xref: /aosp_15_r20/external/ltp/lib/safe_macros.c (revision 49cdfc7efb34551c7342be41a7384b9c40d7cab7)
1*49cdfc7eSAndroid Build Coastguard Worker // SPDX-License-Identifier: GPL-2.0-or-later
2*49cdfc7eSAndroid Build Coastguard Worker /*
3*49cdfc7eSAndroid Build Coastguard Worker  * Copyright (c) Linux Test Project, 2010-2020
4*49cdfc7eSAndroid Build Coastguard Worker  */
5*49cdfc7eSAndroid Build Coastguard Worker 
6*49cdfc7eSAndroid Build Coastguard Worker #define _GNU_SOURCE
7*49cdfc7eSAndroid Build Coastguard Worker #include <sys/types.h>
8*49cdfc7eSAndroid Build Coastguard Worker #include <sys/mman.h>
9*49cdfc7eSAndroid Build Coastguard Worker #include <sys/resource.h>
10*49cdfc7eSAndroid Build Coastguard Worker #include <sys/stat.h>
11*49cdfc7eSAndroid Build Coastguard Worker #include <sys/wait.h>
12*49cdfc7eSAndroid Build Coastguard Worker #include <sys/mount.h>
13*49cdfc7eSAndroid Build Coastguard Worker #include <sys/xattr.h>
14*49cdfc7eSAndroid Build Coastguard Worker #include <sys/sysinfo.h>
15*49cdfc7eSAndroid Build Coastguard Worker #include <errno.h>
16*49cdfc7eSAndroid Build Coastguard Worker #include <libgen.h>
17*49cdfc7eSAndroid Build Coastguard Worker #include <limits.h>
18*49cdfc7eSAndroid Build Coastguard Worker #include <pwd.h>
19*49cdfc7eSAndroid Build Coastguard Worker #include <stdarg.h>
20*49cdfc7eSAndroid Build Coastguard Worker #include <stdlib.h>
21*49cdfc7eSAndroid Build Coastguard Worker #include <unistd.h>
22*49cdfc7eSAndroid Build Coastguard Worker #include <malloc.h>
23*49cdfc7eSAndroid Build Coastguard Worker #include <math.h>
24*49cdfc7eSAndroid Build Coastguard Worker #include "lapi/fcntl.h"
25*49cdfc7eSAndroid Build Coastguard Worker #include "test.h"
26*49cdfc7eSAndroid Build Coastguard Worker #include "safe_macros.h"
27*49cdfc7eSAndroid Build Coastguard Worker 
safe_basename(const char * file,const int lineno,void (* cleanup_fn)(void),char * path)28*49cdfc7eSAndroid Build Coastguard Worker char *safe_basename(const char *file, const int lineno,
29*49cdfc7eSAndroid Build Coastguard Worker 		    void (*cleanup_fn) (void), char *path)
30*49cdfc7eSAndroid Build Coastguard Worker {
31*49cdfc7eSAndroid Build Coastguard Worker 	char *rval;
32*49cdfc7eSAndroid Build Coastguard Worker 
33*49cdfc7eSAndroid Build Coastguard Worker 	rval = basename(path);
34*49cdfc7eSAndroid Build Coastguard Worker 
35*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == NULL) {
36*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
37*49cdfc7eSAndroid Build Coastguard Worker 			"basename(%s) failed", path);
38*49cdfc7eSAndroid Build Coastguard Worker 	}
39*49cdfc7eSAndroid Build Coastguard Worker 
40*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
41*49cdfc7eSAndroid Build Coastguard Worker }
42*49cdfc7eSAndroid Build Coastguard Worker 
43*49cdfc7eSAndroid Build Coastguard Worker int
safe_chdir(const char * file,const int lineno,void (* cleanup_fn)(void),const char * path)44*49cdfc7eSAndroid Build Coastguard Worker safe_chdir(const char *file, const int lineno, void (*cleanup_fn) (void),
45*49cdfc7eSAndroid Build Coastguard Worker 	   const char *path)
46*49cdfc7eSAndroid Build Coastguard Worker {
47*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
48*49cdfc7eSAndroid Build Coastguard Worker 
49*49cdfc7eSAndroid Build Coastguard Worker 	rval = chdir(path);
50*49cdfc7eSAndroid Build Coastguard Worker 
51*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
52*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
53*49cdfc7eSAndroid Build Coastguard Worker 			"chdir(%s) failed", path);
54*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
55*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
56*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid chdir(%s) return value %d", path, rval);
57*49cdfc7eSAndroid Build Coastguard Worker 	}
58*49cdfc7eSAndroid Build Coastguard Worker 
59*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
60*49cdfc7eSAndroid Build Coastguard Worker }
61*49cdfc7eSAndroid Build Coastguard Worker 
62*49cdfc7eSAndroid Build Coastguard Worker int
safe_close(const char * file,const int lineno,void (* cleanup_fn)(void),int fildes)63*49cdfc7eSAndroid Build Coastguard Worker safe_close(const char *file, const int lineno, void (*cleanup_fn) (void),
64*49cdfc7eSAndroid Build Coastguard Worker 	   int fildes)
65*49cdfc7eSAndroid Build Coastguard Worker {
66*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
67*49cdfc7eSAndroid Build Coastguard Worker 
68*49cdfc7eSAndroid Build Coastguard Worker 	rval = close(fildes);
69*49cdfc7eSAndroid Build Coastguard Worker 
70*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
71*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
72*49cdfc7eSAndroid Build Coastguard Worker 			"close(%d) failed", fildes);
73*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
74*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
75*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid close(%d) return value %d", fildes, rval);
76*49cdfc7eSAndroid Build Coastguard Worker 	}
77*49cdfc7eSAndroid Build Coastguard Worker 
78*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
79*49cdfc7eSAndroid Build Coastguard Worker }
80*49cdfc7eSAndroid Build Coastguard Worker 
81*49cdfc7eSAndroid Build Coastguard Worker int
safe_creat(const char * file,const int lineno,void (* cleanup_fn)(void),const char * pathname,mode_t mode)82*49cdfc7eSAndroid Build Coastguard Worker safe_creat(const char *file, const int lineno, void (*cleanup_fn) (void),
83*49cdfc7eSAndroid Build Coastguard Worker 	   const char *pathname, mode_t mode)
84*49cdfc7eSAndroid Build Coastguard Worker {
85*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
86*49cdfc7eSAndroid Build Coastguard Worker 
87*49cdfc7eSAndroid Build Coastguard Worker 	rval = creat(pathname, mode);
88*49cdfc7eSAndroid Build Coastguard Worker 
89*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
90*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
91*49cdfc7eSAndroid Build Coastguard Worker 			"creat(%s,%04o) failed", pathname, mode);
92*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval < 0) {
93*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
94*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid creat(%s,%04o) return value %d", pathname,
95*49cdfc7eSAndroid Build Coastguard Worker 			mode, rval);
96*49cdfc7eSAndroid Build Coastguard Worker 	}
97*49cdfc7eSAndroid Build Coastguard Worker 
98*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
99*49cdfc7eSAndroid Build Coastguard Worker }
100*49cdfc7eSAndroid Build Coastguard Worker 
safe_dirname(const char * file,const int lineno,void (* cleanup_fn)(void),char * path)101*49cdfc7eSAndroid Build Coastguard Worker char *safe_dirname(const char *file, const int lineno,
102*49cdfc7eSAndroid Build Coastguard Worker 		   void (*cleanup_fn) (void), char *path)
103*49cdfc7eSAndroid Build Coastguard Worker {
104*49cdfc7eSAndroid Build Coastguard Worker 	char *rval;
105*49cdfc7eSAndroid Build Coastguard Worker 
106*49cdfc7eSAndroid Build Coastguard Worker 	rval = dirname(path);
107*49cdfc7eSAndroid Build Coastguard Worker 
108*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == NULL) {
109*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
110*49cdfc7eSAndroid Build Coastguard Worker 			"dirname(%s) failed", path);
111*49cdfc7eSAndroid Build Coastguard Worker 	}
112*49cdfc7eSAndroid Build Coastguard Worker 
113*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
114*49cdfc7eSAndroid Build Coastguard Worker }
115*49cdfc7eSAndroid Build Coastguard Worker 
safe_getcwd(const char * file,const int lineno,void (* cleanup_fn)(void),char * buf,size_t size)116*49cdfc7eSAndroid Build Coastguard Worker char *safe_getcwd(const char *file, const int lineno, void (*cleanup_fn) (void),
117*49cdfc7eSAndroid Build Coastguard Worker 		  char *buf, size_t size)
118*49cdfc7eSAndroid Build Coastguard Worker {
119*49cdfc7eSAndroid Build Coastguard Worker 	char *rval;
120*49cdfc7eSAndroid Build Coastguard Worker 
121*49cdfc7eSAndroid Build Coastguard Worker 	rval = getcwd(buf, size);
122*49cdfc7eSAndroid Build Coastguard Worker 
123*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == NULL) {
124*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
125*49cdfc7eSAndroid Build Coastguard Worker 			"getcwd(%p,%zu) failed", buf, size);
126*49cdfc7eSAndroid Build Coastguard Worker 	}
127*49cdfc7eSAndroid Build Coastguard Worker 
128*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
129*49cdfc7eSAndroid Build Coastguard Worker }
130*49cdfc7eSAndroid Build Coastguard Worker 
safe_getpwnam(const char * file,const int lineno,void (* cleanup_fn)(void),const char * name)131*49cdfc7eSAndroid Build Coastguard Worker struct passwd *safe_getpwnam(const char *file, const int lineno,
132*49cdfc7eSAndroid Build Coastguard Worker 			     void (*cleanup_fn) (void), const char *name)
133*49cdfc7eSAndroid Build Coastguard Worker {
134*49cdfc7eSAndroid Build Coastguard Worker 	struct passwd *rval;
135*49cdfc7eSAndroid Build Coastguard Worker 
136*49cdfc7eSAndroid Build Coastguard Worker 	rval = getpwnam(name);
137*49cdfc7eSAndroid Build Coastguard Worker 
138*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == NULL) {
139*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
140*49cdfc7eSAndroid Build Coastguard Worker 			"getpwnam(%s) failed", name);
141*49cdfc7eSAndroid Build Coastguard Worker 	}
142*49cdfc7eSAndroid Build Coastguard Worker 
143*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
144*49cdfc7eSAndroid Build Coastguard Worker }
145*49cdfc7eSAndroid Build Coastguard Worker 
146*49cdfc7eSAndroid Build Coastguard Worker int
safe_getrusage(const char * file,const int lineno,void (* cleanup_fn)(void),int who,struct rusage * usage)147*49cdfc7eSAndroid Build Coastguard Worker safe_getrusage(const char *file, const int lineno, void (*cleanup_fn) (void),
148*49cdfc7eSAndroid Build Coastguard Worker 	       int who, struct rusage *usage)
149*49cdfc7eSAndroid Build Coastguard Worker {
150*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
151*49cdfc7eSAndroid Build Coastguard Worker 
152*49cdfc7eSAndroid Build Coastguard Worker 	rval = getrusage(who, usage);
153*49cdfc7eSAndroid Build Coastguard Worker 
154*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
155*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
156*49cdfc7eSAndroid Build Coastguard Worker 			"getrusage(%d,%p) failed", who, usage);
157*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
158*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
159*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid getrusage(%d,%p) return value %d", who,
160*49cdfc7eSAndroid Build Coastguard Worker 			usage, rval);
161*49cdfc7eSAndroid Build Coastguard Worker 	}
162*49cdfc7eSAndroid Build Coastguard Worker 
163*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
164*49cdfc7eSAndroid Build Coastguard Worker }
165*49cdfc7eSAndroid Build Coastguard Worker 
safe_malloc(const char * file,const int lineno,void (* cleanup_fn)(void),size_t size)166*49cdfc7eSAndroid Build Coastguard Worker void *safe_malloc(const char *file, const int lineno, void (*cleanup_fn) (void),
167*49cdfc7eSAndroid Build Coastguard Worker 		  size_t size)
168*49cdfc7eSAndroid Build Coastguard Worker {
169*49cdfc7eSAndroid Build Coastguard Worker 	void *rval;
170*49cdfc7eSAndroid Build Coastguard Worker 
171*49cdfc7eSAndroid Build Coastguard Worker 	rval = malloc(size);
172*49cdfc7eSAndroid Build Coastguard Worker 
173*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == NULL) {
174*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
175*49cdfc7eSAndroid Build Coastguard Worker 			"malloc(%zu) failed", size);
176*49cdfc7eSAndroid Build Coastguard Worker 	}
177*49cdfc7eSAndroid Build Coastguard Worker 
178*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
179*49cdfc7eSAndroid Build Coastguard Worker }
180*49cdfc7eSAndroid Build Coastguard Worker 
safe_mkdir(const char * file,const int lineno,void (* cleanup_fn)(void),const char * pathname,mode_t mode)181*49cdfc7eSAndroid Build Coastguard Worker int safe_mkdir(const char *file, const int lineno, void (*cleanup_fn) (void),
182*49cdfc7eSAndroid Build Coastguard Worker                const char *pathname, mode_t mode)
183*49cdfc7eSAndroid Build Coastguard Worker {
184*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
185*49cdfc7eSAndroid Build Coastguard Worker 
186*49cdfc7eSAndroid Build Coastguard Worker 	rval = mkdir(pathname, mode);
187*49cdfc7eSAndroid Build Coastguard Worker 
188*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
189*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
190*49cdfc7eSAndroid Build Coastguard Worker 			"mkdir(%s, %04o) failed", pathname, mode);
191*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
192*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
193*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid mkdir(%s, %04o) return value %d", pathname,
194*49cdfc7eSAndroid Build Coastguard Worker 			mode, rval);
195*49cdfc7eSAndroid Build Coastguard Worker 	}
196*49cdfc7eSAndroid Build Coastguard Worker 
197*49cdfc7eSAndroid Build Coastguard Worker 	return (rval);
198*49cdfc7eSAndroid Build Coastguard Worker }
199*49cdfc7eSAndroid Build Coastguard Worker 
safe_rmdir(const char * file,const int lineno,void (* cleanup_fn)(void),const char * pathname)200*49cdfc7eSAndroid Build Coastguard Worker int safe_rmdir(const char *file, const int lineno, void (*cleanup_fn) (void),
201*49cdfc7eSAndroid Build Coastguard Worker                const char *pathname)
202*49cdfc7eSAndroid Build Coastguard Worker {
203*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
204*49cdfc7eSAndroid Build Coastguard Worker 
205*49cdfc7eSAndroid Build Coastguard Worker 	rval = rmdir(pathname);
206*49cdfc7eSAndroid Build Coastguard Worker 
207*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
208*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
209*49cdfc7eSAndroid Build Coastguard Worker 			"rmdir(%s) failed", pathname);
210*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
211*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
212*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid rmdir(%s) return value %d", pathname, rval);
213*49cdfc7eSAndroid Build Coastguard Worker 	}
214*49cdfc7eSAndroid Build Coastguard Worker 
215*49cdfc7eSAndroid Build Coastguard Worker 	return (rval);
216*49cdfc7eSAndroid Build Coastguard Worker }
217*49cdfc7eSAndroid Build Coastguard Worker 
safe_munmap(const char * file,const int lineno,void (* cleanup_fn)(void),void * addr,size_t length)218*49cdfc7eSAndroid Build Coastguard Worker int safe_munmap(const char *file, const int lineno, void (*cleanup_fn) (void),
219*49cdfc7eSAndroid Build Coastguard Worker                 void *addr, size_t length)
220*49cdfc7eSAndroid Build Coastguard Worker {
221*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
222*49cdfc7eSAndroid Build Coastguard Worker 
223*49cdfc7eSAndroid Build Coastguard Worker 	rval = munmap(addr, length);
224*49cdfc7eSAndroid Build Coastguard Worker 
225*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
226*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
227*49cdfc7eSAndroid Build Coastguard Worker 			"munmap(%p,%zu) failed", addr, length);
228*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
229*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
230*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid munmap(%p,%zu) return value %d", addr,
231*49cdfc7eSAndroid Build Coastguard Worker 			length, rval);
232*49cdfc7eSAndroid Build Coastguard Worker 	}
233*49cdfc7eSAndroid Build Coastguard Worker 
234*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
235*49cdfc7eSAndroid Build Coastguard Worker }
236*49cdfc7eSAndroid Build Coastguard Worker 
safe_open(const char * file,const int lineno,void (* cleanup_fn)(void),const char * pathname,int oflags,...)237*49cdfc7eSAndroid Build Coastguard Worker int safe_open(const char *file, const int lineno, void (*cleanup_fn) (void),
238*49cdfc7eSAndroid Build Coastguard Worker               const char *pathname, int oflags, ...)
239*49cdfc7eSAndroid Build Coastguard Worker {
240*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
241*49cdfc7eSAndroid Build Coastguard Worker 	mode_t mode = 0;
242*49cdfc7eSAndroid Build Coastguard Worker 
243*49cdfc7eSAndroid Build Coastguard Worker 	if (TST_OPEN_NEEDS_MODE(oflags)) {
244*49cdfc7eSAndroid Build Coastguard Worker 		va_list ap;
245*49cdfc7eSAndroid Build Coastguard Worker 
246*49cdfc7eSAndroid Build Coastguard Worker 		va_start(ap, oflags);
247*49cdfc7eSAndroid Build Coastguard Worker 
248*49cdfc7eSAndroid Build Coastguard Worker 		/* Android's NDK's mode_t is smaller than an int, which results in
249*49cdfc7eSAndroid Build Coastguard Worker 		 * SIGILL here when passing the mode_t type.
250*49cdfc7eSAndroid Build Coastguard Worker 		 */
251*49cdfc7eSAndroid Build Coastguard Worker 		mode = va_arg(ap, int);
252*49cdfc7eSAndroid Build Coastguard Worker 
253*49cdfc7eSAndroid Build Coastguard Worker 		va_end(ap);
254*49cdfc7eSAndroid Build Coastguard Worker 	}
255*49cdfc7eSAndroid Build Coastguard Worker 
256*49cdfc7eSAndroid Build Coastguard Worker 	rval = open(pathname, oflags, mode);
257*49cdfc7eSAndroid Build Coastguard Worker 
258*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
259*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
260*49cdfc7eSAndroid Build Coastguard Worker 			"open(%s,%d,%04o) failed", pathname, oflags, mode);
261*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval < 0) {
262*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
263*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid open(%s,%d,%04o) return value %d", pathname,
264*49cdfc7eSAndroid Build Coastguard Worker 			oflags, mode, rval);
265*49cdfc7eSAndroid Build Coastguard Worker 	}
266*49cdfc7eSAndroid Build Coastguard Worker 
267*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
268*49cdfc7eSAndroid Build Coastguard Worker }
269*49cdfc7eSAndroid Build Coastguard Worker 
safe_pipe(const char * file,const int lineno,void (* cleanup_fn)(void),int fildes[2])270*49cdfc7eSAndroid Build Coastguard Worker int safe_pipe(const char *file, const int lineno, void (*cleanup_fn) (void),
271*49cdfc7eSAndroid Build Coastguard Worker               int fildes[2])
272*49cdfc7eSAndroid Build Coastguard Worker {
273*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
274*49cdfc7eSAndroid Build Coastguard Worker 
275*49cdfc7eSAndroid Build Coastguard Worker 	rval = pipe(fildes);
276*49cdfc7eSAndroid Build Coastguard Worker 
277*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
278*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
279*49cdfc7eSAndroid Build Coastguard Worker 			"pipe({%d,%d}) failed", fildes[0], fildes[1]);
280*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
281*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
282*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid pipe({%d,%d}) return value %d", fildes[0],
283*49cdfc7eSAndroid Build Coastguard Worker 			fildes[1], rval);
284*49cdfc7eSAndroid Build Coastguard Worker 	}
285*49cdfc7eSAndroid Build Coastguard Worker 
286*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
287*49cdfc7eSAndroid Build Coastguard Worker }
288*49cdfc7eSAndroid Build Coastguard Worker 
safe_read(const char * file,const int lineno,void (* cleanup_fn)(void),char len_strict,int fildes,void * buf,size_t nbyte)289*49cdfc7eSAndroid Build Coastguard Worker ssize_t safe_read(const char *file, const int lineno, void (*cleanup_fn) (void),
290*49cdfc7eSAndroid Build Coastguard Worker                   char len_strict, int fildes, void *buf, size_t nbyte)
291*49cdfc7eSAndroid Build Coastguard Worker {
292*49cdfc7eSAndroid Build Coastguard Worker 	ssize_t rval;
293*49cdfc7eSAndroid Build Coastguard Worker 
294*49cdfc7eSAndroid Build Coastguard Worker 	rval = read(fildes, buf, nbyte);
295*49cdfc7eSAndroid Build Coastguard Worker 
296*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1 || (len_strict && (size_t)rval != nbyte)) {
297*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
298*49cdfc7eSAndroid Build Coastguard Worker 			"read(%d,%p,%zu) failed, returned %zd", fildes, buf,
299*49cdfc7eSAndroid Build Coastguard Worker 			nbyte, rval);
300*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval < 0) {
301*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
302*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid read(%d,%p,%zu) return value %zd", fildes,
303*49cdfc7eSAndroid Build Coastguard Worker 			buf, nbyte, rval);
304*49cdfc7eSAndroid Build Coastguard Worker 	}
305*49cdfc7eSAndroid Build Coastguard Worker 
306*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
307*49cdfc7eSAndroid Build Coastguard Worker }
308*49cdfc7eSAndroid Build Coastguard Worker 
safe_setegid(const char * file,const int lineno,void (* cleanup_fn)(void),gid_t egid)309*49cdfc7eSAndroid Build Coastguard Worker int safe_setegid(const char *file, const int lineno, void (*cleanup_fn) (void),
310*49cdfc7eSAndroid Build Coastguard Worker                  gid_t egid)
311*49cdfc7eSAndroid Build Coastguard Worker {
312*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
313*49cdfc7eSAndroid Build Coastguard Worker 
314*49cdfc7eSAndroid Build Coastguard Worker 	rval = setegid(egid);
315*49cdfc7eSAndroid Build Coastguard Worker 
316*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
317*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
318*49cdfc7eSAndroid Build Coastguard Worker 			"setegid(%u) failed", (unsigned int)egid);
319*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
320*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
321*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid setegid(%u) return value %d",
322*49cdfc7eSAndroid Build Coastguard Worker 			(unsigned int)egid, rval);
323*49cdfc7eSAndroid Build Coastguard Worker 	}
324*49cdfc7eSAndroid Build Coastguard Worker 
325*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
326*49cdfc7eSAndroid Build Coastguard Worker }
327*49cdfc7eSAndroid Build Coastguard Worker 
safe_seteuid(const char * file,const int lineno,void (* cleanup_fn)(void),uid_t euid)328*49cdfc7eSAndroid Build Coastguard Worker int safe_seteuid(const char *file, const int lineno, void (*cleanup_fn) (void),
329*49cdfc7eSAndroid Build Coastguard Worker                  uid_t euid)
330*49cdfc7eSAndroid Build Coastguard Worker {
331*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
332*49cdfc7eSAndroid Build Coastguard Worker 
333*49cdfc7eSAndroid Build Coastguard Worker 	rval = seteuid(euid);
334*49cdfc7eSAndroid Build Coastguard Worker 
335*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
336*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
337*49cdfc7eSAndroid Build Coastguard Worker 			"seteuid(%u) failed", (unsigned int)euid);
338*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
339*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
340*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid seteuid(%u) return value %d",
341*49cdfc7eSAndroid Build Coastguard Worker 			(unsigned int)euid, rval);
342*49cdfc7eSAndroid Build Coastguard Worker 	}
343*49cdfc7eSAndroid Build Coastguard Worker 
344*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
345*49cdfc7eSAndroid Build Coastguard Worker }
346*49cdfc7eSAndroid Build Coastguard Worker 
safe_setgid(const char * file,const int lineno,void (* cleanup_fn)(void),gid_t gid)347*49cdfc7eSAndroid Build Coastguard Worker int safe_setgid(const char *file, const int lineno, void (*cleanup_fn) (void),
348*49cdfc7eSAndroid Build Coastguard Worker                 gid_t gid)
349*49cdfc7eSAndroid Build Coastguard Worker {
350*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
351*49cdfc7eSAndroid Build Coastguard Worker 
352*49cdfc7eSAndroid Build Coastguard Worker 	rval = setgid(gid);
353*49cdfc7eSAndroid Build Coastguard Worker 
354*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
355*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
356*49cdfc7eSAndroid Build Coastguard Worker 			"setgid(%u) failed", (unsigned int)gid);
357*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
358*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
359*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid setgid(%u) return value %d",
360*49cdfc7eSAndroid Build Coastguard Worker 			(unsigned int)gid, rval);
361*49cdfc7eSAndroid Build Coastguard Worker 	}
362*49cdfc7eSAndroid Build Coastguard Worker 
363*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
364*49cdfc7eSAndroid Build Coastguard Worker }
365*49cdfc7eSAndroid Build Coastguard Worker 
safe_setuid(const char * file,const int lineno,void (* cleanup_fn)(void),uid_t uid)366*49cdfc7eSAndroid Build Coastguard Worker int safe_setuid(const char *file, const int lineno, void (*cleanup_fn) (void),
367*49cdfc7eSAndroid Build Coastguard Worker                 uid_t uid)
368*49cdfc7eSAndroid Build Coastguard Worker {
369*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
370*49cdfc7eSAndroid Build Coastguard Worker 
371*49cdfc7eSAndroid Build Coastguard Worker 	rval = setuid(uid);
372*49cdfc7eSAndroid Build Coastguard Worker 
373*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
374*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
375*49cdfc7eSAndroid Build Coastguard Worker 			"setuid(%u) failed", (unsigned int)uid);
376*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
377*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
378*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid setuid(%u) return value %d",
379*49cdfc7eSAndroid Build Coastguard Worker 			(unsigned int)uid, rval);
380*49cdfc7eSAndroid Build Coastguard Worker 	}
381*49cdfc7eSAndroid Build Coastguard Worker 
382*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
383*49cdfc7eSAndroid Build Coastguard Worker }
384*49cdfc7eSAndroid Build Coastguard Worker 
safe_getresuid(const char * file,const int lineno,void (* cleanup_fn)(void),uid_t * ruid,uid_t * euid,uid_t * suid)385*49cdfc7eSAndroid Build Coastguard Worker int safe_getresuid(const char *file, const int lineno, void (*cleanup_fn)(void),
386*49cdfc7eSAndroid Build Coastguard Worker 		   uid_t *ruid, uid_t *euid, uid_t *suid)
387*49cdfc7eSAndroid Build Coastguard Worker {
388*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
389*49cdfc7eSAndroid Build Coastguard Worker 
390*49cdfc7eSAndroid Build Coastguard Worker 	rval = getresuid(ruid, euid, suid);
391*49cdfc7eSAndroid Build Coastguard Worker 
392*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
393*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
394*49cdfc7eSAndroid Build Coastguard Worker 			"getresuid(%p, %p, %p) failed", ruid, euid, suid);
395*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
396*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
397*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid getresuid(%p, %p, %p) return value %d", ruid,
398*49cdfc7eSAndroid Build Coastguard Worker 			euid, suid, rval);
399*49cdfc7eSAndroid Build Coastguard Worker 	}
400*49cdfc7eSAndroid Build Coastguard Worker 
401*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
402*49cdfc7eSAndroid Build Coastguard Worker }
403*49cdfc7eSAndroid Build Coastguard Worker 
safe_getresgid(const char * file,const int lineno,void (* cleanup_fn)(void),gid_t * rgid,gid_t * egid,gid_t * sgid)404*49cdfc7eSAndroid Build Coastguard Worker int safe_getresgid(const char *file, const int lineno, void (*cleanup_fn)(void),
405*49cdfc7eSAndroid Build Coastguard Worker 		   gid_t *rgid, gid_t *egid, gid_t *sgid)
406*49cdfc7eSAndroid Build Coastguard Worker {
407*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
408*49cdfc7eSAndroid Build Coastguard Worker 
409*49cdfc7eSAndroid Build Coastguard Worker 	rval = getresgid(rgid, egid, sgid);
410*49cdfc7eSAndroid Build Coastguard Worker 
411*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
412*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
413*49cdfc7eSAndroid Build Coastguard Worker 			"getresgid(%p, %p, %p) failed", rgid, egid, sgid);
414*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
415*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
416*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid getresgid(%p, %p, %p) return value %d", rgid,
417*49cdfc7eSAndroid Build Coastguard Worker 			egid, sgid, rval);
418*49cdfc7eSAndroid Build Coastguard Worker 	}
419*49cdfc7eSAndroid Build Coastguard Worker 
420*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
421*49cdfc7eSAndroid Build Coastguard Worker }
422*49cdfc7eSAndroid Build Coastguard Worker 
safe_unlink(const char * file,const int lineno,void (* cleanup_fn)(void),const char * pathname)423*49cdfc7eSAndroid Build Coastguard Worker int safe_unlink(const char *file, const int lineno, void (*cleanup_fn) (void),
424*49cdfc7eSAndroid Build Coastguard Worker                 const char *pathname)
425*49cdfc7eSAndroid Build Coastguard Worker {
426*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
427*49cdfc7eSAndroid Build Coastguard Worker 
428*49cdfc7eSAndroid Build Coastguard Worker 	rval = unlink(pathname);
429*49cdfc7eSAndroid Build Coastguard Worker 
430*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
431*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
432*49cdfc7eSAndroid Build Coastguard Worker 			"unlink(%s) failed", pathname);
433*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
434*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
435*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid unlink(%s) return value %d", pathname, rval);
436*49cdfc7eSAndroid Build Coastguard Worker 	}
437*49cdfc7eSAndroid Build Coastguard Worker 
438*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
439*49cdfc7eSAndroid Build Coastguard Worker }
440*49cdfc7eSAndroid Build Coastguard Worker 
441*49cdfc7eSAndroid Build Coastguard Worker 
safe_link(const char * file,const int lineno,void (cleanup_fn)(void),const char * oldpath,const char * newpath)442*49cdfc7eSAndroid Build Coastguard Worker int safe_link(const char *file, const int lineno,
443*49cdfc7eSAndroid Build Coastguard Worker               void (cleanup_fn)(void), const char *oldpath,
444*49cdfc7eSAndroid Build Coastguard Worker               const char *newpath)
445*49cdfc7eSAndroid Build Coastguard Worker {
446*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
447*49cdfc7eSAndroid Build Coastguard Worker 
448*49cdfc7eSAndroid Build Coastguard Worker 	rval = link(oldpath, newpath);
449*49cdfc7eSAndroid Build Coastguard Worker 
450*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
451*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
452*49cdfc7eSAndroid Build Coastguard Worker 		        "link(%s,%s) failed", oldpath, newpath);
453*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
454*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
455*49cdfc7eSAndroid Build Coastguard Worker 		        "Invalid link(%s,%s) return value %d", oldpath,
456*49cdfc7eSAndroid Build Coastguard Worker 			newpath, rval);
457*49cdfc7eSAndroid Build Coastguard Worker 	}
458*49cdfc7eSAndroid Build Coastguard Worker 
459*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
460*49cdfc7eSAndroid Build Coastguard Worker }
461*49cdfc7eSAndroid Build Coastguard Worker 
safe_linkat(const char * file,const int lineno,void (cleanup_fn)(void),int olddirfd,const char * oldpath,int newdirfd,const char * newpath,int flags)462*49cdfc7eSAndroid Build Coastguard Worker int safe_linkat(const char *file, const int lineno,
463*49cdfc7eSAndroid Build Coastguard Worker 		void (cleanup_fn)(void), int olddirfd, const char *oldpath,
464*49cdfc7eSAndroid Build Coastguard Worker 		int newdirfd, const char *newpath, int flags)
465*49cdfc7eSAndroid Build Coastguard Worker {
466*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
467*49cdfc7eSAndroid Build Coastguard Worker 
468*49cdfc7eSAndroid Build Coastguard Worker 	rval = linkat(olddirfd, oldpath, newdirfd, newpath, flags);
469*49cdfc7eSAndroid Build Coastguard Worker 
470*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
471*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
472*49cdfc7eSAndroid Build Coastguard Worker 			"linkat(%d,%s,%d,%s,%d) failed", olddirfd, oldpath,
473*49cdfc7eSAndroid Build Coastguard Worker 			newdirfd, newpath, flags);
474*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
475*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
476*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid linkat(%d,%s,%d,%s,%d) return value %d",
477*49cdfc7eSAndroid Build Coastguard Worker 			olddirfd, oldpath, newdirfd, newpath, flags, rval);
478*49cdfc7eSAndroid Build Coastguard Worker 	}
479*49cdfc7eSAndroid Build Coastguard Worker 
480*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
481*49cdfc7eSAndroid Build Coastguard Worker }
482*49cdfc7eSAndroid Build Coastguard Worker 
safe_readlink(const char * file,const int lineno,void (cleanup_fn)(void),const char * path,char * buf,size_t bufsize)483*49cdfc7eSAndroid Build Coastguard Worker ssize_t safe_readlink(const char *file, const int lineno,
484*49cdfc7eSAndroid Build Coastguard Worker 		  void (cleanup_fn)(void), const char *path,
485*49cdfc7eSAndroid Build Coastguard Worker 		  char *buf, size_t bufsize)
486*49cdfc7eSAndroid Build Coastguard Worker {
487*49cdfc7eSAndroid Build Coastguard Worker 	ssize_t rval;
488*49cdfc7eSAndroid Build Coastguard Worker 
489*49cdfc7eSAndroid Build Coastguard Worker 	rval = readlink(path, buf, bufsize);
490*49cdfc7eSAndroid Build Coastguard Worker 
491*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
492*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
493*49cdfc7eSAndroid Build Coastguard Worker 			"readlink(%s,%p,%zu) failed", path, buf, bufsize);
494*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval < 0) {
495*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
496*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid readlink(%s,%p,%zu) return value %zd", path,
497*49cdfc7eSAndroid Build Coastguard Worker 			buf, bufsize, rval);
498*49cdfc7eSAndroid Build Coastguard Worker 	} else {
499*49cdfc7eSAndroid Build Coastguard Worker 		/* readlink does not append a NUL byte to the buffer.
500*49cdfc7eSAndroid Build Coastguard Worker 		 * Add it now. */
501*49cdfc7eSAndroid Build Coastguard Worker 		if ((size_t) rval < bufsize)
502*49cdfc7eSAndroid Build Coastguard Worker 			buf[rval] = '\0';
503*49cdfc7eSAndroid Build Coastguard Worker 		else
504*49cdfc7eSAndroid Build Coastguard Worker 			buf[bufsize-1] = '\0';
505*49cdfc7eSAndroid Build Coastguard Worker 	}
506*49cdfc7eSAndroid Build Coastguard Worker 
507*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
508*49cdfc7eSAndroid Build Coastguard Worker }
509*49cdfc7eSAndroid Build Coastguard Worker 
safe_symlink(const char * file,const int lineno,void (cleanup_fn)(void),const char * oldpath,const char * newpath)510*49cdfc7eSAndroid Build Coastguard Worker int safe_symlink(const char *file, const int lineno,
511*49cdfc7eSAndroid Build Coastguard Worker                  void (cleanup_fn)(void), const char *oldpath,
512*49cdfc7eSAndroid Build Coastguard Worker                  const char *newpath)
513*49cdfc7eSAndroid Build Coastguard Worker {
514*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
515*49cdfc7eSAndroid Build Coastguard Worker 
516*49cdfc7eSAndroid Build Coastguard Worker 	rval = symlink(oldpath, newpath);
517*49cdfc7eSAndroid Build Coastguard Worker 
518*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
519*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
520*49cdfc7eSAndroid Build Coastguard Worker 			"symlink(%s,%s) failed", oldpath, newpath);
521*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
522*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
523*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid symlink(%s,%s) return value %d", oldpath,
524*49cdfc7eSAndroid Build Coastguard Worker 			newpath, rval);
525*49cdfc7eSAndroid Build Coastguard Worker 	}
526*49cdfc7eSAndroid Build Coastguard Worker 
527*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
528*49cdfc7eSAndroid Build Coastguard Worker }
529*49cdfc7eSAndroid Build Coastguard Worker 
safe_write(const char * file,const int lineno,void (cleanup_fn)(void),enum safe_write_opts len_strict,int fildes,const void * buf,size_t nbyte)530*49cdfc7eSAndroid Build Coastguard Worker ssize_t safe_write(const char *file, const int lineno, void (cleanup_fn) (void),
531*49cdfc7eSAndroid Build Coastguard Worker 		   enum safe_write_opts len_strict, int fildes, const void *buf,
532*49cdfc7eSAndroid Build Coastguard Worker 		   size_t nbyte)
533*49cdfc7eSAndroid Build Coastguard Worker {
534*49cdfc7eSAndroid Build Coastguard Worker 	ssize_t rval;
535*49cdfc7eSAndroid Build Coastguard Worker 	const void *wbuf = buf;
536*49cdfc7eSAndroid Build Coastguard Worker 	size_t len = nbyte;
537*49cdfc7eSAndroid Build Coastguard Worker 	int iter = 0;
538*49cdfc7eSAndroid Build Coastguard Worker 
539*49cdfc7eSAndroid Build Coastguard Worker 	do {
540*49cdfc7eSAndroid Build Coastguard Worker 		iter++;
541*49cdfc7eSAndroid Build Coastguard Worker 		rval = write(fildes, wbuf, len);
542*49cdfc7eSAndroid Build Coastguard Worker 		if (rval == -1) {
543*49cdfc7eSAndroid Build Coastguard Worker 			if (len_strict == SAFE_WRITE_RETRY)
544*49cdfc7eSAndroid Build Coastguard Worker 				tst_resm_(file, lineno, TINFO,
545*49cdfc7eSAndroid Build Coastguard Worker 					"write() wrote %zu bytes in %d calls",
546*49cdfc7eSAndroid Build Coastguard Worker 					nbyte-len, iter);
547*49cdfc7eSAndroid Build Coastguard Worker 			tst_brkm_(file, lineno, TBROK | TERRNO,
548*49cdfc7eSAndroid Build Coastguard Worker 				cleanup_fn, "write(%d,%p,%zu) failed",
549*49cdfc7eSAndroid Build Coastguard Worker 				fildes, buf, nbyte);
550*49cdfc7eSAndroid Build Coastguard Worker 		}
551*49cdfc7eSAndroid Build Coastguard Worker 
552*49cdfc7eSAndroid Build Coastguard Worker 		if (len_strict == SAFE_WRITE_ANY)
553*49cdfc7eSAndroid Build Coastguard Worker 			return rval;
554*49cdfc7eSAndroid Build Coastguard Worker 
555*49cdfc7eSAndroid Build Coastguard Worker 		if (len_strict == SAFE_WRITE_ALL) {
556*49cdfc7eSAndroid Build Coastguard Worker 			if ((size_t)rval != nbyte)
557*49cdfc7eSAndroid Build Coastguard Worker 				tst_brkm_(file, lineno, TBROK | TERRNO,
558*49cdfc7eSAndroid Build Coastguard Worker 					cleanup_fn, "short write(%d,%p,%zu) "
559*49cdfc7eSAndroid Build Coastguard Worker 					"return value %zd",
560*49cdfc7eSAndroid Build Coastguard Worker 					fildes, buf, nbyte, rval);
561*49cdfc7eSAndroid Build Coastguard Worker 			return rval;
562*49cdfc7eSAndroid Build Coastguard Worker 		}
563*49cdfc7eSAndroid Build Coastguard Worker 
564*49cdfc7eSAndroid Build Coastguard Worker 		wbuf += rval;
565*49cdfc7eSAndroid Build Coastguard Worker 		len -= rval;
566*49cdfc7eSAndroid Build Coastguard Worker 	} while (len > 0);
567*49cdfc7eSAndroid Build Coastguard Worker 
568*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
569*49cdfc7eSAndroid Build Coastguard Worker }
570*49cdfc7eSAndroid Build Coastguard Worker 
safe_strtol(const char * file,const int lineno,void (cleanup_fn)(void),char * str,long min,long max)571*49cdfc7eSAndroid Build Coastguard Worker long safe_strtol(const char *file, const int lineno,
572*49cdfc7eSAndroid Build Coastguard Worker 		 void (cleanup_fn) (void), char *str, long min, long max)
573*49cdfc7eSAndroid Build Coastguard Worker {
574*49cdfc7eSAndroid Build Coastguard Worker 	long rval;
575*49cdfc7eSAndroid Build Coastguard Worker 	char *endptr;
576*49cdfc7eSAndroid Build Coastguard Worker 
577*49cdfc7eSAndroid Build Coastguard Worker 	errno = 0;
578*49cdfc7eSAndroid Build Coastguard Worker 	rval = strtol(str, &endptr, 10);
579*49cdfc7eSAndroid Build Coastguard Worker 
580*49cdfc7eSAndroid Build Coastguard Worker 	if ((errno == ERANGE && (rval == LONG_MAX || rval == LONG_MIN))
581*49cdfc7eSAndroid Build Coastguard Worker 	    || (errno != 0 && rval == 0)) {
582*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
583*49cdfc7eSAndroid Build Coastguard Worker 			"strtol(%s) failed", str);
584*49cdfc7eSAndroid Build Coastguard Worker 		return rval;
585*49cdfc7eSAndroid Build Coastguard Worker 	}
586*49cdfc7eSAndroid Build Coastguard Worker 
587*49cdfc7eSAndroid Build Coastguard Worker 	if (endptr == str || (*endptr != '\0' && *endptr != '\n')) {
588*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK, cleanup_fn,
589*49cdfc7eSAndroid Build Coastguard Worker 			"strtol(%s): Invalid value", str);
590*49cdfc7eSAndroid Build Coastguard Worker 		return 0;
591*49cdfc7eSAndroid Build Coastguard Worker 	}
592*49cdfc7eSAndroid Build Coastguard Worker 
593*49cdfc7eSAndroid Build Coastguard Worker 	if (rval > max || rval < min) {
594*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK, cleanup_fn,
595*49cdfc7eSAndroid Build Coastguard Worker 			"strtol(%s): %ld is out of range %ld - %ld",
596*49cdfc7eSAndroid Build Coastguard Worker 			str, rval, min, max);
597*49cdfc7eSAndroid Build Coastguard Worker 		return 0;
598*49cdfc7eSAndroid Build Coastguard Worker 	}
599*49cdfc7eSAndroid Build Coastguard Worker 
600*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
601*49cdfc7eSAndroid Build Coastguard Worker }
602*49cdfc7eSAndroid Build Coastguard Worker 
safe_strtoul(const char * file,const int lineno,void (cleanup_fn)(void),char * str,unsigned long min,unsigned long max)603*49cdfc7eSAndroid Build Coastguard Worker unsigned long safe_strtoul(const char *file, const int lineno,
604*49cdfc7eSAndroid Build Coastguard Worker 			   void (cleanup_fn) (void), char *str,
605*49cdfc7eSAndroid Build Coastguard Worker 			   unsigned long min, unsigned long max)
606*49cdfc7eSAndroid Build Coastguard Worker {
607*49cdfc7eSAndroid Build Coastguard Worker 	unsigned long rval;
608*49cdfc7eSAndroid Build Coastguard Worker 	char *endptr;
609*49cdfc7eSAndroid Build Coastguard Worker 
610*49cdfc7eSAndroid Build Coastguard Worker 	errno = 0;
611*49cdfc7eSAndroid Build Coastguard Worker 	rval = strtoul(str, &endptr, 10);
612*49cdfc7eSAndroid Build Coastguard Worker 
613*49cdfc7eSAndroid Build Coastguard Worker 	if ((errno == ERANGE && rval == ULONG_MAX)
614*49cdfc7eSAndroid Build Coastguard Worker 	    || (errno != 0 && rval == 0)) {
615*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
616*49cdfc7eSAndroid Build Coastguard Worker 			"strtoul(%s) failed", str);
617*49cdfc7eSAndroid Build Coastguard Worker 		return rval;
618*49cdfc7eSAndroid Build Coastguard Worker 	}
619*49cdfc7eSAndroid Build Coastguard Worker 
620*49cdfc7eSAndroid Build Coastguard Worker 	if (endptr == str || (*endptr != '\0' && *endptr != '\n')) {
621*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK, cleanup_fn,
622*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid value: '%s'", str);
623*49cdfc7eSAndroid Build Coastguard Worker 		return 0;
624*49cdfc7eSAndroid Build Coastguard Worker 	}
625*49cdfc7eSAndroid Build Coastguard Worker 
626*49cdfc7eSAndroid Build Coastguard Worker 	if (rval > max || rval < min) {
627*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK, cleanup_fn,
628*49cdfc7eSAndroid Build Coastguard Worker 			"strtoul(%s): %lu is out of range %lu - %lu",
629*49cdfc7eSAndroid Build Coastguard Worker 			str, rval, min, max);
630*49cdfc7eSAndroid Build Coastguard Worker 		return 0;
631*49cdfc7eSAndroid Build Coastguard Worker 	}
632*49cdfc7eSAndroid Build Coastguard Worker 
633*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
634*49cdfc7eSAndroid Build Coastguard Worker }
635*49cdfc7eSAndroid Build Coastguard Worker 
safe_strtof(const char * file,const int lineno,void (cleanup_fn)(void),char * str,float min,float max)636*49cdfc7eSAndroid Build Coastguard Worker float safe_strtof(const char *file, const int lineno,
637*49cdfc7eSAndroid Build Coastguard Worker 		  void (cleanup_fn) (void), char *str,
638*49cdfc7eSAndroid Build Coastguard Worker 		  float min, float max)
639*49cdfc7eSAndroid Build Coastguard Worker {
640*49cdfc7eSAndroid Build Coastguard Worker 	float rval;
641*49cdfc7eSAndroid Build Coastguard Worker 	char *endptr;
642*49cdfc7eSAndroid Build Coastguard Worker 
643*49cdfc7eSAndroid Build Coastguard Worker 	errno = 0;
644*49cdfc7eSAndroid Build Coastguard Worker 	rval = strtof(str, &endptr);
645*49cdfc7eSAndroid Build Coastguard Worker 
646*49cdfc7eSAndroid Build Coastguard Worker 	if (errno) {
647*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
648*49cdfc7eSAndroid Build Coastguard Worker 			"strtof(%s) failed", str);
649*49cdfc7eSAndroid Build Coastguard Worker 		return rval;
650*49cdfc7eSAndroid Build Coastguard Worker 	}
651*49cdfc7eSAndroid Build Coastguard Worker 
652*49cdfc7eSAndroid Build Coastguard Worker 	if (endptr == str || (*endptr != '\0' && *endptr != '\n')) {
653*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK, cleanup_fn,
654*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid value: '%s'", str);
655*49cdfc7eSAndroid Build Coastguard Worker 		return 0;
656*49cdfc7eSAndroid Build Coastguard Worker 	}
657*49cdfc7eSAndroid Build Coastguard Worker 
658*49cdfc7eSAndroid Build Coastguard Worker 	if (rval > max || rval < min) {
659*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK, cleanup_fn,
660*49cdfc7eSAndroid Build Coastguard Worker 			"strtof(%s): %f is out of range %f - %f",
661*49cdfc7eSAndroid Build Coastguard Worker 			str, rval, min, max);
662*49cdfc7eSAndroid Build Coastguard Worker 		return 0;
663*49cdfc7eSAndroid Build Coastguard Worker 	}
664*49cdfc7eSAndroid Build Coastguard Worker 
665*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
666*49cdfc7eSAndroid Build Coastguard Worker }
667*49cdfc7eSAndroid Build Coastguard Worker 
safe_sysconf(const char * file,const int lineno,void (cleanup_fn)(void),int name)668*49cdfc7eSAndroid Build Coastguard Worker long safe_sysconf(const char *file, const int lineno,
669*49cdfc7eSAndroid Build Coastguard Worker 		  void (cleanup_fn) (void), int name)
670*49cdfc7eSAndroid Build Coastguard Worker {
671*49cdfc7eSAndroid Build Coastguard Worker 	long rval;
672*49cdfc7eSAndroid Build Coastguard Worker 
673*49cdfc7eSAndroid Build Coastguard Worker 	errno = 0;
674*49cdfc7eSAndroid Build Coastguard Worker 	rval = sysconf(name);
675*49cdfc7eSAndroid Build Coastguard Worker 
676*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
677*49cdfc7eSAndroid Build Coastguard Worker 		if (errno) {
678*49cdfc7eSAndroid Build Coastguard Worker 			tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
679*49cdfc7eSAndroid Build Coastguard Worker 				"sysconf(%d) failed", name);
680*49cdfc7eSAndroid Build Coastguard Worker 		} else {
681*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm_(file, lineno, TINFO,
682*49cdfc7eSAndroid Build Coastguard Worker 				"sysconf(%d): queried option is not available or there is no definite limit",
683*49cdfc7eSAndroid Build Coastguard Worker 				name);
684*49cdfc7eSAndroid Build Coastguard Worker 		}
685*49cdfc7eSAndroid Build Coastguard Worker 	}
686*49cdfc7eSAndroid Build Coastguard Worker 
687*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
688*49cdfc7eSAndroid Build Coastguard Worker }
689*49cdfc7eSAndroid Build Coastguard Worker 
safe_chmod(const char * file,const int lineno,void (cleanup_fn)(void),const char * path,mode_t mode)690*49cdfc7eSAndroid Build Coastguard Worker int safe_chmod(const char *file, const int lineno,
691*49cdfc7eSAndroid Build Coastguard Worker                void (cleanup_fn)(void), const char *path, mode_t mode)
692*49cdfc7eSAndroid Build Coastguard Worker {
693*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
694*49cdfc7eSAndroid Build Coastguard Worker 
695*49cdfc7eSAndroid Build Coastguard Worker 	rval = chmod(path, mode);
696*49cdfc7eSAndroid Build Coastguard Worker 
697*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
698*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
699*49cdfc7eSAndroid Build Coastguard Worker 			"chmod(%s,%04o) failed", path, mode);
700*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
701*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
702*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid chmod(%s,%04o) return value %d", path, mode,
703*49cdfc7eSAndroid Build Coastguard Worker 			rval);
704*49cdfc7eSAndroid Build Coastguard Worker 	}
705*49cdfc7eSAndroid Build Coastguard Worker 
706*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
707*49cdfc7eSAndroid Build Coastguard Worker }
708*49cdfc7eSAndroid Build Coastguard Worker 
safe_fchmod(const char * file,const int lineno,void (cleanup_fn)(void),int fd,mode_t mode)709*49cdfc7eSAndroid Build Coastguard Worker int safe_fchmod(const char *file, const int lineno,
710*49cdfc7eSAndroid Build Coastguard Worker                 void (cleanup_fn)(void), int fd, mode_t mode)
711*49cdfc7eSAndroid Build Coastguard Worker {
712*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
713*49cdfc7eSAndroid Build Coastguard Worker 
714*49cdfc7eSAndroid Build Coastguard Worker 	rval = fchmod(fd, mode);
715*49cdfc7eSAndroid Build Coastguard Worker 
716*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
717*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
718*49cdfc7eSAndroid Build Coastguard Worker 			"fchmod(%d,%04o) failed", fd, mode);
719*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
720*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
721*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid fchmod(%d,%04o) return value %d", fd, mode,
722*49cdfc7eSAndroid Build Coastguard Worker 			rval);
723*49cdfc7eSAndroid Build Coastguard Worker 	}
724*49cdfc7eSAndroid Build Coastguard Worker 
725*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
726*49cdfc7eSAndroid Build Coastguard Worker }
727*49cdfc7eSAndroid Build Coastguard Worker 
safe_chown(const char * file,const int lineno,void (cleanup_fn)(void),const char * path,uid_t owner,gid_t group)728*49cdfc7eSAndroid Build Coastguard Worker int safe_chown(const char *file, const int lineno, void (cleanup_fn)(void),
729*49cdfc7eSAndroid Build Coastguard Worker 			const char *path, uid_t owner, gid_t group)
730*49cdfc7eSAndroid Build Coastguard Worker {
731*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
732*49cdfc7eSAndroid Build Coastguard Worker 
733*49cdfc7eSAndroid Build Coastguard Worker 	rval = chown(path, owner, group);
734*49cdfc7eSAndroid Build Coastguard Worker 
735*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
736*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
737*49cdfc7eSAndroid Build Coastguard Worker 			"chown(%s,%d,%d) failed", path, owner, group);
738*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
739*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
740*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid chown(%s,%d,%d) return value %d", path,
741*49cdfc7eSAndroid Build Coastguard Worker 			owner, group, rval);
742*49cdfc7eSAndroid Build Coastguard Worker 	}
743*49cdfc7eSAndroid Build Coastguard Worker 
744*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
745*49cdfc7eSAndroid Build Coastguard Worker }
746*49cdfc7eSAndroid Build Coastguard Worker 
safe_fchown(const char * file,const int lineno,void (cleanup_fn)(void),int fd,uid_t owner,gid_t group)747*49cdfc7eSAndroid Build Coastguard Worker int safe_fchown(const char *file, const int lineno, void (cleanup_fn)(void),
748*49cdfc7eSAndroid Build Coastguard Worker                 int fd, uid_t owner, gid_t group)
749*49cdfc7eSAndroid Build Coastguard Worker {
750*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
751*49cdfc7eSAndroid Build Coastguard Worker 
752*49cdfc7eSAndroid Build Coastguard Worker 	rval = fchown(fd, owner, group);
753*49cdfc7eSAndroid Build Coastguard Worker 
754*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
755*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
756*49cdfc7eSAndroid Build Coastguard Worker 			"fchown(%d,%d,%d) failed", fd, owner, group);
757*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
758*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
759*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid fchown(%d,%d,%d) return value %d", fd,
760*49cdfc7eSAndroid Build Coastguard Worker 			owner, group, rval);
761*49cdfc7eSAndroid Build Coastguard Worker 	}
762*49cdfc7eSAndroid Build Coastguard Worker 
763*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
764*49cdfc7eSAndroid Build Coastguard Worker }
765*49cdfc7eSAndroid Build Coastguard Worker 
safe_wait(const char * file,const int lineno,void (cleanup_fn)(void),int * status)766*49cdfc7eSAndroid Build Coastguard Worker pid_t safe_wait(const char *file, const int lineno, void (cleanup_fn)(void),
767*49cdfc7eSAndroid Build Coastguard Worker                 int *status)
768*49cdfc7eSAndroid Build Coastguard Worker {
769*49cdfc7eSAndroid Build Coastguard Worker 	pid_t rval;
770*49cdfc7eSAndroid Build Coastguard Worker 
771*49cdfc7eSAndroid Build Coastguard Worker 	rval = wait(status);
772*49cdfc7eSAndroid Build Coastguard Worker 
773*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
774*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
775*49cdfc7eSAndroid Build Coastguard Worker 			"wait(%p) failed", status);
776*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval < 0) {
777*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
778*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid wait(%p) return value %d", status, rval);
779*49cdfc7eSAndroid Build Coastguard Worker 	}
780*49cdfc7eSAndroid Build Coastguard Worker 
781*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
782*49cdfc7eSAndroid Build Coastguard Worker }
783*49cdfc7eSAndroid Build Coastguard Worker 
safe_waitpid(const char * file,const int lineno,void (cleanup_fn)(void),pid_t pid,int * status,int opts)784*49cdfc7eSAndroid Build Coastguard Worker pid_t safe_waitpid(const char *file, const int lineno, void (cleanup_fn)(void),
785*49cdfc7eSAndroid Build Coastguard Worker                    pid_t pid, int *status, int opts)
786*49cdfc7eSAndroid Build Coastguard Worker {
787*49cdfc7eSAndroid Build Coastguard Worker 	pid_t rval;
788*49cdfc7eSAndroid Build Coastguard Worker 
789*49cdfc7eSAndroid Build Coastguard Worker 	rval = waitpid(pid, status, opts);
790*49cdfc7eSAndroid Build Coastguard Worker 
791*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
792*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
793*49cdfc7eSAndroid Build Coastguard Worker 			"waitpid(%d,%p,%d) failed", pid, status, opts);
794*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval < 0) {
795*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
796*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid waitpid(%d,%p,%d) return value %d", pid,
797*49cdfc7eSAndroid Build Coastguard Worker 			status, opts, rval);
798*49cdfc7eSAndroid Build Coastguard Worker 	}
799*49cdfc7eSAndroid Build Coastguard Worker 
800*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
801*49cdfc7eSAndroid Build Coastguard Worker }
802*49cdfc7eSAndroid Build Coastguard Worker 
safe_memalign(const char * file,const int lineno,void (* cleanup_fn)(void),size_t alignment,size_t size)803*49cdfc7eSAndroid Build Coastguard Worker void *safe_memalign(const char *file, const int lineno,
804*49cdfc7eSAndroid Build Coastguard Worker 		    void (*cleanup_fn) (void), size_t alignment, size_t size)
805*49cdfc7eSAndroid Build Coastguard Worker {
806*49cdfc7eSAndroid Build Coastguard Worker 	void *rval;
807*49cdfc7eSAndroid Build Coastguard Worker 
808*49cdfc7eSAndroid Build Coastguard Worker 	rval = memalign(alignment, size);
809*49cdfc7eSAndroid Build Coastguard Worker 
810*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == NULL) {
811*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
812*49cdfc7eSAndroid Build Coastguard Worker 			"memalign() failed");
813*49cdfc7eSAndroid Build Coastguard Worker 	}
814*49cdfc7eSAndroid Build Coastguard Worker 
815*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
816*49cdfc7eSAndroid Build Coastguard Worker }
817*49cdfc7eSAndroid Build Coastguard Worker 
safe_kill(const char * file,const int lineno,void (cleanup_fn)(void),pid_t pid,int sig)818*49cdfc7eSAndroid Build Coastguard Worker int safe_kill(const char *file, const int lineno, void (cleanup_fn)(void),
819*49cdfc7eSAndroid Build Coastguard Worker 	      pid_t pid, int sig)
820*49cdfc7eSAndroid Build Coastguard Worker {
821*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
822*49cdfc7eSAndroid Build Coastguard Worker 
823*49cdfc7eSAndroid Build Coastguard Worker 	rval = kill(pid, sig);
824*49cdfc7eSAndroid Build Coastguard Worker 
825*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
826*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
827*49cdfc7eSAndroid Build Coastguard Worker 			"kill(%d,%s) failed", pid, tst_strsig(sig));
828*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
829*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
830*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid kill(%d,%s) return value %d", pid,
831*49cdfc7eSAndroid Build Coastguard Worker 			tst_strsig(sig), rval);
832*49cdfc7eSAndroid Build Coastguard Worker 	}
833*49cdfc7eSAndroid Build Coastguard Worker 
834*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
835*49cdfc7eSAndroid Build Coastguard Worker }
836*49cdfc7eSAndroid Build Coastguard Worker 
safe_mkfifo(const char * file,const int lineno,void (* cleanup_fn)(void),const char * pathname,mode_t mode)837*49cdfc7eSAndroid Build Coastguard Worker int safe_mkfifo(const char *file, const int lineno,
838*49cdfc7eSAndroid Build Coastguard Worker                 void (*cleanup_fn)(void), const char *pathname, mode_t mode)
839*49cdfc7eSAndroid Build Coastguard Worker {
840*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
841*49cdfc7eSAndroid Build Coastguard Worker 
842*49cdfc7eSAndroid Build Coastguard Worker 	rval = mkfifo(pathname, mode);
843*49cdfc7eSAndroid Build Coastguard Worker 
844*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
845*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
846*49cdfc7eSAndroid Build Coastguard Worker 			"mkfifo(%s, %04o) failed", pathname, mode);
847*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
848*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
849*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid mkfifo(%s, %04o) return value %d", pathname,
850*49cdfc7eSAndroid Build Coastguard Worker 			mode, rval);
851*49cdfc7eSAndroid Build Coastguard Worker 	}
852*49cdfc7eSAndroid Build Coastguard Worker 
853*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
854*49cdfc7eSAndroid Build Coastguard Worker }
855*49cdfc7eSAndroid Build Coastguard Worker 
safe_rename(const char * file,const int lineno,void (* cleanup_fn)(void),const char * oldpath,const char * newpath)856*49cdfc7eSAndroid Build Coastguard Worker int safe_rename(const char *file, const int lineno, void (*cleanup_fn)(void),
857*49cdfc7eSAndroid Build Coastguard Worker 		const char *oldpath, const char *newpath)
858*49cdfc7eSAndroid Build Coastguard Worker {
859*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
860*49cdfc7eSAndroid Build Coastguard Worker 
861*49cdfc7eSAndroid Build Coastguard Worker 	rval = rename(oldpath, newpath);
862*49cdfc7eSAndroid Build Coastguard Worker 
863*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
864*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
865*49cdfc7eSAndroid Build Coastguard Worker 			"rename(%s, %s) failed", oldpath, newpath);
866*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
867*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
868*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid rename(%s, %s) return value %d", oldpath,
869*49cdfc7eSAndroid Build Coastguard Worker 			newpath, rval);
870*49cdfc7eSAndroid Build Coastguard Worker 	}
871*49cdfc7eSAndroid Build Coastguard Worker 
872*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
873*49cdfc7eSAndroid Build Coastguard Worker }
874*49cdfc7eSAndroid Build Coastguard Worker 
875*49cdfc7eSAndroid Build Coastguard Worker static const char *const fuse_fs_types[] = {
876*49cdfc7eSAndroid Build Coastguard Worker 	"exfat",
877*49cdfc7eSAndroid Build Coastguard Worker 	"ntfs",
878*49cdfc7eSAndroid Build Coastguard Worker };
879*49cdfc7eSAndroid Build Coastguard Worker 
possibly_fuse(const char * fs_type)880*49cdfc7eSAndroid Build Coastguard Worker static int possibly_fuse(const char *fs_type)
881*49cdfc7eSAndroid Build Coastguard Worker {
882*49cdfc7eSAndroid Build Coastguard Worker 	unsigned int i;
883*49cdfc7eSAndroid Build Coastguard Worker 
884*49cdfc7eSAndroid Build Coastguard Worker 	if (!fs_type)
885*49cdfc7eSAndroid Build Coastguard Worker 		return 0;
886*49cdfc7eSAndroid Build Coastguard Worker 
887*49cdfc7eSAndroid Build Coastguard Worker 	for (i = 0; i < ARRAY_SIZE(fuse_fs_types); i++) {
888*49cdfc7eSAndroid Build Coastguard Worker 		if (!strcmp(fuse_fs_types[i], fs_type))
889*49cdfc7eSAndroid Build Coastguard Worker 			return 1;
890*49cdfc7eSAndroid Build Coastguard Worker 	}
891*49cdfc7eSAndroid Build Coastguard Worker 
892*49cdfc7eSAndroid Build Coastguard Worker 	return 0;
893*49cdfc7eSAndroid Build Coastguard Worker }
894*49cdfc7eSAndroid Build Coastguard Worker 
safe_mount(const char * file,const int lineno,void (* cleanup_fn)(void),const char * source,const char * target,const char * filesystemtype,unsigned long mountflags,const void * data)895*49cdfc7eSAndroid Build Coastguard Worker int safe_mount(const char *file, const int lineno, void (*cleanup_fn)(void),
896*49cdfc7eSAndroid Build Coastguard Worker 	       const char *source, const char *target,
897*49cdfc7eSAndroid Build Coastguard Worker 	       const char *filesystemtype, unsigned long mountflags,
898*49cdfc7eSAndroid Build Coastguard Worker 	       const void *data)
899*49cdfc7eSAndroid Build Coastguard Worker {
900*49cdfc7eSAndroid Build Coastguard Worker 	int rval = -1;
901*49cdfc7eSAndroid Build Coastguard Worker 	char mpath[PATH_MAX];
902*49cdfc7eSAndroid Build Coastguard Worker 
903*49cdfc7eSAndroid Build Coastguard Worker 	if (realpath(target, mpath)) {
904*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm_(file, lineno, TINFO,
905*49cdfc7eSAndroid Build Coastguard Worker 			"Mounting %s to %s fstyp=%s flags=%lx",
906*49cdfc7eSAndroid Build Coastguard Worker 			source, mpath, filesystemtype, mountflags);
907*49cdfc7eSAndroid Build Coastguard Worker 	} else {
908*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm_(file, lineno, TINFO | TERRNO,
909*49cdfc7eSAndroid Build Coastguard Worker 			"Cannot resolve the absolute path of %s", target);
910*49cdfc7eSAndroid Build Coastguard Worker 	}
911*49cdfc7eSAndroid Build Coastguard Worker 	/*
912*49cdfc7eSAndroid Build Coastguard Worker 	 * Don't try using the kernel's NTFS driver when mounting NTFS, since
913*49cdfc7eSAndroid Build Coastguard Worker 	 * the kernel's NTFS driver doesn't have proper write support.
914*49cdfc7eSAndroid Build Coastguard Worker 	 */
915*49cdfc7eSAndroid Build Coastguard Worker 	if (!filesystemtype || strcmp(filesystemtype, "ntfs")) {
916*49cdfc7eSAndroid Build Coastguard Worker 		mode_t old_umask = umask(0);
917*49cdfc7eSAndroid Build Coastguard Worker 
918*49cdfc7eSAndroid Build Coastguard Worker 		rval = mount(source, target, filesystemtype, mountflags, data);
919*49cdfc7eSAndroid Build Coastguard Worker 		umask(old_umask);
920*49cdfc7eSAndroid Build Coastguard Worker 		if (!rval)
921*49cdfc7eSAndroid Build Coastguard Worker 			return 0;
922*49cdfc7eSAndroid Build Coastguard Worker 	}
923*49cdfc7eSAndroid Build Coastguard Worker 
924*49cdfc7eSAndroid Build Coastguard Worker 	/*
925*49cdfc7eSAndroid Build Coastguard Worker 	 * The FUSE filesystem executes mount.fuse helper, which tries to
926*49cdfc7eSAndroid Build Coastguard Worker 	 * execute corresponding binary name which is encoded at the start of
927*49cdfc7eSAndroid Build Coastguard Worker 	 * the source string and separated by # from the device name.
928*49cdfc7eSAndroid Build Coastguard Worker          *
929*49cdfc7eSAndroid Build Coastguard Worker 	 * The mount helpers are called mount.$fs_type.
930*49cdfc7eSAndroid Build Coastguard Worker 	 */
931*49cdfc7eSAndroid Build Coastguard Worker 	if (possibly_fuse(filesystemtype)) {
932*49cdfc7eSAndroid Build Coastguard Worker 		char buf[1024];
933*49cdfc7eSAndroid Build Coastguard Worker 
934*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm_(file, lineno, TINFO, "Trying FUSE...");
935*49cdfc7eSAndroid Build Coastguard Worker 		snprintf(buf, sizeof(buf), "mount.%s '%s' '%s'",
936*49cdfc7eSAndroid Build Coastguard Worker 			filesystemtype, source, target);
937*49cdfc7eSAndroid Build Coastguard Worker 
938*49cdfc7eSAndroid Build Coastguard Worker 		rval = tst_system(buf);
939*49cdfc7eSAndroid Build Coastguard Worker 		if (WIFEXITED(rval) && WEXITSTATUS(rval) == 0)
940*49cdfc7eSAndroid Build Coastguard Worker 			return 0;
941*49cdfc7eSAndroid Build Coastguard Worker 
942*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK, cleanup_fn,
943*49cdfc7eSAndroid Build Coastguard Worker 			"mount.%s failed with %i", filesystemtype, rval);
944*49cdfc7eSAndroid Build Coastguard Worker 		return -1;
945*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval == -1) {
946*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
947*49cdfc7eSAndroid Build Coastguard Worker 			"mount(%s, %s, %s, %lu, %p) failed", source, target,
948*49cdfc7eSAndroid Build Coastguard Worker 			filesystemtype, mountflags, data);
949*49cdfc7eSAndroid Build Coastguard Worker 	} else {
950*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
951*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid mount(%s, %s, %s, %lu, %p) return value %d",
952*49cdfc7eSAndroid Build Coastguard Worker 			source, target, filesystemtype, mountflags, data,
953*49cdfc7eSAndroid Build Coastguard Worker 			rval);
954*49cdfc7eSAndroid Build Coastguard Worker 	}
955*49cdfc7eSAndroid Build Coastguard Worker 
956*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
957*49cdfc7eSAndroid Build Coastguard Worker }
958*49cdfc7eSAndroid Build Coastguard Worker 
safe_umount(const char * file,const int lineno,void (* cleanup_fn)(void),const char * target)959*49cdfc7eSAndroid Build Coastguard Worker int safe_umount(const char *file, const int lineno, void (*cleanup_fn)(void),
960*49cdfc7eSAndroid Build Coastguard Worker 		const char *target)
961*49cdfc7eSAndroid Build Coastguard Worker {
962*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
963*49cdfc7eSAndroid Build Coastguard Worker 	char mpath[PATH_MAX];
964*49cdfc7eSAndroid Build Coastguard Worker 
965*49cdfc7eSAndroid Build Coastguard Worker 	if (realpath(target, mpath)) {
966*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm_(file, lineno, TINFO, "Umounting %s", mpath);
967*49cdfc7eSAndroid Build Coastguard Worker 	} else {
968*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm_(file, lineno, TINFO | TERRNO,
969*49cdfc7eSAndroid Build Coastguard Worker 			"Cannot resolve the absolute path of %s", target);
970*49cdfc7eSAndroid Build Coastguard Worker 	}
971*49cdfc7eSAndroid Build Coastguard Worker 
972*49cdfc7eSAndroid Build Coastguard Worker 	rval = tst_umount(target);
973*49cdfc7eSAndroid Build Coastguard Worker 
974*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
975*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
976*49cdfc7eSAndroid Build Coastguard Worker 			"umount(%s) failed", target);
977*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
978*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
979*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid umount(%s) return value %d", target, rval);
980*49cdfc7eSAndroid Build Coastguard Worker 	}
981*49cdfc7eSAndroid Build Coastguard Worker 
982*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
983*49cdfc7eSAndroid Build Coastguard Worker }
984*49cdfc7eSAndroid Build Coastguard Worker 
safe_opendir(const char * file,const int lineno,void (cleanup_fn)(void),const char * name)985*49cdfc7eSAndroid Build Coastguard Worker DIR* safe_opendir(const char *file, const int lineno, void (cleanup_fn)(void),
986*49cdfc7eSAndroid Build Coastguard Worker                   const char *name)
987*49cdfc7eSAndroid Build Coastguard Worker {
988*49cdfc7eSAndroid Build Coastguard Worker 	DIR *rval;
989*49cdfc7eSAndroid Build Coastguard Worker 
990*49cdfc7eSAndroid Build Coastguard Worker 	rval = opendir(name);
991*49cdfc7eSAndroid Build Coastguard Worker 
992*49cdfc7eSAndroid Build Coastguard Worker 	if (!rval) {
993*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
994*49cdfc7eSAndroid Build Coastguard Worker 			"opendir(%s) failed", name);
995*49cdfc7eSAndroid Build Coastguard Worker 	}
996*49cdfc7eSAndroid Build Coastguard Worker 
997*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
998*49cdfc7eSAndroid Build Coastguard Worker }
999*49cdfc7eSAndroid Build Coastguard Worker 
safe_closedir(const char * file,const int lineno,void (cleanup_fn)(void),DIR * dirp)1000*49cdfc7eSAndroid Build Coastguard Worker int safe_closedir(const char *file, const int lineno, void (cleanup_fn)(void),
1001*49cdfc7eSAndroid Build Coastguard Worker                   DIR *dirp)
1002*49cdfc7eSAndroid Build Coastguard Worker {
1003*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
1004*49cdfc7eSAndroid Build Coastguard Worker 
1005*49cdfc7eSAndroid Build Coastguard Worker 	rval = closedir(dirp);
1006*49cdfc7eSAndroid Build Coastguard Worker 
1007*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
1008*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
1009*49cdfc7eSAndroid Build Coastguard Worker 			"closedir(%p) failed", dirp);
1010*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
1011*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
1012*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid closedir(%p) return value %d", dirp, rval);
1013*49cdfc7eSAndroid Build Coastguard Worker 	}
1014*49cdfc7eSAndroid Build Coastguard Worker 
1015*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
1016*49cdfc7eSAndroid Build Coastguard Worker }
1017*49cdfc7eSAndroid Build Coastguard Worker 
safe_readdir(const char * file,const int lineno,void (cleanup_fn)(void),DIR * dirp)1018*49cdfc7eSAndroid Build Coastguard Worker struct dirent *safe_readdir(const char *file, const int lineno, void (cleanup_fn)(void),
1019*49cdfc7eSAndroid Build Coastguard Worker                             DIR *dirp)
1020*49cdfc7eSAndroid Build Coastguard Worker {
1021*49cdfc7eSAndroid Build Coastguard Worker 	struct dirent *rval;
1022*49cdfc7eSAndroid Build Coastguard Worker 	int err = errno;
1023*49cdfc7eSAndroid Build Coastguard Worker 
1024*49cdfc7eSAndroid Build Coastguard Worker 	errno = 0;
1025*49cdfc7eSAndroid Build Coastguard Worker 	rval = readdir(dirp);
1026*49cdfc7eSAndroid Build Coastguard Worker 
1027*49cdfc7eSAndroid Build Coastguard Worker 	if (!rval && errno) {
1028*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, cleanup_fn,
1029*49cdfc7eSAndroid Build Coastguard Worker 			"readdir(%p) failed", dirp);
1030*49cdfc7eSAndroid Build Coastguard Worker 	}
1031*49cdfc7eSAndroid Build Coastguard Worker 
1032*49cdfc7eSAndroid Build Coastguard Worker 	errno = err;
1033*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
1034*49cdfc7eSAndroid Build Coastguard Worker }
1035*49cdfc7eSAndroid Build Coastguard Worker 
safe_getpriority(const char * file,const int lineno,int which,id_t who)1036*49cdfc7eSAndroid Build Coastguard Worker int safe_getpriority(const char *file, const int lineno, int which, id_t who)
1037*49cdfc7eSAndroid Build Coastguard Worker {
1038*49cdfc7eSAndroid Build Coastguard Worker 	int rval, err = errno;
1039*49cdfc7eSAndroid Build Coastguard Worker 
1040*49cdfc7eSAndroid Build Coastguard Worker 	errno = 0;
1041*49cdfc7eSAndroid Build Coastguard Worker 	rval = getpriority(which, who);
1042*49cdfc7eSAndroid Build Coastguard Worker 
1043*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1 && errno) {
1044*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, NULL,
1045*49cdfc7eSAndroid Build Coastguard Worker 			"getpriority(%i, %i) failed", which, who);
1046*49cdfc7eSAndroid Build Coastguard Worker 	} else if (errno) {
1047*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, NULL,
1048*49cdfc7eSAndroid Build Coastguard Worker 			"getpriority(%i, %i) failed with return value %d",
1049*49cdfc7eSAndroid Build Coastguard Worker 			which, who, rval);
1050*49cdfc7eSAndroid Build Coastguard Worker 	}
1051*49cdfc7eSAndroid Build Coastguard Worker 
1052*49cdfc7eSAndroid Build Coastguard Worker 	errno = err;
1053*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
1054*49cdfc7eSAndroid Build Coastguard Worker }
1055*49cdfc7eSAndroid Build Coastguard Worker 
safe_getxattr(const char * file,const int lineno,const char * path,const char * name,void * value,size_t size)1056*49cdfc7eSAndroid Build Coastguard Worker ssize_t safe_getxattr(const char *file, const int lineno, const char *path,
1057*49cdfc7eSAndroid Build Coastguard Worker 		      const char *name, void *value, size_t size)
1058*49cdfc7eSAndroid Build Coastguard Worker {
1059*49cdfc7eSAndroid Build Coastguard Worker 	ssize_t rval;
1060*49cdfc7eSAndroid Build Coastguard Worker 
1061*49cdfc7eSAndroid Build Coastguard Worker 	rval = getxattr(path, name, value, size);
1062*49cdfc7eSAndroid Build Coastguard Worker 
1063*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
1064*49cdfc7eSAndroid Build Coastguard Worker 		if (errno == ENOTSUP) {
1065*49cdfc7eSAndroid Build Coastguard Worker 			tst_brkm_(file, lineno, TCONF, NULL,
1066*49cdfc7eSAndroid Build Coastguard Worker 				"no xattr support in fs or mounted without user_xattr option");
1067*49cdfc7eSAndroid Build Coastguard Worker 			return rval;
1068*49cdfc7eSAndroid Build Coastguard Worker 		}
1069*49cdfc7eSAndroid Build Coastguard Worker 
1070*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, NULL,
1071*49cdfc7eSAndroid Build Coastguard Worker 			"getxattr(%s, %s, %p, %zu) failed",
1072*49cdfc7eSAndroid Build Coastguard Worker 			path, name, value, size);
1073*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval < 0) {
1074*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, NULL,
1075*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid getxattr(%s, %s, %p, %zu) return value %zd",
1076*49cdfc7eSAndroid Build Coastguard Worker 			path, name, value, size, rval);
1077*49cdfc7eSAndroid Build Coastguard Worker 	}
1078*49cdfc7eSAndroid Build Coastguard Worker 
1079*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
1080*49cdfc7eSAndroid Build Coastguard Worker }
1081*49cdfc7eSAndroid Build Coastguard Worker 
safe_setxattr(const char * file,const int lineno,const char * path,const char * name,const void * value,size_t size,int flags)1082*49cdfc7eSAndroid Build Coastguard Worker int safe_setxattr(const char *file, const int lineno, const char *path,
1083*49cdfc7eSAndroid Build Coastguard Worker 		  const char *name, const void *value, size_t size, int flags)
1084*49cdfc7eSAndroid Build Coastguard Worker {
1085*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
1086*49cdfc7eSAndroid Build Coastguard Worker 
1087*49cdfc7eSAndroid Build Coastguard Worker 	rval = setxattr(path, name, value, size, flags);
1088*49cdfc7eSAndroid Build Coastguard Worker 
1089*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
1090*49cdfc7eSAndroid Build Coastguard Worker 		if (errno == ENOTSUP) {
1091*49cdfc7eSAndroid Build Coastguard Worker 			tst_brkm_(file, lineno, TCONF, NULL,
1092*49cdfc7eSAndroid Build Coastguard Worker 				"no xattr support in fs, mounted without user_xattr option "
1093*49cdfc7eSAndroid Build Coastguard Worker 				"or invalid namespace/name format");
1094*49cdfc7eSAndroid Build Coastguard Worker 			return rval;
1095*49cdfc7eSAndroid Build Coastguard Worker 		}
1096*49cdfc7eSAndroid Build Coastguard Worker 
1097*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, NULL,
1098*49cdfc7eSAndroid Build Coastguard Worker 			"setxattr(%s, %s, %p, %zu) failed",
1099*49cdfc7eSAndroid Build Coastguard Worker 			path, name, value, size);
1100*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
1101*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, NULL,
1102*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid setxattr(%s, %s, %p, %zu) return value %d",
1103*49cdfc7eSAndroid Build Coastguard Worker 			path, name, value, size, rval);
1104*49cdfc7eSAndroid Build Coastguard Worker 	}
1105*49cdfc7eSAndroid Build Coastguard Worker 
1106*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
1107*49cdfc7eSAndroid Build Coastguard Worker }
1108*49cdfc7eSAndroid Build Coastguard Worker 
safe_lsetxattr(const char * file,const int lineno,const char * path,const char * name,const void * value,size_t size,int flags)1109*49cdfc7eSAndroid Build Coastguard Worker int safe_lsetxattr(const char *file, const int lineno, const char *path,
1110*49cdfc7eSAndroid Build Coastguard Worker 		   const char *name, const void *value, size_t size, int flags)
1111*49cdfc7eSAndroid Build Coastguard Worker {
1112*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
1113*49cdfc7eSAndroid Build Coastguard Worker 
1114*49cdfc7eSAndroid Build Coastguard Worker 	rval = lsetxattr(path, name, value, size, flags);
1115*49cdfc7eSAndroid Build Coastguard Worker 
1116*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
1117*49cdfc7eSAndroid Build Coastguard Worker 		if (errno == ENOTSUP) {
1118*49cdfc7eSAndroid Build Coastguard Worker 			tst_brkm_(file, lineno, TCONF, NULL,
1119*49cdfc7eSAndroid Build Coastguard Worker 				"no xattr support in fs, mounted without user_xattr option "
1120*49cdfc7eSAndroid Build Coastguard Worker 				"or invalid namespace/name format");
1121*49cdfc7eSAndroid Build Coastguard Worker 			return rval;
1122*49cdfc7eSAndroid Build Coastguard Worker 		}
1123*49cdfc7eSAndroid Build Coastguard Worker 
1124*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, NULL,
1125*49cdfc7eSAndroid Build Coastguard Worker 			"lsetxattr(%s, %s, %p, %zu, %i) failed",
1126*49cdfc7eSAndroid Build Coastguard Worker 			path, name, value, size, flags);
1127*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
1128*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, NULL,
1129*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid lsetxattr(%s, %s, %p, %zu, %i) return value %d",
1130*49cdfc7eSAndroid Build Coastguard Worker 			path, name, value, size, flags, rval);
1131*49cdfc7eSAndroid Build Coastguard Worker 	}
1132*49cdfc7eSAndroid Build Coastguard Worker 
1133*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
1134*49cdfc7eSAndroid Build Coastguard Worker }
1135*49cdfc7eSAndroid Build Coastguard Worker 
safe_fsetxattr(const char * file,const int lineno,int fd,const char * name,const void * value,size_t size,int flags)1136*49cdfc7eSAndroid Build Coastguard Worker int safe_fsetxattr(const char *file, const int lineno, int fd, const char *name,
1137*49cdfc7eSAndroid Build Coastguard Worker 		   const void *value, size_t size, int flags)
1138*49cdfc7eSAndroid Build Coastguard Worker {
1139*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
1140*49cdfc7eSAndroid Build Coastguard Worker 
1141*49cdfc7eSAndroid Build Coastguard Worker 	rval = fsetxattr(fd, name, value, size, flags);
1142*49cdfc7eSAndroid Build Coastguard Worker 
1143*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
1144*49cdfc7eSAndroid Build Coastguard Worker 		if (errno == ENOTSUP) {
1145*49cdfc7eSAndroid Build Coastguard Worker 			tst_brkm_(file, lineno, TCONF, NULL,
1146*49cdfc7eSAndroid Build Coastguard Worker 				"no xattr support in fs, mounted without user_xattr option "
1147*49cdfc7eSAndroid Build Coastguard Worker 				"or invalid namespace/name format");
1148*49cdfc7eSAndroid Build Coastguard Worker 			return rval;
1149*49cdfc7eSAndroid Build Coastguard Worker 		}
1150*49cdfc7eSAndroid Build Coastguard Worker 
1151*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, NULL,
1152*49cdfc7eSAndroid Build Coastguard Worker 			"fsetxattr(%i, %s, %p, %zu, %i) failed",
1153*49cdfc7eSAndroid Build Coastguard Worker 			fd, name, value, size, flags);
1154*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
1155*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, NULL,
1156*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid fsetxattr(%i, %s, %p, %zu, %i) return value %d",
1157*49cdfc7eSAndroid Build Coastguard Worker 			fd, name, value, size, flags, rval);
1158*49cdfc7eSAndroid Build Coastguard Worker 	}
1159*49cdfc7eSAndroid Build Coastguard Worker 
1160*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
1161*49cdfc7eSAndroid Build Coastguard Worker }
1162*49cdfc7eSAndroid Build Coastguard Worker 
safe_removexattr(const char * file,const int lineno,const char * path,const char * name)1163*49cdfc7eSAndroid Build Coastguard Worker int safe_removexattr(const char *file, const int lineno, const char *path,
1164*49cdfc7eSAndroid Build Coastguard Worker 		const char *name)
1165*49cdfc7eSAndroid Build Coastguard Worker {
1166*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
1167*49cdfc7eSAndroid Build Coastguard Worker 
1168*49cdfc7eSAndroid Build Coastguard Worker 	rval = removexattr(path, name);
1169*49cdfc7eSAndroid Build Coastguard Worker 
1170*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
1171*49cdfc7eSAndroid Build Coastguard Worker 		if (errno == ENOTSUP) {
1172*49cdfc7eSAndroid Build Coastguard Worker 			tst_brkm_(file, lineno, TCONF, NULL,
1173*49cdfc7eSAndroid Build Coastguard Worker 				"no xattr support in fs or mounted without user_xattr option");
1174*49cdfc7eSAndroid Build Coastguard Worker 			return rval;
1175*49cdfc7eSAndroid Build Coastguard Worker 		}
1176*49cdfc7eSAndroid Build Coastguard Worker 
1177*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, NULL,
1178*49cdfc7eSAndroid Build Coastguard Worker 			"removexattr(%s, %s) failed", path, name);
1179*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
1180*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, NULL,
1181*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid removexattr(%s, %s) return value %d", path,
1182*49cdfc7eSAndroid Build Coastguard Worker 			name, rval);
1183*49cdfc7eSAndroid Build Coastguard Worker 	}
1184*49cdfc7eSAndroid Build Coastguard Worker 
1185*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
1186*49cdfc7eSAndroid Build Coastguard Worker }
1187*49cdfc7eSAndroid Build Coastguard Worker 
safe_lremovexattr(const char * file,const int lineno,const char * path,const char * name)1188*49cdfc7eSAndroid Build Coastguard Worker int safe_lremovexattr(const char *file, const int lineno, const char *path,
1189*49cdfc7eSAndroid Build Coastguard Worker 		const char *name)
1190*49cdfc7eSAndroid Build Coastguard Worker {
1191*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
1192*49cdfc7eSAndroid Build Coastguard Worker 
1193*49cdfc7eSAndroid Build Coastguard Worker 	rval = lremovexattr(path, name);
1194*49cdfc7eSAndroid Build Coastguard Worker 
1195*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
1196*49cdfc7eSAndroid Build Coastguard Worker 		if (errno == ENOTSUP) {
1197*49cdfc7eSAndroid Build Coastguard Worker 			tst_brkm_(file, lineno, TCONF, NULL,
1198*49cdfc7eSAndroid Build Coastguard Worker 				"no xattr support in fs or mounted without user_xattr option");
1199*49cdfc7eSAndroid Build Coastguard Worker 			return rval;
1200*49cdfc7eSAndroid Build Coastguard Worker 		}
1201*49cdfc7eSAndroid Build Coastguard Worker 
1202*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, NULL,
1203*49cdfc7eSAndroid Build Coastguard Worker 			"lremovexattr(%s, %s) failed", path, name);
1204*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
1205*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, NULL,
1206*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid lremovexattr(%s, %s) return value %d", path,
1207*49cdfc7eSAndroid Build Coastguard Worker 			name, rval);
1208*49cdfc7eSAndroid Build Coastguard Worker 	}
1209*49cdfc7eSAndroid Build Coastguard Worker 
1210*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
1211*49cdfc7eSAndroid Build Coastguard Worker }
1212*49cdfc7eSAndroid Build Coastguard Worker 
safe_fremovexattr(const char * file,const int lineno,int fd,const char * name)1213*49cdfc7eSAndroid Build Coastguard Worker int safe_fremovexattr(const char *file, const int lineno, int fd,
1214*49cdfc7eSAndroid Build Coastguard Worker 		const char *name)
1215*49cdfc7eSAndroid Build Coastguard Worker {
1216*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
1217*49cdfc7eSAndroid Build Coastguard Worker 
1218*49cdfc7eSAndroid Build Coastguard Worker 	rval = fremovexattr(fd, name);
1219*49cdfc7eSAndroid Build Coastguard Worker 
1220*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
1221*49cdfc7eSAndroid Build Coastguard Worker 		if (errno == ENOTSUP) {
1222*49cdfc7eSAndroid Build Coastguard Worker 			tst_brkm_(file, lineno, TCONF, NULL,
1223*49cdfc7eSAndroid Build Coastguard Worker 				"no xattr support in fs or mounted without user_xattr option");
1224*49cdfc7eSAndroid Build Coastguard Worker 			return rval;
1225*49cdfc7eSAndroid Build Coastguard Worker 		}
1226*49cdfc7eSAndroid Build Coastguard Worker 
1227*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, NULL,
1228*49cdfc7eSAndroid Build Coastguard Worker 			"fremovexattr(%i, %s) failed", fd, name);
1229*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
1230*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, NULL,
1231*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid fremovexattr(%i, %s) return value %d", fd,
1232*49cdfc7eSAndroid Build Coastguard Worker 			name, rval);
1233*49cdfc7eSAndroid Build Coastguard Worker 	}
1234*49cdfc7eSAndroid Build Coastguard Worker 
1235*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
1236*49cdfc7eSAndroid Build Coastguard Worker }
1237*49cdfc7eSAndroid Build Coastguard Worker 
safe_fsync(const char * file,const int lineno,int fd)1238*49cdfc7eSAndroid Build Coastguard Worker int safe_fsync(const char *file, const int lineno, int fd)
1239*49cdfc7eSAndroid Build Coastguard Worker {
1240*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
1241*49cdfc7eSAndroid Build Coastguard Worker 
1242*49cdfc7eSAndroid Build Coastguard Worker 	rval = fsync(fd);
1243*49cdfc7eSAndroid Build Coastguard Worker 
1244*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
1245*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, NULL,
1246*49cdfc7eSAndroid Build Coastguard Worker 			"fsync(%i) failed", fd);
1247*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
1248*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, NULL,
1249*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid fsync(%i) return value %d", fd, rval);
1250*49cdfc7eSAndroid Build Coastguard Worker 	}
1251*49cdfc7eSAndroid Build Coastguard Worker 
1252*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
1253*49cdfc7eSAndroid Build Coastguard Worker }
1254*49cdfc7eSAndroid Build Coastguard Worker 
safe_setsid(const char * file,const int lineno)1255*49cdfc7eSAndroid Build Coastguard Worker pid_t safe_setsid(const char *file, const int lineno)
1256*49cdfc7eSAndroid Build Coastguard Worker {
1257*49cdfc7eSAndroid Build Coastguard Worker 	pid_t rval;
1258*49cdfc7eSAndroid Build Coastguard Worker 
1259*49cdfc7eSAndroid Build Coastguard Worker 	rval = setsid();
1260*49cdfc7eSAndroid Build Coastguard Worker 
1261*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
1262*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, NULL,
1263*49cdfc7eSAndroid Build Coastguard Worker 			"setsid() failed");
1264*49cdfc7eSAndroid Build Coastguard Worker 	}
1265*49cdfc7eSAndroid Build Coastguard Worker 
1266*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
1267*49cdfc7eSAndroid Build Coastguard Worker }
1268*49cdfc7eSAndroid Build Coastguard Worker 
safe_mknod(const char * file,const int lineno,const char * pathname,mode_t mode,dev_t dev)1269*49cdfc7eSAndroid Build Coastguard Worker int safe_mknod(const char *file, const int lineno, const char *pathname,
1270*49cdfc7eSAndroid Build Coastguard Worker 	mode_t mode, dev_t dev)
1271*49cdfc7eSAndroid Build Coastguard Worker {
1272*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
1273*49cdfc7eSAndroid Build Coastguard Worker 
1274*49cdfc7eSAndroid Build Coastguard Worker 	rval = mknod(pathname, mode, dev);
1275*49cdfc7eSAndroid Build Coastguard Worker 
1276*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
1277*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, NULL,
1278*49cdfc7eSAndroid Build Coastguard Worker 			"mknod() failed");
1279*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
1280*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, NULL,
1281*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid mknod() return value %d", rval);
1282*49cdfc7eSAndroid Build Coastguard Worker 	}
1283*49cdfc7eSAndroid Build Coastguard Worker 
1284*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
1285*49cdfc7eSAndroid Build Coastguard Worker }
1286*49cdfc7eSAndroid Build Coastguard Worker 
safe_mlock(const char * file,const int lineno,const void * addr,size_t len)1287*49cdfc7eSAndroid Build Coastguard Worker int safe_mlock(const char *file, const int lineno, const void *addr,
1288*49cdfc7eSAndroid Build Coastguard Worker 	size_t len)
1289*49cdfc7eSAndroid Build Coastguard Worker {
1290*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
1291*49cdfc7eSAndroid Build Coastguard Worker 
1292*49cdfc7eSAndroid Build Coastguard Worker 	rval = mlock(addr, len);
1293*49cdfc7eSAndroid Build Coastguard Worker 
1294*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
1295*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, NULL,
1296*49cdfc7eSAndroid Build Coastguard Worker 			"mlock() failed");
1297*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
1298*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, NULL,
1299*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid mlock() return value %d", rval);
1300*49cdfc7eSAndroid Build Coastguard Worker 	}
1301*49cdfc7eSAndroid Build Coastguard Worker 
1302*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
1303*49cdfc7eSAndroid Build Coastguard Worker }
1304*49cdfc7eSAndroid Build Coastguard Worker 
safe_munlock(const char * file,const int lineno,const void * addr,size_t len)1305*49cdfc7eSAndroid Build Coastguard Worker int safe_munlock(const char *file, const int lineno, const void *addr,
1306*49cdfc7eSAndroid Build Coastguard Worker 	size_t len)
1307*49cdfc7eSAndroid Build Coastguard Worker {
1308*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
1309*49cdfc7eSAndroid Build Coastguard Worker 
1310*49cdfc7eSAndroid Build Coastguard Worker 	rval = munlock(addr, len);
1311*49cdfc7eSAndroid Build Coastguard Worker 
1312*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
1313*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, NULL,
1314*49cdfc7eSAndroid Build Coastguard Worker 			"munlock() failed");
1315*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
1316*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, NULL,
1317*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid munlock() return value %d", rval);
1318*49cdfc7eSAndroid Build Coastguard Worker 	}
1319*49cdfc7eSAndroid Build Coastguard Worker 
1320*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
1321*49cdfc7eSAndroid Build Coastguard Worker }
1322*49cdfc7eSAndroid Build Coastguard Worker 
safe_mincore(const char * file,const int lineno,void * start,size_t length,unsigned char * vec)1323*49cdfc7eSAndroid Build Coastguard Worker int safe_mincore(const char *file, const int lineno, void *start,
1324*49cdfc7eSAndroid Build Coastguard Worker 	size_t length, unsigned char *vec)
1325*49cdfc7eSAndroid Build Coastguard Worker {
1326*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
1327*49cdfc7eSAndroid Build Coastguard Worker 
1328*49cdfc7eSAndroid Build Coastguard Worker 	rval = mincore(start, length, vec);
1329*49cdfc7eSAndroid Build Coastguard Worker 
1330*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
1331*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, NULL,
1332*49cdfc7eSAndroid Build Coastguard Worker 			"mincore() failed");
1333*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
1334*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, NULL,
1335*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid mincore() return value %d", rval);
1336*49cdfc7eSAndroid Build Coastguard Worker 	}
1337*49cdfc7eSAndroid Build Coastguard Worker 
1338*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
1339*49cdfc7eSAndroid Build Coastguard Worker }
1340*49cdfc7eSAndroid Build Coastguard Worker 
safe_sysinfo(const char * file,const int lineno,struct sysinfo * info)1341*49cdfc7eSAndroid Build Coastguard Worker int safe_sysinfo(const char *file, const int lineno, struct sysinfo *info)
1342*49cdfc7eSAndroid Build Coastguard Worker {
1343*49cdfc7eSAndroid Build Coastguard Worker 	int ret;
1344*49cdfc7eSAndroid Build Coastguard Worker 
1345*49cdfc7eSAndroid Build Coastguard Worker 	errno = 0;
1346*49cdfc7eSAndroid Build Coastguard Worker 	ret = sysinfo(info);
1347*49cdfc7eSAndroid Build Coastguard Worker 
1348*49cdfc7eSAndroid Build Coastguard Worker 	if (ret == -1) {
1349*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, NULL,
1350*49cdfc7eSAndroid Build Coastguard Worker 			"sysinfo() failed");
1351*49cdfc7eSAndroid Build Coastguard Worker 	} else if (ret) {
1352*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm_(file, lineno, TBROK | TERRNO, NULL,
1353*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid sysinfo() return value %d", ret);
1354*49cdfc7eSAndroid Build Coastguard Worker 	}
1355*49cdfc7eSAndroid Build Coastguard Worker 
1356*49cdfc7eSAndroid Build Coastguard Worker 	return ret;
1357*49cdfc7eSAndroid Build Coastguard Worker }
1358