mirror of
https://github.com/xzeldon/htop.git
synced 2025-07-12 12:14:36 +03:00
Add Platform_getProcessEnv
- currently implemented for darwin and linux
This commit is contained in:
@ -236,3 +236,56 @@ void Platform_setSwapValues(Meter* mtr) {
|
||||
mtr->total = swapused.xsu_total / 1024;
|
||||
mtr->values[0] = swapused.xsu_used / 1024;
|
||||
}
|
||||
|
||||
char* Platform_getProcessEnv(pid_t pid) {
|
||||
char* env = NULL;
|
||||
|
||||
int argmax;
|
||||
size_t bufsz = sizeof(argmax);
|
||||
|
||||
int mib[3];
|
||||
mib[0] = CTL_KERN;
|
||||
mib[1] = KERN_ARGMAX;
|
||||
if (sysctl(mib, 2, &argmax, &bufsz, 0, 0) == 0) {
|
||||
char* buf = malloc(argmax);
|
||||
if (buf) {
|
||||
mib[0] = CTL_KERN;
|
||||
mib[1] = KERN_PROCARGS2;
|
||||
mib[2] = pid;
|
||||
size_t bufsz = argmax;
|
||||
if (sysctl(mib, 3, buf, &bufsz, 0, 0) == 0) {
|
||||
if (bufsz > sizeof(int)) {
|
||||
char *p = buf, *endp = buf + bufsz;
|
||||
int argc = *(int*)p;
|
||||
p += sizeof(int);
|
||||
|
||||
// skip exe
|
||||
p = strchr(p, 0)+1;
|
||||
|
||||
// skip padding
|
||||
while(!*p && p < endp)
|
||||
++p;
|
||||
|
||||
// skip argv
|
||||
for (; argc-- && p < endp; p = strrchr(p, 0)+1)
|
||||
;
|
||||
|
||||
// skip padding
|
||||
while(!*p && p < endp)
|
||||
++p;
|
||||
|
||||
size_t size = endp - p;
|
||||
env = malloc(size+2);
|
||||
if (env) {
|
||||
memcpy(env, p, size);
|
||||
env[size] = 0;
|
||||
env[size+1] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
free(buf);
|
||||
}
|
||||
}
|
||||
|
||||
return env;
|
||||
}
|
||||
|
@ -44,4 +44,6 @@ void Platform_setMemoryValues(Meter* mtr);
|
||||
|
||||
void Platform_setSwapValues(Meter* mtr);
|
||||
|
||||
char* Platform_getProcessEnv(pid_t pid);
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user