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