1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217
|
/*
* Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
* Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
* Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
* Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
* Copyright (c) 1999-2020 The strace developers.
* All rights reserved.
*
* SPDX-License-Identifier: LGPL-2.1-or-later
*/
#include "defs.h"
#include <sys/resource.h>
#include "xstring.h"
#include "xlat/resources.h"
static void
print_rlim64_t(uint64_t lim) {
const char *str = NULL;
if (lim == UINT64_MAX)
str = "RLIM64_INFINITY";
else if (lim > 1024 && lim % 1024 == 0) {
static char buf[sizeof(lim) * 3 + sizeof("*1024")];
xsprintf(buf, "%" PRIu64 "*1024", lim / 1024);
str = buf;
}
if (!str || xlat_verbose(xlat_verbosity) != XLAT_STYLE_ABBREV)
tprintf("%" PRIu64, lim);
if (!str || xlat_verbose(xlat_verbosity) == XLAT_STYLE_RAW)
return;
(xlat_verbose(xlat_verbosity) == XLAT_STYLE_VERBOSE
? tprints_comment : tprints)(str);
}
static void
print_rlimit64(struct tcb *const tcp, const kernel_ulong_t addr)
{
struct rlimit_64 {
uint64_t rlim_cur;
uint64_t rlim_max;
} rlim;
if (!umove_or_printaddr(tcp, addr, &rlim)) {
tprints("{rlim_cur=");
print_rlim64_t(rlim.rlim_cur);
tprints(", rlim_max=");
print_rlim64_t(rlim.rlim_max);
tprints("}");
}
}
#if !defined(current_wordsize) || current_wordsize == 4
static void
print_rlim32_t(uint32_t lim) {
const char *str = NULL;
if (lim == UINT32_MAX)
str = "RLIM_INFINITY";
else if (lim > 1024 && lim % 1024 == 0) {
static char buf[sizeof(lim) * 3 + sizeof("*1024")];
xsprintf(buf, "%" PRIu32 "*1024", lim / 1024);
str = buf;
}
if (!str || xlat_verbose(xlat_verbosity) != XLAT_STYLE_ABBREV)
tprintf("%" PRIu32, lim);
if (!str || xlat_verbose(xlat_verbosity) == XLAT_STYLE_RAW)
return;
(xlat_verbose(xlat_verbosity) == XLAT_STYLE_VERBOSE
? tprints_comment : tprints)(str);
}
static void
print_rlimit32(struct tcb *const tcp, const kernel_ulong_t addr)
{
struct rlimit_32 {
uint32_t rlim_cur;
uint32_t rlim_max;
} rlim;
if (!umove_or_printaddr(tcp, addr, &rlim)) {
tprints("{rlim_cur=");
print_rlim32_t(rlim.rlim_cur);
tprints(", rlim_max=");
print_rlim32_t(rlim.rlim_max);
tprints("}");
}
}
static void
decode_rlimit(struct tcb *const tcp, const kernel_ulong_t addr)
{
/*
* 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_klongsize == 4)
print_rlimit32(tcp, addr);
else
print_rlimit64(tcp, addr);
}
#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 {
decode_rlimit(tcp, tcp->u_arg[1]);
}
return 0;
}
SYS_FUNC(setrlimit)
{
printxval(resources, tcp->u_arg[0], "RLIMIT_???");
tprints(", ");
decode_rlimit(tcp, tcp->u_arg[1]);
return RVAL_DECODED;
}
SYS_FUNC(prlimit64)
{
if (entering(tcp)) {
printpid(tcp, tcp->u_arg[0], PT_TGID);
tprints(", ");
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;
}
#include "xlat/usagewho.h"
SYS_FUNC(getrusage)
{
if (entering(tcp)) {
printxval(usagewho, tcp->u_arg[0], "RUSAGE_???");
tprints(", ");
} else
printrusage(tcp, tcp->u_arg[1]);
return 0;
}
#ifdef ALPHA
SYS_FUNC(osf_getrusage)
{
if (entering(tcp)) {
printxval(usagewho, tcp->u_arg[0], "RUSAGE_???");
tprints(", ");
} else
printrusage32(tcp, tcp->u_arg[1]);
return 0;
}
#endif /* ALPHA */
#include "xlat/priorities.h"
static void
priority_print_who(struct tcb *tcp, int which, int who)
{
switch (which)
{
case PRIO_PROCESS:
printpid(tcp, who, PT_TGID);
break;
case PRIO_PGRP:
printpid(tcp, who, PT_PGID);
break;
default:
tprintf("%d", who);
break;
}
}
SYS_FUNC(getpriority)
{
printxval(priorities, tcp->u_arg[0], "PRIO_???");
tprints(", ");
priority_print_who(tcp, tcp->u_arg[0], tcp->u_arg[1]);
return RVAL_DECODED;
}
SYS_FUNC(setpriority)
{
printxval(priorities, tcp->u_arg[0], "PRIO_???");
tprints(", ");
priority_print_who(tcp, tcp->u_arg[0], tcp->u_arg[1]);
tprintf(", %d", (int) tcp->u_arg[2]);
return RVAL_DECODED;
}
|