Changeset View
Changeset View
Standalone View
Standalone View
usr.bin/procstat/procstat_auxv.c
/*- | /*- | ||||
* Copyright (c) 2011 Mikolaj Golub | * Copyright (c) 2011 Mikolaj Golub | ||||
* Copyright (c) 2015 Allan Jude <allanjude@freebsd.org> | |||||
* All rights reserved. | * All rights reserved. | ||||
* | * | ||||
* Redistribution and use in source and binary forms, with or without | * Redistribution and use in source and binary forms, with or without | ||||
* modification, are permitted provided that the following conditions | * modification, are permitted provided that the following conditions | ||||
* are met: | * are met: | ||||
* 1. Redistributions of source code must retain the above copyright | * 1. Redistributions of source code must retain the above copyright | ||||
* notice, this list of conditions and the following disclaimer. | * notice, this list of conditions and the following disclaimer. | ||||
* 2. Redistributions in binary form must reproduce the above copyright | * 2. Redistributions in binary form must reproduce the above copyright | ||||
Show All 27 Lines | |||||
#include <libprocstat.h> | #include <libprocstat.h> | ||||
#include <limits.h> | #include <limits.h> | ||||
#include <stdio.h> | #include <stdio.h> | ||||
#include <stdlib.h> | #include <stdlib.h> | ||||
#include <string.h> | #include <string.h> | ||||
#include "procstat.h" | #include "procstat.h" | ||||
#define PRINT(name, spec, val) \ | |||||
printf("%s %-16s " #spec "\n", prefix, #name, (val)) | |||||
#define PRINT_UNKNOWN(type, val) \ | |||||
printf("%s %16ld %#lx\n", prefix, (long)type, (u_long)(val)) | |||||
void | void | ||||
procstat_auxv(struct procstat *procstat, struct kinfo_proc *kipp) | procstat_auxv(struct procstat *procstat, struct kinfo_proc *kipp) | ||||
{ | { | ||||
Elf_Auxinfo *auxv; | Elf_Auxinfo *auxv; | ||||
u_int count, i; | u_int count, i; | ||||
static char prefix[256]; | static char prefix[256]; | ||||
if (!hflag) | if (!hflag) | ||||
printf("%5s %-16s %-16s %-16s\n", "PID", "COMM", "AUXV", "VALUE"); | xo_emit("{T:/%5s %-16s %-16s %-16s}\n", "PID", "COMM", "AUXV", | ||||
"VALUE"); | |||||
auxv = procstat_getauxv(procstat, kipp, &count); | auxv = procstat_getauxv(procstat, kipp, &count); | ||||
if (auxv == NULL) | if (auxv == NULL) | ||||
return; | return; | ||||
snprintf(prefix, sizeof(prefix), "%5d %-16s", kipp->ki_pid, | snprintf(prefix, sizeof(prefix), "%5d %-16s", kipp->ki_pid, | ||||
kipp->ki_comm); | kipp->ki_comm); | ||||
xo_emit("{e:process_id/%5d/%d}{e:command/%-16s/%s}", kipp->ki_pid, | |||||
kipp->ki_comm); | |||||
for (i = 0; i < count; i++) { | for (i = 0; i < count; i++) { | ||||
switch(auxv[i].a_type) { | switch(auxv[i].a_type) { | ||||
marcel: Long line. Lots in this function. | |||||
case AT_NULL: | case AT_NULL: | ||||
return; | return; | ||||
case AT_IGNORE: | case AT_IGNORE: | ||||
break; | break; | ||||
case AT_EXECFD: | case AT_EXECFD: | ||||
PRINT(AT_EXECFD, %ld, (long)auxv[i].a_un.a_val); | xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_EXECFD/%ld}\n", | ||||
prefix, "AT_EXECFD", (long)auxv[i].a_un.a_val); | |||||
break; | break; | ||||
case AT_PHDR: | case AT_PHDR: | ||||
PRINT(AT_PHDR, %p, auxv[i].a_un.a_ptr); | xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_PHDR/%p}\n", | ||||
prefix, "AT_PHDR", auxv[i].a_un.a_ptr); | |||||
break; | break; | ||||
case AT_PHENT: | case AT_PHENT: | ||||
PRINT(AT_PHENT, %ld, (long)auxv[i].a_un.a_val); | xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_PHENT/%ld}\n", | ||||
prefix, "AT_PHENT", (long)auxv[i].a_un.a_val); | |||||
break; | break; | ||||
case AT_PHNUM: | case AT_PHNUM: | ||||
PRINT(AT_PHNUM, %ld, (long)auxv[i].a_un.a_val); | xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_PHNUM/%ld}\n", | ||||
prefix, "AT_PHNUM", (long)auxv[i].a_un.a_val); | |||||
break; | break; | ||||
case AT_PAGESZ: | case AT_PAGESZ: | ||||
PRINT(AT_PAGESZ, %ld, (long)auxv[i].a_un.a_val); | xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_PAGESZ/%ld}\n", | ||||
prefix, "AT_PAGESZ", (long)auxv[i].a_un.a_val); | |||||
break; | break; | ||||
case AT_BASE: | case AT_BASE: | ||||
PRINT(AT_BASE, %p, auxv[i].a_un.a_ptr); | xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_BASE/%p}\n", | ||||
prefix, "AT_BASE", auxv[i].a_un.a_ptr); | |||||
break; | break; | ||||
case AT_FLAGS: | case AT_FLAGS: | ||||
PRINT(AT_FLAGS, %#lx, (u_long)auxv[i].a_un.a_val); | xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_FLAGS/%#lx}\n", | ||||
prefix, "AT_FLAGS", (u_long)auxv[i].a_un.a_val); | |||||
break; | break; | ||||
case AT_ENTRY: | case AT_ENTRY: | ||||
PRINT(AT_ENTRY, %p, auxv[i].a_un.a_ptr); | xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_ENTRY/%p}\n", | ||||
prefix, "AT_ENTRY", auxv[i].a_un.a_ptr); | |||||
break; | break; | ||||
#ifdef AT_NOTELF | #ifdef AT_NOTELF | ||||
case AT_NOTELF: | case AT_NOTELF: | ||||
PRINT(AT_NOTELF, %ld, (long)auxv[i].a_un.a_val); | xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_NOTELF/%ld}\n", | ||||
prefix, "AT_NOTELF", (long)auxv[i].a_un.a_val); | |||||
break; | break; | ||||
#endif | #endif | ||||
#ifdef AT_UID | #ifdef AT_UID | ||||
case AT_UID: | case AT_UID: | ||||
PRINT(AT_UID, %ld, (long)auxv[i].a_un.a_val); | xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_UID/%ld}\n", | ||||
prefix, "AT_UID", (long)auxv[i].a_un.a_val); | |||||
break; | break; | ||||
#endif | #endif | ||||
#ifdef AT_EUID | #ifdef AT_EUID | ||||
case AT_EUID: | case AT_EUID: | ||||
PRINT(AT_EUID, %ld, (long)auxv[i].a_un.a_val); | xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_EUID/%ld}\n", | ||||
prefix, "AT_EUID", (long)auxv[i].a_un.a_val); | |||||
break; | break; | ||||
#endif | #endif | ||||
#ifdef AT_GID | #ifdef AT_GID | ||||
case AT_GID: | case AT_GID: | ||||
PRINT(AT_GID, %ld, (long)auxv[i].a_un.a_val); | xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_GID/%ld}\n", | ||||
prefix, "AT_GID", (long)auxv[i].a_un.a_val); | |||||
break; | break; | ||||
#endif | #endif | ||||
#ifdef AT_EGID | #ifdef AT_EGID | ||||
case AT_EGID: | case AT_EGID: | ||||
PRINT(AT_EGID, %ld, (long)auxv[i].a_un.a_val); | xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_EGID/%ld}\n", | ||||
prefix, "AT_EGID", (long)auxv[i].a_un.a_val); | |||||
break; | break; | ||||
#endif | #endif | ||||
case AT_EXECPATH: | case AT_EXECPATH: | ||||
PRINT(AT_EXECPATH, %p, auxv[i].a_un.a_ptr); | xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_EXECPATH/%p}\n", | ||||
prefix, "AT_EXECPATH", auxv[i].a_un.a_ptr); | |||||
break; | break; | ||||
case AT_CANARY: | case AT_CANARY: | ||||
PRINT(AT_CANARY, %p, auxv[i].a_un.a_ptr); | xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_CANARY/%p}\n", | ||||
prefix, "AT_CANARY", auxv[i].a_un.a_ptr); | |||||
break; | break; | ||||
case AT_CANARYLEN: | case AT_CANARYLEN: | ||||
PRINT(AT_CANARYLEN, %ld, (long)auxv[i].a_un.a_val); | xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_CANARYLEN/%ld}\n", | ||||
prefix, "AT_CANARYLEN", (long)auxv[i].a_un.a_val); | |||||
break; | break; | ||||
case AT_OSRELDATE: | case AT_OSRELDATE: | ||||
PRINT(AT_OSRELDATE, %ld, (long)auxv[i].a_un.a_val); | xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_OSRELDATE/%ld}\n", | ||||
prefix, "AT_OSRELDATE", (long)auxv[i].a_un.a_val); | |||||
break; | break; | ||||
case AT_NCPUS: | case AT_NCPUS: | ||||
PRINT(AT_NCPUS, %ld, (long)auxv[i].a_un.a_val); | xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_NCPUS/%ld}\n", | ||||
prefix, "AT_NCPUS", (long)auxv[i].a_un.a_val); | |||||
break; | break; | ||||
case AT_PAGESIZES: | case AT_PAGESIZES: | ||||
PRINT(AT_PAGESIZES, %p, auxv[i].a_un.a_ptr); | xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_PAGESIZES/%p}\n", | ||||
prefix, "AT_PAGESIZES", auxv[i].a_un.a_ptr); | |||||
break; | break; | ||||
case AT_PAGESIZESLEN: | case AT_PAGESIZESLEN: | ||||
PRINT(AT_PAGESIZESLEN, %ld, (long)auxv[i].a_un.a_val); | xo_emit("{dw:/%s}{Lw:/%-16s/%s}" | ||||
"{:AT_PAGESIZESLEN/%ld}\n", prefix, | |||||
"AT_PAGESIZESLEN", (long)auxv[i].a_un.a_val); | |||||
break; | break; | ||||
case AT_STACKPROT: | case AT_STACKPROT: | ||||
if ((auxv[i].a_un.a_val & VM_PROT_EXECUTE) != 0) | if ((auxv[i].a_un.a_val & VM_PROT_EXECUTE) != 0) | ||||
PRINT(AT_STACKPROT, %s, "NONEXECUTABLE"); | xo_emit("{dw:/%s}{Lw:/%-16s/%s}" | ||||
"{:AT_STACKPROT/%s}\n", prefix, | |||||
"AT_STACKPROT", "NONEXECUTABLE"); | |||||
else | else | ||||
PRINT(AT_STACKPROT, %s, "EXECUTABLE"); | xo_emit("{dw:/%s}{Lw:/%-16s/%s}" | ||||
"{:AT_STACKPROT/%s}\n", prefix, | |||||
"AT_STACKPROT", "EXECUTABLE"); | |||||
break; | break; | ||||
#ifdef AT_TIMEKEEP | #ifdef AT_TIMEKEEP | ||||
case AT_TIMEKEEP: | case AT_TIMEKEEP: | ||||
PRINT(AT_TIMEKEEP, %p, auxv[i].a_un.a_ptr); | xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_TIMEKEEP/%p}\n", | ||||
prefix, "AT_TIMEKEEP", auxv[i].a_un.a_ptr); | |||||
break; | break; | ||||
#endif | #endif | ||||
default: | default: | ||||
PRINT_UNKNOWN(auxv[i].a_type, auxv[i].a_un.a_val); | xo_emit("{dw:/%s}{Lw:/%16ld/%ld}{:UNKNOWN/%#lx}\n", | ||||
prefix, auxv[i].a_type, auxv[i].a_un.a_val); | |||||
break; | break; | ||||
} | } | ||||
} | } | ||||
printf("\n"); | xo_emit("\n"); | ||||
procstat_freeauxv(procstat, auxv); | procstat_freeauxv(procstat, auxv); | ||||
} | } | ||||
Long line. Lots in this function.