blob: f95176c047f0a2de7f8a63d25c06dfa59fbaa2fa [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
28safe_close(const char *file, const int lineno, void (*cleanup_fn)(void),
29 int fildes)
30{
31 int rval;
32
33 rval = close(fildes);
34 if (rval == -1)
35 tst_brkm(TBROK|TERRNO, cleanup_fn, "close failed at %s:%d",
36 file, lineno);
37
38 return (rval);
39}
40
41int
42safe_creat(const char *file, const int lineno, void (*cleanup_fn)(void),
43 char *pathname, mode_t mode)
44{
45 int rval;
46
47 rval = creat(pathname, mode);
48 if (rval == -1)
49 tst_brkm(TBROK|TERRNO, cleanup_fn, "pipe failed at %s:%d",
50 file, lineno);
51
52 return (rval);
53}
54
55char *
56safe_dirname(const char *file, const int lineno, void (*cleanup_fn)(void),
57 char *path)
58{
59 char *rval;
60
61 rval = dirname(path);
62 if (rval == NULL)
63 tst_brkm(TBROK|TERRNO, cleanup_fn, "dirname failed at %s:%d",
64 file, lineno);
65
66 return (rval);
67}
68
Garrett Cooperca435922010-12-20 12:26:32 -080069char *
70safe_getcwd(const char *file, const int lineno, void (*cleanup_fn)(void),
71 char *buf, size_t size)
72{
73 char *rval;
74
75 rval = getcwd(buf, size);
76 if (rval == NULL)
77 tst_brkm(TBROK|TERRNO, cleanup_fn, "getcwd failed at %s:%d",
78 file, lineno);
79
80 return (rval);
81}
82
83struct passwd*
84safe_getpwnam(const char *file, const int lineno, void (*cleanup_fn)(void),
85 const char *name)
86{
87 struct passwd *rval;
88
89 rval = getpwnam(name);
90 if (rval == NULL)
91 tst_brkm(TBROK|TERRNO, cleanup_fn, "getpwnam failed at %s:%d",
92 file, lineno);
93
94 return (rval);
95}
96
97void*
98safe_malloc(const char *file, const int lineno, void (*cleanup_fn)(void),
99 size_t size)
100{
101 void *rval;
102
103 rval = malloc(size);
104 if (rval == NULL)
105 tst_brkm(TBROK|TERRNO, cleanup_fn, "malloc failed at %s:%d",
106 file, lineno);
107
108 return (rval);
109}
110
111void*
112safe_mmap(const char *file, const int lineno, void (*cleanup_fn)(void),
113 void *addr, size_t length, int prot, int flags, int fd, off_t offset)
114{
115 void *rval;
116
117 rval = mmap(addr, length, prot, flags, fd, offset);
118 if (rval == MAP_FAILED)
119 tst_brkm(TBROK|TERRNO, cleanup_fn, "mmap failed at %s:%d",
120 file, lineno);
121
122 return (rval);
123}
124
125int
126safe_munmap(const char *file, const int lineno, void (*cleanup_fn)(void),
127 void *addr, size_t length)
128{
129 int rval;
130
131 rval = munmap(addr, length);
132 if (rval == -1)
133 tst_brkm(TBROK|TERRNO, cleanup_fn, "munmap failed at %s:%d",
134 file, lineno);
135
136 return (rval);
137}
138
Garrett Cooperdd3f47e2010-12-20 05:40:52 -0800139int
140safe_open(const char *file, const int lineno, void (*cleanup_fn)(void),
141 const char *pathname, int oflags, ...)
142{
143 va_list ap;
144 int rval;
145 mode_t mode;
146
147 va_start(ap, oflags);
148 mode = va_arg(ap, mode_t);
149 va_end(ap);
150
151 rval = open(pathname, oflags, mode);
152 if (rval == -1)
153 tst_brkm(TBROK|TERRNO, cleanup_fn, "open failed at %s:%d",
154 file, lineno);
155
156 return (rval);
157}
158
159int
160safe_pipe(const char *file, const int lineno, void (*cleanup_fn)(void),
161 int fildes[2])
162{
163 int rval;
164
165 rval = pipe(fildes);
166 if (rval == -1)
167 tst_brkm(TBROK|TERRNO, cleanup_fn, "pipe failed at %s:%d",
168 file, lineno);
169
170 return (rval);
171}
172
173ssize_t
174safe_read(const char *file, const int lineno, void (*cleanup_fn)(void),
175 char len_strict, int fildes, void *buf, size_t nbyte)
176{
177 ssize_t rval;
178
179 rval = read(fildes, buf, nbyte);
180 if ((len_strict == 0 && rval == -1) || rval != nbyte)
181 tst_brkm(TBROK|TERRNO, cleanup_fn, "read failed at %s:%d",
182 file, lineno);
183
184 return (rval);
185}
186
187int
Garrett Cooperca435922010-12-20 12:26:32 -0800188safe_setgid(const char *file, const int lineno, void (*cleanup_fn)(void),
189 gid_t gid)
190{
191 int rval;
192
193 rval = setgid(gid);
194 if (rval == -1)
195 tst_brkm(TBROK|TERRNO, cleanup_fn, "setgid failed at %s:%d",
196 file, lineno);
197
198 return (rval);
199}
200
201int
202safe_setuid(const char *file, const int lineno, void (*cleanup_fn)(void),
203 uid_t uid)
204{
205 int rval;
206
207 rval = setuid(uid);
208 if (rval == -1)
209 tst_brkm(TBROK|TERRNO, cleanup_fn, "setuid failed at %s:%d",
210 file, lineno);
211
212 return (rval);
213}
214
215int
Garrett Cooperdd3f47e2010-12-20 05:40:52 -0800216safe_unlink(const char *file, const int lineno, void (*cleanup_fn)(void),
217 const char *pathname)
218{
219 int rval;
220
221 rval = unlink(pathname);
222 if (rval == -1)
223 tst_brkm(TBROK|TERRNO, cleanup_fn, "unlink failed at %s:%d",
224 file, lineno);
225
226 return (rval);
227}
228
229ssize_t
230safe_write(const char *file, const int lineno, void (cleanup_fn)(void),
231 char len_strict, int fildes, const void *buf, size_t nbyte)
232{
233 ssize_t rval;
234
235 rval = write(fildes, buf, nbyte);
236 if ((len_strict == 0 && rval == -1) || rval != nbyte)
237 tst_brkm(TBROK|TERRNO, cleanup_fn, "write failed at %s:%d",
238 file, lineno);
239
240 return (rval);
241}