mirror of
				https://github.com/tmux/tmux.git
				synced 2025-10-26 12:27:15 +00:00 
			
		
		
		
	Improved NetBSD current-process detection from Roy Marples.
This commit is contained in:
		| @@ -1,4 +1,4 @@ | |||||||
| /* $Id: osdep-netbsd.c,v 1.4 2009-06-26 15:54:52 nicm Exp $ */ | /* $Id: osdep-netbsd.c,v 1.5 2009-07-15 17:53:15 nicm Exp $ */ | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> |  * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> | ||||||
| @@ -18,14 +18,18 @@ | |||||||
|  |  | ||||||
| #include <sys/param.h> | #include <sys/param.h> | ||||||
| #include <sys/proc.h> | #include <sys/proc.h> | ||||||
|  | #include <sys/stat.h> | ||||||
| #include <sys/sysctl.h> | #include <sys/sysctl.h> | ||||||
|  |  | ||||||
|  | #include <errno.h> | ||||||
|  | #include <stdlib.h> | ||||||
| #include <string.h> | #include <string.h> | ||||||
| #include <unistd.h> | #include <unistd.h> | ||||||
|  |  | ||||||
| #ifndef nitems | #define is_runnable(p) \ | ||||||
| #define nitems(_a) (sizeof((_a)) / sizeof((_a)[0])) |         ((p)->p_stat == LSRUN || (p)->p_stat == SIDL) | ||||||
| #endif | #define is_stopped(p) \ | ||||||
|  |         ((p)->p_stat == SSTOP || (p)->p_stat == SZOMB) | ||||||
|  |  | ||||||
| char	*osdep_get_name(int, char *); | char	*osdep_get_name(int, char *); | ||||||
|  |  | ||||||
| @@ -33,20 +37,80 @@ char * | |||||||
| osdep_get_name(int fd, __unused char *tty) | osdep_get_name(int fd, __unused char *tty) | ||||||
| { | { | ||||||
| 	int		 mib[6]; | 	int		 mib[6]; | ||||||
| 	size_t		 len; | 	struct stat	 sb; | ||||||
| 	struct kinfo_proc2 p; | 	size_t		 len, i; | ||||||
|  | 	struct kinfo_proc2 *buf, *newbuf, *p, *bestp; | ||||||
|  | 	char		*name; | ||||||
|  |  | ||||||
|  | 	if (stat(tty, &sb) == -1) | ||||||
|  | 		return (NULL); | ||||||
| 	if ((mib[3] = tcgetpgrp(fd)) == -1) | 	if ((mib[3] = tcgetpgrp(fd)) == -1) | ||||||
| 		return (NULL); | 		return (NULL); | ||||||
|  |  | ||||||
|  | 	buf = NULL; | ||||||
| 	len = sizeof(p); | 	len = sizeof(p); | ||||||
| 	mib[0] = CTL_KERN; | 	mib[0] = CTL_KERN; | ||||||
| 	mib[1] = KERN_PROC2; | 	mib[1] = KERN_PROC2; | ||||||
| 	mib[2] = KERN_PROC_PID; | 	mib[2] = KERN_PROC_PGRP; | ||||||
| 	mib[4] = sizeof(p); | 	mib[4] = sizeof (*buf); | ||||||
| 	mib[5] = 1; | 	mib[5] = 0; | ||||||
| 	if (sysctl(mib, nitems(mib), &p, &len, NULL, 0) == -1) |  | ||||||
|  | retry: | ||||||
|  | 	if (sysctl(mib, __arraycount(mib), NULL, &len, NULL, 0) == -1) | ||||||
| 		return (NULL); | 		return (NULL); | ||||||
|  |  | ||||||
| 	return (strdup(p.p_comm)); | 	if ((newbuf = realloc(buf, len * sizeof (*buf))) == NULL) { | ||||||
|  | 		free(buf); | ||||||
|  | 		return (NULL); | ||||||
|  | 	} | ||||||
|  | 	buf = newbuf; | ||||||
|  |  | ||||||
|  | 	mib[5] = len / sizeof(*buf); | ||||||
|  | 	if (sysctl(mib, __arraycount(mib), buf, &len, NULL, 0) == -1) { | ||||||
|  | 		if (errno == ENOMEM) | ||||||
|  | 			goto retry; /* possible infinite loop? */ | ||||||
|  | 		free(buf); | ||||||
|  | 		return (NULL); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	bestp = NULL; | ||||||
|  | 	for (i = 0; i < len / sizeof (*buf); i++) { | ||||||
|  | 		if (buf[i].p_tdev != sb.st_rdev) | ||||||
|  | 			continue; | ||||||
|  | 		p = &buf[i]; | ||||||
|  | 		if (bestp == NULL) { | ||||||
|  | 			bestp = p; | ||||||
|  | 			continue; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if (is_runnable(p) && !is_runnable(bestp)) | ||||||
|  | 			bestp = p; | ||||||
|  | 		else if (!is_runnable(p) && is_runnable(bestp)) | ||||||
|  | 			continue; | ||||||
|  |  | ||||||
|  | 		if (!is_stopped(p) && is_stopped(bestp)) | ||||||
|  | 			bestp = p; | ||||||
|  | 		else if (is_stopped(p) && !is_stopped(bestp)) | ||||||
|  | 			continue; | ||||||
|  |  | ||||||
|  | 		if (p->p_estcpu > bestp->p_estcpu) | ||||||
|  | 			bestp = p; | ||||||
|  | 		else if (p->p_estcpu < bestp->p_estcpu) | ||||||
|  | 			continue; | ||||||
|  |  | ||||||
|  | 		if (p->p_slptime < bestp->p_slptime) | ||||||
|  | 			bestp = p; | ||||||
|  | 		else if (p->p_slptime > bestp->p_slptime) | ||||||
|  | 			continue; | ||||||
|  |  | ||||||
|  | 		if (p->p_pid > bestp->p_pid) | ||||||
|  | 			bestp = p; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	name = NULL; | ||||||
|  | 	if (bestp != NULL) | ||||||
|  | 		name = strdup(bestp->p_comm); | ||||||
|  | 	 | ||||||
|  | 	free(buf); | ||||||
|  | 	return (name); | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Nicholas Marriott
					Nicholas Marriott