1 /*
2 * Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
3 * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
4 * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
5 * Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. The name of the author may not be used to endorse or promote products
17 * derived from this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 *
30 * $Id: resource.c,v 1.13 2004/10/06 22:14:53 roland Exp $
31 */
32
33 #include "defs.h"
34
35 #include <sys/resource.h>
36 #ifdef LINUX
37 #include <sys/times.h>
38 #include <linux/kernel.h>
39 #ifdef HAVE_ANDROID_OS
40 #define spinlock_t struct spinlock_t
41 #define if_dqblk dqblk
42 #define dqb_curblocks dqb_curspace
43 #else
44 #include <sys/quota.h>
45 #endif
46 #include <linux/quota.h>
47 #endif /* LINUX */
48 #ifdef SUNOS4
49 #include <ufs/quota.h>
50 #endif /* SUNOS4 */
51 #if defined(SVR4) || defined(FREEBSD)
52 #include <sys/times.h>
53 #include <sys/time.h>
54 #endif
55
56 #if HAVE_LONG_LONG_RLIM_T
57 /*
58 * Hacks for systems that have a long long rlim_t
59 */
60
61 #define rlimit64 rlimit /* Ugly hack */
62 #define rlim64_t rlim_t /* Ugly hack */
63 #define RLIM64_INFINITY RLIM_INFINITY /* You guessed it */
64
65 #define sys_getrlimit64 sys_getrlimit
66 #define sys_setrlimit64 sys_setrlimit
67 #endif
68
69 static const struct xlat resources[] = {
70 #ifdef RLIMIT_CPU
71 { RLIMIT_CPU, "RLIMIT_CPU" },
72 #endif
73 #ifdef RLIMIT_FSIZE
74 { RLIMIT_FSIZE, "RLIMIT_FSIZE" },
75 #endif
76 #ifdef RLIMIT_DATA
77 { RLIMIT_DATA, "RLIMIT_DATA" },
78 #endif
79 #ifdef RLIMIT_STACK
80 { RLIMIT_STACK, "RLIMIT_STACK" },
81 #endif
82 #ifdef RLIMIT_CORE
83 { RLIMIT_CORE, "RLIMIT_CORE" },
84 #endif
85 #ifdef RLIMIT_RSS
86 { RLIMIT_RSS, "RLIMIT_RSS" },
87 #endif
88 #ifdef RLIMIT_NPROC
89 { RLIMIT_NPROC,"RLIMIT_NPROC" },
90 #endif
91 #ifdef RLIMIT_NOFILE
92 { RLIMIT_NOFILE,"RLIMIT_NOFILE" },
93 #endif
94 #ifdef RLIMIT_MEMLOCK
95 { RLIMIT_MEMLOCK, "RLIMIT_MEMLOCK" },
96 #endif
97 #ifdef RLIMIT_VMEM
98 { RLIMIT_VMEM, "RLIMIT_VMEM" },
99 #endif
100 #ifdef RLIMIT_AS
101 { RLIMIT_AS, "RLIMIT_AS" },
102 #endif
103 #ifdef RLIMIT_LOCKS
104 { RLIMIT_LOCKS, "RLIMIT_LOCKS" },
105 #endif
106 #ifdef RLIMIT_SIGPENDING
107 { RLIMIT_SIGPENDING, "RLIMIT_SIGPENDING" },
108 #endif
109 #ifdef RLIMIT_MSGQUEUE
110 { RLIMIT_MSGQUEUE, "RLIMIT_MSGQUEUE" },
111 #endif
112 { 0, NULL },
113 };
114
115 #if !HAVE_LONG_LONG_RLIM_T
116 static char *
sprintrlim(lim)117 sprintrlim(lim)
118 long lim;
119 {
120 static char buf[32];
121
122 if (lim == RLIM_INFINITY)
123 sprintf(buf, "RLIM_INFINITY");
124 else if (lim > 1024 && lim%1024 == 0)
125 sprintf(buf, "%ld*1024", lim/1024);
126 else
127 sprintf(buf, "%ld", lim);
128 return buf;
129 }
130
131 int
sys_getrlimit(tcp)132 sys_getrlimit(tcp)
133 struct tcb *tcp;
134 {
135 struct rlimit rlim;
136
137 if (entering(tcp)) {
138 printxval(resources, tcp->u_arg[0], "RLIMIT_???");
139 tprintf(", ");
140 }
141 else {
142 if (syserror(tcp) || !verbose(tcp))
143 tprintf("%#lx", tcp->u_arg[1]);
144 else if (umove(tcp, tcp->u_arg[1], &rlim) < 0)
145 tprintf("{...}");
146 else {
147 tprintf("{rlim_cur=%s,", sprintrlim(rlim.rlim_cur));
148 tprintf(" rlim_max=%s}", sprintrlim(rlim.rlim_max));
149 }
150 }
151 return 0;
152 }
153
154 int
sys_setrlimit(tcp)155 sys_setrlimit(tcp)
156 struct tcb *tcp;
157 {
158 struct rlimit rlim;
159
160 if (entering(tcp)) {
161 printxval(resources, tcp->u_arg[0], "RLIMIT_???");
162 tprintf(", ");
163 if (!verbose(tcp))
164 tprintf("%#lx", tcp->u_arg[1]);
165 else if (umove(tcp, tcp->u_arg[1], &rlim) < 0)
166 tprintf("{...}");
167 else {
168 tprintf("{rlim_cur=%s,", sprintrlim(rlim.rlim_cur));
169 tprintf(" rlim_max=%s}", sprintrlim(rlim.rlim_max));
170 }
171 }
172 return 0;
173 }
174 #endif /* !HAVE_LONG_LONG_RLIM_T */
175
176 #ifndef HAVE_ANDROID_OS
177 #if _LFS64_LARGEFILE || HAVE_LONG_LONG_RLIM_T
178 static char *
sprintrlim64(lim)179 sprintrlim64(lim)
180 rlim64_t lim;
181 {
182 static char buf[64];
183
184 if (lim == RLIM64_INFINITY)
185 sprintf(buf, "RLIM64_INFINITY");
186 else if (lim > 1024 && lim%1024 == 0)
187 sprintf(buf, "%lld*1024", (long long) lim/1024);
188 else
189 sprintf(buf, "%lld", (long long) lim);
190 return buf;
191 }
192
193 int
sys_getrlimit64(tcp)194 sys_getrlimit64(tcp)
195 struct tcb *tcp;
196 {
197 struct rlimit64 rlim;
198
199 if (entering(tcp)) {
200 printxval(resources, tcp->u_arg[0], "RLIMIT_???");
201 tprintf(", ");
202 }
203 else {
204 if (syserror(tcp) || !verbose(tcp))
205 tprintf("%#lx", tcp->u_arg[1]);
206 else if (umove(tcp, tcp->u_arg[1], &rlim) < 0)
207 tprintf("{...}");
208 else {
209 tprintf("{rlim_cur=%s,", sprintrlim64(rlim.rlim_cur));
210 tprintf(" rlim_max=%s}", sprintrlim64(rlim.rlim_max));
211 }
212 }
213 return 0;
214 }
215
216 int
sys_setrlimit64(tcp)217 sys_setrlimit64(tcp)
218 struct tcb *tcp;
219 {
220 struct rlimit64 rlim;
221
222 if (entering(tcp)) {
223 printxval(resources, tcp->u_arg[0], "RLIMIT_???");
224 tprintf(", ");
225 if (!verbose(tcp))
226 tprintf("%#lx", tcp->u_arg[1]);
227 else if (umove(tcp, tcp->u_arg[1], &rlim) < 0)
228 tprintf("{...}");
229 else {
230 tprintf("{rlim_cur=%s,", sprintrlim64(rlim.rlim_cur));
231 tprintf(" rlim_max=%s}", sprintrlim64(rlim.rlim_max));
232 }
233 }
234 return 0;
235 }
236 #endif /* _LFS64_LARGEFILES || HAVE_LONG_LONG_RLIM_T */
237 #endif /* HAVE_ANDROID_OS */
238
239 #ifndef SVR4
240
241 static const struct xlat usagewho[] = {
242 { RUSAGE_SELF, "RUSAGE_SELF" },
243 { RUSAGE_CHILDREN, "RUSAGE_CHILDREN" },
244 #ifdef RUSAGE_BOTH
245 { RUSAGE_BOTH, "RUSAGE_BOTH" },
246 #endif
247 { 0, NULL },
248 };
249
250 #ifdef ALPHA
251 void
printrusage32(tcp,addr)252 printrusage32(tcp, addr)
253 struct tcb *tcp;
254 long addr;
255 {
256 struct timeval32
257 {
258 unsigned tv_sec;
259 unsigned tv_usec;
260 };
261 struct rusage32
262 {
263 struct timeval32 ru_utime; /* user time used */
264 struct timeval32 ru_stime; /* system time used */
265 long ru_maxrss; /* maximum resident set size */
266 long ru_ixrss; /* integral shared memory size */
267 long ru_idrss; /* integral unshared data size */
268 long ru_isrss; /* integral unshared stack size */
269 long ru_minflt; /* page reclaims */
270 long ru_majflt; /* page faults */
271 long ru_nswap; /* swaps */
272 long ru_inblock; /* block input operations */
273 long ru_oublock; /* block output operations */
274 long ru_msgsnd; /* messages sent */
275 long ru_msgrcv; /* messages received */
276 long ru_nsignals; /* signals received */
277 long ru_nvcsw; /* voluntary context switches */
278 long ru_nivcsw; /* involuntary " */
279 } ru;
280
281 if (!addr)
282 tprintf("NULL");
283 else if (syserror(tcp) || !verbose(tcp))
284 tprintf("%#lx", addr);
285 else if (umove(tcp, addr, &ru) < 0)
286 tprintf("{...}");
287 else if (!abbrev(tcp)) {
288 tprintf("{ru_utime={%lu, %lu}, ru_stime={%lu, %lu}, ",
289 (long) ru.ru_utime.tv_sec, (long) ru.ru_utime.tv_usec,
290 (long) ru.ru_stime.tv_sec, (long) ru.ru_stime.tv_usec);
291 tprintf("ru_maxrss=%lu, ru_ixrss=%lu, ",
292 ru.ru_maxrss, ru.ru_ixrss);
293 tprintf("ru_idrss=%lu, ru_isrss=%lu, ",
294 ru.ru_idrss, ru.ru_isrss);
295 tprintf("ru_minflt=%lu, ru_majflt=%lu, ru_nswap=%lu, ",
296 ru.ru_minflt, ru.ru_majflt, ru.ru_nswap);
297 tprintf("ru_inblock=%lu, ru_oublock=%lu, ",
298 ru.ru_inblock, ru.ru_oublock);
299 tprintf("ru_msgsnd=%lu, ru_msgrcv=%lu, ",
300 ru.ru_msgsnd, ru.ru_msgrcv);
301 tprintf("ru_nsignals=%lu, ru_nvcsw=%lu, ru_nivcsw=%lu}",
302 ru.ru_nsignals, ru.ru_nvcsw, ru.ru_nivcsw);
303 }
304 else {
305 tprintf("{ru_utime={%lu, %lu}, ru_stime={%lu, %lu}, ...}",
306 (long) ru.ru_utime.tv_sec, (long) ru.ru_utime.tv_usec,
307 (long) ru.ru_stime.tv_sec, (long) ru.ru_stime.tv_usec);
308 }
309 }
310 #endif
311
312 void
printrusage(tcp,addr)313 printrusage(tcp, addr)
314 struct tcb *tcp;
315 long addr;
316 {
317 struct rusage ru;
318
319 if (!addr)
320 tprintf("NULL");
321 else if (syserror(tcp) || !verbose(tcp))
322 tprintf("%#lx", addr);
323 else if (umove(tcp, addr, &ru) < 0)
324 tprintf("{...}");
325 else if (!abbrev(tcp)) {
326 tprintf("{ru_utime={%lu, %lu}, ru_stime={%lu, %lu}, ",
327 (long) ru.ru_utime.tv_sec, (long) ru.ru_utime.tv_usec,
328 (long) ru.ru_stime.tv_sec, (long) ru.ru_stime.tv_usec);
329 tprintf("ru_maxrss=%lu, ru_ixrss=%lu, ",
330 ru.ru_maxrss, ru.ru_ixrss);
331 tprintf("ru_idrss=%lu, ru_isrss=%lu, ",
332 ru.ru_idrss, ru.ru_isrss);
333 tprintf("ru_minflt=%lu, ru_majflt=%lu, ru_nswap=%lu, ",
334 ru.ru_minflt, ru.ru_majflt, ru.ru_nswap);
335 tprintf("ru_inblock=%lu, ru_oublock=%lu, ",
336 ru.ru_inblock, ru.ru_oublock);
337 tprintf("ru_msgsnd=%lu, ru_msgrcv=%lu, ",
338 ru.ru_msgsnd, ru.ru_msgrcv);
339 tprintf("ru_nsignals=%lu, ru_nvcsw=%lu, ru_nivcsw=%lu}",
340 ru.ru_nsignals, ru.ru_nvcsw, ru.ru_nivcsw);
341 }
342 else {
343 tprintf("{ru_utime={%lu, %lu}, ru_stime={%lu, %lu}, ...}",
344 (long) ru.ru_utime.tv_sec, (long) ru.ru_utime.tv_usec,
345 (long) ru.ru_stime.tv_sec, (long) ru.ru_stime.tv_usec);
346 }
347 }
348
349 int
sys_getrusage(tcp)350 sys_getrusage(tcp)
351 struct tcb *tcp;
352 {
353 if (entering(tcp)) {
354 printxval(usagewho, tcp->u_arg[0], "RUSAGE_???");
355 tprintf(", ");
356 }
357 else
358 printrusage(tcp, tcp->u_arg[1]);
359 return 0;
360 }
361
362 #ifdef ALPHA
363 int
sys_osf_getrusage(tcp)364 sys_osf_getrusage(tcp)
365 struct tcb *tcp;
366 {
367 if (entering(tcp)) {
368 printxval(usagewho, tcp->u_arg[0], "RUSAGE_???");
369 tprintf(", ");
370 }
371 else
372 printrusage32(tcp, tcp->u_arg[1]);
373 return 0;
374 }
375 #endif /* ALPHA */
376
377 #endif /* !SVR4 */
378
379 #ifdef LINUX
380
381 int
sys_sysinfo(tcp)382 sys_sysinfo(tcp)
383 struct tcb *tcp;
384 {
385 struct sysinfo si;
386
387 if (exiting(tcp)) {
388 if (syserror(tcp) || !verbose(tcp))
389 tprintf("%#lx", tcp->u_arg[0]);
390 else if (umove(tcp, tcp->u_arg[0], &si) < 0)
391 tprintf("{...}");
392 else {
393 tprintf("{uptime=%lu, loads=[%lu, %lu, %lu] ",
394 si.uptime, si.loads[0], si.loads[1],
395 si.loads[2]);
396 tprintf("totalram=%lu, freeram=%lu, ",
397 si.totalram, si.freeram);
398 tprintf("sharedram=%lu, bufferram=%lu} ",
399 si.sharedram, si.bufferram);
400 tprintf("totalswap=%lu, freeswap=%lu, procs=%hu}",
401 si.totalswap, si.freeswap, si.procs);
402 }
403 }
404 return 0;
405 }
406
407 #endif /* LINUX */
408
409 static const struct xlat priorities[] = {
410 { PRIO_PROCESS, "PRIO_PROCESS" },
411 { PRIO_PGRP, "PRIO_PGRP" },
412 { PRIO_USER, "PRIO_USER" },
413 { 0, NULL },
414 };
415
416 int
sys_getpriority(tcp)417 sys_getpriority(tcp)
418 struct tcb *tcp;
419 {
420 if (entering(tcp)) {
421 printxval(priorities, tcp->u_arg[0], "PRIO_???");
422 tprintf(", %lu", tcp->u_arg[1]);
423 }
424 return 0;
425 }
426
427 int
sys_setpriority(tcp)428 sys_setpriority(tcp)
429 struct tcb *tcp;
430 {
431 if (entering(tcp)) {
432 printxval(priorities, tcp->u_arg[0], "PRIO_???");
433 tprintf(", %lu, %ld", tcp->u_arg[1], tcp->u_arg[2]);
434 }
435 return 0;
436 }
437
438 int
sys_nice(tcp)439 sys_nice(tcp)
440 struct tcb *tcp;
441 {
442 if (entering(tcp))
443 tprintf("%ld", tcp->u_arg[0]);
444 return 0;
445 }
446
447 #ifndef SUNOS4
448
449 int
sys_times(tcp)450 sys_times(tcp)
451 struct tcb *tcp;
452 {
453 struct tms tbuf;
454
455 if (exiting(tcp)) {
456 if (tcp->u_arg[0] == 0)
457 tprintf("NULL");
458 else if (syserror(tcp))
459 tprintf("%#lx", tcp->u_arg[0]);
460 else if (umove(tcp, tcp->u_arg[0], &tbuf) < 0)
461 tprintf("{...}");
462 else {
463 tprintf("{tms_utime=%lu, tms_stime=%lu, ",
464 tbuf.tms_utime, tbuf.tms_stime);
465 tprintf("tms_cutime=%lu, tms_cstime=%lu}",
466 tbuf.tms_cutime, tbuf.tms_cstime);
467 }
468 }
469 return 0;
470 }
471
472 #endif /* !SUNOS4 */
473
474
475 //#ifndef HAVE_ANDROID_OS
476 #ifdef LINUX
477
478 #define NEW_CMD(c) ((0x80<<16)+(c))
479 #define XQM_CMD(c) (('X'<<8)+(c))
480 #define NEW_COMMAND(c) (( ((c) >> SUBCMDSHIFT) & (0x80 << 16)))
481 #define XQM_COMMAND(c) (( ((c) >> SUBCMDSHIFT) & ('X' << 8)) == ('X' << 8))
482 #define OLD_COMMAND(c) (!NEW_COMMAND(c) && !XQM_COMMAND(c))
483
484 static const struct xlat quotacmds[] = {
485 { Q_QUOTAON, "Q_QUOTAON" },
486 { Q_QUOTAOFF, "Q_QUOTAOFF" },
487 { Q_GETQUOTA, "Q_GETQUOTA" },
488 { Q_SETQUOTA, "Q_SETQUOTA" },
489 #ifndef HAVE_ANDROID_OS
490 { Q_SETUSE, "Q_SETUSE" },
491 #endif
492 { Q_SYNC, "Q_SYNC" },
493 #ifndef HAVE_ANDROID_OS
494 { Q_SETQLIM, "Q_SETQLIM" },
495 { Q_GETSTATS, "Q_GETSTATS" },
496 { Q_RSQUASH, "Q_RSQUASH" },
497 #endif
498 { NEW_CMD(0x1), "Q_SYNC" },
499 { NEW_CMD(0x2), "Q_QUOTAON" },
500 { NEW_CMD(0x3), "Q_QUOTAOFF" },
501 { NEW_CMD(0x4), "Q_GETFMT" },
502 { NEW_CMD(0x5), "Q_GETINFO" },
503 { NEW_CMD(0x6), "Q_SETINFO" },
504 { NEW_CMD(0x7), "Q_GETQUOTA" },
505 { NEW_CMD(0x8), "Q_SETQUOTA" },
506 { XQM_CMD(0x1), "Q_XQUOTAON" },
507 { XQM_CMD(0x2), "Q_XQUOTAOFF" },
508 { XQM_CMD(0x3), "Q_XGETQUOTA" },
509 { XQM_CMD(0x4), "Q_XSETQLIM" },
510 { XQM_CMD(0x5), "Q_XGETQSTAT" },
511 { XQM_CMD(0x6), "Q_XQUOTARM" },
512 { 0, NULL },
513 };
514
515 static const struct xlat quotatypes[] = {
516 { USRQUOTA, "USRQUOTA" },
517 { GRPQUOTA, "GRPQUOTA" },
518 { 0, NULL },
519 };
520
521 int
sys_quotactl(tcp)522 sys_quotactl(tcp)
523 struct tcb *tcp;
524 {
525 /*
526 * The Linux kernel only looks at the low 32 bits of the command
527 * argument, but on some 64-bit architectures (s390x) this word
528 * will have been sign-extended when we see it. The high 1 bits
529 * don't mean anything, so don't confuse the output with them.
530 */
531 unsigned int cmd = tcp->u_arg[0];
532
533 if (entering(tcp)) {
534 printxval(quotacmds, cmd >> SUBCMDSHIFT, "Q_???");
535 tprintf("|");
536 printxval(quotatypes, cmd & SUBCMDMASK, "???QUOTA");
537 tprintf(", ");
538 printstr(tcp, tcp->u_arg[1], -1);
539 tprintf(", %lu, ", tcp->u_arg[2]);
540 }
541 else {
542 struct dqblk dq;
543
544 if (!tcp->u_arg[3])
545 tprintf("NULL");
546 else if (!verbose(tcp) || !OLD_COMMAND(cmd))
547 tprintf("%#lx", tcp->u_arg[3]);
548 else if (umoven(tcp, tcp->u_arg[3], sizeof(struct dqblk),
549 (char *) &dq) < 0)
550 tprintf("???");
551 else {
552 tprintf("{");
553 tprintf("%u, ", dq.dqb_bhardlimit);
554 tprintf("%u, ", dq.dqb_bsoftlimit);
555 tprintf("%u, ", dq.dqb_curblocks);
556 tprintf("%u, ", dq.dqb_ihardlimit);
557 tprintf("%u, ", dq.dqb_isoftlimit);
558 tprintf("%u, ", dq.dqb_curinodes);
559 tprintf("%lu, ", dq.dqb_btime);
560 tprintf("%lu", dq.dqb_itime);
561 tprintf("}");
562 }
563
564 }
565 return 0;
566 }
567
568 #endif /* Linux */
569 //#endif /* HAVE_ANDROID_OS */
570
571 #if defined(SUNOS4) || defined(FREEBSD)
572
573 #ifdef FREEBSD
574 #include <ufs/ufs/quota.h>
575 #endif
576
577 static const struct xlat quotacmds[] = {
578 { Q_QUOTAON, "Q_QUOTAON" },
579 { Q_QUOTAOFF, "Q_QUOTAOFF" },
580 { Q_GETQUOTA, "Q_GETQUOTA" },
581 { Q_SETQUOTA, "Q_SETQUOTA" },
582 #ifdef Q_SETQLIM
583 { Q_SETQLIM, "Q_SETQLIM" },
584 #endif
585 #ifdef Q_SETUSE
586 { Q_SETUSE, "Q_SETUSE" },
587 #endif
588 { Q_SYNC, "Q_SYNC" },
589 { 0, NULL },
590 };
591
592 int
sys_quotactl(tcp)593 sys_quotactl(tcp)
594 struct tcb *tcp;
595 {
596 /* fourth arg (addr) not interpreted here */
597 if (entering(tcp)) {
598 #ifdef SUNOS4
599 printxval(quotacmds, tcp->u_arg[0], "Q_???");
600 tprintf(", ");
601 printstr(tcp, tcp->u_arg[1], -1);
602 #endif
603 #ifdef FREEBSD
604 printpath(tcp, tcp->u_arg[0]);
605 tprintf(", ");
606 printxval(quotacmds, tcp->u_arg[1], "Q_???");
607 #endif
608 tprintf(", %lu, %#lx", tcp->u_arg[2], tcp->u_arg[3]);
609 }
610 return 0;
611 }
612
613 #endif /* SUNOS4 || FREEBSD */
614