Use libprocstat(3) to retrieve process command line arguments and

environment variables.

MFC after:	1 month
This commit is contained in:
Mikolaj Golub 2013-04-20 08:08:29 +00:00
parent 4482b5e320
commit 729e63c34b
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=249680
3 changed files with 24 additions and 36 deletions

View File

@ -61,9 +61,9 @@ procstat(struct procstat *prstat, struct kinfo_proc *kipp)
if (bflag) if (bflag)
procstat_bin(prstat, kipp); procstat_bin(prstat, kipp);
else if (cflag) else if (cflag)
procstat_args(kipp); procstat_args(prstat, kipp);
else if (eflag) else if (eflag)
procstat_env(kipp); procstat_env(prstat, kipp);
else if (fflag) else if (fflag)
procstat_files(prstat, kipp); procstat_files(prstat, kipp);
else if (iflag) else if (iflag)

View File

@ -34,12 +34,12 @@ extern int hflag, nflag, Cflag;
struct kinfo_proc; struct kinfo_proc;
void kinfo_proc_sort(struct kinfo_proc *kipp, int count); void kinfo_proc_sort(struct kinfo_proc *kipp, int count);
void procstat_args(struct kinfo_proc *kipp); void procstat_args(struct procstat *prstat, struct kinfo_proc *kipp);
void procstat_auxv(struct kinfo_proc *kipp); void procstat_auxv(struct kinfo_proc *kipp);
void procstat_basic(struct kinfo_proc *kipp); void procstat_basic(struct kinfo_proc *kipp);
void procstat_bin(struct procstat *prstat, struct kinfo_proc *kipp); void procstat_bin(struct procstat *prstat, struct kinfo_proc *kipp);
void procstat_cred(struct procstat *prstat, struct kinfo_proc *kipp); void procstat_cred(struct procstat *prstat, struct kinfo_proc *kipp);
void procstat_env(struct kinfo_proc *kipp); void procstat_env(struct procstat *prstat, struct kinfo_proc *kipp);
void procstat_files(struct procstat *prstat, struct kinfo_proc *kipp); void procstat_files(struct procstat *prstat, struct kinfo_proc *kipp);
void procstat_kstack(struct kinfo_proc *kipp, int kflag); void procstat_kstack(struct kinfo_proc *kipp, int kflag);
void procstat_rlimit(struct procstat *prstat, struct kinfo_proc *kipp); void procstat_rlimit(struct procstat *prstat, struct kinfo_proc *kipp);

View File

@ -40,52 +40,40 @@
#include "procstat.h" #include "procstat.h"
static char args[ARG_MAX];
static void static void
do_args(struct kinfo_proc *kipp, int env) do_args(struct procstat *procstat, struct kinfo_proc *kipp, int env)
{ {
int error, name[4]; int i;
size_t len; char **args;
char *cp;
if (!hflag) if (!hflag) {
printf("%5s %-16s %-53s\n", "PID", "COMM", printf("%5s %-16s %-53s\n", "PID", "COMM",
env ? "ENVIRONMENT" : "ARGS"); env ? "ENVIRONMENT" : "ARGS");
name[0] = CTL_KERN;
name[1] = KERN_PROC;
name[2] = env ? KERN_PROC_ENV : KERN_PROC_ARGS;
name[3] = kipp->ki_pid;
len = sizeof(args);
error = sysctl(name, 4, args, &len, NULL, 0);
if (error < 0 && errno != ESRCH && errno != EPERM) {
warn("sysctl: kern.proc.%s: %d: %d", env ? "env" : "args",
kipp->ki_pid, errno);
return;
}
if (error < 0)
return;
if (len == 0 || strlen(args) == 0) {
strcpy(args, "-");
len = strlen(args) + 1;
} }
printf("%5d ", kipp->ki_pid); args = env ? procstat_getenvv(procstat, kipp, 0) :
printf("%-16s ", kipp->ki_comm); procstat_getargv(procstat, kipp, 0);
for (cp = args; cp < args + len; cp += strlen(cp) + 1)
printf("%s%s", cp != args ? " " : "", cp); printf("%5d %-16s", kipp->ki_pid, kipp->ki_comm);
if (args == NULL) {
printf(" -\n");
return;
}
for (i = 0; args[i] != NULL; i++)
printf(" %s", args[i]);
printf("\n"); printf("\n");
} }
void void
procstat_args(struct kinfo_proc *kipp) procstat_args(struct procstat *procstat, struct kinfo_proc *kipp)
{ {
do_args(kipp, 0); do_args(procstat, kipp, 0);
} }
void void
procstat_env(struct kinfo_proc *kipp) procstat_env(struct procstat *procstat, struct kinfo_proc *kipp)
{ {
do_args(kipp, 1); do_args(procstat, kipp, 1);
} }