summaryrefslogtreecommitdiff
path: root/compat/time32/wait3_time32.c
blob: 8fe128edbfae0b12bb5001d48ce9c4940a5e9979 (plain) (blame)
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
#define _BSD_SOURCE
#include "time32.h"
#include <string.h>
#include <stddef.h>
#include <sys/wait.h>

struct compat_rusage {
	struct timeval32 ru_utime;
	struct timeval32 ru_stime;
	long	ru_maxrss;
	long	ru_ixrss;
	long	ru_idrss;
	long	ru_isrss;
	long	ru_minflt;
	long	ru_majflt;
	long	ru_nswap;
	long	ru_inblock;
	long	ru_oublock;
	long	ru_msgsnd;
	long	ru_msgrcv;
	long	ru_nsignals;
	long	ru_nvcsw;
	long	ru_nivcsw;
};

pid_t __wait3_time32(int *status, int options, struct compat_rusage *usage)
{
	struct rusage ru;
	int r = wait3(status, options, usage ? &ru : 0);
	if (!r && usage) {
		usage->ru_utime.tv_sec = ru.ru_utime.tv_sec;
		usage->ru_utime.tv_usec = ru.ru_utime.tv_usec;
		usage->ru_stime.tv_sec = ru.ru_stime.tv_sec;
		usage->ru_stime.tv_usec = ru.ru_stime.tv_usec;
		memcpy(&usage->ru_maxrss, &ru.ru_maxrss,
			sizeof(struct compat_rusage) -
			offsetof(struct compat_rusage, ru_maxrss));
	}
	return r;
}