doat.c revision 231786
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: stable/9/tools/regression/doat/doat.c 231786 2012-02-15 22:07:09Z jilles $
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
41void cleanup(void);
42void setup(void);
43void setup_once(void);
44
45union 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
56struct testcase {
57	int		result;
58	union param	params[5];	/* no *at syscall with more than 5 params */
59};
60
61struct 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
69struct test *tests;
70#define	NUM_OF_TESTS	14		/* we dont want the fexecve test to run */
71
72char *absolute_path = NULL;
73const char *relative_path = "tmp/";
74const char *not_dir_path = "/bin/date";
75
76const char *file = "foo";
77char *absolute_file = NULL;
78char *relative_file = NULL;
79const char *symlinkf = "link";
80const char *newlink = "nlink1";
81const char *newlink2 = "nlink2";
82const char *newlink3 = "nlink3";
83const char *newdir = "newdir";
84const char *fifo = "fifo";
85const char *nod = "nod";
86const char *newfile = "newfile";
87const char *newslink = "nslink1";
88
89bool dir_exist = false;
90bool file_exist = false;
91bool link_exist = false;
92
93int rel_fd, abs_fd, notd_fd, exec_fd;
94
95struct timeval times[2];
96struct stat buf;
97const char *pargv[2] = { "/bin/date", NULL };
98#define	PATH_MAX	1024
99char cbuf[PATH_MAX];
100
101void
102setup(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
617void
618cleanup(void)
619{
620	system("/bin/sh -c 'rm -rf tmp'");
621}
622
623void
624setup_once(void)
625{
626}
627
628int
629main(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}
673