X-Git-Url: https://granicus.if.org/sourcecode?a=blobdiff_plain;f=resource.c;h=9aacfbe486b3d8a686789f03b5853e1d9c0d16df;hb=5c720b0b9b90a6cf650c52b0d9d8204b70f0f820;hp=9a90ad82ae8533cef9a5c2259577ba6ba6480661;hpb=60fe8c139c6f2febefe595781812ddf0864a6ab8;p=strace diff --git a/resource.c b/resource.c index 9a90ad82..9aacfbe4 100644 --- a/resource.c +++ b/resource.c @@ -26,339 +26,136 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $Id$ */ #include "defs.h" - #include -#ifdef LINUX -#include -#include -#endif /* LINUX */ -#if defined(SVR4) || defined(FREEBSD) -#include -#include -#endif - -#if HAVE_LONG_LONG_RLIM_T -/* - * Hacks for systems that have a long long rlim_t - */ - -#define rlimit64 rlimit /* Ugly hack */ -#define rlim64_t rlim_t /* Ugly hack */ -#define RLIM64_INFINITY RLIM_INFINITY /* You guessed it */ -#define sys_getrlimit64 sys_getrlimit -#define sys_setrlimit64 sys_setrlimit -#endif +#include "xlat/resources.h" -static const struct xlat resources[] = { -#ifdef RLIMIT_AS - { RLIMIT_AS, "RLIMIT_AS" }, -#endif -#ifdef RLIMIT_CORE - { RLIMIT_CORE, "RLIMIT_CORE" }, -#endif -#ifdef RLIMIT_CPU - { RLIMIT_CPU, "RLIMIT_CPU" }, -#endif -#ifdef RLIMIT_DATA - { RLIMIT_DATA, "RLIMIT_DATA" }, -#endif -#ifdef RLIMIT_FSIZE - { RLIMIT_FSIZE, "RLIMIT_FSIZE" }, -#endif -#ifdef RLIMIT_LOCKS - { RLIMIT_LOCKS, "RLIMIT_LOCKS" }, -#endif -#ifdef RLIMIT_MEMLOCK - { RLIMIT_MEMLOCK, "RLIMIT_MEMLOCK" }, -#endif -#ifdef RLIMIT_MSGQUEUE - { RLIMIT_MSGQUEUE, "RLIMIT_MSGQUEUE" }, -#endif -#ifdef RLIMIT_NICE - { RLIMIT_NICE, "RLIMIT_NICE" }, -#endif -#ifdef RLIMIT_NOFILE - { RLIMIT_NOFILE, "RLIMIT_NOFILE" }, -#endif -#ifdef RLIMIT_NPROC - { RLIMIT_NPROC, "RLIMIT_NPROC" }, -#endif -#ifdef RLIMIT_RSS - { RLIMIT_RSS, "RLIMIT_RSS" }, -#endif -#ifdef RLIMIT_RTPRIO - { RLIMIT_RTPRIO, "RLIMIT_RTPRIO" }, -#endif -#ifdef RLIMIT_SIGPENDING - { RLIMIT_SIGPENDING, "RLIMIT_SIGPENDING" }, -#endif -#ifdef RLIMIT_STACK - { RLIMIT_STACK, "RLIMIT_STACK" }, -#endif -#ifdef RLIMIT_VMEM - { RLIMIT_VMEM, "RLIMIT_VMEM" }, -#endif - { 0, NULL }, -}; - -#if !HAVE_LONG_LONG_RLIM_T -static char * -sprintrlim(long lim) +static const char * +sprint_rlim64(uint64_t lim) { - static char buf[32]; + static char buf[sizeof(uint64_t)*3 + sizeof("*1024")]; + + if (lim == UINT64_MAX) + return "RLIM64_INFINITY"; - if (lim == RLIM_INFINITY) - sprintf(buf, "RLIM_INFINITY"); - else if (lim > 1024 && lim%1024 == 0) - sprintf(buf, "%ld*1024", lim/1024); + if (lim > 1024 && lim % 1024 == 0) + sprintf(buf, "%" PRIu64 "*1024", lim / 1024); else - sprintf(buf, "%ld", lim); + sprintf(buf, "%" PRIu64, lim); return buf; } -# if defined LINUX && (defined POWERPC64 || defined X86_64) static void -print_rlimit32(struct tcb *tcp) +print_rlimit64(struct tcb *tcp, unsigned long addr) { - struct rlimit32 { - unsigned int rlim_cur; - unsigned int rlim_max; + struct rlimit_64 { + uint64_t rlim_cur; + uint64_t rlim_max; } rlim; - if (umove(tcp, tcp->u_arg[1], &rlim) < 0) - tprints("{...}"); - else { - tprintf("{rlim_cur=%s,", - sprintrlim(rlim.rlim_cur == -1 ? RLIM_INFINITY - : rlim.rlim_cur)); - tprintf(" rlim_max=%s}", - sprintrlim(rlim.rlim_max == -1 ? RLIM_INFINITY - : rlim.rlim_max)); + if (!umove_or_printaddr(tcp, addr, &rlim)) { + tprintf("{rlim_cur=%s,", sprint_rlim64(rlim.rlim_cur)); + tprintf(" rlim_max=%s}", sprint_rlim64(rlim.rlim_max)); } } -# endif -int -sys_getrlimit(struct tcb *tcp) +#if !defined(current_wordsize) || current_wordsize == 4 + +static const char * +sprint_rlim32(uint32_t lim) { - struct rlimit rlim; + static char buf[sizeof(uint32_t)*3 + sizeof("*1024")]; - if (entering(tcp)) { - printxval(resources, tcp->u_arg[0], "RLIMIT_???"); - tprints(", "); - } - else { - if (syserror(tcp) || !verbose(tcp)) - tprintf("%#lx", tcp->u_arg[1]); -# if defined LINUX && (defined POWERPC64 || defined X86_64) - else if (current_personality == 1) - print_rlimit32(tcp); -# endif - else if (umove(tcp, tcp->u_arg[1], &rlim) < 0) - tprints("{...}"); - else { - tprintf("{rlim_cur=%s,", sprintrlim(rlim.rlim_cur)); - tprintf(" rlim_max=%s}", sprintrlim(rlim.rlim_max)); - } - } - return 0; + if (lim == UINT32_MAX) + return "RLIM_INFINITY"; + + if (lim > 1024 && lim % 1024 == 0) + sprintf(buf, "%" PRIu32 "*1024", lim / 1024); + else + sprintf(buf, "%" PRIu32, lim); + return buf; } -int -sys_setrlimit(struct tcb *tcp) +static void +print_rlimit32(struct tcb *tcp, unsigned long addr) { - struct rlimit rlim; + struct rlimit_32 { + uint32_t rlim_cur; + uint32_t rlim_max; + } rlim; - if (entering(tcp)) { - printxval(resources, tcp->u_arg[0], "RLIMIT_???"); - tprints(", "); - if (!verbose(tcp)) - tprintf("%#lx", tcp->u_arg[1]); -# if defined LINUX && (defined POWERPC64 || defined X86_64) - else if (current_personality == 1) - print_rlimit32(tcp); -# endif - else if (umove(tcp, tcp->u_arg[1], &rlim) < 0) - tprints("{...}"); - else { - tprintf("{rlim_cur=%s,", sprintrlim(rlim.rlim_cur)); - tprintf(" rlim_max=%s}", sprintrlim(rlim.rlim_max)); - } + if (!umove_or_printaddr(tcp, addr, &rlim)) { + tprintf("{rlim_cur=%s,", sprint_rlim32(rlim.rlim_cur)); + tprintf(" rlim_max=%s}", sprint_rlim32(rlim.rlim_max)); } - return 0; } -#endif /* !HAVE_LONG_LONG_RLIM_T */ -#if _LFS64_LARGEFILE || HAVE_LONG_LONG_RLIM_T -static char * -sprintrlim64(rlim64_t lim) -{ - static char buf[64]; - - if (lim == RLIM64_INFINITY) - sprintf(buf, "RLIM64_INFINITY"); - else if (lim > 1024 && lim%1024 == 0) - sprintf(buf, "%lld*1024", (long long) lim/1024); +static void +decode_rlimit(struct tcb *tcp, unsigned long addr) +{ +# if defined(X86_64) || defined(X32) + /* + * i386 is the only personality on X86_64 and X32 + * with 32-bit rlim_t. + * When current_personality is X32, current_wordsize + * equals to 4 but rlim_t is 64-bit. + */ + if (current_personality == 1) +# else + if (current_wordsize == 4) +# endif + print_rlimit32(tcp, addr); else - sprintf(buf, "%lld", (long long) lim); - return buf; + print_rlimit64(tcp, addr); } -int -sys_getrlimit64(struct tcb *tcp) -{ - struct rlimit64 rlim; +#else /* defined(current_wordsize) && current_wordsize != 4 */ +# define decode_rlimit print_rlimit64 + +#endif + +SYS_FUNC(getrlimit) +{ if (entering(tcp)) { printxval(resources, tcp->u_arg[0], "RLIMIT_???"); tprints(", "); } else { - if (syserror(tcp) || !verbose(tcp)) - tprintf("%#lx", tcp->u_arg[1]); - else if (umove(tcp, tcp->u_arg[1], &rlim) < 0) - tprints("{...}"); - else { - tprintf("{rlim_cur=%s,", sprintrlim64(rlim.rlim_cur)); - tprintf(" rlim_max=%s}", sprintrlim64(rlim.rlim_max)); - } + decode_rlimit(tcp, tcp->u_arg[1]); } return 0; } -int -sys_setrlimit64(struct tcb *tcp) +SYS_FUNC(setrlimit) { - struct rlimit64 rlim; + printxval(resources, tcp->u_arg[0], "RLIMIT_???"); + tprints(", "); + decode_rlimit(tcp, tcp->u_arg[1]); - if (entering(tcp)) { - printxval(resources, tcp->u_arg[0], "RLIMIT_???"); - tprints(", "); - if (!verbose(tcp)) - tprintf("%#lx", tcp->u_arg[1]); - else if (umove(tcp, tcp->u_arg[1], &rlim) < 0) - tprints("{...}"); - else { - tprintf("{rlim_cur=%s,", sprintrlim64(rlim.rlim_cur)); - tprintf(" rlim_max=%s}", sprintrlim64(rlim.rlim_max)); - } - } - return 0; + return RVAL_DECODED; } -#endif /* _LFS64_LARGEFILES || HAVE_LONG_LONG_RLIM_T */ - -#ifndef SVR4 -static const struct xlat usagewho[] = { - { RUSAGE_SELF, "RUSAGE_SELF" }, - { RUSAGE_CHILDREN, "RUSAGE_CHILDREN" }, -#ifdef RUSAGE_BOTH - { RUSAGE_BOTH, "RUSAGE_BOTH" }, -#endif - { 0, NULL }, -}; - -#ifdef ALPHA -void -printrusage32(struct tcb *tcp, long addr) +SYS_FUNC(prlimit64) { - struct timeval32 { - unsigned tv_sec; - unsigned tv_usec; - }; - struct rusage32 { - struct timeval32 ru_utime; /* user time used */ - struct timeval32 ru_stime; /* system time used */ - long ru_maxrss; /* maximum resident set size */ - long ru_ixrss; /* integral shared memory size */ - long ru_idrss; /* integral unshared data size */ - long ru_isrss; /* integral unshared stack size */ - long ru_minflt; /* page reclaims */ - long ru_majflt; /* page faults */ - long ru_nswap; /* swaps */ - long ru_inblock; /* block input operations */ - long ru_oublock; /* block output operations */ - long ru_msgsnd; /* messages sent */ - long ru_msgrcv; /* messages received */ - long ru_nsignals; /* signals received */ - long ru_nvcsw; /* voluntary context switches */ - long ru_nivcsw; /* involuntary " */ - } ru; - - if (!addr) - tprints("NULL"); - else if (syserror(tcp) || !verbose(tcp)) - tprintf("%#lx", addr); - else if (umove(tcp, addr, &ru) < 0) - tprints("{...}"); - else if (!abbrev(tcp)) { - tprintf("{ru_utime={%lu, %lu}, ru_stime={%lu, %lu}, ", - (long) ru.ru_utime.tv_sec, (long) ru.ru_utime.tv_usec, - (long) ru.ru_stime.tv_sec, (long) ru.ru_stime.tv_usec); - tprintf("ru_maxrss=%lu, ru_ixrss=%lu, ", - ru.ru_maxrss, ru.ru_ixrss); - tprintf("ru_idrss=%lu, ru_isrss=%lu, ", - ru.ru_idrss, ru.ru_isrss); - tprintf("ru_minflt=%lu, ru_majflt=%lu, ru_nswap=%lu, ", - ru.ru_minflt, ru.ru_majflt, ru.ru_nswap); - tprintf("ru_inblock=%lu, ru_oublock=%lu, ", - ru.ru_inblock, ru.ru_oublock); - tprintf("ru_msgsnd=%lu, ru_msgrcv=%lu, ", - ru.ru_msgsnd, ru.ru_msgrcv); - tprintf("ru_nsignals=%lu, ru_nvcsw=%lu, ru_nivcsw=%lu}", - ru.ru_nsignals, ru.ru_nvcsw, ru.ru_nivcsw); - } - else { - tprintf("{ru_utime={%lu, %lu}, ru_stime={%lu, %lu}, ...}", - (long) ru.ru_utime.tv_sec, (long) ru.ru_utime.tv_usec, - (long) ru.ru_stime.tv_sec, (long) ru.ru_stime.tv_usec); + if (entering(tcp)) { + tprintf("%ld, ", tcp->u_arg[0]); + printxval(resources, tcp->u_arg[1], "RLIMIT_???"); + tprints(", "); + print_rlimit64(tcp, tcp->u_arg[2]); + tprints(", "); + } else { + print_rlimit64(tcp, tcp->u_arg[3]); } + return 0; } -#endif - -void -printrusage(struct tcb *tcp, long addr) -{ - struct rusage ru; - if (!addr) - tprints("NULL"); - else if (syserror(tcp) || !verbose(tcp)) - tprintf("%#lx", addr); - else if (umove(tcp, addr, &ru) < 0) - tprints("{...}"); - else if (!abbrev(tcp)) { - tprintf("{ru_utime={%lu, %lu}, ru_stime={%lu, %lu}, ", - (long) ru.ru_utime.tv_sec, (long) ru.ru_utime.tv_usec, - (long) ru.ru_stime.tv_sec, (long) ru.ru_stime.tv_usec); - tprintf("ru_maxrss=%lu, ru_ixrss=%lu, ", - ru.ru_maxrss, ru.ru_ixrss); - tprintf("ru_idrss=%lu, ru_isrss=%lu, ", - ru.ru_idrss, ru.ru_isrss); - tprintf("ru_minflt=%lu, ru_majflt=%lu, ru_nswap=%lu, ", - ru.ru_minflt, ru.ru_majflt, ru.ru_nswap); - tprintf("ru_inblock=%lu, ru_oublock=%lu, ", - ru.ru_inblock, ru.ru_oublock); - tprintf("ru_msgsnd=%lu, ru_msgrcv=%lu, ", - ru.ru_msgsnd, ru.ru_msgrcv); - tprintf("ru_nsignals=%lu, ru_nvcsw=%lu, ru_nivcsw=%lu}", - ru.ru_nsignals, ru.ru_nvcsw, ru.ru_nivcsw); - } - else { - tprintf("{ru_utime={%lu, %lu}, ru_stime={%lu, %lu}, ...}", - (long) ru.ru_utime.tv_sec, (long) ru.ru_utime.tv_usec, - (long) ru.ru_stime.tv_sec, (long) ru.ru_stime.tv_usec); - } -} +#include "xlat/usagewho.h" -int -sys_getrusage(struct tcb *tcp) +SYS_FUNC(getrusage) { if (entering(tcp)) { printxval(usagewho, tcp->u_arg[0], "RUSAGE_???"); @@ -370,8 +167,7 @@ sys_getrusage(struct tcb *tcp) } #ifdef ALPHA -int -sys_osf_getrusage(struct tcb *tcp) +SYS_FUNC(osf_getrusage) { if (entering(tcp)) { printxval(usagewho, tcp->u_arg[0], "RUSAGE_???"); @@ -383,94 +179,20 @@ sys_osf_getrusage(struct tcb *tcp) } #endif /* ALPHA */ -#endif /* !SVR4 */ - -#ifdef LINUX - -int -sys_sysinfo(struct tcb *tcp) -{ - struct sysinfo si; - - if (exiting(tcp)) { - if (syserror(tcp) || !verbose(tcp)) - tprintf("%#lx", tcp->u_arg[0]); - else if (umove(tcp, tcp->u_arg[0], &si) < 0) - tprints("{...}"); - else { - tprintf("{uptime=%lu, loads=[%lu, %lu, %lu] ", - si.uptime, si.loads[0], si.loads[1], - si.loads[2]); - tprintf("totalram=%lu, freeram=%lu, ", - si.totalram, si.freeram); - tprintf("sharedram=%lu, bufferram=%lu} ", - si.sharedram, si.bufferram); - tprintf("totalswap=%lu, freeswap=%lu, procs=%hu}", - si.totalswap, si.freeswap, si.procs); - } - } - return 0; -} - -#endif /* LINUX */ - -static const struct xlat priorities[] = { - { PRIO_PROCESS, "PRIO_PROCESS" }, - { PRIO_PGRP, "PRIO_PGRP" }, - { PRIO_USER, "PRIO_USER" }, - { 0, NULL }, -}; - -int -sys_getpriority(struct tcb *tcp) -{ - if (entering(tcp)) { - printxval(priorities, tcp->u_arg[0], "PRIO_???"); - tprintf(", %lu", tcp->u_arg[1]); - } - return 0; -} +#include "xlat/priorities.h" -int -sys_setpriority(struct tcb *tcp) +SYS_FUNC(getpriority) { - if (entering(tcp)) { - printxval(priorities, tcp->u_arg[0], "PRIO_???"); - tprintf(", %lu, %ld", tcp->u_arg[1], tcp->u_arg[2]); - } - return 0; -} + printxval(priorities, tcp->u_arg[0], "PRIO_???"); + tprintf(", %d", (int) tcp->u_arg[1]); -int -sys_nice(struct tcb *tcp) -{ - if (entering(tcp)) - tprintf("%ld", tcp->u_arg[0]); - return 0; + return RVAL_DECODED; } -#ifndef SUNOS4 - -int -sys_times(struct tcb *tcp) +SYS_FUNC(setpriority) { - struct tms tbuf; + printxval(priorities, tcp->u_arg[0], "PRIO_???"); + tprintf(", %d, %d", (int) tcp->u_arg[1], (int) tcp->u_arg[2]); - if (exiting(tcp)) { - if (tcp->u_arg[0] == 0) - tprints("NULL"); - else if (syserror(tcp)) - tprintf("%#lx", tcp->u_arg[0]); - else if (umove(tcp, tcp->u_arg[0], &tbuf) < 0) - tprints("{...}"); - else { - tprintf("{tms_utime=%lu, tms_stime=%lu, ", - tbuf.tms_utime, tbuf.tms_stime); - tprintf("tms_cutime=%lu, tms_cstime=%lu}", - tbuf.tms_cutime, tbuf.tms_cstime); - } - } - return 0; + return RVAL_DECODED; } - -#endif /* !SUNOS4 */