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