blob: 4c8cbb7159f613d4950dc6c551c28b4a56c711ce [file] [log] [blame]
Garrett Cooperdd3f47e2010-12-20 05:40:52 -08001#include <sys/types.h>
Garrett Cooperca435922010-12-20 12:26:32 -08002#include <sys/mman.h>
Caspar Zhang817c7822011-06-30 01:50:33 +08003#include <sys/resource.h>
Garrett Cooperdd3f47e2010-12-20 05:40:52 -08004#include <sys/stat.h>
5#include <fcntl.h>
6#include <libgen.h>
Caspar Zhangd6a1f252012-02-09 15:58:28 +08007#include <limits.h>
Garrett Cooperca435922010-12-20 12:26:32 -08008#include <pwd.h>
Garrett Cooperdd3f47e2010-12-20 05:40:52 -08009#include <stdarg.h>
Garrett Cooperca435922010-12-20 12:26:32 -080010#include <stdlib.h>
Garrett Cooperdd3f47e2010-12-20 05:40:52 -080011#include <unistd.h>
12#include "test.h"
Garrett Cooperca435922010-12-20 12:26:32 -080013#include "safe_macros.h"
Garrett Cooperdd3f47e2010-12-20 05:40:52 -080014
15char *
16safe_basename(const char *file, const int lineno, void (*cleanup_fn)(void),
17 char *path)
18{
19 char *rval;
20
21 rval = basename(path);
22 if (rval == NULL)
23 tst_brkm(TBROK|TERRNO, cleanup_fn, "basename failed at %s:%d",
24 file, lineno);
25
26 return (rval);
27}
28
29int
Garrett Cooper4a3c6582010-12-21 07:07:01 -080030safe_chdir(const char *file, const int lineno, void (*cleanup_fn)(void),
31 const char *path)
32{
33 int rval;
34
35 rval = chdir(path);
36 if (rval == -1)
37 tst_brkm(TBROK|TERRNO, cleanup_fn, "chdir failed at %s:%d",
38 file, lineno);
39
40 return (rval);
41}
42
43int
Garrett Cooperdd3f47e2010-12-20 05:40:52 -080044safe_close(const char *file, const int lineno, void (*cleanup_fn)(void),
45 int fildes)
46{
47 int rval;
48
49 rval = close(fildes);
50 if (rval == -1)
51 tst_brkm(TBROK|TERRNO, cleanup_fn, "close failed at %s:%d",
52 file, lineno);
53
54 return (rval);
55}
56
57int
58safe_creat(const char *file, const int lineno, void (*cleanup_fn)(void),
59 char *pathname, mode_t mode)
60{
61 int rval;
62
63 rval = creat(pathname, mode);
64 if (rval == -1)
65 tst_brkm(TBROK|TERRNO, cleanup_fn, "pipe failed at %s:%d",
66 file, lineno);
67
68 return (rval);
69}
70
71char *
72safe_dirname(const char *file, const int lineno, void (*cleanup_fn)(void),
73 char *path)
74{
75 char *rval;
76
77 rval = dirname(path);
78 if (rval == NULL)
79 tst_brkm(TBROK|TERRNO, cleanup_fn, "dirname failed at %s:%d",
80 file, lineno);
81
82 return (rval);
83}
84
Garrett Cooperca435922010-12-20 12:26:32 -080085char *
86safe_getcwd(const char *file, const int lineno, void (*cleanup_fn)(void),
87 char *buf, size_t size)
88{
89 char *rval;
90
91 rval = getcwd(buf, size);
92 if (rval == NULL)
93 tst_brkm(TBROK|TERRNO, cleanup_fn, "getcwd failed at %s:%d",
94 file, lineno);
95
96 return (rval);
97}
98
99struct passwd*
100safe_getpwnam(const char *file, const int lineno, void (*cleanup_fn)(void),
101 const char *name)
102{
103 struct passwd *rval;
104
105 rval = getpwnam(name);
106 if (rval == NULL)
107 tst_brkm(TBROK|TERRNO, cleanup_fn, "getpwnam failed at %s:%d",
108 file, lineno);
109
110 return (rval);
111}
112
Caspar Zhang817c7822011-06-30 01:50:33 +0800113int
114safe_getrusage(const char *file, const int lineno, void (*cleanup_fn)(void),
115 int who, struct rusage *usage)
116{
117 int rval;
118
119 rval = getrusage(who, usage);
120 if (rval == -1)
121 tst_brkm(TBROK|TERRNO, cleanup_fn, "getrusage failed at %s:%d",
122 file, lineno);
123
124 return rval;
125}
126
Garrett Cooperca435922010-12-20 12:26:32 -0800127void*
128safe_malloc(const char *file, const int lineno, void (*cleanup_fn)(void),
129 size_t size)
130{
131 void *rval;
132
133 rval = malloc(size);
134 if (rval == NULL)
135 tst_brkm(TBROK|TERRNO, cleanup_fn, "malloc failed at %s:%d",
136 file, lineno);
137
138 return (rval);
139}
140
Garrett Cooper4a3c6582010-12-21 07:07:01 -0800141int
142safe_mkdir(const char *file, const int lineno, void (*cleanup_fn)(void),
143 const char *pathname, mode_t mode)
144{
145 int rval;
146
147 rval = mkdir(pathname, mode);
148 if (rval == -1)
149 tst_brkm(TBROK|TERRNO, cleanup_fn, "mkdir failed at %s:%d",
150 file, lineno);
151
152 return (rval);
153}
154
Garrett Cooperca435922010-12-20 12:26:32 -0800155void*
156safe_mmap(const char *file, const int lineno, void (*cleanup_fn)(void),
157 void *addr, size_t length, int prot, int flags, int fd, off_t offset)
158{
159 void *rval;
160
161 rval = mmap(addr, length, prot, flags, fd, offset);
162 if (rval == MAP_FAILED)
163 tst_brkm(TBROK|TERRNO, cleanup_fn, "mmap failed at %s:%d",
164 file, lineno);
165
166 return (rval);
167}
168
169int
170safe_munmap(const char *file, const int lineno, void (*cleanup_fn)(void),
171 void *addr, size_t length)
172{
173 int rval;
174
175 rval = munmap(addr, length);
176 if (rval == -1)
177 tst_brkm(TBROK|TERRNO, cleanup_fn, "munmap failed at %s:%d",
178 file, lineno);
179
180 return (rval);
181}
182
Garrett Cooperdd3f47e2010-12-20 05:40:52 -0800183int
184safe_open(const char *file, const int lineno, void (*cleanup_fn)(void),
185 const char *pathname, int oflags, ...)
186{
187 va_list ap;
188 int rval;
189 mode_t mode;
190
191 va_start(ap, oflags);
192 mode = va_arg(ap, mode_t);
193 va_end(ap);
194
195 rval = open(pathname, oflags, mode);
196 if (rval == -1)
197 tst_brkm(TBROK|TERRNO, cleanup_fn, "open failed at %s:%d",
198 file, lineno);
199
200 return (rval);
201}
202
203int
204safe_pipe(const char *file, const int lineno, void (*cleanup_fn)(void),
205 int fildes[2])
206{
207 int rval;
208
209 rval = pipe(fildes);
210 if (rval == -1)
211 tst_brkm(TBROK|TERRNO, cleanup_fn, "pipe failed at %s:%d",
212 file, lineno);
213
214 return (rval);
215}
216
217ssize_t
218safe_read(const char *file, const int lineno, void (*cleanup_fn)(void),
219 char len_strict, int fildes, void *buf, size_t nbyte)
220{
221 ssize_t rval;
222
223 rval = read(fildes, buf, nbyte);
224 if ((len_strict == 0 && rval == -1) || rval != nbyte)
225 tst_brkm(TBROK|TERRNO, cleanup_fn, "read failed at %s:%d",
226 file, lineno);
227
228 return (rval);
229}
230
Garrett Cooper400c8362010-12-20 20:02:01 -0800231 int
232safe_setegid(const char *file, const int lineno, void (*cleanup_fn)(void),
233 gid_t egid)
234{
235 int rval;
236
237 rval = setegid(egid);
238 if (rval == -1)
239 tst_brkm(TBROK|TERRNO, cleanup_fn, "setegid failed at %s:%d",
240 file, lineno);
241
242 return (rval);
243}
244
245int
246safe_seteuid(const char *file, const int lineno, void (*cleanup_fn)(void),
247 uid_t euid)
248{
249 int rval;
250
251 rval = seteuid(euid);
252 if (rval == -1)
253 tst_brkm(TBROK|TERRNO, cleanup_fn, "seteuid failed at %s:%d",
254 file, lineno);
255
256 return (rval);
257}
258
Garrett Cooperdd3f47e2010-12-20 05:40:52 -0800259int
Garrett Cooperca435922010-12-20 12:26:32 -0800260safe_setgid(const char *file, const int lineno, void (*cleanup_fn)(void),
261 gid_t gid)
262{
263 int rval;
264
265 rval = setgid(gid);
266 if (rval == -1)
267 tst_brkm(TBROK|TERRNO, cleanup_fn, "setgid failed at %s:%d",
268 file, lineno);
269
270 return (rval);
271}
272
273int
274safe_setuid(const char *file, const int lineno, void (*cleanup_fn)(void),
275 uid_t uid)
276{
277 int rval;
278
279 rval = setuid(uid);
280 if (rval == -1)
281 tst_brkm(TBROK|TERRNO, cleanup_fn, "setuid failed at %s:%d",
282 file, lineno);
283
284 return (rval);
285}
286
287int
Garrett Cooperdd3f47e2010-12-20 05:40:52 -0800288safe_unlink(const char *file, const int lineno, void (*cleanup_fn)(void),
289 const char *pathname)
290{
291 int rval;
292
293 rval = unlink(pathname);
294 if (rval == -1)
295 tst_brkm(TBROK|TERRNO, cleanup_fn, "unlink failed at %s:%d",
296 file, lineno);
297
298 return (rval);
299}
300
301ssize_t
302safe_write(const char *file, const int lineno, void (cleanup_fn)(void),
303 char len_strict, int fildes, const void *buf, size_t nbyte)
304{
305 ssize_t rval;
306
307 rval = write(fildes, buf, nbyte);
308 if ((len_strict == 0 && rval == -1) || rval != nbyte)
309 tst_brkm(TBROK|TERRNO, cleanup_fn, "write failed at %s:%d",
310 file, lineno);
311
312 return (rval);
313}
Cyril Hrubis3f75fe42011-12-28 15:33:12 +0100314
315int safe_ftruncate(const char *file, const int lineno,
316 void (cleanup_fn)(void), int fd, off_t length)
317{
318 int rval;
Caspar Zhangd6a1f252012-02-09 15:58:28 +0800319
Cyril Hrubis3f75fe42011-12-28 15:33:12 +0100320 rval = ftruncate(fd, length);
321 if (rval == -1) {
322 tst_brkm(TBROK|TERRNO, cleanup_fn, "ftruncate failed at %s:%d",
323 file, lineno);
324 }
325
326 return rval;
327}
328
329int safe_truncate(const char *file, const int lineno,
330 void (cleanup_fn)(void), const char *path, off_t length)
331{
332 int rval;
333
334 rval = truncate(path, length);
335 if (rval == -1) {
336 tst_brkm(TBROK|TERRNO, cleanup_fn, "truncate failed at %s:%d",
337 file, lineno);
338 }
339
340 return rval;
341}
Caspar Zhangd6a1f252012-02-09 15:58:28 +0800342
343long safe_strtol(const char *file, const int lineno,
344 void (cleanup_fn)(void), char *str, long min, long max)
345{
346 long rval;
347 char *endptr;
348
349 errno = 0;
350 rval = strtol(str, &endptr, 10);
351 if ((errno == ERANGE && (rval == LONG_MAX || rval == LONG_MIN))
352 || (errno != 0 && rval == 0))
353 tst_brkm(TBROK|TERRNO, cleanup_fn,
354 "strtol failed at %s:%d", file, lineno);
355 if (rval > max || rval < min)
356 tst_brkm(TBROK, cleanup_fn,
357 "converted value out of range (%ld - %ld) at %s:%d",
358 min, max, file, lineno);
359 if (endptr == str || (*endptr != '\0' && *endptr != '\n'))
360 tst_brkm(TBROK, cleanup_fn,
361 "Invalid value: '%s' at %s:%d", str, file, lineno);
362
363 return rval;
364}