xref: /minix3/minix/lib/libc/sys/getrusage.c (revision 433d6423c39e34ec4b79c950597bb2d236f886be)
1*433d6423SLionel Sambuc #include <sys/cdefs.h>
2*433d6423SLionel Sambuc #include "namespace.h"
3*433d6423SLionel Sambuc #include <lib.h>
4*433d6423SLionel Sambuc 
5*433d6423SLionel Sambuc #include <string.h>
6*433d6423SLionel Sambuc #include <unistd.h>
7*433d6423SLionel Sambuc #include <sys/resource.h>
8*433d6423SLionel Sambuc 
9*433d6423SLionel Sambuc int getrusage(int who, struct rusage *r_usage)
10*433d6423SLionel Sambuc {
11*433d6423SLionel Sambuc 	int rc;
12*433d6423SLionel Sambuc 	message m;
13*433d6423SLionel Sambuc 
14*433d6423SLionel Sambuc 	memset(&m, 0, sizeof(m));
15*433d6423SLionel Sambuc 	m.m_lc_pm_rusage.who = who;
16*433d6423SLionel Sambuc 	m.m_lc_pm_rusage.addr = (vir_bytes)r_usage;
17*433d6423SLionel Sambuc 
18*433d6423SLionel Sambuc 	if (r_usage == NULL) {
19*433d6423SLionel Sambuc 		errno = EFAULT;
20*433d6423SLionel Sambuc 		return -1;
21*433d6423SLionel Sambuc 	}
22*433d6423SLionel Sambuc 	if (who != RUSAGE_SELF && who != RUSAGE_CHILDREN) {
23*433d6423SLionel Sambuc 		errno = EINVAL;
24*433d6423SLionel Sambuc 		return -1;
25*433d6423SLionel Sambuc 	}
26*433d6423SLionel Sambuc 
27*433d6423SLionel Sambuc 	memset(r_usage, 0, sizeof(struct rusage));
28*433d6423SLionel Sambuc 	if ((rc = _syscall(PM_PROC_NR, PM_GETRUSAGE, &m)) < 0)
29*433d6423SLionel Sambuc 		return rc;
30*433d6423SLionel Sambuc 
31*433d6423SLionel Sambuc 	memset(&m, 0, sizeof(m));
32*433d6423SLionel Sambuc 	m.m_lc_vfs_rusage.addr = (vir_bytes)r_usage;
33*433d6423SLionel Sambuc 	if ((rc = _syscall(VFS_PROC_NR, VFS_GETRUSAGE, &m)) < 0)
34*433d6423SLionel Sambuc 		return rc;
35*433d6423SLionel Sambuc 
36*433d6423SLionel Sambuc 	memset(&m, 0, sizeof(m));
37*433d6423SLionel Sambuc 	m.m_lc_vm_rusage.addr = (vir_bytes)r_usage;
38*433d6423SLionel Sambuc 	return _syscall(VM_PROC_NR, VM_GETRUSAGE, &m);
39*433d6423SLionel Sambuc }
40