1 /* Compatibility definitions for 'struct timeval' with 32-bit time_t.
2    Copyright (C) 2020-2022 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4 
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9 
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14 
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, see
17    <http://www.gnu.org/licenses/>.  */
18 
19 #ifndef _TV32_COMPAT_H
20 #define _TV32_COMPAT_H 1
21 
22 #include <bits/types/time_t.h>
23 #include <sys/resource.h>
24 
25 /* Structures containing 'struct timeval' with 32-bit time_t.  */
26 struct __itimerval32
27 {
28   struct __timeval32 it_interval;
29   struct __timeval32 it_value;
30 };
31 
32 struct __rusage32
33 {
34   struct __timeval32 ru_utime;	/* user time used */
35   struct __timeval32 ru_stime;	/* system time used */
36   long ru_maxrss;		/* maximum resident set size */
37   long ru_ixrss;		/* integral shared memory size */
38   long ru_idrss;		/* integral unshared data size */
39   long ru_isrss;		/* integral unshared stack size */
40   long ru_minflt;		/* page reclaims */
41   long ru_majflt;		/* page faults */
42   long ru_nswap;		/* swaps */
43   long ru_inblock;		/* block input operations */
44   long ru_oublock;		/* block output operations */
45   long ru_msgsnd;		/* messages sent */
46   long ru_msgrcv;		/* messages received */
47   long ru_nsignals;		/* signals received */
48   long ru_nvcsw;		/* voluntary context switches */
49   long ru_nivcsw;		/* involuntary " */
50 };
51 
52 static inline void
rusage32_to_rusage64(const struct __rusage32 * restrict r32,struct __rusage64 * restrict r64)53 rusage32_to_rusage64 (const struct __rusage32 *restrict r32,
54                     struct __rusage64 *restrict r64)
55 {
56   /* Make sure the entire output structure is cleared, including
57      padding and reserved fields.  */
58   memset (r64, 0, sizeof *r64);
59 
60   r64->ru_utime    = valid_timeval32_to_timeval64 (r32->ru_utime);
61   r64->ru_stime    = valid_timeval32_to_timeval64 (r32->ru_stime);
62   r64->ru_maxrss   = r32->ru_maxrss;
63   r64->ru_ixrss    = r32->ru_ixrss;
64   r64->ru_idrss    = r32->ru_idrss;
65   r64->ru_isrss    = r32->ru_isrss;
66   r64->ru_minflt   = r32->ru_minflt;
67   r64->ru_majflt   = r32->ru_majflt;
68   r64->ru_nswap    = r32->ru_nswap;
69   r64->ru_inblock  = r32->ru_inblock;
70   r64->ru_oublock  = r32->ru_oublock;
71   r64->ru_msgsnd   = r32->ru_msgsnd;
72   r64->ru_msgrcv   = r32->ru_msgrcv;
73   r64->ru_nsignals = r32->ru_nsignals;
74   r64->ru_nvcsw    = r32->ru_nvcsw;
75   r64->ru_nivcsw   = r32->ru_nivcsw;
76 }
77 
78 static inline void
rusage64_to_rusage32(const struct __rusage64 * restrict r64,struct __rusage32 * restrict r32)79 rusage64_to_rusage32 (const struct __rusage64 *restrict r64,
80                     struct __rusage32 *restrict r32)
81 {
82   /* Make sure the entire output structure is cleared, including
83      padding and reserved fields.  */
84   memset (r32, 0, sizeof *r32);
85 
86   r32->ru_utime    = valid_timeval64_to_timeval32 (r64->ru_utime);
87   r32->ru_stime    = valid_timeval64_to_timeval32 (r64->ru_stime);
88   r32->ru_maxrss   = r64->ru_maxrss;
89   r32->ru_ixrss    = r64->ru_ixrss;
90   r32->ru_idrss    = r64->ru_idrss;
91   r32->ru_isrss    = r64->ru_isrss;
92   r32->ru_minflt   = r64->ru_minflt;
93   r32->ru_majflt   = r64->ru_majflt;
94   r32->ru_nswap    = r64->ru_nswap;
95   r32->ru_inblock  = r64->ru_inblock;
96   r32->ru_oublock  = r64->ru_oublock;
97   r32->ru_msgsnd   = r64->ru_msgsnd;
98   r32->ru_msgrcv   = r64->ru_msgrcv;
99   r32->ru_nsignals = r64->ru_nsignals;
100   r32->ru_nvcsw    = r64->ru_nvcsw;
101   r32->ru_nivcsw   = r64->ru_nivcsw;
102 }
103 
104 #endif /* tv32-compat.h */
105