blob: c98376db6b28bcfa6205b1beb48a4a2f65d00af2 [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>
Garrett Cooperdd3f47e2010-12-20 05:40:52 -08003#include <sys/stat.h>
4#include <fcntl.h>
5#include <libgen.h>
Garrett Cooperca435922010-12-20 12:26:32 -08006#include <pwd.h>
Garrett Cooperdd3f47e2010-12-20 05:40:52 -08007#include <stdarg.h>
Garrett Cooperca435922010-12-20 12:26:32 -08008#include <stdlib.h>
Garrett Cooperdd3f47e2010-12-20 05:40:52 -08009#include <unistd.h>
10#include "test.h"
Garrett Cooperca435922010-12-20 12:26:32 -080011#include "safe_macros.h"
Garrett Cooperdd3f47e2010-12-20 05:40:52 -080012
13char *
14safe_basename(const char *file, const int lineno, void (*cleanup_fn)(void),
15 char *path)
16{
17 char *rval;
18
19 rval = basename(path);
20 if (rval == NULL)
21 tst_brkm(TBROK|TERRNO, cleanup_fn, "basename failed at %s:%d",
22 file, lineno);
23
24 return (rval);
25}
26
27int
Garrett Cooper4a3c6582010-12-21 07:07:01 -080028safe_chdir(const char *file, const int lineno, void (*cleanup_fn)(void),
29 const char *path)
30{
31 int rval;
32
33 rval = chdir(path);
34 if (rval == -1)
35 tst_brkm(TBROK|TERRNO, cleanup_fn, "chdir failed at %s:%d",
36 file, lineno);
37
38 return (rval);
39}
40
41int
Garrett Cooperdd3f47e2010-12-20 05:40:52 -080042safe_close(const char *file, const int lineno, void (*cleanup_fn)(void),
43 int fildes)
44{
45 int rval;
46
47 rval = close(fildes);
48 if (rval == -1)
49 tst_brkm(TBROK|TERRNO, cleanup_fn, "close failed at %s:%d",
50 file, lineno);
51
52 return (rval);
53}
54
55int
56safe_creat(const char *file, const int lineno, void (*cleanup_fn)(void),
57 char *pathname, mode_t mode)
58{
59 int rval;
60
61 rval = creat(pathname, mode);
62 if (rval == -1)
63 tst_brkm(TBROK|TERRNO, cleanup_fn, "pipe failed at %s:%d",
64 file, lineno);
65
66 return (rval);
67}
68
69char *
70safe_dirname(const char *file, const int lineno, void (*cleanup_fn)(void),
71 char *path)
72{
73 char *rval;
74
75 rval = dirname(path);
76 if (rval == NULL)
77 tst_brkm(TBROK|TERRNO, cleanup_fn, "dirname failed at %s:%d",
78 file, lineno);
79
80 return (rval);
81}
82
Garrett Cooperca435922010-12-20 12:26:32 -080083char *
84safe_getcwd(const char *file, const int lineno, void (*cleanup_fn)(void),
85 char *buf, size_t size)
86{
87 char *rval;
88
89 rval = getcwd(buf, size);
90 if (rval == NULL)
91 tst_brkm(TBROK|TERRNO, cleanup_fn, "getcwd failed at %s:%d",
92 file, lineno);
93
94 return (rval);
95}
96
97struct passwd*
98safe_getpwnam(const char *file, const int lineno, void (*cleanup_fn)(void),
99 const char *name)
100{
101 struct passwd *rval;
102
103 rval = getpwnam(name);
104 if (rval == NULL)
105 tst_brkm(TBROK|TERRNO, cleanup_fn, "getpwnam failed at %s:%d",
106 file, lineno);
107
108 return (rval);
109}
110
111void*
112safe_malloc(const char *file, const int lineno, void (*cleanup_fn)(void),
113 size_t size)
114{
115 void *rval;
116
117 rval = malloc(size);
118 if (rval == NULL)
119 tst_brkm(TBROK|TERRNO, cleanup_fn, "malloc failed at %s:%d",
120 file, lineno);
121
122 return (rval);
123}
124
Garrett Cooper4a3c6582010-12-21 07:07:01 -0800125int
126safe_mkdir(const char *file, const int lineno, void (*cleanup_fn)(void),
127 const char *pathname, mode_t mode)
128{
129 int rval;
130
131 rval = mkdir(pathname, mode);
132 if (rval == -1)
133 tst_brkm(TBROK|TERRNO, cleanup_fn, "mkdir failed at %s:%d",
134 file, lineno);
135
136 return (rval);
137}
138
Garrett Cooperca435922010-12-20 12:26:32 -0800139void*
140safe_mmap(const char *file, const int lineno, void (*cleanup_fn)(void),
141 void *addr, size_t length, int prot, int flags, int fd, off_t offset)
142{
143 void *rval;
144
145 rval = mmap(addr, length, prot, flags, fd, offset);
146 if (rval == MAP_FAILED)
147 tst_brkm(TBROK|TERRNO, cleanup_fn, "mmap failed at %s:%d",
148 file, lineno);
149
150 return (rval);
151}
152
153int
154safe_munmap(const char *file, const int lineno, void (*cleanup_fn)(void),
155 void *addr, size_t length)
156{
157 int rval;
158
159 rval = munmap(addr, length);
160 if (rval == -1)
161 tst_brkm(TBROK|TERRNO, cleanup_fn, "munmap failed at %s:%d",
162 file, lineno);
163
164 return (rval);
165}
166
Garrett Cooperdd3f47e2010-12-20 05:40:52 -0800167int
168safe_open(const char *file, const int lineno, void (*cleanup_fn)(void),
169 const char *pathname, int oflags, ...)
170{
171 va_list ap;
172 int rval;
173 mode_t mode;
174
175 va_start(ap, oflags);
176 mode = va_arg(ap, mode_t);
177 va_end(ap);
178
179 rval = open(pathname, oflags, mode);
180 if (rval == -1)
181 tst_brkm(TBROK|TERRNO, cleanup_fn, "open failed at %s:%d",
182 file, lineno);
183
184 return (rval);
185}
186
187int
188safe_pipe(const char *file, const int lineno, void (*cleanup_fn)(void),
189 int fildes[2])
190{
191 int rval;
192
193 rval = pipe(fildes);
194 if (rval == -1)
195 tst_brkm(TBROK|TERRNO, cleanup_fn, "pipe failed at %s:%d",
196 file, lineno);
197
198 return (rval);
199}
200
201ssize_t
202safe_read(const char *file, const int lineno, void (*cleanup_fn)(void),
203 char len_strict, int fildes, void *buf, size_t nbyte)
204{
205 ssize_t rval;
206
207 rval = read(fildes, buf, nbyte);
208 if ((len_strict == 0 && rval == -1) || rval != nbyte)
209 tst_brkm(TBROK|TERRNO, cleanup_fn, "read failed at %s:%d",
210 file, lineno);
211
212 return (rval);
213}
214
Garrett Cooper400c8362010-12-20 20:02:01 -0800215 int
216safe_setegid(const char *file, const int lineno, void (*cleanup_fn)(void),
217 gid_t egid)
218{
219 int rval;
220
221 rval = setegid(egid);
222 if (rval == -1)
223 tst_brkm(TBROK|TERRNO, cleanup_fn, "setegid failed at %s:%d",
224 file, lineno);
225
226 return (rval);
227}
228
229int
230safe_seteuid(const char *file, const int lineno, void (*cleanup_fn)(void),
231 uid_t euid)
232{
233 int rval;
234
235 rval = seteuid(euid);
236 if (rval == -1)
237 tst_brkm(TBROK|TERRNO, cleanup_fn, "seteuid failed at %s:%d",
238 file, lineno);
239
240 return (rval);
241}
242
Garrett Cooperdd3f47e2010-12-20 05:40:52 -0800243int
Garrett Cooperca435922010-12-20 12:26:32 -0800244safe_setgid(const char *file, const int lineno, void (*cleanup_fn)(void),
245 gid_t gid)
246{
247 int rval;
248
249 rval = setgid(gid);
250 if (rval == -1)
251 tst_brkm(TBROK|TERRNO, cleanup_fn, "setgid failed at %s:%d",
252 file, lineno);
253
254 return (rval);
255}
256
257int
258safe_setuid(const char *file, const int lineno, void (*cleanup_fn)(void),
259 uid_t uid)
260{
261 int rval;
262
263 rval = setuid(uid);
264 if (rval == -1)
265 tst_brkm(TBROK|TERRNO, cleanup_fn, "setuid failed at %s:%d",
266 file, lineno);
267
268 return (rval);
269}
270
271int
Garrett Cooperdd3f47e2010-12-20 05:40:52 -0800272safe_unlink(const char *file, const int lineno, void (*cleanup_fn)(void),
273 const char *pathname)
274{
275 int rval;
276
277 rval = unlink(pathname);
278 if (rval == -1)
279 tst_brkm(TBROK|TERRNO, cleanup_fn, "unlink failed at %s:%d",
280 file, lineno);
281
282 return (rval);
283}
284
285ssize_t
286safe_write(const char *file, const int lineno, void (cleanup_fn)(void),
287 char len_strict, int fildes, const void *buf, size_t nbyte)
288{
289 ssize_t rval;
290
291 rval = write(fildes, buf, nbyte);
292 if ((len_strict == 0 && rval == -1) || rval != nbyte)
293 tst_brkm(TBROK|TERRNO, cleanup_fn, "write failed at %s:%d",
294 file, lineno);
295
296 return (rval);
297}