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