(root)/
strace-6.5/
tests-mx32/
getrusage.c
       1  /*
       2   * Check decoding of getrusage syscall.
       3   *
       4   * Copyright (c) 2016 Fei Jie <feij.fnst@cn.fujitsu.com>
       5   * Copyright (c) 2016 Dmitry V. Levin <ldv@strace.io>
       6   * Copyright (c) 2016-2021 The strace developers.
       7   * All rights reserved.
       8   *
       9   * SPDX-License-Identifier: GPL-2.0-or-later
      10   */
      11  
      12  #include "tests.h"
      13  #include "scno.h"
      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 "kernel_rusage.h"
      22  #include "xlat.h"
      23  #include "xlat/usagewho.h"
      24  
      25  static int
      26  invoke_print(int who, const char *who_str, kernel_rusage_t *usage)
      27  {
      28  	int rc = syscall(__NR_getrusage, who, usage);
      29  	int saved_errno = errno;
      30  	printf("getrusage(%s, {ru_utime={tv_sec=%lld, tv_usec=%llu}"
      31  	       ", ru_stime={tv_sec=%lld, tv_usec=%llu}, ru_maxrss=%llu"
      32  	       ", ru_ixrss=%llu, ru_idrss=%llu, ru_isrss=%llu, ru_minflt=%llu"
      33  	       ", ru_majflt=%llu, ru_nswap=%llu, ru_inblock=%llu"
      34  	       ", ru_oublock=%llu, ru_msgsnd=%llu, ru_msgrcv=%llu"
      35  	       ", ru_nsignals=%llu, ru_nvcsw=%llu, ru_nivcsw=%llu}) = %s\n",
      36  	       who_str,
      37  	       (long long) usage->ru_utime.tv_sec,
      38  	       zero_extend_signed_to_ull(usage->ru_utime.tv_usec),
      39  	       (long long) usage->ru_stime.tv_sec,
      40  	       zero_extend_signed_to_ull(usage->ru_stime.tv_usec),
      41  	       zero_extend_signed_to_ull(usage->ru_maxrss),
      42  	       zero_extend_signed_to_ull(usage->ru_ixrss),
      43  	       zero_extend_signed_to_ull(usage->ru_idrss),
      44  	       zero_extend_signed_to_ull(usage->ru_isrss),
      45  	       zero_extend_signed_to_ull(usage->ru_minflt),
      46  	       zero_extend_signed_to_ull(usage->ru_majflt),
      47  	       zero_extend_signed_to_ull(usage->ru_nswap),
      48  	       zero_extend_signed_to_ull(usage->ru_inblock),
      49  	       zero_extend_signed_to_ull(usage->ru_oublock),
      50  	       zero_extend_signed_to_ull(usage->ru_msgsnd),
      51  	       zero_extend_signed_to_ull(usage->ru_msgrcv),
      52  	       zero_extend_signed_to_ull(usage->ru_nsignals),
      53  	       zero_extend_signed_to_ull(usage->ru_nvcsw),
      54  	       zero_extend_signed_to_ull(usage->ru_nivcsw),
      55  	       sprintrc(rc));
      56  	errno = saved_errno;
      57  	return rc;
      58  }
      59  
      60  int
      61  main(void)
      62  {
      63  	TAIL_ALLOC_OBJECT_CONST_PTR(kernel_rusage_t, usage);
      64  	if (invoke_print(ARG_STR(RUSAGE_SELF), usage)) {
      65  		perror_msg_and_fail("RUSAGE_SELF");
      66  	}
      67  	if (invoke_print(ARG_STR(RUSAGE_THREAD), usage) && errno != EINVAL) {
      68  		perror_msg_and_fail("RUSAGE_THREAD");
      69  	}
      70  
      71  	puts("+++ exited with 0 +++");
      72  	return 0;
      73  }