]> granicus.if.org Git - strace/blob - tests/getrusage.c
Update copyright headers
[strace] / tests / getrusage.c
1 /*
2  * Copyright (c) 2016 Fei Jie <feij.fnst@cn.fujitsu.com>
3  * Copyright (c) 2016 Dmitry V. Levin <ldv@altlinux.org>
4  * Copyright (c) 2016-2018 The strace developers.
5  * All rights reserved.
6  *
7  * SPDX-License-Identifier: GPL-2.0-or-later
8  */
9
10 #include "tests.h"
11 #include <asm/unistd.h>
12
13 #ifdef __NR_getrusage
14
15 # include <stdio.h>
16 # include <stdint.h>
17 # include <sys/resource.h>
18 # include <unistd.h>
19 # include <errno.h>
20
21 # include "xlat.h"
22 # include "xlat/usagewho.h"
23
24 int
25 invoke_print(int who, const char *who_str, struct rusage *usage)
26 {
27         int rc = syscall(__NR_getrusage, who, usage);
28         int saved_errno = errno;
29         printf("getrusage(%s, {ru_utime={tv_sec=%lld, tv_usec=%llu}"
30                ", ru_stime={tv_sec=%lld, tv_usec=%llu}, ru_maxrss=%lu"
31                ", ru_ixrss=%lu, ru_idrss=%lu, ru_isrss=%lu, ru_minflt=%lu"
32                ", ru_majflt=%lu, ru_nswap=%lu, ru_inblock=%lu"
33                ", ru_oublock=%lu, ru_msgsnd=%lu, ru_msgrcv=%lu"
34                ", ru_nsignals=%lu, ru_nvcsw=%lu, ru_nivcsw=%lu}) = %s\n",
35                who_str,
36                (long long) usage->ru_utime.tv_sec,
37                zero_extend_signed_to_ull(usage->ru_utime.tv_usec),
38                (long long) usage->ru_stime.tv_sec,
39                zero_extend_signed_to_ull(usage->ru_stime.tv_usec),
40                usage->ru_maxrss, usage->ru_ixrss, usage->ru_idrss,
41                usage->ru_isrss, usage->ru_minflt, usage->ru_majflt,
42                usage->ru_nswap, usage->ru_inblock, usage->ru_oublock,
43                usage->ru_msgsnd, usage->ru_msgrcv, usage->ru_nsignals,
44                usage->ru_nvcsw, usage->ru_nivcsw, sprintrc(rc));
45         errno = saved_errno;
46         return rc;
47 }
48
49 int
50 main(void)
51 {
52         TAIL_ALLOC_OBJECT_CONST_PTR(struct rusage, usage);
53         if (invoke_print(ARG_STR(RUSAGE_SELF), usage)) {
54                 perror_msg_and_fail("RUSAGE_SELF");
55         }
56         if (invoke_print(ARG_STR(RUSAGE_THREAD), usage) && errno != EINVAL) {
57                 perror_msg_and_fail("RUSAGE_THREAD");
58         }
59
60         puts("+++ exited with 0 +++");
61         return 0;
62 }
63
64 #else
65
66 SKIP_MAIN_UNDEFINED("__NR_getrusage")
67
68 #endif