1*49cdfc7eSAndroid Build Coastguard Worker /* SPDX-License-Identifier: GPL-2.0-or-later
2*49cdfc7eSAndroid Build Coastguard Worker * Copyright (c) 2010-2024 Linux Test Project
3*49cdfc7eSAndroid Build Coastguard Worker * Copyright (c) 2011-2015 Cyril Hrubis <[email protected]>
4*49cdfc7eSAndroid Build Coastguard Worker */
5*49cdfc7eSAndroid Build Coastguard Worker
6*49cdfc7eSAndroid Build Coastguard Worker #ifndef TST_SAFE_MACROS_INLINE_H__
7*49cdfc7eSAndroid Build Coastguard Worker #define TST_SAFE_MACROS_INLINE_H__
8*49cdfc7eSAndroid Build Coastguard Worker
9*49cdfc7eSAndroid Build Coastguard Worker /*
10*49cdfc7eSAndroid Build Coastguard Worker * Following functions are inline because the behaviour may depend on
11*49cdfc7eSAndroid Build Coastguard Worker * -D_FILE_OFFSET_BITS=64 compile flag (type off_t or structures containing
12*49cdfc7eSAndroid Build Coastguard Worker * off_t fields), see man off_t(3type).
13*49cdfc7eSAndroid Build Coastguard Worker *
14*49cdfc7eSAndroid Build Coastguard Worker * Do not add other functions here.
15*49cdfc7eSAndroid Build Coastguard Worker */
16*49cdfc7eSAndroid Build Coastguard Worker
safe_ftruncate(const char * file,const int lineno,int fd,off_t length)17*49cdfc7eSAndroid Build Coastguard Worker static inline int safe_ftruncate(const char *file, const int lineno,
18*49cdfc7eSAndroid Build Coastguard Worker int fd, off_t length)
19*49cdfc7eSAndroid Build Coastguard Worker {
20*49cdfc7eSAndroid Build Coastguard Worker int rval;
21*49cdfc7eSAndroid Build Coastguard Worker
22*49cdfc7eSAndroid Build Coastguard Worker rval = ftruncate(fd, length);
23*49cdfc7eSAndroid Build Coastguard Worker
24*49cdfc7eSAndroid Build Coastguard Worker if (rval == -1) {
25*49cdfc7eSAndroid Build Coastguard Worker tst_brk_(file, lineno, TBROK | TERRNO,
26*49cdfc7eSAndroid Build Coastguard Worker "ftruncate(%d,%ld) failed", fd, (long)length);
27*49cdfc7eSAndroid Build Coastguard Worker } else if (rval) {
28*49cdfc7eSAndroid Build Coastguard Worker tst_brk_(file, lineno, TBROK | TERRNO,
29*49cdfc7eSAndroid Build Coastguard Worker "Invalid ftruncate(%d,%ld) return value %d", fd,
30*49cdfc7eSAndroid Build Coastguard Worker (long)length, rval);
31*49cdfc7eSAndroid Build Coastguard Worker }
32*49cdfc7eSAndroid Build Coastguard Worker
33*49cdfc7eSAndroid Build Coastguard Worker return rval;
34*49cdfc7eSAndroid Build Coastguard Worker }
35*49cdfc7eSAndroid Build Coastguard Worker
36*49cdfc7eSAndroid Build Coastguard Worker #define SAFE_FTRUNCATE(fd, length) \
37*49cdfc7eSAndroid Build Coastguard Worker safe_ftruncate(__FILE__, __LINE__, (fd), (length))
38*49cdfc7eSAndroid Build Coastguard Worker
safe_posix_fadvise(const char * file,const int lineno,int fd,off_t offset,off_t len,int advice)39*49cdfc7eSAndroid Build Coastguard Worker static inline int safe_posix_fadvise(const char *file, const int lineno,
40*49cdfc7eSAndroid Build Coastguard Worker int fd, off_t offset, off_t len, int advice)
41*49cdfc7eSAndroid Build Coastguard Worker {
42*49cdfc7eSAndroid Build Coastguard Worker int rval;
43*49cdfc7eSAndroid Build Coastguard Worker
44*49cdfc7eSAndroid Build Coastguard Worker rval = posix_fadvise(fd, offset, len, advice);
45*49cdfc7eSAndroid Build Coastguard Worker
46*49cdfc7eSAndroid Build Coastguard Worker if (rval)
47*49cdfc7eSAndroid Build Coastguard Worker tst_brk_(file, lineno, TBROK,
48*49cdfc7eSAndroid Build Coastguard Worker "posix_fadvise(%d,%ld,%ld,%d) failed: %s",
49*49cdfc7eSAndroid Build Coastguard Worker fd, (long)offset, (long)len, advice, tst_strerrno(rval));
50*49cdfc7eSAndroid Build Coastguard Worker
51*49cdfc7eSAndroid Build Coastguard Worker return rval;
52*49cdfc7eSAndroid Build Coastguard Worker }
53*49cdfc7eSAndroid Build Coastguard Worker
54*49cdfc7eSAndroid Build Coastguard Worker #define SAFE_POSIX_FADVISE(fd, offset, len, advice) \
55*49cdfc7eSAndroid Build Coastguard Worker safe_posix_fadvise(__FILE__, __LINE__, (fd), (offset), (len), (advice))
56*49cdfc7eSAndroid Build Coastguard Worker
safe_truncate(const char * file,const int lineno,const char * path,off_t length)57*49cdfc7eSAndroid Build Coastguard Worker static inline int safe_truncate(const char *file, const int lineno,
58*49cdfc7eSAndroid Build Coastguard Worker const char *path, off_t length)
59*49cdfc7eSAndroid Build Coastguard Worker {
60*49cdfc7eSAndroid Build Coastguard Worker int rval;
61*49cdfc7eSAndroid Build Coastguard Worker
62*49cdfc7eSAndroid Build Coastguard Worker rval = truncate(path, length);
63*49cdfc7eSAndroid Build Coastguard Worker
64*49cdfc7eSAndroid Build Coastguard Worker if (rval == -1) {
65*49cdfc7eSAndroid Build Coastguard Worker tst_brk_(file, lineno, TBROK | TERRNO,
66*49cdfc7eSAndroid Build Coastguard Worker "truncate(%s,%ld) failed", path, (long)length);
67*49cdfc7eSAndroid Build Coastguard Worker } else if (rval) {
68*49cdfc7eSAndroid Build Coastguard Worker tst_brk_(file, lineno, TBROK | TERRNO,
69*49cdfc7eSAndroid Build Coastguard Worker "Invalid truncate(%s,%ld) return value %d", path,
70*49cdfc7eSAndroid Build Coastguard Worker (long)length, rval);
71*49cdfc7eSAndroid Build Coastguard Worker }
72*49cdfc7eSAndroid Build Coastguard Worker
73*49cdfc7eSAndroid Build Coastguard Worker return rval;
74*49cdfc7eSAndroid Build Coastguard Worker }
75*49cdfc7eSAndroid Build Coastguard Worker
76*49cdfc7eSAndroid Build Coastguard Worker #define SAFE_TRUNCATE(path, length) \
77*49cdfc7eSAndroid Build Coastguard Worker safe_truncate(__FILE__, __LINE__, (path), (length))
78*49cdfc7eSAndroid Build Coastguard Worker
safe_stat(const char * file,const int lineno,const char * path,struct stat * buf)79*49cdfc7eSAndroid Build Coastguard Worker static inline int safe_stat(const char *file, const int lineno,
80*49cdfc7eSAndroid Build Coastguard Worker const char *path, struct stat *buf)
81*49cdfc7eSAndroid Build Coastguard Worker {
82*49cdfc7eSAndroid Build Coastguard Worker int rval;
83*49cdfc7eSAndroid Build Coastguard Worker
84*49cdfc7eSAndroid Build Coastguard Worker rval = stat(path, buf);
85*49cdfc7eSAndroid Build Coastguard Worker
86*49cdfc7eSAndroid Build Coastguard Worker if (rval == -1) {
87*49cdfc7eSAndroid Build Coastguard Worker tst_brk_(file, lineno, TBROK | TERRNO,
88*49cdfc7eSAndroid Build Coastguard Worker "stat(%s,%p) failed", path, buf);
89*49cdfc7eSAndroid Build Coastguard Worker } else if (rval) {
90*49cdfc7eSAndroid Build Coastguard Worker tst_brk_(file, lineno, TBROK | TERRNO,
91*49cdfc7eSAndroid Build Coastguard Worker "Invalid stat(%s,%p) return value %d", path, buf,
92*49cdfc7eSAndroid Build Coastguard Worker rval);
93*49cdfc7eSAndroid Build Coastguard Worker }
94*49cdfc7eSAndroid Build Coastguard Worker
95*49cdfc7eSAndroid Build Coastguard Worker return rval;
96*49cdfc7eSAndroid Build Coastguard Worker }
97*49cdfc7eSAndroid Build Coastguard Worker
98*49cdfc7eSAndroid Build Coastguard Worker #define SAFE_STAT(path, buf) \
99*49cdfc7eSAndroid Build Coastguard Worker safe_stat(__FILE__, __LINE__, (path), (buf))
100*49cdfc7eSAndroid Build Coastguard Worker
safe_fstat(const char * file,const int lineno,int fd,struct stat * buf)101*49cdfc7eSAndroid Build Coastguard Worker static inline int safe_fstat(const char *file, const int lineno,
102*49cdfc7eSAndroid Build Coastguard Worker int fd, struct stat *buf)
103*49cdfc7eSAndroid Build Coastguard Worker {
104*49cdfc7eSAndroid Build Coastguard Worker int rval;
105*49cdfc7eSAndroid Build Coastguard Worker
106*49cdfc7eSAndroid Build Coastguard Worker rval = fstat(fd, buf);
107*49cdfc7eSAndroid Build Coastguard Worker
108*49cdfc7eSAndroid Build Coastguard Worker if (rval == -1) {
109*49cdfc7eSAndroid Build Coastguard Worker tst_brk_(file, lineno, TBROK | TERRNO,
110*49cdfc7eSAndroid Build Coastguard Worker "fstat(%d,%p) failed", fd, buf);
111*49cdfc7eSAndroid Build Coastguard Worker } else if (rval) {
112*49cdfc7eSAndroid Build Coastguard Worker tst_brk_(file, lineno, TBROK | TERRNO,
113*49cdfc7eSAndroid Build Coastguard Worker "Invalid fstat(%d,%p) return value %d", fd, buf, rval);
114*49cdfc7eSAndroid Build Coastguard Worker }
115*49cdfc7eSAndroid Build Coastguard Worker
116*49cdfc7eSAndroid Build Coastguard Worker return rval;
117*49cdfc7eSAndroid Build Coastguard Worker }
118*49cdfc7eSAndroid Build Coastguard Worker #define SAFE_FSTAT(fd, buf) \
119*49cdfc7eSAndroid Build Coastguard Worker safe_fstat(__FILE__, __LINE__, (fd), (buf))
120*49cdfc7eSAndroid Build Coastguard Worker
safe_lstat(const char * file,const int lineno,const char * path,struct stat * buf)121*49cdfc7eSAndroid Build Coastguard Worker static inline int safe_lstat(const char *file, const int lineno,
122*49cdfc7eSAndroid Build Coastguard Worker const char *path, struct stat *buf)
123*49cdfc7eSAndroid Build Coastguard Worker {
124*49cdfc7eSAndroid Build Coastguard Worker int rval;
125*49cdfc7eSAndroid Build Coastguard Worker
126*49cdfc7eSAndroid Build Coastguard Worker rval = lstat(path, buf);
127*49cdfc7eSAndroid Build Coastguard Worker
128*49cdfc7eSAndroid Build Coastguard Worker if (rval == -1) {
129*49cdfc7eSAndroid Build Coastguard Worker tst_brk_(file, lineno, TBROK | TERRNO,
130*49cdfc7eSAndroid Build Coastguard Worker "lstat(%s,%p) failed", path, buf);
131*49cdfc7eSAndroid Build Coastguard Worker } else if (rval) {
132*49cdfc7eSAndroid Build Coastguard Worker tst_brk_(file, lineno, TBROK | TERRNO,
133*49cdfc7eSAndroid Build Coastguard Worker "Invalid lstat(%s,%p) return value %d", path, buf,
134*49cdfc7eSAndroid Build Coastguard Worker rval);
135*49cdfc7eSAndroid Build Coastguard Worker }
136*49cdfc7eSAndroid Build Coastguard Worker
137*49cdfc7eSAndroid Build Coastguard Worker return rval;
138*49cdfc7eSAndroid Build Coastguard Worker }
139*49cdfc7eSAndroid Build Coastguard Worker #define SAFE_LSTAT(path, buf) \
140*49cdfc7eSAndroid Build Coastguard Worker safe_lstat(__FILE__, __LINE__, (path), (buf))
141*49cdfc7eSAndroid Build Coastguard Worker
safe_statfs(const char * file,const int lineno,const char * path,struct statfs * buf)142*49cdfc7eSAndroid Build Coastguard Worker static inline int safe_statfs(const char *file, const int lineno,
143*49cdfc7eSAndroid Build Coastguard Worker const char *path, struct statfs *buf)
144*49cdfc7eSAndroid Build Coastguard Worker {
145*49cdfc7eSAndroid Build Coastguard Worker int rval;
146*49cdfc7eSAndroid Build Coastguard Worker
147*49cdfc7eSAndroid Build Coastguard Worker rval = statfs(path, buf);
148*49cdfc7eSAndroid Build Coastguard Worker
149*49cdfc7eSAndroid Build Coastguard Worker if (rval == -1) {
150*49cdfc7eSAndroid Build Coastguard Worker tst_brk_(file, lineno, TBROK | TERRNO,
151*49cdfc7eSAndroid Build Coastguard Worker "statfs(%s,%p) failed", path, buf);
152*49cdfc7eSAndroid Build Coastguard Worker } else if (rval) {
153*49cdfc7eSAndroid Build Coastguard Worker tst_brk_(file, lineno, TBROK | TERRNO,
154*49cdfc7eSAndroid Build Coastguard Worker "Invalid statfs(%s,%p) return value %d", path, buf,
155*49cdfc7eSAndroid Build Coastguard Worker rval);
156*49cdfc7eSAndroid Build Coastguard Worker }
157*49cdfc7eSAndroid Build Coastguard Worker
158*49cdfc7eSAndroid Build Coastguard Worker return rval;
159*49cdfc7eSAndroid Build Coastguard Worker }
160*49cdfc7eSAndroid Build Coastguard Worker
161*49cdfc7eSAndroid Build Coastguard Worker #define SAFE_STATFS(path, buf) \
162*49cdfc7eSAndroid Build Coastguard Worker safe_statfs(__FILE__, __LINE__, (path), (buf))
163*49cdfc7eSAndroid Build Coastguard Worker
safe_lseek(const char * file,const int lineno,int fd,off_t offset,int whence)164*49cdfc7eSAndroid Build Coastguard Worker static inline off_t safe_lseek(const char *file, const int lineno,
165*49cdfc7eSAndroid Build Coastguard Worker int fd, off_t offset, int whence)
166*49cdfc7eSAndroid Build Coastguard Worker {
167*49cdfc7eSAndroid Build Coastguard Worker off_t rval;
168*49cdfc7eSAndroid Build Coastguard Worker
169*49cdfc7eSAndroid Build Coastguard Worker rval = lseek(fd, offset, whence);
170*49cdfc7eSAndroid Build Coastguard Worker
171*49cdfc7eSAndroid Build Coastguard Worker if (rval == (off_t) -1) {
172*49cdfc7eSAndroid Build Coastguard Worker tst_brk_(file, lineno, TBROK | TERRNO,
173*49cdfc7eSAndroid Build Coastguard Worker "lseek(%d,%ld,%d) failed", fd, (long)offset, whence);
174*49cdfc7eSAndroid Build Coastguard Worker } else if (rval < 0) {
175*49cdfc7eSAndroid Build Coastguard Worker tst_brk_(file, lineno, TBROK | TERRNO,
176*49cdfc7eSAndroid Build Coastguard Worker "Invalid lseek(%d,%ld,%d) return value %ld", fd,
177*49cdfc7eSAndroid Build Coastguard Worker (long)offset, whence, (long)rval);
178*49cdfc7eSAndroid Build Coastguard Worker }
179*49cdfc7eSAndroid Build Coastguard Worker
180*49cdfc7eSAndroid Build Coastguard Worker return rval;
181*49cdfc7eSAndroid Build Coastguard Worker }
182*49cdfc7eSAndroid Build Coastguard Worker
183*49cdfc7eSAndroid Build Coastguard Worker #define SAFE_LSEEK(fd, offset, whence) \
184*49cdfc7eSAndroid Build Coastguard Worker safe_lseek(__FILE__, __LINE__, (fd), (offset), (whence))
185*49cdfc7eSAndroid Build Coastguard Worker
safe_getrlimit(const char * file,const int lineno,int resource,struct rlimit * rlim)186*49cdfc7eSAndroid Build Coastguard Worker static inline int safe_getrlimit(const char *file, const int lineno,
187*49cdfc7eSAndroid Build Coastguard Worker int resource, struct rlimit *rlim)
188*49cdfc7eSAndroid Build Coastguard Worker {
189*49cdfc7eSAndroid Build Coastguard Worker int rval;
190*49cdfc7eSAndroid Build Coastguard Worker
191*49cdfc7eSAndroid Build Coastguard Worker rval = getrlimit(resource, rlim);
192*49cdfc7eSAndroid Build Coastguard Worker
193*49cdfc7eSAndroid Build Coastguard Worker if (rval == -1) {
194*49cdfc7eSAndroid Build Coastguard Worker tst_brk_(file, lineno, TBROK | TERRNO,
195*49cdfc7eSAndroid Build Coastguard Worker "getrlimit(%d,%p) failed", resource, rlim);
196*49cdfc7eSAndroid Build Coastguard Worker } else if (rval) {
197*49cdfc7eSAndroid Build Coastguard Worker tst_brk_(file, lineno, TBROK | TERRNO,
198*49cdfc7eSAndroid Build Coastguard Worker "Invalid getrlimit(%d,%p) return value %d", resource,
199*49cdfc7eSAndroid Build Coastguard Worker rlim, rval);
200*49cdfc7eSAndroid Build Coastguard Worker }
201*49cdfc7eSAndroid Build Coastguard Worker
202*49cdfc7eSAndroid Build Coastguard Worker return rval;
203*49cdfc7eSAndroid Build Coastguard Worker }
204*49cdfc7eSAndroid Build Coastguard Worker
205*49cdfc7eSAndroid Build Coastguard Worker #define SAFE_GETRLIMIT(resource, rlim) \
206*49cdfc7eSAndroid Build Coastguard Worker safe_getrlimit(__FILE__, __LINE__, (resource), (rlim))
207*49cdfc7eSAndroid Build Coastguard Worker
safe_setrlimit(const char * file,const int lineno,int resource,const struct rlimit * rlim)208*49cdfc7eSAndroid Build Coastguard Worker static inline int safe_setrlimit(const char *file, const int lineno,
209*49cdfc7eSAndroid Build Coastguard Worker int resource, const struct rlimit *rlim)
210*49cdfc7eSAndroid Build Coastguard Worker {
211*49cdfc7eSAndroid Build Coastguard Worker int rval;
212*49cdfc7eSAndroid Build Coastguard Worker
213*49cdfc7eSAndroid Build Coastguard Worker rval = setrlimit(resource, rlim);
214*49cdfc7eSAndroid Build Coastguard Worker
215*49cdfc7eSAndroid Build Coastguard Worker if (rval == -1) {
216*49cdfc7eSAndroid Build Coastguard Worker tst_brk_(file, lineno, TBROK | TERRNO,
217*49cdfc7eSAndroid Build Coastguard Worker "setrlimit(%d,%p) failed", resource, rlim);
218*49cdfc7eSAndroid Build Coastguard Worker } else if (rval) {
219*49cdfc7eSAndroid Build Coastguard Worker tst_brk_(file, lineno, TBROK | TERRNO,
220*49cdfc7eSAndroid Build Coastguard Worker "Invalid setrlimit(%d,%p) return value %d", resource,
221*49cdfc7eSAndroid Build Coastguard Worker rlim, rval);
222*49cdfc7eSAndroid Build Coastguard Worker }
223*49cdfc7eSAndroid Build Coastguard Worker
224*49cdfc7eSAndroid Build Coastguard Worker return rval;
225*49cdfc7eSAndroid Build Coastguard Worker }
226*49cdfc7eSAndroid Build Coastguard Worker
227*49cdfc7eSAndroid Build Coastguard Worker #define SAFE_SETRLIMIT(resource, rlim) \
228*49cdfc7eSAndroid Build Coastguard Worker safe_setrlimit(__FILE__, __LINE__, (resource), (rlim))
229*49cdfc7eSAndroid Build Coastguard Worker
230*49cdfc7eSAndroid Build Coastguard Worker #endif /* TST_SAFE_MACROS_INLINE_H__ */
231