OpenBSD sigar_proc_args impl
This commit is contained in:
		
							parent
							
								
									3bd2bd2c6d
								
							
						
					
					
						commit
						eccfefcb6b
					
				@ -1313,6 +1313,9 @@ static int kern_proc_args_skip_argv(sigar_kern_proc_args_t *kargs)
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* ARG_MAX in FreeBSD 6.0 == 262144, which blows up the stack */
 | 
			
		||||
#define SIGAR_ARG_MAX 65536
 | 
			
		||||
 | 
			
		||||
int sigar_os_proc_args_get(sigar_t *sigar, sigar_pid_t pid,
 | 
			
		||||
                           sigar_proc_args_t *procargs)
 | 
			
		||||
{
 | 
			
		||||
@ -1358,13 +1361,10 @@ int sigar_os_proc_args_get(sigar_t *sigar, sigar_pid_t pid,
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return SIGAR_OK;
 | 
			
		||||
#else
 | 
			
		||||
    /* ARG_MAX in FreeBSD 6.0 == 262144, which blows up the stack */
 | 
			
		||||
#define SIGAR_ARG_MAX 65536
 | 
			
		||||
#elif defined(__FreeBSD__)
 | 
			
		||||
    char buffer[SIGAR_ARG_MAX+1], *ptr=buffer;
 | 
			
		||||
    size_t len = sizeof(buffer);
 | 
			
		||||
    int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_ARGS, 0 };
 | 
			
		||||
 | 
			
		||||
    int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_ARGS, 0 };
 | 
			
		||||
    mib[3] = pid;
 | 
			
		||||
 | 
			
		||||
    if (sysctl(mib, NMIB(mib), buffer, &len, NULL, 0) < 0) {
 | 
			
		||||
@ -1394,6 +1394,34 @@ int sigar_os_proc_args_get(sigar_t *sigar, sigar_pid_t pid,
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return SIGAR_OK;
 | 
			
		||||
#elif defined(__OpenBSD__)
 | 
			
		||||
    char buffer[SIGAR_ARG_MAX+1], **ptr=(char **)buffer;
 | 
			
		||||
    size_t len = sizeof(buffer);
 | 
			
		||||
    int mib[] = { CTL_KERN, KERN_PROC_ARGS, 0, KERN_PROC_ARGV };
 | 
			
		||||
    mib[2] = pid;
 | 
			
		||||
 | 
			
		||||
    if (sysctl(mib, NMIB(mib), buffer, &len, NULL, 0) < 0) {
 | 
			
		||||
        return errno;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (len == 0) {
 | 
			
		||||
        procargs->number = 0;
 | 
			
		||||
        return SIGAR_OK;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (; *ptr; ptr++) {
 | 
			
		||||
        int alen = strlen(*ptr)+1;
 | 
			
		||||
        char *arg = malloc(alen);
 | 
			
		||||
 | 
			
		||||
        SIGAR_PROC_ARGS_GROW(procargs);
 | 
			
		||||
        memcpy(arg, *ptr, alen);
 | 
			
		||||
 | 
			
		||||
        procargs->data[procargs->number++] = arg;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return SIGAR_OK;
 | 
			
		||||
#else
 | 
			
		||||
    return SIGAR_ENOTIMPL;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user