github.com/afumu/libc@v0.0.6/musl/src/linux/wait4.c (about)

     1  #define _GNU_SOURCE
     2  #include <sys/wait.h>
     3  #include <sys/resource.h>
     4  #include <string.h>
     5  #include <errno.h>
     6  #include "syscall.h"
     7  
     8  pid_t wait4(pid_t pid, int *status, int options, struct rusage *ru)
     9  {
    10  	int r;
    11  #ifdef SYS_wait4_time64
    12  	if (ru) {
    13  		long long kru64[18];
    14  		r = __syscall(SYS_wait4_time64, pid, status, options, kru64);
    15  		if (!r) {
    16  			ru->ru_utime = (struct timeval)
    17  				{ .tv_sec = kru64[0], .tv_usec = kru64[1] };
    18  			ru->ru_stime = (struct timeval)
    19  				{ .tv_sec = kru64[2], .tv_usec = kru64[3] };
    20  			char *slots = (char *)&ru->ru_maxrss;
    21  			for (int i=0; i<14; i++)
    22  				*(long *)(slots + i*sizeof(long)) = kru64[4+i];
    23  		}
    24  		if (SYS_wait4_time64 == SYS_wait4 || r != -ENOSYS)
    25  			return __syscall_ret(r);
    26  	}
    27  #endif
    28  	char *dest = ru ? (char *)&ru->ru_maxrss - 4*sizeof(long) : 0;
    29  	r = __syscall(SYS_wait4, pid, status, options, dest);
    30  	if (r>0 && ru && sizeof(time_t) > sizeof(long)) {
    31  		long kru[4];
    32  		memcpy(kru, dest, 4*sizeof(long));
    33  		ru->ru_utime = (struct timeval)
    34  			{ .tv_sec = kru[0], .tv_usec = kru[1] };
    35  		ru->ru_stime = (struct timeval)
    36  			{ .tv_sec = kru[2], .tv_usec = kru[3] };
    37  	}
    38  	return __syscall_ret(r);
    39  }