xref: /aosp_15_r20/external/ltp/include/tst_safe_macros_inline.h (revision 49cdfc7efb34551c7342be41a7384b9c40d7cab7)
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