procstat_auxv.c revision 249683
183900Sdfr/*- 283900Sdfr * Copyright (c) 2011 Mikolaj Golub 383900Sdfr * All rights reserved. 483900Sdfr * 583900Sdfr * Redistribution and use in source and binary forms, with or without 683900Sdfr * modification, are permitted provided that the following conditions 783900Sdfr * are met: 883900Sdfr * 1. Redistributions of source code must retain the above copyright 983900Sdfr * notice, this list of conditions and the following disclaimer. 1083900Sdfr * 2. Redistributions in binary form must reproduce the above copyright 1183900Sdfr * notice, this list of conditions and the following disclaimer in the 1283900Sdfr * documentation and/or other materials provided with the distribution. 1383900Sdfr * 1483900Sdfr * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1583900Sdfr * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1683900Sdfr * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1783900Sdfr * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1883900Sdfr * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 1983900Sdfr * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2083900Sdfr * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2183900Sdfr * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2283900Sdfr * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2383900Sdfr * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2483900Sdfr * SUCH DAMAGE. 2583900Sdfr * 2683900Sdfr * $FreeBSD: head/usr.bin/procstat/procstat_auxv.c 249683 2013-04-20 08:15:43Z trociny $ 2783900Sdfr */ 2883900Sdfr 2983900Sdfr#include <sys/param.h> 3083900Sdfr#include <sys/elf.h> 3183900Sdfr#include <sys/sysctl.h> 32135590Smarcel#include <sys/user.h> 33135590Smarcel 34135590Smarcel#include <vm/vm.h> 35135590Smarcel 36135590Smarcel#include <err.h> 37135590Smarcel#include <errno.h> 38135590Smarcel#include <libprocstat.h> 39135590Smarcel#include <limits.h> 40135590Smarcel#include <stdio.h> 41135590Smarcel#include <stdlib.h> 42135590Smarcel#include <string.h> 43135590Smarcel 44135590Smarcel#include "procstat.h" 45135590Smarcel 46135590Smarcel#define PRINT(name, spec, val) \ 47135590Smarcel printf("%s %-16s " #spec "\n", prefix, #name, (val)) 48135590Smarcel#define PRINT_UNKNOWN(type, val) \ 49135590Smarcel printf("%s %16ld %#lx\n", prefix, (long)type, (u_long)(val)) 50135590Smarcel 51135590Smarcelvoid 52135590Smarcelprocstat_auxv(struct procstat *procstat, struct kinfo_proc *kipp) 53135590Smarcel{ 54135590Smarcel Elf_Auxinfo *auxv; 55135590Smarcel u_int count, i; 56135590Smarcel static char prefix[256]; 57135590Smarcel 58135590Smarcel if (!hflag) 59135590Smarcel printf("%5s %-16s %-16s %-16s\n", "PID", "COMM", "AUXV", "VALUE"); 60135590Smarcel auxv = procstat_getauxv(procstat, kipp, &count); 6183900Sdfr if (auxv == NULL) 62137978Smarcel return; 63137978Smarcel snprintf(prefix, sizeof(prefix), "%5d %-16s", kipp->ki_pid, 64137978Smarcel kipp->ki_comm); 65137978Smarcel for (i = 0; i < count; i++) { 66137978Smarcel switch(auxv[i].a_type) { 67135590Smarcel case AT_NULL: 6883900Sdfr return; 69135590Smarcel case AT_IGNORE: 7083900Sdfr break; 71135590Smarcel case AT_EXECFD: 72135590Smarcel PRINT(AT_EXECFD, %ld, (long)auxv[i].a_un.a_val); 73135590Smarcel break; 74135590Smarcel case AT_PHDR: 75135590Smarcel PRINT(AT_PHDR, %p, auxv[i].a_un.a_ptr); 7683900Sdfr break; 77135590Smarcel case AT_PHENT: 78135590Smarcel PRINT(AT_PHENT, %ld, (long)auxv[i].a_un.a_val); 79135590Smarcel break; 80135590Smarcel case AT_PHNUM: 81135590Smarcel PRINT(AT_PHNUM, %ld, (long)auxv[i].a_un.a_val); 8283900Sdfr break; 8383900Sdfr case AT_PAGESZ: 8483900Sdfr PRINT(AT_PAGESZ, %ld, (long)auxv[i].a_un.a_val); 8583900Sdfr break; 8683900Sdfr case AT_BASE: 87135590Smarcel PRINT(AT_BASE, %p, auxv[i].a_un.a_ptr); 88137978Smarcel break; 89135590Smarcel case AT_FLAGS: 90135590Smarcel PRINT(AT_FLAGS, %#lx, (u_long)auxv[i].a_un.a_val); 9183900Sdfr break; 9283900Sdfr case AT_ENTRY: 9383900Sdfr PRINT(AT_ENTRY, %p, auxv[i].a_un.a_ptr); 9483900Sdfr break; 9583900Sdfr#ifdef AT_NOTELF 9683900Sdfr case AT_NOTELF: 97133405Smarcel PRINT(AT_NOTELF, %ld, (long)auxv[i].a_un.a_val); 98133405Smarcel break; 99133405Smarcel#endif 100133405Smarcel#ifdef AT_UID 101133405Smarcel case AT_UID: 10283900Sdfr PRINT(AT_UID, %ld, (long)auxv[i].a_un.a_val); 10383900Sdfr break; 10483900Sdfr#endif 10583900Sdfr#ifdef AT_EUID 10683900Sdfr case AT_EUID: 107 PRINT(AT_EUID, %ld, (long)auxv[i].a_un.a_val); 108 break; 109#endif 110#ifdef AT_GID 111 case AT_GID: 112 PRINT(AT_GID, %ld, (long)auxv[i].a_un.a_val); 113 break; 114#endif 115#ifdef AT_EGID 116 case AT_EGID: 117 PRINT(AT_EGID, %ld, (long)auxv[i].a_un.a_val); 118 break; 119#endif 120 case AT_EXECPATH: 121 PRINT(AT_EXECPATH, %p, auxv[i].a_un.a_ptr); 122 break; 123 case AT_CANARY: 124 PRINT(AT_CANARY, %p, auxv[i].a_un.a_ptr); 125 break; 126 case AT_CANARYLEN: 127 PRINT(AT_CANARYLEN, %ld, (long)auxv[i].a_un.a_val); 128 break; 129 case AT_OSRELDATE: 130 PRINT(AT_OSRELDATE, %ld, (long)auxv[i].a_un.a_val); 131 break; 132 case AT_NCPUS: 133 PRINT(AT_NCPUS, %ld, (long)auxv[i].a_un.a_val); 134 break; 135 case AT_PAGESIZES: 136 PRINT(AT_PAGESIZES, %p, auxv[i].a_un.a_ptr); 137 break; 138 case AT_PAGESIZESLEN: 139 PRINT(AT_PAGESIZESLEN, %ld, (long)auxv[i].a_un.a_val); 140 break; 141 case AT_STACKPROT: 142 if ((auxv[i].a_un.a_val & VM_PROT_EXECUTE) != 0) 143 PRINT(AT_STACKPROT, %s, "NONEXECUTABLE"); 144 else 145 PRINT(AT_STACKPROT, %s, "EXECUTABLE"); 146 break; 147#ifdef AT_TIMEKEEP 148 case AT_TIMEKEEP: 149 PRINT(AT_TIMEKEEP, %p, auxv[i].a_un.a_ptr); 150 break; 151#endif 152 default: 153 PRINT_UNKNOWN(auxv[i].a_type, auxv[i].a_un.a_val); 154 break; 155 } 156 } 157 printf("\n"); 158 procstat_freeauxv(procstat, auxv); 159} 160 161