• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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