1179084Srdivacky/*-
2179084Srdivacky * Copyright (c) 2007 Roman Divacky
3179084Srdivacky * All rights reserved.
4179084Srdivacky *
5179084Srdivacky * Redistribution and use in source and binary forms, with or without
6179084Srdivacky * modification, are permitted provided that the following conditions
7179084Srdivacky * are met:
8179084Srdivacky * 1. Redistributions of source code must retain the above copyright
9179084Srdivacky *    notice, this list of conditions and the following disclaimer.
10179084Srdivacky * 2. Redistributions in binary form must reproduce the above copyright
11179084Srdivacky *    notice, this list of conditions and the following disclaimer in the
12179084Srdivacky *    documentation and/or other materials provided with the distribution.
13179084Srdivacky *
14179084Srdivacky * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15179084Srdivacky * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16179084Srdivacky * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17179084Srdivacky * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18179084Srdivacky * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19179084Srdivacky * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20179084Srdivacky * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21179084Srdivacky * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22179084Srdivacky * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23179084Srdivacky * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24179084Srdivacky * SUCH DAMAGE.
25179084Srdivacky *
26179084Srdivacky * $FreeBSD$
27179084Srdivacky */
28179084Srdivacky
29219568Sbrucec#include <sys/types.h>
30219568Sbrucec#include <sys/syscall.h>
31219568Sbrucec#include <sys/stat.h>
32219568Sbrucec
33179084Srdivacky#include <errno.h>
34179084Srdivacky#include <fcntl.h>
35179084Srdivacky#include <stdbool.h>
36179084Srdivacky#include <stdio.h>
37179084Srdivacky#include <stdlib.h>
38179084Srdivacky#include <string.h>
39219568Sbrucec#include <unistd.h>
40179084Srdivacky
41219568Sbrucecvoid cleanup(void);
42219568Sbrucecvoid setup(void);
43219568Sbrucecvoid setup_once(void);
44219568Sbrucec
45179084Srdivackyunion param {
46179084Srdivacky	int		i;
47219568Sbrucec	const char	*cp;
48179084Srdivacky	mode_t		m;
49179084Srdivacky	dev_t		d;
50179084Srdivacky	void		*vp;
51179084Srdivacky	uid_t		u;
52179084Srdivacky	gid_t		g;
53219568Sbrucec	const char	**cpp;
54179084Srdivacky};
55179084Srdivacky
56179084Srdivackystruct testcase {
57179084Srdivacky	int		result;
58179084Srdivacky	union param	params[5];	/* no *at syscall with more than 5 params */
59179084Srdivacky};
60179084Srdivacky
61179084Srdivackystruct test {
62179084Srdivacky	int	syscall;
63179084Srdivacky	int	num_of_cases;
64219568Sbrucec	const char *name;
65179084Srdivacky	struct testcase	tests[10];	/* no more than 10 tests */
66179084Srdivacky
67179084Srdivacky};
68179084Srdivacky
69179084Srdivackystruct test *tests;
70179084Srdivacky#define	NUM_OF_TESTS	14		/* we dont want the fexecve test to run */
71179084Srdivacky
72179084Srdivackychar *absolute_path = NULL;
73219568Sbrucecconst char *relative_path = "tmp/";
74219568Sbrucecconst char *not_dir_path = "/bin/date";
75179084Srdivacky
76219568Sbrucecconst char *file = "foo";
77179084Srdivackychar *absolute_file = NULL;
78179084Srdivackychar *relative_file = NULL;
79219568Sbrucecconst char *symlinkf = "link";
80219568Sbrucecconst char *newlink = "nlink1";
81219568Sbrucecconst char *newlink2 = "nlink2";
82219568Sbrucecconst char *newlink3 = "nlink3";
83219568Sbrucecconst char *newdir = "newdir";
84219568Sbrucecconst char *fifo = "fifo";
85219568Sbrucecconst char *nod = "nod";
86219568Sbrucecconst char *newfile = "newfile";
87219568Sbrucecconst char *newslink = "nslink1";
88179084Srdivacky
89179084Srdivackybool dir_exist = false;
90179084Srdivackybool file_exist = false;
91179084Srdivackybool link_exist = false;
92179084Srdivacky
93179084Srdivackyint rel_fd, abs_fd, notd_fd, exec_fd;
94179084Srdivacky
95179084Srdivackystruct timeval times[2];
96179084Srdivackystruct stat buf;
97219568Sbrucecconst char *pargv[2] = { "/bin/date", NULL };
98179084Srdivacky#define	PATH_MAX	1024
99179084Srdivackychar cbuf[PATH_MAX];
100179084Srdivacky
101179084Srdivackyvoid
102219568Sbrucecsetup(void)
103179084Srdivacky{
104179084Srdivacky	int i, error;
105179084Srdivacky	struct stat sb;
106231786Sjilles	size_t len;
107179084Srdivacky
108231786Sjilles	tests = calloc(NUM_OF_TESTS + 1, sizeof(struct test));
109179084Srdivacky	if (tests == NULL) {
110179084Srdivacky		perror("");
111179084Srdivacky		exit(0);
112179084Srdivacky	}
113179084Srdivacky
114179084Srdivacky	absolute_path = (char *)getcwd(NULL, 0);
115179084Srdivacky	if (absolute_path == NULL) {
116179084Srdivacky		perror("getcwd");
117179084Srdivacky		exit(0);
118179084Srdivacky	}
119179084Srdivacky
120231786Sjilles	len = strlen(absolute_path);
121231786Sjilles	absolute_path = realloc(absolute_path,
122231786Sjilles	    len + 1 + strlen(relative_path) + 1);
123179084Srdivacky	if (absolute_path == NULL) {
124179084Srdivacky		perror("realloc");
125179084Srdivacky		exit(0);
126179084Srdivacky	}
127179084Srdivacky
128231786Sjilles	absolute_path[len] = '/';
129231786Sjilles	strcpy(absolute_path + len + 1, relative_path);
130179084Srdivacky
131179084Srdivacky	absolute_file = malloc(strlen(absolute_path) + 1 + strlen(file));
132179084Srdivacky	bzero(absolute_file, strlen(absolute_path) + 1 + strlen(file));
133179084Srdivacky	if (absolute_file == NULL) {
134179084Srdivacky		perror("malloc");
135179084Srdivacky		exit(0);
136179084Srdivacky	}
137179084Srdivacky	strcpy(absolute_file, absolute_path);
138179084Srdivacky	absolute_file[strlen(absolute_file)] = '/';
139179084Srdivacky	strcpy(absolute_file + strlen(absolute_path), file);
140179084Srdivacky
141179084Srdivacky	relative_file = malloc(strlen(relative_path) + 1 + strlen(file));
142179084Srdivacky	bzero(relative_file, strlen(relative_path) + 1 + strlen(file));
143179084Srdivacky	if (relative_file == NULL) {
144179084Srdivacky		perror("malloc");
145179084Srdivacky		exit(0);
146179084Srdivacky	}
147179084Srdivacky	strcpy(relative_file, relative_path);
148179084Srdivacky	relative_file[strlen(relative_file)] = '/';
149179084Srdivacky	strcpy(relative_file + strlen(relative_path), file);
150179084Srdivacky
151231786Sjilles	error = mkdir(relative_path, 0700);
152179084Srdivacky	dir_exist = (errno == EEXIST);
153179084Srdivacky	if (error && errno != EEXIST) {
154179084Srdivacky		perror("tmp");
155179084Srdivacky		exit(0);
156179084Srdivacky	}
157179084Srdivacky
158179084Srdivacky	error = stat("tmp/foo", &sb);
159179084Srdivacky	file_exist = (errno != ENOENT);
160231786Sjilles	i = open("tmp/foo", O_RDONLY | O_CREAT, 0666);
161179084Srdivacky	if (i == -1) {
162179084Srdivacky		perror("foo");
163179084Srdivacky		exit(0);
164179084Srdivacky	}
165179084Srdivacky
166179084Srdivacky	rel_fd = open(relative_path, O_RDONLY);
167179084Srdivacky	if (rel_fd == -1) {
168179084Srdivacky		perror("relative path");
169179084Srdivacky		exit(0);
170179084Srdivacky	}
171179084Srdivacky
172179084Srdivacky	abs_fd = open(absolute_path, O_RDONLY);
173179084Srdivacky	if (abs_fd == -1) {
174179084Srdivacky		perror("absolute path");
175179084Srdivacky		exit(0);
176179084Srdivacky	}
177179084Srdivacky
178179084Srdivacky	notd_fd = open(not_dir_path, O_RDONLY);
179179084Srdivacky	if (notd_fd == -1) {
180179084Srdivacky		perror("not a directory");
181179084Srdivacky		exit(0);
182179084Srdivacky	}
183179084Srdivacky
184179084Srdivacky	exec_fd = open(not_dir_path, O_RDONLY);
185179084Srdivacky	if (exec_fd == -1) {
186179084Srdivacky		perror("not a directory");
187179084Srdivacky		exit(0);
188179084Srdivacky	}
189179084Srdivacky
190179084Srdivacky	error = symlink(absolute_file, symlinkf);
191179084Srdivacky	link_exist = (errno == EEXIST);
192179084Srdivacky	if (error && errno != EEXIST) {
193179084Srdivacky		perror("symlink");
194179084Srdivacky		exit(0);
195179084Srdivacky	}
196179084Srdivacky
197179084Srdivacky	/* faccessat */
198179084Srdivacky	tests[0].syscall = SYS_faccessat;
199179084Srdivacky	tests[0].num_of_cases = 6;
200179084Srdivacky	tests[0].name = "faccessat";
201179084Srdivacky	tests[0].tests[0].result = EBADF;
202179084Srdivacky	tests[0].tests[0].params[0].i = 106;	/* invalid fd */
203179084Srdivacky	tests[0].tests[0].params[1].cp = relative_path;
204179084Srdivacky	tests[0].tests[0].params[2].m = 0;
205179084Srdivacky	tests[0].tests[0].params[3].i = 0;
206179084Srdivacky	tests[0].tests[1].result = EBADF;
207179084Srdivacky	tests[0].tests[1].params[0].i = 106;	/* invalid fd */
208179084Srdivacky	tests[0].tests[1].params[1].cp = relative_path;
209179084Srdivacky	tests[0].tests[1].params[2].m = 0;
210179084Srdivacky	tests[0].tests[1].params[3].i = AT_EACCESS;
211179084Srdivacky	tests[0].tests[2].result = EINVAL;
212179084Srdivacky	tests[0].tests[2].params[0].i = rel_fd;
213179084Srdivacky	tests[0].tests[2].params[1].cp = absolute_path;
214179084Srdivacky	tests[0].tests[2].params[2].m = 0;
215179084Srdivacky	tests[0].tests[2].params[3].i = 123;	/* invalid flag */
216179084Srdivacky	tests[0].tests[3].result = ENOTDIR;
217179084Srdivacky	tests[0].tests[3].params[0].i = notd_fd;
218179084Srdivacky	tests[0].tests[3].params[1].cp = relative_file;
219179084Srdivacky	tests[0].tests[3].params[2].m = 0;
220179084Srdivacky	tests[0].tests[3].params[3].i = 0;
221179084Srdivacky	tests[0].tests[4].result = 0;
222179084Srdivacky	tests[0].tests[4].params[0].i = rel_fd;
223179084Srdivacky	tests[0].tests[4].params[1].cp = file;
224179084Srdivacky	tests[0].tests[4].params[2].m = 0;
225179084Srdivacky	tests[0].tests[4].params[3].i = 0;
226179084Srdivacky	tests[0].tests[5].result = 0;
227179084Srdivacky	tests[0].tests[5].params[0].i = rel_fd;
228179084Srdivacky	tests[0].tests[5].params[1].cp = file;
229179084Srdivacky	tests[0].tests[5].params[2].m = 0;
230179084Srdivacky	tests[0].tests[5].params[3].i = AT_EACCESS;
231179084Srdivacky	tests[0].tests[6].result = 0;
232179084Srdivacky	tests[0].tests[6].params[0].i = 106;	/* invalid fd */
233179084Srdivacky	tests[0].tests[6].params[1].cp = absolute_path;
234179084Srdivacky	tests[0].tests[6].params[2].m = 0;
235179084Srdivacky	tests[0].tests[6].params[3].i = 0;
236179084Srdivacky
237179084Srdivacky	/* fchmodat */
238179084Srdivacky	tests[1].syscall = SYS_fchmodat;
239179084Srdivacky	tests[1].num_of_cases = 6;
240179084Srdivacky	tests[1].name = "fchmodat";
241179084Srdivacky	tests[1].tests[0].result = EBADF;
242179084Srdivacky	tests[1].tests[0].params[0].i = 106;	/* invalid fd */
243179084Srdivacky	tests[1].tests[0].params[1].cp = relative_path;
244179084Srdivacky	tests[1].tests[0].params[2].m = 33190;
245179084Srdivacky	tests[1].tests[0].params[3].i = 0;
246179084Srdivacky	tests[1].tests[1].result = EINVAL;
247179084Srdivacky	tests[1].tests[1].params[0].i = rel_fd;
248179084Srdivacky	tests[1].tests[1].params[1].cp = absolute_path;
249179084Srdivacky	tests[1].tests[1].params[2].m = 33190;	/* mode 646 translated */
250179084Srdivacky	tests[1].tests[1].params[3].i = 123;	/* invalid flag */
251179084Srdivacky	tests[1].tests[2].result = ENOTDIR;
252179084Srdivacky	tests[1].tests[2].params[0].i = notd_fd;
253179084Srdivacky	tests[1].tests[2].params[1].cp = relative_file;
254179084Srdivacky	tests[1].tests[2].params[2].m = 33190;
255179084Srdivacky	tests[1].tests[2].params[3].i = 0;
256179084Srdivacky	tests[1].tests[3].result = 0;
257179084Srdivacky	tests[1].tests[3].params[0].i = notd_fd;
258179084Srdivacky	tests[1].tests[3].params[1].cp = absolute_file;
259179084Srdivacky	tests[1].tests[3].params[2].m = 33190;
260179084Srdivacky	tests[1].tests[3].params[3].i = 0;
261179084Srdivacky	tests[1].tests[4].result = 0;
262179084Srdivacky	tests[1].tests[4].params[0].i = AT_FDCWD;
263179084Srdivacky	tests[1].tests[4].params[1].cp = symlinkf;
264179084Srdivacky	tests[1].tests[4].params[2].m = 33190;
265179084Srdivacky	tests[1].tests[4].params[3].i = AT_SYMLINK_NOFOLLOW;
266179084Srdivacky	tests[1].tests[5].result = 0;
267179084Srdivacky	tests[1].tests[5].params[0].i = rel_fd;
268179084Srdivacky	tests[1].tests[5].params[1].cp = file;
269179084Srdivacky	tests[1].tests[5].params[2].m = 33190;
270179084Srdivacky	tests[1].tests[5].params[3].i = 0;
271179084Srdivacky
272179084Srdivacky	/* fchownat */
273179084Srdivacky	tests[2].syscall = SYS_fchownat;
274179084Srdivacky	tests[2].num_of_cases = 6;
275179084Srdivacky	tests[2].name = "fchownat";
276179084Srdivacky	tests[2].tests[0].result = EBADF;
277179084Srdivacky	tests[2].tests[0].params[0].i = 106;	/* invalid fd */
278179084Srdivacky	tests[2].tests[0].params[1].cp = relative_file;
279179084Srdivacky	tests[2].tests[0].params[2].u = 65534;
280179084Srdivacky	tests[2].tests[0].params[3].g = 65534;
281179084Srdivacky	tests[2].tests[0].params[4].i = 0;
282179084Srdivacky	tests[2].tests[1].result = EINVAL;
283179084Srdivacky	tests[2].tests[1].params[0].i = rel_fd;
284179084Srdivacky	tests[2].tests[1].params[1].cp = file;
285179084Srdivacky	tests[2].tests[1].params[2].u = 65534;
286179084Srdivacky	tests[2].tests[1].params[3].g = 65534;
287179084Srdivacky	tests[2].tests[1].params[4].i = 123;	/* invalid flag */
288179084Srdivacky	tests[2].tests[2].result = ENOTDIR;
289179084Srdivacky	tests[2].tests[2].params[0].i = notd_fd;
290179084Srdivacky	tests[2].tests[2].params[1].cp = relative_file;
291179084Srdivacky	tests[2].tests[2].params[2].u = 65534;
292179084Srdivacky	tests[2].tests[2].params[3].g = 65534;
293179084Srdivacky	tests[2].tests[2].params[4].i = 0;
294179084Srdivacky	tests[2].tests[3].result = 0;
295179084Srdivacky	tests[2].tests[3].params[0].i = notd_fd;
296179084Srdivacky	tests[2].tests[3].params[1].cp = absolute_file;
297179084Srdivacky	tests[2].tests[3].params[2].u = 65534;
298179084Srdivacky	tests[2].tests[3].params[3].g = 65534;
299179084Srdivacky	tests[2].tests[3].params[4].i = 0;
300179084Srdivacky	tests[2].tests[4].result = 0;
301179084Srdivacky	tests[2].tests[4].params[0].i = AT_FDCWD;
302179084Srdivacky	tests[2].tests[4].params[1].cp = symlinkf;
303179084Srdivacky	tests[2].tests[4].params[2].u = 65534;
304179084Srdivacky	tests[2].tests[4].params[3].g = 65534;
305179084Srdivacky	tests[2].tests[4].params[4].i = AT_SYMLINK_NOFOLLOW;
306179084Srdivacky	tests[2].tests[5].result = 0;
307179084Srdivacky	tests[2].tests[5].params[0].i = rel_fd;
308179084Srdivacky	tests[2].tests[5].params[1].cp = file;
309179084Srdivacky	tests[2].tests[5].params[2].u = 0;
310179084Srdivacky	tests[2].tests[5].params[3].g = 0;
311179084Srdivacky	tests[2].tests[5].params[4].i = 0;
312179084Srdivacky
313179084Srdivacky	/* fstatat */
314179084Srdivacky	tests[3].syscall = SYS_fstatat;
315179084Srdivacky	tests[3].num_of_cases = 5;
316179084Srdivacky	tests[3].name = "fstatat";
317179084Srdivacky	tests[3].tests[0].result = EBADF;
318179084Srdivacky	tests[3].tests[0].params[0].i = 106;	/* invalid fd */
319179084Srdivacky	tests[3].tests[0].params[1].cp = relative_file;
320179084Srdivacky	tests[3].tests[0].params[2].vp = &buf;
321179084Srdivacky	tests[3].tests[0].params[3].i = 0;
322179084Srdivacky	tests[3].tests[1].result = EINVAL;
323179084Srdivacky	tests[3].tests[1].params[0].i = rel_fd;
324179084Srdivacky	tests[3].tests[1].params[1].cp = relative_file;
325179084Srdivacky	tests[3].tests[1].params[2].vp = &buf;
326179084Srdivacky	tests[3].tests[1].params[3].i = 123;	/* invalid flags */
327179084Srdivacky	tests[3].tests[2].result = ENOTDIR;
328179084Srdivacky	tests[3].tests[2].params[0].i = notd_fd;
329179084Srdivacky	tests[3].tests[2].params[1].cp = relative_file;
330179084Srdivacky	tests[3].tests[2].params[2].vp = &buf;
331179084Srdivacky	tests[3].tests[2].params[3].i = 0;
332179084Srdivacky	tests[3].tests[2].result = 0;
333179084Srdivacky	tests[3].tests[2].params[0].i = rel_fd;
334179084Srdivacky	tests[3].tests[2].params[1].cp = file;
335179084Srdivacky	tests[3].tests[2].params[2].vp = &buf;
336179084Srdivacky	tests[3].tests[2].params[3].i = 0;
337179084Srdivacky	tests[3].tests[3].result = 0;
338179084Srdivacky	tests[3].tests[3].params[0].i = AT_FDCWD;
339179084Srdivacky	tests[3].tests[3].params[1].cp = symlinkf;
340179084Srdivacky	tests[3].tests[3].params[2].vp = &buf;
341179084Srdivacky	tests[3].tests[3].params[3].i = AT_SYMLINK_NOFOLLOW;
342179084Srdivacky	tests[3].tests[4].result = 0;
343179084Srdivacky	tests[3].tests[4].params[0].i = notd_fd;
344179084Srdivacky	tests[3].tests[4].params[1].cp = absolute_file;
345179084Srdivacky	tests[3].tests[4].params[2].vp = &buf;
346179084Srdivacky	tests[3].tests[4].params[3].i = 0;
347179084Srdivacky
348179084Srdivacky	/* futimesat */
349179084Srdivacky	tests[4].syscall = SYS_futimesat;
350179084Srdivacky	tests[4].num_of_cases = 4;
351179084Srdivacky	tests[4].name = "futimesat";
352179084Srdivacky	tests[4].tests[0].result = EBADF;
353179084Srdivacky	tests[4].tests[0].params[0].i = 106;	/* invalid fd */
354179084Srdivacky	tests[4].tests[0].params[1].cp = relative_file;
355179084Srdivacky	tests[4].tests[0].params[2].vp = times;
356179084Srdivacky	tests[4].tests[1].result = ENOTDIR;
357179084Srdivacky	tests[4].tests[1].params[0].i = notd_fd;
358179084Srdivacky	tests[4].tests[1].params[1].cp = relative_file;
359179084Srdivacky	tests[4].tests[1].params[2].vp = times;
360179084Srdivacky	tests[4].tests[2].result = 0;
361179084Srdivacky	tests[4].tests[2].params[0].i = rel_fd;
362179084Srdivacky	tests[4].tests[2].params[1].cp = file;
363179084Srdivacky	tests[4].tests[2].params[2].vp = times;
364179084Srdivacky	tests[4].tests[3].result = 0;
365179084Srdivacky	tests[4].tests[3].params[0].i = notd_fd;
366179084Srdivacky	tests[4].tests[3].params[1].cp = absolute_file;
367179084Srdivacky	tests[4].tests[3].params[2].vp = times;
368179084Srdivacky
369179084Srdivacky	/* linkat */
370179084Srdivacky	tests[5].syscall = SYS_linkat;
371179084Srdivacky	tests[5].num_of_cases = 7;
372179084Srdivacky	tests[5].name = "linkat";
373179084Srdivacky	tests[5].tests[0].result = EBADF;
374179084Srdivacky	tests[5].tests[0].params[0].i = 106;	/* invalid fd */
375179084Srdivacky	tests[5].tests[0].params[1].cp = relative_file;
376179084Srdivacky	tests[5].tests[0].params[2].i = AT_FDCWD;
377179084Srdivacky	tests[5].tests[0].params[3].cp = newlink;
378179084Srdivacky	tests[5].tests[0].params[4].i = 0;
379179084Srdivacky	tests[5].tests[1].result = EBADF;
380179084Srdivacky	tests[5].tests[1].params[0].i = AT_FDCWD;
381179084Srdivacky	tests[5].tests[1].params[1].cp = relative_file;
382179084Srdivacky	tests[5].tests[1].params[2].i = 106;	/* invalid fd */
383179084Srdivacky	tests[5].tests[1].params[3].cp = newlink;
384179084Srdivacky	tests[5].tests[1].params[4].i = 0;
385179084Srdivacky	tests[5].tests[2].result = EINVAL;
386179084Srdivacky	tests[5].tests[2].params[0].i = rel_fd;
387179084Srdivacky	tests[5].tests[2].params[1].cp = relative_file;
388179084Srdivacky	tests[5].tests[2].params[2].i = AT_FDCWD;
389179084Srdivacky	tests[5].tests[2].params[3].cp = newlink;
390179084Srdivacky	tests[5].tests[2].params[4].i = 123;	/* invalid flag */
391179084Srdivacky	tests[5].tests[3].result = ENOTDIR;
392179084Srdivacky	tests[5].tests[3].params[0].i = notd_fd;
393179084Srdivacky	tests[5].tests[3].params[1].cp = relative_file;
394179084Srdivacky	tests[5].tests[3].params[2].i = AT_FDCWD;
395179084Srdivacky	tests[5].tests[3].params[3].cp = newlink;
396179084Srdivacky	tests[5].tests[3].params[4].i = 0;
397179084Srdivacky	tests[5].tests[4].result = 0;
398179084Srdivacky	tests[5].tests[4].params[0].i = rel_fd;
399179084Srdivacky	tests[5].tests[4].params[1].cp = file;
400179084Srdivacky	tests[5].tests[4].params[2].i = rel_fd;
401179084Srdivacky	tests[5].tests[4].params[3].cp = newlink;
402179084Srdivacky	tests[5].tests[4].params[4].i = 0;
403179084Srdivacky	tests[5].tests[5].result = 0;
404179084Srdivacky	tests[5].tests[5].params[0].i = AT_FDCWD;
405179084Srdivacky	tests[5].tests[5].params[1].cp = symlinkf;
406179084Srdivacky	tests[5].tests[5].params[2].i = rel_fd;
407179084Srdivacky	tests[5].tests[5].params[3].cp = newlink2;
408179084Srdivacky	tests[5].tests[5].params[4].i = 0;
409179084Srdivacky	tests[5].tests[6].result = 0;
410179084Srdivacky	tests[5].tests[6].params[0].i = AT_FDCWD;
411179084Srdivacky	tests[5].tests[6].params[1].cp = symlinkf;
412179084Srdivacky	tests[5].tests[6].params[2].i = rel_fd;
413179084Srdivacky	tests[5].tests[6].params[3].cp = newlink3;
414179084Srdivacky	tests[5].tests[6].params[4].i = AT_SYMLINK_FOLLOW;
415179084Srdivacky
416179084Srdivacky	/* mkdirat */
417179084Srdivacky	tests[6].syscall = SYS_mkdirat;
418179084Srdivacky	tests[6].num_of_cases = 3;
419179084Srdivacky	tests[6].name = "mkdirat";
420179084Srdivacky	tests[6].tests[0].result = EBADF;
421179084Srdivacky	tests[6].tests[0].params[0].i = 106;	/* invalid fd */
422179084Srdivacky	tests[6].tests[0].params[1].cp = relative_file;
423179084Srdivacky	tests[6].tests[0].params[2].m = 33190;
424179084Srdivacky	tests[6].tests[1].result = ENOTDIR;
425179084Srdivacky	tests[6].tests[1].params[0].i = notd_fd;
426179084Srdivacky	tests[6].tests[1].params[1].cp = relative_file;
427179084Srdivacky	tests[6].tests[1].params[2].m = 33190;
428179084Srdivacky	tests[6].tests[2].result = 0;
429179084Srdivacky	tests[6].tests[2].params[0].i = rel_fd;
430179084Srdivacky	tests[6].tests[2].params[1].cp = newdir;
431179084Srdivacky	tests[6].tests[2].params[2].m = 33190;
432179084Srdivacky
433179084Srdivacky	/* mkfifoat */
434179084Srdivacky	tests[7].syscall = SYS_mkfifoat;
435179084Srdivacky	tests[7].num_of_cases = 3;
436179084Srdivacky	tests[7].name = "mkfifoat";
437179084Srdivacky	tests[7].tests[0].result = EBADF;
438179084Srdivacky	tests[7].tests[0].params[0].i = 107;	/* invalid fd */
439179084Srdivacky	tests[7].tests[0].params[1].cp = relative_file;
440179084Srdivacky	tests[7].tests[0].params[2].m = 33190;
441179084Srdivacky	tests[7].tests[1].result = ENOTDIR;
442179084Srdivacky	tests[7].tests[1].params[0].i = notd_fd;
443179084Srdivacky	tests[7].tests[1].params[1].cp = relative_file;
444179084Srdivacky	tests[7].tests[1].params[2].m = 33190;
445179084Srdivacky	tests[7].tests[2].result = 0;
446179084Srdivacky	tests[7].tests[2].params[0].i = rel_fd;
447179084Srdivacky	tests[7].tests[2].params[1].cp = fifo;
448179084Srdivacky	tests[7].tests[2].params[2].m = 33190;
449179084Srdivacky
450179084Srdivacky	/* mknodat */
451179084Srdivacky	tests[8].syscall = SYS_mknodat;
452179084Srdivacky	tests[8].num_of_cases = 3;
453179084Srdivacky	tests[8].name = "mknodat";
454179084Srdivacky	tests[8].tests[0].result = EBADF;
455179084Srdivacky	tests[8].tests[0].params[0].i = 108;	/* invalid fd */
456179084Srdivacky	tests[8].tests[0].params[1].cp = relative_file;
457179084Srdivacky	tests[8].tests[0].params[2].m = 0666 | S_IFCHR;
458179084Srdivacky	tests[8].tests[0].params[3].d = 15;
459179084Srdivacky	tests[8].tests[1].result = ENOTDIR;
460179084Srdivacky	tests[8].tests[1].params[0].i = notd_fd;
461179084Srdivacky	tests[8].tests[1].params[1].cp = relative_file;
462179084Srdivacky	tests[8].tests[1].params[2].m = 0666 | S_IFCHR;
463179084Srdivacky	tests[8].tests[1].params[3].d = 15;
464179084Srdivacky	tests[8].tests[2].result = 0;
465179084Srdivacky	tests[8].tests[2].params[0].i = rel_fd;
466179084Srdivacky	tests[8].tests[2].params[1].cp = nod;
467179084Srdivacky	tests[8].tests[2].params[2].m = 0666 | S_IFCHR;
468179084Srdivacky	tests[8].tests[2].params[3].d = 2570;
469179084Srdivacky
470179084Srdivacky	/* openat */
471179084Srdivacky	tests[9].syscall = SYS_openat;
472179084Srdivacky	tests[9].num_of_cases = 5;
473179084Srdivacky	tests[9].name = "openat";
474179084Srdivacky	tests[9].tests[0].result = EBADF;
475179084Srdivacky	tests[9].tests[0].params[0].i = 106;	/* invalid fd */
476179084Srdivacky	tests[9].tests[0].params[1].cp = relative_file;
477179084Srdivacky	tests[9].tests[0].params[2].i = O_RDONLY;
478179084Srdivacky	tests[9].tests[0].params[3].i = 0666;
479179084Srdivacky	tests[9].tests[1].result = ENOTDIR;
480179084Srdivacky	tests[9].tests[1].params[0].i = notd_fd;
481179084Srdivacky	tests[9].tests[1].params[1].cp = relative_file;
482179084Srdivacky	tests[9].tests[1].params[2].i = O_RDONLY;
483179084Srdivacky	tests[9].tests[1].params[3].i = 0666;
484179084Srdivacky	tests[9].tests[2].result = 8;		/* hardcoded fd */
485179084Srdivacky	tests[9].tests[2].params[0].i = rel_fd;
486179084Srdivacky	tests[9].tests[2].params[1].cp = file;
487179084Srdivacky	tests[9].tests[2].params[2].i = O_RDONLY;
488179084Srdivacky	tests[9].tests[2].params[3].i = 0400;
489179084Srdivacky	tests[9].tests[3].result = 9;		/* hardcoded fd */
490179084Srdivacky	tests[9].tests[3].params[0].i = notd_fd;
491179084Srdivacky	tests[9].tests[3].params[1].cp = absolute_file;
492179084Srdivacky	tests[9].tests[3].params[2].i = O_RDONLY;
493179084Srdivacky	tests[9].tests[3].params[3].i = 0400;
494179084Srdivacky	tests[9].tests[4].result = 10;		/* hardcoded fd */
495179084Srdivacky	tests[9].tests[4].params[0].i = rel_fd;
496179084Srdivacky	tests[9].tests[4].params[1].cp = newfile;
497179084Srdivacky	tests[9].tests[4].params[2].i = O_RDONLY | O_CREAT;
498179084Srdivacky	tests[9].tests[4].params[3].i = 0666;
499179084Srdivacky
500179084Srdivacky	/* readlinkat */
501179084Srdivacky	tests[10].syscall = SYS_readlinkat;
502179084Srdivacky	tests[10].num_of_cases = 3;
503179084Srdivacky	tests[10].name = "readlinkat";
504179084Srdivacky	tests[10].tests[0].result = EBADF;
505179084Srdivacky	tests[10].tests[0].params[0].i = 106;	/* invalid fd */
506179084Srdivacky	tests[10].tests[0].params[1].cp = relative_file;
507179084Srdivacky	tests[10].tests[0].params[2].vp = cbuf;
508179084Srdivacky	tests[10].tests[0].params[3].i = PATH_MAX;
509179084Srdivacky	tests[10].tests[1].result = ENOTDIR;
510179084Srdivacky	tests[10].tests[1].params[0].i = notd_fd;
511179084Srdivacky	tests[10].tests[1].params[1].cp = relative_file;
512179084Srdivacky	tests[10].tests[1].params[2].vp = cbuf;
513179084Srdivacky	tests[10].tests[1].params[3].i = PATH_MAX;
514179084Srdivacky	tests[10].tests[2].result = strlen(absolute_file);
515179084Srdivacky	tests[10].tests[2].params[0].i = AT_FDCWD;
516179084Srdivacky	tests[10].tests[2].params[1].cp = symlinkf;
517179084Srdivacky	tests[10].tests[2].params[2].vp = cbuf;
518179084Srdivacky	tests[10].tests[2].params[3].i = PATH_MAX;
519179084Srdivacky
520179084Srdivacky	/* renameat */
521179084Srdivacky	tests[11].syscall = SYS_renameat;
522179084Srdivacky	tests[11].num_of_cases = 5;
523179084Srdivacky	tests[11].name = "renameat";
524179084Srdivacky	tests[11].tests[0].result = EBADF;
525179084Srdivacky	tests[11].tests[0].params[0].i = 106;	/* invalid fd */
526179084Srdivacky	tests[11].tests[0].params[1].cp = file;
527179084Srdivacky	tests[11].tests[0].params[2].i = rel_fd;
528179084Srdivacky	tests[11].tests[0].params[3].cp = file;
529179084Srdivacky	tests[11].tests[1].result = EBADF;
530179084Srdivacky	tests[11].tests[1].params[0].i = rel_fd;
531179084Srdivacky	tests[11].tests[1].params[1].cp = file;
532179084Srdivacky	tests[11].tests[1].params[2].i = 106;	/* invalid fd */
533179084Srdivacky	tests[11].tests[1].params[3].cp = file;
534179084Srdivacky	tests[11].tests[2].result = ENOTDIR;
535179084Srdivacky	tests[11].tests[2].params[0].i = notd_fd;
536179084Srdivacky	tests[11].tests[2].params[1].cp = relative_file;
537179084Srdivacky	tests[11].tests[2].params[2].i = rel_fd;
538179084Srdivacky	tests[11].tests[2].params[3].cp = file;
539179084Srdivacky	tests[11].tests[3].result = ENOTDIR;
540179084Srdivacky	tests[11].tests[3].params[0].i = rel_fd;
541179084Srdivacky	tests[11].tests[3].params[1].cp = file;
542179084Srdivacky	tests[11].tests[3].params[2].i = notd_fd;
543179084Srdivacky	tests[11].tests[3].params[3].cp = relative_file;
544179084Srdivacky	tests[11].tests[4].result = 0;
545179084Srdivacky	tests[11].tests[4].params[0].i = rel_fd;
546179084Srdivacky	tests[11].tests[4].params[1].cp = newfile;
547179084Srdivacky	tests[11].tests[4].params[2].i = AT_FDCWD;
548179084Srdivacky	tests[11].tests[4].params[3].cp = newfile;
549179084Srdivacky
550179084Srdivacky	/* symlinkat */
551179084Srdivacky	tests[12].syscall = SYS_symlinkat;
552179084Srdivacky	tests[12].num_of_cases = 3;
553179084Srdivacky	tests[12].name = "symlinkat";
554179084Srdivacky	tests[12].tests[0].result = EBADF;
555179084Srdivacky	tests[12].tests[0].params[0].cp = file;
556179084Srdivacky	tests[12].tests[0].params[1].i = 106;	/* invalid fd */
557179084Srdivacky	tests[12].tests[0].params[2].cp = file;
558179084Srdivacky	tests[12].tests[1].result = ENOTDIR;
559179084Srdivacky	tests[12].tests[1].params[0].cp = file;
560179084Srdivacky	tests[12].tests[1].params[1].i = notd_fd;
561179084Srdivacky	tests[12].tests[1].params[2].cp = relative_file;
562179084Srdivacky	tests[12].tests[2].result = 0;
563179084Srdivacky	tests[12].tests[2].params[0].cp = absolute_file;
564179084Srdivacky	tests[12].tests[2].params[1].i = rel_fd;
565179084Srdivacky	tests[12].tests[2].params[2].cp = newslink;
566179084Srdivacky
567179084Srdivacky
568179084Srdivacky	/* unlinkat */
569179084Srdivacky	tests[13].syscall = SYS_unlinkat;
570179084Srdivacky	tests[13].num_of_cases = 7;
571179084Srdivacky	tests[13].name = "unlinkat";
572179084Srdivacky	tests[13].tests[0].result = EBADF;
573179084Srdivacky	tests[13].tests[0].params[0].i = 106;	/* invalid fd */
574179084Srdivacky	tests[13].tests[0].params[1].cp = relative_file;
575179084Srdivacky	tests[13].tests[0].params[2].i = 0;
576179084Srdivacky	tests[13].tests[1].result = ENOTDIR;
577179084Srdivacky	tests[13].tests[1].params[0].i = notd_fd;
578179084Srdivacky	tests[13].tests[1].params[1].cp = relative_file;
579179084Srdivacky	tests[13].tests[1].params[2].i = 0;
580179084Srdivacky	tests[13].tests[2].result = EINVAL;
581179084Srdivacky	tests[13].tests[2].params[0].i = rel_fd;
582179084Srdivacky	tests[13].tests[2].params[1].cp = file;
583179084Srdivacky	tests[13].tests[2].params[2].i = 123;	/* invalid flag */
584179084Srdivacky	tests[13].tests[3].result = ENOTDIR;
585179084Srdivacky	tests[13].tests[3].params[0].i = rel_fd;
586179084Srdivacky	tests[13].tests[3].params[1].cp = not_dir_path;
587179084Srdivacky	tests[13].tests[3].params[2].i = AT_REMOVEDIR;
588179084Srdivacky	tests[13].tests[4].result = ENOTEMPTY;
589179084Srdivacky	tests[13].tests[4].params[0].i = AT_FDCWD;
590179084Srdivacky	tests[13].tests[4].params[1].cp = relative_path;
591179084Srdivacky	tests[13].tests[4].params[2].i = AT_REMOVEDIR;
592179084Srdivacky	tests[13].tests[5].result = 0;
593179084Srdivacky	tests[13].tests[5].params[0].i = rel_fd;
594179084Srdivacky	tests[13].tests[5].params[1].cp = newdir;
595179084Srdivacky	tests[13].tests[5].params[2].i = AT_REMOVEDIR;
596179084Srdivacky	tests[13].tests[6].result = 0;
597179084Srdivacky	tests[13].tests[6].params[0].i = AT_FDCWD;
598179084Srdivacky	tests[13].tests[6].params[1].cp = newfile;
599179084Srdivacky	tests[13].tests[6].params[2].i = 0;
600179084Srdivacky
601179084Srdivacky
602179084Srdivacky	/* fexecve */
603179084Srdivacky	tests[14].syscall = SYS_fexecve;
604179084Srdivacky	tests[14].num_of_cases = 2;
605179084Srdivacky	tests[14].name = "fexecve";
606179084Srdivacky	tests[14].tests[0].result = EBADF;
607179084Srdivacky	tests[14].tests[0].params[0].i = 106;	/* invalid fd */
608179084Srdivacky	tests[14].tests[0].params[1].cpp = pargv;
609179084Srdivacky	tests[14].tests[0].params[2].cpp = NULL;
610179084Srdivacky	/* This is EXPECTED to execve /bin/date, so dont expect OK output */
611179084Srdivacky	tests[14].tests[1].result = 0;
612179084Srdivacky	tests[14].tests[1].params[0].i = exec_fd;
613179084Srdivacky	tests[14].tests[1].params[1].cpp = pargv;
614179084Srdivacky	tests[14].tests[1].params[2].cpp = NULL;
615179084Srdivacky}
616179084Srdivacky
617179084Srdivackyvoid
618219568Sbruceccleanup(void)
619179084Srdivacky{
620179084Srdivacky	system("/bin/sh -c 'rm -rf tmp'");
621179084Srdivacky}
622179084Srdivacky
623179084Srdivackyvoid
624219568Sbrucecsetup_once(void)
625179084Srdivacky{
626179084Srdivacky}
627179084Srdivacky
628179084Srdivackyint
629179084Srdivackymain(int argc, char *argv[])
630179084Srdivacky{
631179084Srdivacky	int i,j;
632179084Srdivacky	int error;
633179084Srdivacky
634219568Sbrucec	(void)argc;
635219568Sbrucec	(void)argv;
636219568Sbrucec
637179084Srdivacky	setup();
638179084Srdivacky
639179084Srdivacky	for (i = 0; i < NUM_OF_TESTS; i++) {
640219568Sbrucec		printf("\nTest: %s\n", tests[i].name);
641179084Srdivacky		for (j = 0; j < tests[i].num_of_cases; j++) {
642179084Srdivacky			error = syscall(tests[i].syscall,
643179084Srdivacky				tests[i].tests[j].params[0],
644179084Srdivacky				tests[i].tests[j].params[1],
645179084Srdivacky				tests[i].tests[j].params[2],
646179084Srdivacky				tests[i].tests[j].params[3],
647179084Srdivacky				tests[i].tests[j].params[4]);
648179084Srdivacky			if (error == 0) {
649179084Srdivacky				if (tests[i].tests[j].result == 0)
650179084Srdivacky   					printf("#%i ... OK\n", j);
651179084Srdivacky				else {
652179084Srdivacky					printf("#%i ... BAD: ", j);
653179084Srdivacky					printf("expected %i, but got %i\n", tests[i].tests[j].result, error);
654179084Srdivacky				}
655179084Srdivacky			} else 	{
656179084Srdivacky				if (tests[i].tests[j].result == errno)
657179084Srdivacky					printf("#%i ... OK\n", j);
658179084Srdivacky				else {
659179084Srdivacky				   	if (error != tests[i].tests[j].result) {
660179084Srdivacky						printf("#%i ... BAD: ", j);
661179084Srdivacky						printf("expected %i, but got %i\n", tests[i].tests[j].result, error);
662179084Srdivacky					} else
663179084Srdivacky						printf("#%i ... OK\n", j);
664179084Srdivacky				}
665179084Srdivacky			}
666179084Srdivacky		}
667179084Srdivacky	}
668179084Srdivacky
669179084Srdivacky	cleanup();
670179084Srdivacky
671179084Srdivacky	return (0);
672179084Srdivacky}
673