1e5de992cSRoman Divacky /*-
2e5de992cSRoman Divacky * Copyright (c) 2007 Roman Divacky
3e5de992cSRoman Divacky * All rights reserved.
4e5de992cSRoman Divacky *
5e5de992cSRoman Divacky * Redistribution and use in source and binary forms, with or without
6e5de992cSRoman Divacky * modification, are permitted provided that the following conditions
7e5de992cSRoman Divacky * are met:
8e5de992cSRoman Divacky * 1. Redistributions of source code must retain the above copyright
9e5de992cSRoman Divacky * notice, this list of conditions and the following disclaimer.
10e5de992cSRoman Divacky * 2. Redistributions in binary form must reproduce the above copyright
11e5de992cSRoman Divacky * notice, this list of conditions and the following disclaimer in the
12e5de992cSRoman Divacky * documentation and/or other materials provided with the distribution.
13e5de992cSRoman Divacky *
14e5de992cSRoman Divacky * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15e5de992cSRoman Divacky * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16e5de992cSRoman Divacky * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17e5de992cSRoman Divacky * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18e5de992cSRoman Divacky * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19e5de992cSRoman Divacky * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20e5de992cSRoman Divacky * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21e5de992cSRoman Divacky * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22e5de992cSRoman Divacky * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23e5de992cSRoman Divacky * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24e5de992cSRoman Divacky * SUCH DAMAGE.
25e5de992cSRoman Divacky */
26e5de992cSRoman Divacky
27d7d3cbdaSRebecca Cran #include <sys/types.h>
28d7d3cbdaSRebecca Cran #include <sys/syscall.h>
29d7d3cbdaSRebecca Cran #include <sys/stat.h>
30d7d3cbdaSRebecca Cran
31e5de992cSRoman Divacky #include <errno.h>
32e5de992cSRoman Divacky #include <fcntl.h>
33e5de992cSRoman Divacky #include <stdbool.h>
34e5de992cSRoman Divacky #include <stdio.h>
35e5de992cSRoman Divacky #include <stdlib.h>
36e5de992cSRoman Divacky #include <string.h>
37d7d3cbdaSRebecca Cran #include <unistd.h>
38d7d3cbdaSRebecca Cran
39d7d3cbdaSRebecca Cran void cleanup(void);
40d7d3cbdaSRebecca Cran void setup(void);
41d7d3cbdaSRebecca Cran void setup_once(void);
42e5de992cSRoman Divacky
43e5de992cSRoman Divacky union param {
44e5de992cSRoman Divacky int i;
45d7d3cbdaSRebecca Cran const char *cp;
46e5de992cSRoman Divacky mode_t m;
47e5de992cSRoman Divacky dev_t d;
48e5de992cSRoman Divacky void *vp;
49e5de992cSRoman Divacky uid_t u;
50e5de992cSRoman Divacky gid_t g;
51d7d3cbdaSRebecca Cran const char **cpp;
52e5de992cSRoman Divacky };
53e5de992cSRoman Divacky
54e5de992cSRoman Divacky struct testcase {
55e5de992cSRoman Divacky int result;
56e5de992cSRoman Divacky union param params[5]; /* no *at syscall with more than 5 params */
57e5de992cSRoman Divacky };
58e5de992cSRoman Divacky
59e5de992cSRoman Divacky struct test {
60e5de992cSRoman Divacky int syscall;
61e5de992cSRoman Divacky int num_of_cases;
62d7d3cbdaSRebecca Cran const char *name;
63e5de992cSRoman Divacky struct testcase tests[10]; /* no more than 10 tests */
64e5de992cSRoman Divacky
65e5de992cSRoman Divacky };
66e5de992cSRoman Divacky
67e5de992cSRoman Divacky struct test *tests;
68e5de992cSRoman Divacky #define NUM_OF_TESTS 14 /* we dont want the fexecve test to run */
69e5de992cSRoman Divacky
70e5de992cSRoman Divacky char *absolute_path = NULL;
71d7d3cbdaSRebecca Cran const char *relative_path = "tmp/";
72d7d3cbdaSRebecca Cran const char *not_dir_path = "/bin/date";
73e5de992cSRoman Divacky
74d7d3cbdaSRebecca Cran const char *file = "foo";
75e5de992cSRoman Divacky char *absolute_file = NULL;
76e5de992cSRoman Divacky char *relative_file = NULL;
77d7d3cbdaSRebecca Cran const char *symlinkf = "link";
78d7d3cbdaSRebecca Cran const char *newlink = "nlink1";
79d7d3cbdaSRebecca Cran const char *newlink2 = "nlink2";
80d7d3cbdaSRebecca Cran const char *newlink3 = "nlink3";
81d7d3cbdaSRebecca Cran const char *newdir = "newdir";
82d7d3cbdaSRebecca Cran const char *fifo = "fifo";
83d7d3cbdaSRebecca Cran const char *nod = "nod";
84d7d3cbdaSRebecca Cran const char *newfile = "newfile";
85d7d3cbdaSRebecca Cran const char *newslink = "nslink1";
86e5de992cSRoman Divacky
87e5de992cSRoman Divacky bool dir_exist = false;
88e5de992cSRoman Divacky bool file_exist = false;
89e5de992cSRoman Divacky bool link_exist = false;
90e5de992cSRoman Divacky
91e5de992cSRoman Divacky int rel_fd, abs_fd, notd_fd, exec_fd;
92e5de992cSRoman Divacky
93e5de992cSRoman Divacky struct timeval times[2];
94e5de992cSRoman Divacky struct stat buf;
95d7d3cbdaSRebecca Cran const char *pargv[2] = { "/bin/date", NULL };
96e5de992cSRoman Divacky #define PATH_MAX 1024
97e5de992cSRoman Divacky char cbuf[PATH_MAX];
98e5de992cSRoman Divacky
99e5de992cSRoman Divacky void
setup(void)100d7d3cbdaSRebecca Cran setup(void)
101e5de992cSRoman Divacky {
102e5de992cSRoman Divacky int i, error;
103e5de992cSRoman Divacky struct stat sb;
104*b0e4234aSJilles Tjoelker size_t len;
105e5de992cSRoman Divacky
106*b0e4234aSJilles Tjoelker tests = calloc(NUM_OF_TESTS + 1, sizeof(struct test));
107e5de992cSRoman Divacky if (tests == NULL) {
108e5de992cSRoman Divacky perror("");
109e5de992cSRoman Divacky exit(0);
110e5de992cSRoman Divacky }
111e5de992cSRoman Divacky
112e5de992cSRoman Divacky absolute_path = (char *)getcwd(NULL, 0);
113e5de992cSRoman Divacky if (absolute_path == NULL) {
114e5de992cSRoman Divacky perror("getcwd");
115e5de992cSRoman Divacky exit(0);
116e5de992cSRoman Divacky }
117e5de992cSRoman Divacky
118*b0e4234aSJilles Tjoelker len = strlen(absolute_path);
119*b0e4234aSJilles Tjoelker absolute_path = realloc(absolute_path,
120*b0e4234aSJilles Tjoelker len + 1 + strlen(relative_path) + 1);
121e5de992cSRoman Divacky if (absolute_path == NULL) {
122e5de992cSRoman Divacky perror("realloc");
123e5de992cSRoman Divacky exit(0);
124e5de992cSRoman Divacky }
125e5de992cSRoman Divacky
126*b0e4234aSJilles Tjoelker absolute_path[len] = '/';
127*b0e4234aSJilles Tjoelker strcpy(absolute_path + len + 1, relative_path);
128e5de992cSRoman Divacky
129e5de992cSRoman Divacky absolute_file = malloc(strlen(absolute_path) + 1 + strlen(file));
130e5de992cSRoman Divacky bzero(absolute_file, strlen(absolute_path) + 1 + strlen(file));
131e5de992cSRoman Divacky if (absolute_file == NULL) {
132e5de992cSRoman Divacky perror("malloc");
133e5de992cSRoman Divacky exit(0);
134e5de992cSRoman Divacky }
135e5de992cSRoman Divacky strcpy(absolute_file, absolute_path);
136e5de992cSRoman Divacky absolute_file[strlen(absolute_file)] = '/';
137e5de992cSRoman Divacky strcpy(absolute_file + strlen(absolute_path), file);
138e5de992cSRoman Divacky
139e5de992cSRoman Divacky relative_file = malloc(strlen(relative_path) + 1 + strlen(file));
140e5de992cSRoman Divacky bzero(relative_file, strlen(relative_path) + 1 + strlen(file));
141e5de992cSRoman Divacky if (relative_file == NULL) {
142e5de992cSRoman Divacky perror("malloc");
143e5de992cSRoman Divacky exit(0);
144e5de992cSRoman Divacky }
145e5de992cSRoman Divacky strcpy(relative_file, relative_path);
146e5de992cSRoman Divacky relative_file[strlen(relative_file)] = '/';
147e5de992cSRoman Divacky strcpy(relative_file + strlen(relative_path), file);
148e5de992cSRoman Divacky
149*b0e4234aSJilles Tjoelker error = mkdir(relative_path, 0700);
150e5de992cSRoman Divacky dir_exist = (errno == EEXIST);
151e5de992cSRoman Divacky if (error && errno != EEXIST) {
152e5de992cSRoman Divacky perror("tmp");
153e5de992cSRoman Divacky exit(0);
154e5de992cSRoman Divacky }
155e5de992cSRoman Divacky
156e5de992cSRoman Divacky error = stat("tmp/foo", &sb);
157e5de992cSRoman Divacky file_exist = (errno != ENOENT);
158*b0e4234aSJilles Tjoelker i = open("tmp/foo", O_RDONLY | O_CREAT, 0666);
159e5de992cSRoman Divacky if (i == -1) {
160e5de992cSRoman Divacky perror("foo");
161e5de992cSRoman Divacky exit(0);
162e5de992cSRoman Divacky }
163e5de992cSRoman Divacky
164e5de992cSRoman Divacky rel_fd = open(relative_path, O_RDONLY);
165e5de992cSRoman Divacky if (rel_fd == -1) {
166e5de992cSRoman Divacky perror("relative path");
167e5de992cSRoman Divacky exit(0);
168e5de992cSRoman Divacky }
169e5de992cSRoman Divacky
170e5de992cSRoman Divacky abs_fd = open(absolute_path, O_RDONLY);
171e5de992cSRoman Divacky if (abs_fd == -1) {
172e5de992cSRoman Divacky perror("absolute path");
173e5de992cSRoman Divacky exit(0);
174e5de992cSRoman Divacky }
175e5de992cSRoman Divacky
176e5de992cSRoman Divacky notd_fd = open(not_dir_path, O_RDONLY);
177e5de992cSRoman Divacky if (notd_fd == -1) {
178e5de992cSRoman Divacky perror("not a directory");
179e5de992cSRoman Divacky exit(0);
180e5de992cSRoman Divacky }
181e5de992cSRoman Divacky
182e5de992cSRoman Divacky exec_fd = open(not_dir_path, O_RDONLY);
183e5de992cSRoman Divacky if (exec_fd == -1) {
184e5de992cSRoman Divacky perror("not a directory");
185e5de992cSRoman Divacky exit(0);
186e5de992cSRoman Divacky }
187e5de992cSRoman Divacky
188e5de992cSRoman Divacky error = symlink(absolute_file, symlinkf);
189e5de992cSRoman Divacky link_exist = (errno == EEXIST);
190e5de992cSRoman Divacky if (error && errno != EEXIST) {
191e5de992cSRoman Divacky perror("symlink");
192e5de992cSRoman Divacky exit(0);
193e5de992cSRoman Divacky }
194e5de992cSRoman Divacky
195e5de992cSRoman Divacky /* faccessat */
196e5de992cSRoman Divacky tests[0].syscall = SYS_faccessat;
197e5de992cSRoman Divacky tests[0].num_of_cases = 6;
198e5de992cSRoman Divacky tests[0].name = "faccessat";
199e5de992cSRoman Divacky tests[0].tests[0].result = EBADF;
200e5de992cSRoman Divacky tests[0].tests[0].params[0].i = 106; /* invalid fd */
201e5de992cSRoman Divacky tests[0].tests[0].params[1].cp = relative_path;
202e5de992cSRoman Divacky tests[0].tests[0].params[2].m = 0;
203e5de992cSRoman Divacky tests[0].tests[0].params[3].i = 0;
204e5de992cSRoman Divacky tests[0].tests[1].result = EBADF;
205e5de992cSRoman Divacky tests[0].tests[1].params[0].i = 106; /* invalid fd */
206e5de992cSRoman Divacky tests[0].tests[1].params[1].cp = relative_path;
207e5de992cSRoman Divacky tests[0].tests[1].params[2].m = 0;
208e5de992cSRoman Divacky tests[0].tests[1].params[3].i = AT_EACCESS;
209e5de992cSRoman Divacky tests[0].tests[2].result = EINVAL;
210e5de992cSRoman Divacky tests[0].tests[2].params[0].i = rel_fd;
211e5de992cSRoman Divacky tests[0].tests[2].params[1].cp = absolute_path;
212e5de992cSRoman Divacky tests[0].tests[2].params[2].m = 0;
213e5de992cSRoman Divacky tests[0].tests[2].params[3].i = 123; /* invalid flag */
214e5de992cSRoman Divacky tests[0].tests[3].result = ENOTDIR;
215e5de992cSRoman Divacky tests[0].tests[3].params[0].i = notd_fd;
216e5de992cSRoman Divacky tests[0].tests[3].params[1].cp = relative_file;
217e5de992cSRoman Divacky tests[0].tests[3].params[2].m = 0;
218e5de992cSRoman Divacky tests[0].tests[3].params[3].i = 0;
219e5de992cSRoman Divacky tests[0].tests[4].result = 0;
220e5de992cSRoman Divacky tests[0].tests[4].params[0].i = rel_fd;
221e5de992cSRoman Divacky tests[0].tests[4].params[1].cp = file;
222e5de992cSRoman Divacky tests[0].tests[4].params[2].m = 0;
223e5de992cSRoman Divacky tests[0].tests[4].params[3].i = 0;
224e5de992cSRoman Divacky tests[0].tests[5].result = 0;
225e5de992cSRoman Divacky tests[0].tests[5].params[0].i = rel_fd;
226e5de992cSRoman Divacky tests[0].tests[5].params[1].cp = file;
227e5de992cSRoman Divacky tests[0].tests[5].params[2].m = 0;
228e5de992cSRoman Divacky tests[0].tests[5].params[3].i = AT_EACCESS;
229e5de992cSRoman Divacky tests[0].tests[6].result = 0;
230e5de992cSRoman Divacky tests[0].tests[6].params[0].i = 106; /* invalid fd */
231e5de992cSRoman Divacky tests[0].tests[6].params[1].cp = absolute_path;
232e5de992cSRoman Divacky tests[0].tests[6].params[2].m = 0;
233e5de992cSRoman Divacky tests[0].tests[6].params[3].i = 0;
234e5de992cSRoman Divacky
235e5de992cSRoman Divacky /* fchmodat */
236e5de992cSRoman Divacky tests[1].syscall = SYS_fchmodat;
237e5de992cSRoman Divacky tests[1].num_of_cases = 6;
238e5de992cSRoman Divacky tests[1].name = "fchmodat";
239e5de992cSRoman Divacky tests[1].tests[0].result = EBADF;
240e5de992cSRoman Divacky tests[1].tests[0].params[0].i = 106; /* invalid fd */
241e5de992cSRoman Divacky tests[1].tests[0].params[1].cp = relative_path;
242e5de992cSRoman Divacky tests[1].tests[0].params[2].m = 33190;
243e5de992cSRoman Divacky tests[1].tests[0].params[3].i = 0;
244e5de992cSRoman Divacky tests[1].tests[1].result = EINVAL;
245e5de992cSRoman Divacky tests[1].tests[1].params[0].i = rel_fd;
246e5de992cSRoman Divacky tests[1].tests[1].params[1].cp = absolute_path;
247e5de992cSRoman Divacky tests[1].tests[1].params[2].m = 33190; /* mode 646 translated */
248e5de992cSRoman Divacky tests[1].tests[1].params[3].i = 123; /* invalid flag */
249e5de992cSRoman Divacky tests[1].tests[2].result = ENOTDIR;
250e5de992cSRoman Divacky tests[1].tests[2].params[0].i = notd_fd;
251e5de992cSRoman Divacky tests[1].tests[2].params[1].cp = relative_file;
252e5de992cSRoman Divacky tests[1].tests[2].params[2].m = 33190;
253e5de992cSRoman Divacky tests[1].tests[2].params[3].i = 0;
254e5de992cSRoman Divacky tests[1].tests[3].result = 0;
255e5de992cSRoman Divacky tests[1].tests[3].params[0].i = notd_fd;
256e5de992cSRoman Divacky tests[1].tests[3].params[1].cp = absolute_file;
257e5de992cSRoman Divacky tests[1].tests[3].params[2].m = 33190;
258e5de992cSRoman Divacky tests[1].tests[3].params[3].i = 0;
259e5de992cSRoman Divacky tests[1].tests[4].result = 0;
260e5de992cSRoman Divacky tests[1].tests[4].params[0].i = AT_FDCWD;
261e5de992cSRoman Divacky tests[1].tests[4].params[1].cp = symlinkf;
262e5de992cSRoman Divacky tests[1].tests[4].params[2].m = 33190;
263e5de992cSRoman Divacky tests[1].tests[4].params[3].i = AT_SYMLINK_NOFOLLOW;
264e5de992cSRoman Divacky tests[1].tests[5].result = 0;
265e5de992cSRoman Divacky tests[1].tests[5].params[0].i = rel_fd;
266e5de992cSRoman Divacky tests[1].tests[5].params[1].cp = file;
267e5de992cSRoman Divacky tests[1].tests[5].params[2].m = 33190;
268e5de992cSRoman Divacky tests[1].tests[5].params[3].i = 0;
269e5de992cSRoman Divacky
270e5de992cSRoman Divacky /* fchownat */
271e5de992cSRoman Divacky tests[2].syscall = SYS_fchownat;
272e5de992cSRoman Divacky tests[2].num_of_cases = 6;
273e5de992cSRoman Divacky tests[2].name = "fchownat";
274e5de992cSRoman Divacky tests[2].tests[0].result = EBADF;
275e5de992cSRoman Divacky tests[2].tests[0].params[0].i = 106; /* invalid fd */
276e5de992cSRoman Divacky tests[2].tests[0].params[1].cp = relative_file;
277e5de992cSRoman Divacky tests[2].tests[0].params[2].u = 65534;
278e5de992cSRoman Divacky tests[2].tests[0].params[3].g = 65534;
279e5de992cSRoman Divacky tests[2].tests[0].params[4].i = 0;
280e5de992cSRoman Divacky tests[2].tests[1].result = EINVAL;
281e5de992cSRoman Divacky tests[2].tests[1].params[0].i = rel_fd;
282e5de992cSRoman Divacky tests[2].tests[1].params[1].cp = file;
283e5de992cSRoman Divacky tests[2].tests[1].params[2].u = 65534;
284e5de992cSRoman Divacky tests[2].tests[1].params[3].g = 65534;
285e5de992cSRoman Divacky tests[2].tests[1].params[4].i = 123; /* invalid flag */
286e5de992cSRoman Divacky tests[2].tests[2].result = ENOTDIR;
287e5de992cSRoman Divacky tests[2].tests[2].params[0].i = notd_fd;
288e5de992cSRoman Divacky tests[2].tests[2].params[1].cp = relative_file;
289e5de992cSRoman Divacky tests[2].tests[2].params[2].u = 65534;
290e5de992cSRoman Divacky tests[2].tests[2].params[3].g = 65534;
291e5de992cSRoman Divacky tests[2].tests[2].params[4].i = 0;
292e5de992cSRoman Divacky tests[2].tests[3].result = 0;
293e5de992cSRoman Divacky tests[2].tests[3].params[0].i = notd_fd;
294e5de992cSRoman Divacky tests[2].tests[3].params[1].cp = absolute_file;
295e5de992cSRoman Divacky tests[2].tests[3].params[2].u = 65534;
296e5de992cSRoman Divacky tests[2].tests[3].params[3].g = 65534;
297e5de992cSRoman Divacky tests[2].tests[3].params[4].i = 0;
298e5de992cSRoman Divacky tests[2].tests[4].result = 0;
299e5de992cSRoman Divacky tests[2].tests[4].params[0].i = AT_FDCWD;
300e5de992cSRoman Divacky tests[2].tests[4].params[1].cp = symlinkf;
301e5de992cSRoman Divacky tests[2].tests[4].params[2].u = 65534;
302e5de992cSRoman Divacky tests[2].tests[4].params[3].g = 65534;
303e5de992cSRoman Divacky tests[2].tests[4].params[4].i = AT_SYMLINK_NOFOLLOW;
304e5de992cSRoman Divacky tests[2].tests[5].result = 0;
305e5de992cSRoman Divacky tests[2].tests[5].params[0].i = rel_fd;
306e5de992cSRoman Divacky tests[2].tests[5].params[1].cp = file;
307e5de992cSRoman Divacky tests[2].tests[5].params[2].u = 0;
308e5de992cSRoman Divacky tests[2].tests[5].params[3].g = 0;
309e5de992cSRoman Divacky tests[2].tests[5].params[4].i = 0;
310e5de992cSRoman Divacky
311e5de992cSRoman Divacky /* fstatat */
312e5de992cSRoman Divacky tests[3].syscall = SYS_fstatat;
313e5de992cSRoman Divacky tests[3].num_of_cases = 5;
314e5de992cSRoman Divacky tests[3].name = "fstatat";
315e5de992cSRoman Divacky tests[3].tests[0].result = EBADF;
316e5de992cSRoman Divacky tests[3].tests[0].params[0].i = 106; /* invalid fd */
317e5de992cSRoman Divacky tests[3].tests[0].params[1].cp = relative_file;
318e5de992cSRoman Divacky tests[3].tests[0].params[2].vp = &buf;
319e5de992cSRoman Divacky tests[3].tests[0].params[3].i = 0;
320e5de992cSRoman Divacky tests[3].tests[1].result = EINVAL;
321e5de992cSRoman Divacky tests[3].tests[1].params[0].i = rel_fd;
322e5de992cSRoman Divacky tests[3].tests[1].params[1].cp = relative_file;
323e5de992cSRoman Divacky tests[3].tests[1].params[2].vp = &buf;
324e5de992cSRoman Divacky tests[3].tests[1].params[3].i = 123; /* invalid flags */
325e5de992cSRoman Divacky tests[3].tests[2].result = ENOTDIR;
326e5de992cSRoman Divacky tests[3].tests[2].params[0].i = notd_fd;
327e5de992cSRoman Divacky tests[3].tests[2].params[1].cp = relative_file;
328e5de992cSRoman Divacky tests[3].tests[2].params[2].vp = &buf;
329e5de992cSRoman Divacky tests[3].tests[2].params[3].i = 0;
330e5de992cSRoman Divacky tests[3].tests[2].result = 0;
331e5de992cSRoman Divacky tests[3].tests[2].params[0].i = rel_fd;
332e5de992cSRoman Divacky tests[3].tests[2].params[1].cp = file;
333e5de992cSRoman Divacky tests[3].tests[2].params[2].vp = &buf;
334e5de992cSRoman Divacky tests[3].tests[2].params[3].i = 0;
335e5de992cSRoman Divacky tests[3].tests[3].result = 0;
336e5de992cSRoman Divacky tests[3].tests[3].params[0].i = AT_FDCWD;
337e5de992cSRoman Divacky tests[3].tests[3].params[1].cp = symlinkf;
338e5de992cSRoman Divacky tests[3].tests[3].params[2].vp = &buf;
339e5de992cSRoman Divacky tests[3].tests[3].params[3].i = AT_SYMLINK_NOFOLLOW;
340e5de992cSRoman Divacky tests[3].tests[4].result = 0;
341e5de992cSRoman Divacky tests[3].tests[4].params[0].i = notd_fd;
342e5de992cSRoman Divacky tests[3].tests[4].params[1].cp = absolute_file;
343e5de992cSRoman Divacky tests[3].tests[4].params[2].vp = &buf;
344e5de992cSRoman Divacky tests[3].tests[4].params[3].i = 0;
345e5de992cSRoman Divacky
346e5de992cSRoman Divacky /* futimesat */
347e5de992cSRoman Divacky tests[4].syscall = SYS_futimesat;
348e5de992cSRoman Divacky tests[4].num_of_cases = 4;
349e5de992cSRoman Divacky tests[4].name = "futimesat";
350e5de992cSRoman Divacky tests[4].tests[0].result = EBADF;
351e5de992cSRoman Divacky tests[4].tests[0].params[0].i = 106; /* invalid fd */
352e5de992cSRoman Divacky tests[4].tests[0].params[1].cp = relative_file;
353e5de992cSRoman Divacky tests[4].tests[0].params[2].vp = times;
354e5de992cSRoman Divacky tests[4].tests[1].result = ENOTDIR;
355e5de992cSRoman Divacky tests[4].tests[1].params[0].i = notd_fd;
356e5de992cSRoman Divacky tests[4].tests[1].params[1].cp = relative_file;
357e5de992cSRoman Divacky tests[4].tests[1].params[2].vp = times;
358e5de992cSRoman Divacky tests[4].tests[2].result = 0;
359e5de992cSRoman Divacky tests[4].tests[2].params[0].i = rel_fd;
360e5de992cSRoman Divacky tests[4].tests[2].params[1].cp = file;
361e5de992cSRoman Divacky tests[4].tests[2].params[2].vp = times;
362e5de992cSRoman Divacky tests[4].tests[3].result = 0;
363e5de992cSRoman Divacky tests[4].tests[3].params[0].i = notd_fd;
364e5de992cSRoman Divacky tests[4].tests[3].params[1].cp = absolute_file;
365e5de992cSRoman Divacky tests[4].tests[3].params[2].vp = times;
366e5de992cSRoman Divacky
367e5de992cSRoman Divacky /* linkat */
368e5de992cSRoman Divacky tests[5].syscall = SYS_linkat;
369e5de992cSRoman Divacky tests[5].num_of_cases = 7;
370e5de992cSRoman Divacky tests[5].name = "linkat";
371e5de992cSRoman Divacky tests[5].tests[0].result = EBADF;
372e5de992cSRoman Divacky tests[5].tests[0].params[0].i = 106; /* invalid fd */
373e5de992cSRoman Divacky tests[5].tests[0].params[1].cp = relative_file;
374e5de992cSRoman Divacky tests[5].tests[0].params[2].i = AT_FDCWD;
375e5de992cSRoman Divacky tests[5].tests[0].params[3].cp = newlink;
376e5de992cSRoman Divacky tests[5].tests[0].params[4].i = 0;
377e5de992cSRoman Divacky tests[5].tests[1].result = EBADF;
378e5de992cSRoman Divacky tests[5].tests[1].params[0].i = AT_FDCWD;
379e5de992cSRoman Divacky tests[5].tests[1].params[1].cp = relative_file;
380e5de992cSRoman Divacky tests[5].tests[1].params[2].i = 106; /* invalid fd */
381e5de992cSRoman Divacky tests[5].tests[1].params[3].cp = newlink;
382e5de992cSRoman Divacky tests[5].tests[1].params[4].i = 0;
383e5de992cSRoman Divacky tests[5].tests[2].result = EINVAL;
384e5de992cSRoman Divacky tests[5].tests[2].params[0].i = rel_fd;
385e5de992cSRoman Divacky tests[5].tests[2].params[1].cp = relative_file;
386e5de992cSRoman Divacky tests[5].tests[2].params[2].i = AT_FDCWD;
387e5de992cSRoman Divacky tests[5].tests[2].params[3].cp = newlink;
388e5de992cSRoman Divacky tests[5].tests[2].params[4].i = 123; /* invalid flag */
389e5de992cSRoman Divacky tests[5].tests[3].result = ENOTDIR;
390e5de992cSRoman Divacky tests[5].tests[3].params[0].i = notd_fd;
391e5de992cSRoman Divacky tests[5].tests[3].params[1].cp = relative_file;
392e5de992cSRoman Divacky tests[5].tests[3].params[2].i = AT_FDCWD;
393e5de992cSRoman Divacky tests[5].tests[3].params[3].cp = newlink;
394e5de992cSRoman Divacky tests[5].tests[3].params[4].i = 0;
395e5de992cSRoman Divacky tests[5].tests[4].result = 0;
396e5de992cSRoman Divacky tests[5].tests[4].params[0].i = rel_fd;
397e5de992cSRoman Divacky tests[5].tests[4].params[1].cp = file;
398e5de992cSRoman Divacky tests[5].tests[4].params[2].i = rel_fd;
399e5de992cSRoman Divacky tests[5].tests[4].params[3].cp = newlink;
400e5de992cSRoman Divacky tests[5].tests[4].params[4].i = 0;
401e5de992cSRoman Divacky tests[5].tests[5].result = 0;
402e5de992cSRoman Divacky tests[5].tests[5].params[0].i = AT_FDCWD;
403e5de992cSRoman Divacky tests[5].tests[5].params[1].cp = symlinkf;
404e5de992cSRoman Divacky tests[5].tests[5].params[2].i = rel_fd;
405e5de992cSRoman Divacky tests[5].tests[5].params[3].cp = newlink2;
406e5de992cSRoman Divacky tests[5].tests[5].params[4].i = 0;
407e5de992cSRoman Divacky tests[5].tests[6].result = 0;
408e5de992cSRoman Divacky tests[5].tests[6].params[0].i = AT_FDCWD;
409e5de992cSRoman Divacky tests[5].tests[6].params[1].cp = symlinkf;
410e5de992cSRoman Divacky tests[5].tests[6].params[2].i = rel_fd;
411e5de992cSRoman Divacky tests[5].tests[6].params[3].cp = newlink3;
412e5de992cSRoman Divacky tests[5].tests[6].params[4].i = AT_SYMLINK_FOLLOW;
413e5de992cSRoman Divacky
414e5de992cSRoman Divacky /* mkdirat */
415e5de992cSRoman Divacky tests[6].syscall = SYS_mkdirat;
416e5de992cSRoman Divacky tests[6].num_of_cases = 3;
417e5de992cSRoman Divacky tests[6].name = "mkdirat";
418e5de992cSRoman Divacky tests[6].tests[0].result = EBADF;
419e5de992cSRoman Divacky tests[6].tests[0].params[0].i = 106; /* invalid fd */
420e5de992cSRoman Divacky tests[6].tests[0].params[1].cp = relative_file;
421e5de992cSRoman Divacky tests[6].tests[0].params[2].m = 33190;
422e5de992cSRoman Divacky tests[6].tests[1].result = ENOTDIR;
423e5de992cSRoman Divacky tests[6].tests[1].params[0].i = notd_fd;
424e5de992cSRoman Divacky tests[6].tests[1].params[1].cp = relative_file;
425e5de992cSRoman Divacky tests[6].tests[1].params[2].m = 33190;
426e5de992cSRoman Divacky tests[6].tests[2].result = 0;
427e5de992cSRoman Divacky tests[6].tests[2].params[0].i = rel_fd;
428e5de992cSRoman Divacky tests[6].tests[2].params[1].cp = newdir;
429e5de992cSRoman Divacky tests[6].tests[2].params[2].m = 33190;
430e5de992cSRoman Divacky
431e5de992cSRoman Divacky /* mkfifoat */
432e5de992cSRoman Divacky tests[7].syscall = SYS_mkfifoat;
433e5de992cSRoman Divacky tests[7].num_of_cases = 3;
434e5de992cSRoman Divacky tests[7].name = "mkfifoat";
435e5de992cSRoman Divacky tests[7].tests[0].result = EBADF;
436e5de992cSRoman Divacky tests[7].tests[0].params[0].i = 107; /* invalid fd */
437e5de992cSRoman Divacky tests[7].tests[0].params[1].cp = relative_file;
438e5de992cSRoman Divacky tests[7].tests[0].params[2].m = 33190;
439e5de992cSRoman Divacky tests[7].tests[1].result = ENOTDIR;
440e5de992cSRoman Divacky tests[7].tests[1].params[0].i = notd_fd;
441e5de992cSRoman Divacky tests[7].tests[1].params[1].cp = relative_file;
442e5de992cSRoman Divacky tests[7].tests[1].params[2].m = 33190;
443e5de992cSRoman Divacky tests[7].tests[2].result = 0;
444e5de992cSRoman Divacky tests[7].tests[2].params[0].i = rel_fd;
445e5de992cSRoman Divacky tests[7].tests[2].params[1].cp = fifo;
446e5de992cSRoman Divacky tests[7].tests[2].params[2].m = 33190;
447e5de992cSRoman Divacky
448e5de992cSRoman Divacky /* mknodat */
449e5de992cSRoman Divacky tests[8].syscall = SYS_mknodat;
450e5de992cSRoman Divacky tests[8].num_of_cases = 3;
451e5de992cSRoman Divacky tests[8].name = "mknodat";
452e5de992cSRoman Divacky tests[8].tests[0].result = EBADF;
453e5de992cSRoman Divacky tests[8].tests[0].params[0].i = 108; /* invalid fd */
454e5de992cSRoman Divacky tests[8].tests[0].params[1].cp = relative_file;
455e5de992cSRoman Divacky tests[8].tests[0].params[2].m = 0666 | S_IFCHR;
456e5de992cSRoman Divacky tests[8].tests[0].params[3].d = 15;
457e5de992cSRoman Divacky tests[8].tests[1].result = ENOTDIR;
458e5de992cSRoman Divacky tests[8].tests[1].params[0].i = notd_fd;
459e5de992cSRoman Divacky tests[8].tests[1].params[1].cp = relative_file;
460e5de992cSRoman Divacky tests[8].tests[1].params[2].m = 0666 | S_IFCHR;
461e5de992cSRoman Divacky tests[8].tests[1].params[3].d = 15;
462e5de992cSRoman Divacky tests[8].tests[2].result = 0;
463e5de992cSRoman Divacky tests[8].tests[2].params[0].i = rel_fd;
464e5de992cSRoman Divacky tests[8].tests[2].params[1].cp = nod;
465e5de992cSRoman Divacky tests[8].tests[2].params[2].m = 0666 | S_IFCHR;
466e5de992cSRoman Divacky tests[8].tests[2].params[3].d = 2570;
467e5de992cSRoman Divacky
468e5de992cSRoman Divacky /* openat */
469e5de992cSRoman Divacky tests[9].syscall = SYS_openat;
470e5de992cSRoman Divacky tests[9].num_of_cases = 5;
471e5de992cSRoman Divacky tests[9].name = "openat";
472e5de992cSRoman Divacky tests[9].tests[0].result = EBADF;
473e5de992cSRoman Divacky tests[9].tests[0].params[0].i = 106; /* invalid fd */
474e5de992cSRoman Divacky tests[9].tests[0].params[1].cp = relative_file;
475e5de992cSRoman Divacky tests[9].tests[0].params[2].i = O_RDONLY;
476e5de992cSRoman Divacky tests[9].tests[0].params[3].i = 0666;
477e5de992cSRoman Divacky tests[9].tests[1].result = ENOTDIR;
478e5de992cSRoman Divacky tests[9].tests[1].params[0].i = notd_fd;
479e5de992cSRoman Divacky tests[9].tests[1].params[1].cp = relative_file;
480e5de992cSRoman Divacky tests[9].tests[1].params[2].i = O_RDONLY;
481e5de992cSRoman Divacky tests[9].tests[1].params[3].i = 0666;
482e5de992cSRoman Divacky tests[9].tests[2].result = 8; /* hardcoded fd */
483e5de992cSRoman Divacky tests[9].tests[2].params[0].i = rel_fd;
484e5de992cSRoman Divacky tests[9].tests[2].params[1].cp = file;
485e5de992cSRoman Divacky tests[9].tests[2].params[2].i = O_RDONLY;
486e5de992cSRoman Divacky tests[9].tests[2].params[3].i = 0400;
487e5de992cSRoman Divacky tests[9].tests[3].result = 9; /* hardcoded fd */
488e5de992cSRoman Divacky tests[9].tests[3].params[0].i = notd_fd;
489e5de992cSRoman Divacky tests[9].tests[3].params[1].cp = absolute_file;
490e5de992cSRoman Divacky tests[9].tests[3].params[2].i = O_RDONLY;
491e5de992cSRoman Divacky tests[9].tests[3].params[3].i = 0400;
492e5de992cSRoman Divacky tests[9].tests[4].result = 10; /* hardcoded fd */
493e5de992cSRoman Divacky tests[9].tests[4].params[0].i = rel_fd;
494e5de992cSRoman Divacky tests[9].tests[4].params[1].cp = newfile;
495e5de992cSRoman Divacky tests[9].tests[4].params[2].i = O_RDONLY | O_CREAT;
496e5de992cSRoman Divacky tests[9].tests[4].params[3].i = 0666;
497e5de992cSRoman Divacky
498e5de992cSRoman Divacky /* readlinkat */
499e5de992cSRoman Divacky tests[10].syscall = SYS_readlinkat;
500e5de992cSRoman Divacky tests[10].num_of_cases = 3;
501e5de992cSRoman Divacky tests[10].name = "readlinkat";
502e5de992cSRoman Divacky tests[10].tests[0].result = EBADF;
503e5de992cSRoman Divacky tests[10].tests[0].params[0].i = 106; /* invalid fd */
504e5de992cSRoman Divacky tests[10].tests[0].params[1].cp = relative_file;
505e5de992cSRoman Divacky tests[10].tests[0].params[2].vp = cbuf;
506e5de992cSRoman Divacky tests[10].tests[0].params[3].i = PATH_MAX;
507e5de992cSRoman Divacky tests[10].tests[1].result = ENOTDIR;
508e5de992cSRoman Divacky tests[10].tests[1].params[0].i = notd_fd;
509e5de992cSRoman Divacky tests[10].tests[1].params[1].cp = relative_file;
510e5de992cSRoman Divacky tests[10].tests[1].params[2].vp = cbuf;
511e5de992cSRoman Divacky tests[10].tests[1].params[3].i = PATH_MAX;
512e5de992cSRoman Divacky tests[10].tests[2].result = strlen(absolute_file);
513e5de992cSRoman Divacky tests[10].tests[2].params[0].i = AT_FDCWD;
514e5de992cSRoman Divacky tests[10].tests[2].params[1].cp = symlinkf;
515e5de992cSRoman Divacky tests[10].tests[2].params[2].vp = cbuf;
516e5de992cSRoman Divacky tests[10].tests[2].params[3].i = PATH_MAX;
517e5de992cSRoman Divacky
518e5de992cSRoman Divacky /* renameat */
519e5de992cSRoman Divacky tests[11].syscall = SYS_renameat;
520e5de992cSRoman Divacky tests[11].num_of_cases = 5;
521e5de992cSRoman Divacky tests[11].name = "renameat";
522e5de992cSRoman Divacky tests[11].tests[0].result = EBADF;
523e5de992cSRoman Divacky tests[11].tests[0].params[0].i = 106; /* invalid fd */
524e5de992cSRoman Divacky tests[11].tests[0].params[1].cp = file;
525e5de992cSRoman Divacky tests[11].tests[0].params[2].i = rel_fd;
526e5de992cSRoman Divacky tests[11].tests[0].params[3].cp = file;
527e5de992cSRoman Divacky tests[11].tests[1].result = EBADF;
528e5de992cSRoman Divacky tests[11].tests[1].params[0].i = rel_fd;
529e5de992cSRoman Divacky tests[11].tests[1].params[1].cp = file;
530e5de992cSRoman Divacky tests[11].tests[1].params[2].i = 106; /* invalid fd */
531e5de992cSRoman Divacky tests[11].tests[1].params[3].cp = file;
532e5de992cSRoman Divacky tests[11].tests[2].result = ENOTDIR;
533e5de992cSRoman Divacky tests[11].tests[2].params[0].i = notd_fd;
534e5de992cSRoman Divacky tests[11].tests[2].params[1].cp = relative_file;
535e5de992cSRoman Divacky tests[11].tests[2].params[2].i = rel_fd;
536e5de992cSRoman Divacky tests[11].tests[2].params[3].cp = file;
537e5de992cSRoman Divacky tests[11].tests[3].result = ENOTDIR;
538e5de992cSRoman Divacky tests[11].tests[3].params[0].i = rel_fd;
539e5de992cSRoman Divacky tests[11].tests[3].params[1].cp = file;
540e5de992cSRoman Divacky tests[11].tests[3].params[2].i = notd_fd;
541e5de992cSRoman Divacky tests[11].tests[3].params[3].cp = relative_file;
542e5de992cSRoman Divacky tests[11].tests[4].result = 0;
543e5de992cSRoman Divacky tests[11].tests[4].params[0].i = rel_fd;
544e5de992cSRoman Divacky tests[11].tests[4].params[1].cp = newfile;
545e5de992cSRoman Divacky tests[11].tests[4].params[2].i = AT_FDCWD;
546e5de992cSRoman Divacky tests[11].tests[4].params[3].cp = newfile;
547e5de992cSRoman Divacky
548e5de992cSRoman Divacky /* symlinkat */
549e5de992cSRoman Divacky tests[12].syscall = SYS_symlinkat;
550e5de992cSRoman Divacky tests[12].num_of_cases = 3;
551e5de992cSRoman Divacky tests[12].name = "symlinkat";
552e5de992cSRoman Divacky tests[12].tests[0].result = EBADF;
553e5de992cSRoman Divacky tests[12].tests[0].params[0].cp = file;
554e5de992cSRoman Divacky tests[12].tests[0].params[1].i = 106; /* invalid fd */
555e5de992cSRoman Divacky tests[12].tests[0].params[2].cp = file;
556e5de992cSRoman Divacky tests[12].tests[1].result = ENOTDIR;
557e5de992cSRoman Divacky tests[12].tests[1].params[0].cp = file;
558e5de992cSRoman Divacky tests[12].tests[1].params[1].i = notd_fd;
559e5de992cSRoman Divacky tests[12].tests[1].params[2].cp = relative_file;
560e5de992cSRoman Divacky tests[12].tests[2].result = 0;
561e5de992cSRoman Divacky tests[12].tests[2].params[0].cp = absolute_file;
562e5de992cSRoman Divacky tests[12].tests[2].params[1].i = rel_fd;
563e5de992cSRoman Divacky tests[12].tests[2].params[2].cp = newslink;
564e5de992cSRoman Divacky
565e5de992cSRoman Divacky
566e5de992cSRoman Divacky /* unlinkat */
567e5de992cSRoman Divacky tests[13].syscall = SYS_unlinkat;
568e5de992cSRoman Divacky tests[13].num_of_cases = 7;
569e5de992cSRoman Divacky tests[13].name = "unlinkat";
570e5de992cSRoman Divacky tests[13].tests[0].result = EBADF;
571e5de992cSRoman Divacky tests[13].tests[0].params[0].i = 106; /* invalid fd */
572e5de992cSRoman Divacky tests[13].tests[0].params[1].cp = relative_file;
573e5de992cSRoman Divacky tests[13].tests[0].params[2].i = 0;
574e5de992cSRoman Divacky tests[13].tests[1].result = ENOTDIR;
575e5de992cSRoman Divacky tests[13].tests[1].params[0].i = notd_fd;
576e5de992cSRoman Divacky tests[13].tests[1].params[1].cp = relative_file;
577e5de992cSRoman Divacky tests[13].tests[1].params[2].i = 0;
578e5de992cSRoman Divacky tests[13].tests[2].result = EINVAL;
579e5de992cSRoman Divacky tests[13].tests[2].params[0].i = rel_fd;
580e5de992cSRoman Divacky tests[13].tests[2].params[1].cp = file;
581e5de992cSRoman Divacky tests[13].tests[2].params[2].i = 123; /* invalid flag */
582e5de992cSRoman Divacky tests[13].tests[3].result = ENOTDIR;
583e5de992cSRoman Divacky tests[13].tests[3].params[0].i = rel_fd;
584e5de992cSRoman Divacky tests[13].tests[3].params[1].cp = not_dir_path;
585e5de992cSRoman Divacky tests[13].tests[3].params[2].i = AT_REMOVEDIR;
586e5de992cSRoman Divacky tests[13].tests[4].result = ENOTEMPTY;
587e5de992cSRoman Divacky tests[13].tests[4].params[0].i = AT_FDCWD;
588e5de992cSRoman Divacky tests[13].tests[4].params[1].cp = relative_path;
589e5de992cSRoman Divacky tests[13].tests[4].params[2].i = AT_REMOVEDIR;
590e5de992cSRoman Divacky tests[13].tests[5].result = 0;
591e5de992cSRoman Divacky tests[13].tests[5].params[0].i = rel_fd;
592e5de992cSRoman Divacky tests[13].tests[5].params[1].cp = newdir;
593e5de992cSRoman Divacky tests[13].tests[5].params[2].i = AT_REMOVEDIR;
594e5de992cSRoman Divacky tests[13].tests[6].result = 0;
595e5de992cSRoman Divacky tests[13].tests[6].params[0].i = AT_FDCWD;
596e5de992cSRoman Divacky tests[13].tests[6].params[1].cp = newfile;
597e5de992cSRoman Divacky tests[13].tests[6].params[2].i = 0;
598e5de992cSRoman Divacky
599e5de992cSRoman Divacky
600e5de992cSRoman Divacky /* fexecve */
601e5de992cSRoman Divacky tests[14].syscall = SYS_fexecve;
602e5de992cSRoman Divacky tests[14].num_of_cases = 2;
603e5de992cSRoman Divacky tests[14].name = "fexecve";
604e5de992cSRoman Divacky tests[14].tests[0].result = EBADF;
605e5de992cSRoman Divacky tests[14].tests[0].params[0].i = 106; /* invalid fd */
606e5de992cSRoman Divacky tests[14].tests[0].params[1].cpp = pargv;
607e5de992cSRoman Divacky tests[14].tests[0].params[2].cpp = NULL;
608e5de992cSRoman Divacky /* This is EXPECTED to execve /bin/date, so dont expect OK output */
609e5de992cSRoman Divacky tests[14].tests[1].result = 0;
610e5de992cSRoman Divacky tests[14].tests[1].params[0].i = exec_fd;
611e5de992cSRoman Divacky tests[14].tests[1].params[1].cpp = pargv;
612e5de992cSRoman Divacky tests[14].tests[1].params[2].cpp = NULL;
613e5de992cSRoman Divacky }
614e5de992cSRoman Divacky
615e5de992cSRoman Divacky void
cleanup(void)616d7d3cbdaSRebecca Cran cleanup(void)
617e5de992cSRoman Divacky {
618e5de992cSRoman Divacky system("/bin/sh -c 'rm -rf tmp'");
619e5de992cSRoman Divacky }
620e5de992cSRoman Divacky
621e5de992cSRoman Divacky void
setup_once(void)622d7d3cbdaSRebecca Cran setup_once(void)
623e5de992cSRoman Divacky {
624e5de992cSRoman Divacky }
625e5de992cSRoman Divacky
626e5de992cSRoman Divacky int
main(int argc,char * argv[])627e5de992cSRoman Divacky main(int argc, char *argv[])
628e5de992cSRoman Divacky {
629e5de992cSRoman Divacky int i,j;
630e5de992cSRoman Divacky int error;
631e5de992cSRoman Divacky
632d7d3cbdaSRebecca Cran (void)argc;
633d7d3cbdaSRebecca Cran (void)argv;
634d7d3cbdaSRebecca Cran
635e5de992cSRoman Divacky setup();
636e5de992cSRoman Divacky
637e5de992cSRoman Divacky for (i = 0; i < NUM_OF_TESTS; i++) {
638e5de992cSRoman Divacky printf("\nTest: %s\n", tests[i].name);
639e5de992cSRoman Divacky for (j = 0; j < tests[i].num_of_cases; j++) {
640e5de992cSRoman Divacky error = syscall(tests[i].syscall,
641e5de992cSRoman Divacky tests[i].tests[j].params[0],
642e5de992cSRoman Divacky tests[i].tests[j].params[1],
643e5de992cSRoman Divacky tests[i].tests[j].params[2],
644e5de992cSRoman Divacky tests[i].tests[j].params[3],
645e5de992cSRoman Divacky tests[i].tests[j].params[4]);
646e5de992cSRoman Divacky if (error == 0) {
647e5de992cSRoman Divacky if (tests[i].tests[j].result == 0)
648e5de992cSRoman Divacky printf("#%i ... OK\n", j);
649e5de992cSRoman Divacky else {
650e5de992cSRoman Divacky printf("#%i ... BAD: ", j);
651e5de992cSRoman Divacky printf("expected %i, but got %i\n", tests[i].tests[j].result, error);
652e5de992cSRoman Divacky }
653e5de992cSRoman Divacky } else {
654e5de992cSRoman Divacky if (tests[i].tests[j].result == errno)
655e5de992cSRoman Divacky printf("#%i ... OK\n", j);
656e5de992cSRoman Divacky else {
657e5de992cSRoman Divacky if (error != tests[i].tests[j].result) {
658e5de992cSRoman Divacky printf("#%i ... BAD: ", j);
659e5de992cSRoman Divacky printf("expected %i, but got %i\n", tests[i].tests[j].result, error);
660e5de992cSRoman Divacky } else
661e5de992cSRoman Divacky printf("#%i ... OK\n", j);
662e5de992cSRoman Divacky }
663e5de992cSRoman Divacky }
664e5de992cSRoman Divacky }
665e5de992cSRoman Divacky }
666e5de992cSRoman Divacky
667e5de992cSRoman Divacky cleanup();
668e5de992cSRoman Divacky
669e5de992cSRoman Divacky return (0);
670e5de992cSRoman Divacky }
671