blob: 569952d5223e721bfa4f62780e40323f1a4a84cd [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>
Garrett Cooperca435922010-12-20 12:26:32 -08007#include <pwd.h>
Garrett Cooperdd3f47e2010-12-20 05:40:52 -08008#include <stdarg.h>
Garrett Cooperca435922010-12-20 12:26:32 -08009#include <stdlib.h>
Garrett Cooperdd3f47e2010-12-20 05:40:52 -080010#include <unistd.h>
11#include "test.h"
Garrett Cooperca435922010-12-20 12:26:32 -080012#include "safe_macros.h"
Garrett Cooperdd3f47e2010-12-20 05:40:52 -080013
14char *
15safe_basename(const char *file, const int lineno, void (*cleanup_fn)(void),
16 char *path)
17{
18 char *rval;
19
20 rval = basename(path);
21 if (rval == NULL)
22 tst_brkm(TBROK|TERRNO, cleanup_fn, "basename failed at %s:%d",
23 file, lineno);
24
25 return (rval);
26}
27
28int
Garrett Cooper4a3c6582010-12-21 07:07:01 -080029safe_chdir(const char *file, const int lineno, void (*cleanup_fn)(void),
30 const char *path)
31{
32 int rval;
33
34 rval = chdir(path);
35 if (rval == -1)
36 tst_brkm(TBROK|TERRNO, cleanup_fn, "chdir failed at %s:%d",
37 file, lineno);
38
39 return (rval);
40}
41
42int
Garrett Cooperdd3f47e2010-12-20 05:40:52 -080043safe_close(const char *file, const int lineno, void (*cleanup_fn)(void),
44 int fildes)
45{
46 int rval;
47
48 rval = close(fildes);
49 if (rval == -1)
50 tst_brkm(TBROK|TERRNO, cleanup_fn, "close failed at %s:%d",
51 file, lineno);
52
53 return (rval);
54}
55
56int
57safe_creat(const char *file, const int lineno, void (*cleanup_fn)(void),
58 char *pathname, mode_t mode)
59{
60 int rval;
61
62 rval = creat(pathname, mode);
63 if (rval == -1)
64 tst_brkm(TBROK|TERRNO, cleanup_fn, "pipe failed at %s:%d",
65 file, lineno);
66
67 return (rval);
68}
69
70char *
71safe_dirname(const char *file, const int lineno, void (*cleanup_fn)(void),
72 char *path)
73{
74 char *rval;
75
76 rval = dirname(path);
77 if (rval == NULL)
78 tst_brkm(TBROK|TERRNO, cleanup_fn, "dirname failed at %s:%d",
79 file, lineno);
80
81 return (rval);
82}
83
Garrett Cooperca435922010-12-20 12:26:32 -080084char *
85safe_getcwd(const char *file, const int lineno, void (*cleanup_fn)(void),
86 char *buf, size_t size)
87{
88 char *rval;
89
90 rval = getcwd(buf, size);
91 if (rval == NULL)
92 tst_brkm(TBROK|TERRNO, cleanup_fn, "getcwd failed at %s:%d",
93 file, lineno);
94
95 return (rval);
96}
97
98struct passwd*
99safe_getpwnam(const char *file, const int lineno, void (*cleanup_fn)(void),
100 const char *name)
101{
102 struct passwd *rval;
103
104 rval = getpwnam(name);
105 if (rval == NULL)
106 tst_brkm(TBROK|TERRNO, cleanup_fn, "getpwnam failed at %s:%d",
107 file, lineno);
108
109 return (rval);
110}
111
Caspar Zhang817c7822011-06-30 01:50:33 +0800112int
113safe_getrusage(const char *file, const int lineno, void (*cleanup_fn)(void),
114 int who, struct rusage *usage)
115{
116 int rval;
117
118 rval = getrusage(who, usage);
119 if (rval == -1)
120 tst_brkm(TBROK|TERRNO, cleanup_fn, "getrusage failed at %s:%d",
121 file, lineno);
122
123 return rval;
124}
125
Garrett Cooperca435922010-12-20 12:26:32 -0800126void*
127safe_malloc(const char *file, const int lineno, void (*cleanup_fn)(void),
128 size_t size)
129{
130 void *rval;
131
132 rval = malloc(size);
133 if (rval == NULL)
134 tst_brkm(TBROK|TERRNO, cleanup_fn, "malloc failed at %s:%d",
135 file, lineno);
136
137 return (rval);
138}
139
Garrett Cooper4a3c6582010-12-21 07:07:01 -0800140int
141safe_mkdir(const char *file, const int lineno, void (*cleanup_fn)(void),
142 const char *pathname, mode_t mode)
143{
144 int rval;
145
146 rval = mkdir(pathname, mode);
147 if (rval == -1)
148 tst_brkm(TBROK|TERRNO, cleanup_fn, "mkdir failed at %s:%d",
149 file, lineno);
150
151 return (rval);
152}
153
Garrett Cooperca435922010-12-20 12:26:32 -0800154void*
155safe_mmap(const char *file, const int lineno, void (*cleanup_fn)(void),
156 void *addr, size_t length, int prot, int flags, int fd, off_t offset)
157{
158 void *rval;
159
160 rval = mmap(addr, length, prot, flags, fd, offset);
161 if (rval == MAP_FAILED)
162 tst_brkm(TBROK|TERRNO, cleanup_fn, "mmap failed at %s:%d",
163 file, lineno);
164
165 return (rval);
166}
167
168int
169safe_munmap(const char *file, const int lineno, void (*cleanup_fn)(void),
170 void *addr, size_t length)
171{
172 int rval;
173
174 rval = munmap(addr, length);
175 if (rval == -1)
176 tst_brkm(TBROK|TERRNO, cleanup_fn, "munmap failed at %s:%d",
177 file, lineno);
178
179 return (rval);
180}
181
Garrett Cooperdd3f47e2010-12-20 05:40:52 -0800182int
183safe_open(const char *file, const int lineno, void (*cleanup_fn)(void),
184 const char *pathname, int oflags, ...)
185{
186 va_list ap;
187 int rval;
188 mode_t mode;
189
190 va_start(ap, oflags);
191 mode = va_arg(ap, mode_t);
192 va_end(ap);
193
194 rval = open(pathname, oflags, mode);
195 if (rval == -1)
196 tst_brkm(TBROK|TERRNO, cleanup_fn, "open failed at %s:%d",
197 file, lineno);
198
199 return (rval);
200}
201
202int
203safe_pipe(const char *file, const int lineno, void (*cleanup_fn)(void),
204 int fildes[2])
205{
206 int rval;
207
208 rval = pipe(fildes);
209 if (rval == -1)
210 tst_brkm(TBROK|TERRNO, cleanup_fn, "pipe failed at %s:%d",
211 file, lineno);
212
213 return (rval);
214}
215
216ssize_t
217safe_read(const char *file, const int lineno, void (*cleanup_fn)(void),
218 char len_strict, int fildes, void *buf, size_t nbyte)
219{
220 ssize_t rval;
221
222 rval = read(fildes, buf, nbyte);
223 if ((len_strict == 0 && rval == -1) || rval != nbyte)
224 tst_brkm(TBROK|TERRNO, cleanup_fn, "read failed at %s:%d",
225 file, lineno);
226
227 return (rval);
228}
229
Garrett Cooper400c8362010-12-20 20:02:01 -0800230 int
231safe_setegid(const char *file, const int lineno, void (*cleanup_fn)(void),
232 gid_t egid)
233{
234 int rval;
235
236 rval = setegid(egid);
237 if (rval == -1)
238 tst_brkm(TBROK|TERRNO, cleanup_fn, "setegid failed at %s:%d",
239 file, lineno);
240
241 return (rval);
242}
243
244int
245safe_seteuid(const char *file, const int lineno, void (*cleanup_fn)(void),
246 uid_t euid)
247{
248 int rval;
249
250 rval = seteuid(euid);
251 if (rval == -1)
252 tst_brkm(TBROK|TERRNO, cleanup_fn, "seteuid failed at %s:%d",
253 file, lineno);
254
255 return (rval);
256}
257
Garrett Cooperdd3f47e2010-12-20 05:40:52 -0800258int
Garrett Cooperca435922010-12-20 12:26:32 -0800259safe_setgid(const char *file, const int lineno, void (*cleanup_fn)(void),
260 gid_t gid)
261{
262 int rval;
263
264 rval = setgid(gid);
265 if (rval == -1)
266 tst_brkm(TBROK|TERRNO, cleanup_fn, "setgid failed at %s:%d",
267 file, lineno);
268
269 return (rval);
270}
271
272int
273safe_setuid(const char *file, const int lineno, void (*cleanup_fn)(void),
274 uid_t uid)
275{
276 int rval;
277
278 rval = setuid(uid);
279 if (rval == -1)
280 tst_brkm(TBROK|TERRNO, cleanup_fn, "setuid failed at %s:%d",
281 file, lineno);
282
283 return (rval);
284}
285
286int
Garrett Cooperdd3f47e2010-12-20 05:40:52 -0800287safe_unlink(const char *file, const int lineno, void (*cleanup_fn)(void),
288 const char *pathname)
289{
290 int rval;
291
292 rval = unlink(pathname);
293 if (rval == -1)
294 tst_brkm(TBROK|TERRNO, cleanup_fn, "unlink failed at %s:%d",
295 file, lineno);
296
297 return (rval);
298}
299
300ssize_t
301safe_write(const char *file, const int lineno, void (cleanup_fn)(void),
302 char len_strict, int fildes, const void *buf, size_t nbyte)
303{
304 ssize_t rval;
305
306 rval = write(fildes, buf, nbyte);
307 if ((len_strict == 0 && rval == -1) || rval != nbyte)
308 tst_brkm(TBROK|TERRNO, cleanup_fn, "write failed at %s:%d",
309 file, lineno);
310
311 return (rval);
312}
Cyril Hrubis3f75fe42011-12-28 15:33:12 +0100313
314int safe_ftruncate(const char *file, const int lineno,
315 void (cleanup_fn)(void), int fd, off_t length)
316{
317 int rval;
318
319 rval = ftruncate(fd, length);
320 if (rval == -1) {
321 tst_brkm(TBROK|TERRNO, cleanup_fn, "ftruncate failed at %s:%d",
322 file, lineno);
323 }
324
325 return rval;
326}
327
328int safe_truncate(const char *file, const int lineno,
329 void (cleanup_fn)(void), const char *path, off_t length)
330{
331 int rval;
332
333 rval = truncate(path, length);
334 if (rval == -1) {
335 tst_brkm(TBROK|TERRNO, cleanup_fn, "truncate failed at %s:%d",
336 file, lineno);
337 }
338
339 return rval;
340}