doat.c revision 179084
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: head/tools/regression/doat/doat.c 179084 2008-05-18 08:34:04Z rdivacky $ 27179084Srdivacky */ 28179084Srdivacky 29179084Srdivacky#include <errno.h> 30179084Srdivacky#include <fcntl.h> 31179084Srdivacky#include <stdbool.h> 32179084Srdivacky#include <stdio.h> 33179084Srdivacky#include <stdlib.h> 34179084Srdivacky#include <string.h> 35179084Srdivacky#include <sys/types.h> 36179084Srdivacky#include <sys/syscall.h> 37179084Srdivacky#include <sys/stat.h> 38179084Srdivacky 39179084Srdivackyunion param { 40179084Srdivacky int i; 41179084Srdivacky char *cp; 42179084Srdivacky mode_t m; 43179084Srdivacky dev_t d; 44179084Srdivacky void *vp; 45179084Srdivacky uid_t u; 46179084Srdivacky gid_t g; 47179084Srdivacky char **cpp; 48179084Srdivacky}; 49179084Srdivacky 50179084Srdivackystruct testcase { 51179084Srdivacky int result; 52179084Srdivacky union param params[5]; /* no *at syscall with more than 5 params */ 53179084Srdivacky}; 54179084Srdivacky 55179084Srdivackystruct test { 56179084Srdivacky int syscall; 57179084Srdivacky int num_of_cases; 58179084Srdivacky char *name; 59179084Srdivacky struct testcase tests[10]; /* no more than 10 tests */ 60179084Srdivacky 61179084Srdivacky}; 62179084Srdivacky 63179084Srdivackystruct test *tests; 64179084Srdivacky#define NUM_OF_TESTS 14 /* we dont want the fexecve test to run */ 65179084Srdivacky 66179084Srdivackychar *absolute_path = NULL; 67179084Srdivackychar *relative_path = "tmp/"; 68179084Srdivackychar *not_dir_path = "/bin/date"; 69179084Srdivacky 70179084Srdivackychar *file = "foo"; 71179084Srdivackychar *absolute_file = NULL; 72179084Srdivackychar *relative_file = NULL; 73179084Srdivackychar *symlinkf = "link"; 74179084Srdivackychar *newlink = "nlink1"; 75179084Srdivackychar *newlink2 = "nlink2"; 76179084Srdivackychar *newlink3 = "nlink3"; 77179084Srdivackychar *newdir = "newdir"; 78179084Srdivackychar *fifo = "fifo"; 79179084Srdivackychar *nod = "nod"; 80179084Srdivackychar *newfile = "newfile"; 81179084Srdivackychar *newslink = "nslink1"; 82179084Srdivacky 83179084Srdivackybool dir_exist = false; 84179084Srdivackybool file_exist = false; 85179084Srdivackybool link_exist = false; 86179084Srdivacky 87179084Srdivackyint rel_fd, abs_fd, notd_fd, exec_fd; 88179084Srdivacky 89179084Srdivackystruct timeval times[2]; 90179084Srdivackystruct stat buf; 91179084Srdivackychar *pargv[2] = { "/bin/date", NULL }; 92179084Srdivacky#define PATH_MAX 1024 93179084Srdivackychar cbuf[PATH_MAX]; 94179084Srdivacky 95179084Srdivackyvoid 96179084Srdivackysetup() 97179084Srdivacky{ 98179084Srdivacky int i, error; 99179084Srdivacky size_t siz; 100179084Srdivacky struct stat sb; 101179084Srdivacky 102179084Srdivacky tests = calloc(NUM_OF_TESTS, sizeof(struct test)); 103179084Srdivacky if (tests == NULL) { 104179084Srdivacky perror(""); 105179084Srdivacky exit(0); 106179084Srdivacky } 107179084Srdivacky 108179084Srdivacky absolute_path = (char *)getcwd(NULL, 0); 109179084Srdivacky if (absolute_path == NULL) { 110179084Srdivacky perror("getcwd"); 111179084Srdivacky exit(0); 112179084Srdivacky } 113179084Srdivacky 114179084Srdivacky absolute_path = realloc(absolute_path, strlen(absolute_path) + 5); 115179084Srdivacky if (absolute_path == NULL) { 116179084Srdivacky perror("realloc"); 117179084Srdivacky exit(0); 118179084Srdivacky } 119179084Srdivacky 120179084Srdivacky absolute_path[strlen(absolute_path)] = '/'; 121179084Srdivacky strcpy(absolute_path + strlen(absolute_path), relative_path); 122179084Srdivacky 123179084Srdivacky absolute_file = malloc(strlen(absolute_path) + 1 + strlen(file)); 124179084Srdivacky bzero(absolute_file, strlen(absolute_path) + 1 + strlen(file)); 125179084Srdivacky if (absolute_file == NULL) { 126179084Srdivacky perror("malloc"); 127179084Srdivacky exit(0); 128179084Srdivacky } 129179084Srdivacky strcpy(absolute_file, absolute_path); 130179084Srdivacky absolute_file[strlen(absolute_file)] = '/'; 131179084Srdivacky strcpy(absolute_file + strlen(absolute_path), file); 132179084Srdivacky 133179084Srdivacky relative_file = malloc(strlen(relative_path) + 1 + strlen(file)); 134179084Srdivacky bzero(relative_file, strlen(relative_path) + 1 + strlen(file)); 135179084Srdivacky if (relative_file == NULL) { 136179084Srdivacky perror("malloc"); 137179084Srdivacky exit(0); 138179084Srdivacky } 139179084Srdivacky strcpy(relative_file, relative_path); 140179084Srdivacky relative_file[strlen(relative_file)] = '/'; 141179084Srdivacky strcpy(relative_file + strlen(relative_path), file); 142179084Srdivacky 143179084Srdivacky error = mkdir(relative_path, 666); 144179084Srdivacky dir_exist = (errno == EEXIST); 145179084Srdivacky if (error && errno != EEXIST) { 146179084Srdivacky perror("tmp"); 147179084Srdivacky exit(0); 148179084Srdivacky } 149179084Srdivacky 150179084Srdivacky error = stat("tmp/foo", &sb); 151179084Srdivacky file_exist = (errno != ENOENT); 152179084Srdivacky i = open("tmp/foo", O_RDONLY | O_CREAT); 153179084Srdivacky if (i == -1) { 154179084Srdivacky perror("foo"); 155179084Srdivacky exit(0); 156179084Srdivacky } 157179084Srdivacky 158179084Srdivacky rel_fd = open(relative_path, O_RDONLY); 159179084Srdivacky if (rel_fd == -1) { 160179084Srdivacky perror("relative path"); 161179084Srdivacky exit(0); 162179084Srdivacky } 163179084Srdivacky 164179084Srdivacky abs_fd = open(absolute_path, O_RDONLY); 165179084Srdivacky if (abs_fd == -1) { 166179084Srdivacky perror("absolute path"); 167179084Srdivacky exit(0); 168179084Srdivacky } 169179084Srdivacky 170179084Srdivacky notd_fd = open(not_dir_path, O_RDONLY); 171179084Srdivacky if (notd_fd == -1) { 172179084Srdivacky perror("not a directory"); 173179084Srdivacky exit(0); 174179084Srdivacky } 175179084Srdivacky 176179084Srdivacky exec_fd = open(not_dir_path, O_RDONLY); 177179084Srdivacky if (exec_fd == -1) { 178179084Srdivacky perror("not a directory"); 179179084Srdivacky exit(0); 180179084Srdivacky } 181179084Srdivacky 182179084Srdivacky error = symlink(absolute_file, symlinkf); 183179084Srdivacky link_exist = (errno == EEXIST); 184179084Srdivacky if (error && errno != EEXIST) { 185179084Srdivacky perror("symlink"); 186179084Srdivacky exit(0); 187179084Srdivacky } 188179084Srdivacky 189179084Srdivacky /* faccessat */ 190179084Srdivacky tests[0].syscall = SYS_faccessat; 191179084Srdivacky tests[0].num_of_cases = 6; 192179084Srdivacky tests[0].name = "faccessat"; 193179084Srdivacky tests[0].tests[0].result = EBADF; 194179084Srdivacky tests[0].tests[0].params[0].i = 106; /* invalid fd */ 195179084Srdivacky tests[0].tests[0].params[1].cp = relative_path; 196179084Srdivacky tests[0].tests[0].params[2].m = 0; 197179084Srdivacky tests[0].tests[0].params[3].i = 0; 198179084Srdivacky tests[0].tests[1].result = EBADF; 199179084Srdivacky tests[0].tests[1].params[0].i = 106; /* invalid fd */ 200179084Srdivacky tests[0].tests[1].params[1].cp = relative_path; 201179084Srdivacky tests[0].tests[1].params[2].m = 0; 202179084Srdivacky tests[0].tests[1].params[3].i = AT_EACCESS; 203179084Srdivacky tests[0].tests[2].result = EINVAL; 204179084Srdivacky tests[0].tests[2].params[0].i = rel_fd; 205179084Srdivacky tests[0].tests[2].params[1].cp = absolute_path; 206179084Srdivacky tests[0].tests[2].params[2].m = 0; 207179084Srdivacky tests[0].tests[2].params[3].i = 123; /* invalid flag */ 208179084Srdivacky tests[0].tests[3].result = ENOTDIR; 209179084Srdivacky tests[0].tests[3].params[0].i = notd_fd; 210179084Srdivacky tests[0].tests[3].params[1].cp = relative_file; 211179084Srdivacky tests[0].tests[3].params[2].m = 0; 212179084Srdivacky tests[0].tests[3].params[3].i = 0; 213179084Srdivacky tests[0].tests[4].result = 0; 214179084Srdivacky tests[0].tests[4].params[0].i = rel_fd; 215179084Srdivacky tests[0].tests[4].params[1].cp = file; 216179084Srdivacky tests[0].tests[4].params[2].m = 0; 217179084Srdivacky tests[0].tests[4].params[3].i = 0; 218179084Srdivacky tests[0].tests[5].result = 0; 219179084Srdivacky tests[0].tests[5].params[0].i = rel_fd; 220179084Srdivacky tests[0].tests[5].params[1].cp = file; 221179084Srdivacky tests[0].tests[5].params[2].m = 0; 222179084Srdivacky tests[0].tests[5].params[3].i = AT_EACCESS; 223179084Srdivacky tests[0].tests[6].result = 0; 224179084Srdivacky tests[0].tests[6].params[0].i = 106; /* invalid fd */ 225179084Srdivacky tests[0].tests[6].params[1].cp = absolute_path; 226179084Srdivacky tests[0].tests[6].params[2].m = 0; 227179084Srdivacky tests[0].tests[6].params[3].i = 0; 228179084Srdivacky 229179084Srdivacky /* fchmodat */ 230179084Srdivacky tests[1].syscall = SYS_fchmodat; 231179084Srdivacky tests[1].num_of_cases = 6; 232179084Srdivacky tests[1].name = "fchmodat"; 233179084Srdivacky tests[1].tests[0].result = EBADF; 234179084Srdivacky tests[1].tests[0].params[0].i = 106; /* invalid fd */ 235179084Srdivacky tests[1].tests[0].params[1].cp = relative_path; 236179084Srdivacky tests[1].tests[0].params[2].m = 33190; 237179084Srdivacky tests[1].tests[0].params[3].i = 0; 238179084Srdivacky tests[1].tests[1].result = EINVAL; 239179084Srdivacky tests[1].tests[1].params[0].i = rel_fd; 240179084Srdivacky tests[1].tests[1].params[1].cp = absolute_path; 241179084Srdivacky tests[1].tests[1].params[2].m = 33190; /* mode 646 translated */ 242179084Srdivacky tests[1].tests[1].params[3].i = 123; /* invalid flag */ 243179084Srdivacky tests[1].tests[2].result = ENOTDIR; 244179084Srdivacky tests[1].tests[2].params[0].i = notd_fd; 245179084Srdivacky tests[1].tests[2].params[1].cp = relative_file; 246179084Srdivacky tests[1].tests[2].params[2].m = 33190; 247179084Srdivacky tests[1].tests[2].params[3].i = 0; 248179084Srdivacky tests[1].tests[3].result = 0; 249179084Srdivacky tests[1].tests[3].params[0].i = notd_fd; 250179084Srdivacky tests[1].tests[3].params[1].cp = absolute_file; 251179084Srdivacky tests[1].tests[3].params[2].m = 33190; 252179084Srdivacky tests[1].tests[3].params[3].i = 0; 253179084Srdivacky tests[1].tests[4].result = 0; 254179084Srdivacky tests[1].tests[4].params[0].i = AT_FDCWD; 255179084Srdivacky tests[1].tests[4].params[1].cp = symlinkf; 256179084Srdivacky tests[1].tests[4].params[2].m = 33190; 257179084Srdivacky tests[1].tests[4].params[3].i = AT_SYMLINK_NOFOLLOW; 258179084Srdivacky tests[1].tests[5].result = 0; 259179084Srdivacky tests[1].tests[5].params[0].i = rel_fd; 260179084Srdivacky tests[1].tests[5].params[1].cp = file; 261179084Srdivacky tests[1].tests[5].params[2].m = 33190; 262179084Srdivacky tests[1].tests[5].params[3].i = 0; 263179084Srdivacky 264179084Srdivacky /* fchownat */ 265179084Srdivacky tests[2].syscall = SYS_fchownat; 266179084Srdivacky tests[2].num_of_cases = 6; 267179084Srdivacky tests[2].name = "fchownat"; 268179084Srdivacky tests[2].tests[0].result = EBADF; 269179084Srdivacky tests[2].tests[0].params[0].i = 106; /* invalid fd */ 270179084Srdivacky tests[2].tests[0].params[1].cp = relative_file; 271179084Srdivacky tests[2].tests[0].params[2].u = 65534; 272179084Srdivacky tests[2].tests[0].params[3].g = 65534; 273179084Srdivacky tests[2].tests[0].params[4].i = 0; 274179084Srdivacky tests[2].tests[1].result = EINVAL; 275179084Srdivacky tests[2].tests[1].params[0].i = rel_fd; 276179084Srdivacky tests[2].tests[1].params[1].cp = file; 277179084Srdivacky tests[2].tests[1].params[2].u = 65534; 278179084Srdivacky tests[2].tests[1].params[3].g = 65534; 279179084Srdivacky tests[2].tests[1].params[4].i = 123; /* invalid flag */ 280179084Srdivacky tests[2].tests[2].result = ENOTDIR; 281179084Srdivacky tests[2].tests[2].params[0].i = notd_fd; 282179084Srdivacky tests[2].tests[2].params[1].cp = relative_file; 283179084Srdivacky tests[2].tests[2].params[2].u = 65534; 284179084Srdivacky tests[2].tests[2].params[3].g = 65534; 285179084Srdivacky tests[2].tests[2].params[4].i = 0; 286179084Srdivacky tests[2].tests[3].result = 0; 287179084Srdivacky tests[2].tests[3].params[0].i = notd_fd; 288179084Srdivacky tests[2].tests[3].params[1].cp = absolute_file; 289179084Srdivacky tests[2].tests[3].params[2].u = 65534; 290179084Srdivacky tests[2].tests[3].params[3].g = 65534; 291179084Srdivacky tests[2].tests[3].params[4].i = 0; 292179084Srdivacky tests[2].tests[4].result = 0; 293179084Srdivacky tests[2].tests[4].params[0].i = AT_FDCWD; 294179084Srdivacky tests[2].tests[4].params[1].cp = symlinkf; 295179084Srdivacky tests[2].tests[4].params[2].u = 65534; 296179084Srdivacky tests[2].tests[4].params[3].g = 65534; 297179084Srdivacky tests[2].tests[4].params[4].i = AT_SYMLINK_NOFOLLOW; 298179084Srdivacky tests[2].tests[5].result = 0; 299179084Srdivacky tests[2].tests[5].params[0].i = rel_fd; 300179084Srdivacky tests[2].tests[5].params[1].cp = file; 301179084Srdivacky tests[2].tests[5].params[2].u = 0; 302179084Srdivacky tests[2].tests[5].params[3].g = 0; 303179084Srdivacky tests[2].tests[5].params[4].i = 0; 304179084Srdivacky 305179084Srdivacky /* fstatat */ 306179084Srdivacky tests[3].syscall = SYS_fstatat; 307179084Srdivacky tests[3].num_of_cases = 5; 308179084Srdivacky tests[3].name = "fstatat"; 309179084Srdivacky tests[3].tests[0].result = EBADF; 310179084Srdivacky tests[3].tests[0].params[0].i = 106; /* invalid fd */ 311179084Srdivacky tests[3].tests[0].params[1].cp = relative_file; 312179084Srdivacky tests[3].tests[0].params[2].vp = &buf; 313179084Srdivacky tests[3].tests[0].params[3].i = 0; 314179084Srdivacky tests[3].tests[1].result = EINVAL; 315179084Srdivacky tests[3].tests[1].params[0].i = rel_fd; 316179084Srdivacky tests[3].tests[1].params[1].cp = relative_file; 317179084Srdivacky tests[3].tests[1].params[2].vp = &buf; 318179084Srdivacky tests[3].tests[1].params[3].i = 123; /* invalid flags */ 319179084Srdivacky tests[3].tests[2].result = ENOTDIR; 320179084Srdivacky tests[3].tests[2].params[0].i = notd_fd; 321179084Srdivacky tests[3].tests[2].params[1].cp = relative_file; 322179084Srdivacky tests[3].tests[2].params[2].vp = &buf; 323179084Srdivacky tests[3].tests[2].params[3].i = 0; 324179084Srdivacky tests[3].tests[2].result = 0; 325179084Srdivacky tests[3].tests[2].params[0].i = rel_fd; 326179084Srdivacky tests[3].tests[2].params[1].cp = file; 327179084Srdivacky tests[3].tests[2].params[2].vp = &buf; 328179084Srdivacky tests[3].tests[2].params[3].i = 0; 329179084Srdivacky tests[3].tests[3].result = 0; 330179084Srdivacky tests[3].tests[3].params[0].i = AT_FDCWD; 331179084Srdivacky tests[3].tests[3].params[1].cp = symlinkf; 332179084Srdivacky tests[3].tests[3].params[2].vp = &buf; 333179084Srdivacky tests[3].tests[3].params[3].i = AT_SYMLINK_NOFOLLOW; 334179084Srdivacky tests[3].tests[4].result = 0; 335179084Srdivacky tests[3].tests[4].params[0].i = notd_fd; 336179084Srdivacky tests[3].tests[4].params[1].cp = absolute_file; 337179084Srdivacky tests[3].tests[4].params[2].vp = &buf; 338179084Srdivacky tests[3].tests[4].params[3].i = 0; 339179084Srdivacky 340179084Srdivacky /* futimesat */ 341179084Srdivacky tests[4].syscall = SYS_futimesat; 342179084Srdivacky tests[4].num_of_cases = 4; 343179084Srdivacky tests[4].name = "futimesat"; 344179084Srdivacky tests[4].tests[0].result = EBADF; 345179084Srdivacky tests[4].tests[0].params[0].i = 106; /* invalid fd */ 346179084Srdivacky tests[4].tests[0].params[1].cp = relative_file; 347179084Srdivacky tests[4].tests[0].params[2].vp = times; 348179084Srdivacky tests[4].tests[1].result = ENOTDIR; 349179084Srdivacky tests[4].tests[1].params[0].i = notd_fd; 350179084Srdivacky tests[4].tests[1].params[1].cp = relative_file; 351179084Srdivacky tests[4].tests[1].params[2].vp = times; 352179084Srdivacky tests[4].tests[2].result = 0; 353179084Srdivacky tests[4].tests[2].params[0].i = rel_fd; 354179084Srdivacky tests[4].tests[2].params[1].cp = file; 355179084Srdivacky tests[4].tests[2].params[2].vp = times; 356179084Srdivacky tests[4].tests[3].result = 0; 357179084Srdivacky tests[4].tests[3].params[0].i = notd_fd; 358179084Srdivacky tests[4].tests[3].params[1].cp = absolute_file; 359179084Srdivacky tests[4].tests[3].params[2].vp = times; 360179084Srdivacky 361179084Srdivacky /* linkat */ 362179084Srdivacky tests[5].syscall = SYS_linkat; 363179084Srdivacky tests[5].num_of_cases = 7; 364179084Srdivacky tests[5].name = "linkat"; 365179084Srdivacky tests[5].tests[0].result = EBADF; 366179084Srdivacky tests[5].tests[0].params[0].i = 106; /* invalid fd */ 367179084Srdivacky tests[5].tests[0].params[1].cp = relative_file; 368179084Srdivacky tests[5].tests[0].params[2].i = AT_FDCWD; 369179084Srdivacky tests[5].tests[0].params[3].cp = newlink; 370179084Srdivacky tests[5].tests[0].params[4].i = 0; 371179084Srdivacky tests[5].tests[1].result = EBADF; 372179084Srdivacky tests[5].tests[1].params[0].i = AT_FDCWD; 373179084Srdivacky tests[5].tests[1].params[1].cp = relative_file; 374179084Srdivacky tests[5].tests[1].params[2].i = 106; /* invalid fd */ 375179084Srdivacky tests[5].tests[1].params[3].cp = newlink; 376179084Srdivacky tests[5].tests[1].params[4].i = 0; 377179084Srdivacky tests[5].tests[2].result = EINVAL; 378179084Srdivacky tests[5].tests[2].params[0].i = rel_fd; 379179084Srdivacky tests[5].tests[2].params[1].cp = relative_file; 380179084Srdivacky tests[5].tests[2].params[2].i = AT_FDCWD; 381179084Srdivacky tests[5].tests[2].params[3].cp = newlink; 382179084Srdivacky tests[5].tests[2].params[4].i = 123; /* invalid flag */ 383179084Srdivacky tests[5].tests[3].result = ENOTDIR; 384179084Srdivacky tests[5].tests[3].params[0].i = notd_fd; 385179084Srdivacky tests[5].tests[3].params[1].cp = relative_file; 386179084Srdivacky tests[5].tests[3].params[2].i = AT_FDCWD; 387179084Srdivacky tests[5].tests[3].params[3].cp = newlink; 388179084Srdivacky tests[5].tests[3].params[4].i = 0; 389179084Srdivacky tests[5].tests[4].result = 0; 390179084Srdivacky tests[5].tests[4].params[0].i = rel_fd; 391179084Srdivacky tests[5].tests[4].params[1].cp = file; 392179084Srdivacky tests[5].tests[4].params[2].i = rel_fd; 393179084Srdivacky tests[5].tests[4].params[3].cp = newlink; 394179084Srdivacky tests[5].tests[4].params[4].i = 0; 395179084Srdivacky tests[5].tests[5].result = 0; 396179084Srdivacky tests[5].tests[5].params[0].i = AT_FDCWD; 397179084Srdivacky tests[5].tests[5].params[1].cp = symlinkf; 398179084Srdivacky tests[5].tests[5].params[2].i = rel_fd; 399179084Srdivacky tests[5].tests[5].params[3].cp = newlink2; 400179084Srdivacky tests[5].tests[5].params[4].i = 0; 401179084Srdivacky tests[5].tests[6].result = 0; 402179084Srdivacky tests[5].tests[6].params[0].i = AT_FDCWD; 403179084Srdivacky tests[5].tests[6].params[1].cp = symlinkf; 404179084Srdivacky tests[5].tests[6].params[2].i = rel_fd; 405179084Srdivacky tests[5].tests[6].params[3].cp = newlink3; 406179084Srdivacky tests[5].tests[6].params[4].i = AT_SYMLINK_FOLLOW; 407179084Srdivacky 408179084Srdivacky /* mkdirat */ 409179084Srdivacky tests[6].syscall = SYS_mkdirat; 410179084Srdivacky tests[6].num_of_cases = 3; 411179084Srdivacky tests[6].name = "mkdirat"; 412179084Srdivacky tests[6].tests[0].result = EBADF; 413179084Srdivacky tests[6].tests[0].params[0].i = 106; /* invalid fd */ 414179084Srdivacky tests[6].tests[0].params[1].cp = relative_file; 415179084Srdivacky tests[6].tests[0].params[2].m = 33190; 416179084Srdivacky tests[6].tests[1].result = ENOTDIR; 417179084Srdivacky tests[6].tests[1].params[0].i = notd_fd; 418179084Srdivacky tests[6].tests[1].params[1].cp = relative_file; 419179084Srdivacky tests[6].tests[1].params[2].m = 33190; 420179084Srdivacky tests[6].tests[2].result = 0; 421179084Srdivacky tests[6].tests[2].params[0].i = rel_fd; 422179084Srdivacky tests[6].tests[2].params[1].cp = newdir; 423179084Srdivacky tests[6].tests[2].params[2].m = 33190; 424179084Srdivacky 425179084Srdivacky /* mkfifoat */ 426179084Srdivacky tests[7].syscall = SYS_mkfifoat; 427179084Srdivacky tests[7].num_of_cases = 3; 428179084Srdivacky tests[7].name = "mkfifoat"; 429179084Srdivacky tests[7].tests[0].result = EBADF; 430179084Srdivacky tests[7].tests[0].params[0].i = 107; /* invalid fd */ 431179084Srdivacky tests[7].tests[0].params[1].cp = relative_file; 432179084Srdivacky tests[7].tests[0].params[2].m = 33190; 433179084Srdivacky tests[7].tests[1].result = ENOTDIR; 434179084Srdivacky tests[7].tests[1].params[0].i = notd_fd; 435179084Srdivacky tests[7].tests[1].params[1].cp = relative_file; 436179084Srdivacky tests[7].tests[1].params[2].m = 33190; 437179084Srdivacky tests[7].tests[2].result = 0; 438179084Srdivacky tests[7].tests[2].params[0].i = rel_fd; 439179084Srdivacky tests[7].tests[2].params[1].cp = fifo; 440179084Srdivacky tests[7].tests[2].params[2].m = 33190; 441179084Srdivacky 442179084Srdivacky /* mknodat */ 443179084Srdivacky tests[8].syscall = SYS_mknodat; 444179084Srdivacky tests[8].num_of_cases = 3; 445179084Srdivacky tests[8].name = "mknodat"; 446179084Srdivacky tests[8].tests[0].result = EBADF; 447179084Srdivacky tests[8].tests[0].params[0].i = 108; /* invalid fd */ 448179084Srdivacky tests[8].tests[0].params[1].cp = relative_file; 449179084Srdivacky tests[8].tests[0].params[2].m = 0666 | S_IFCHR; 450179084Srdivacky tests[8].tests[0].params[3].d = 15; 451179084Srdivacky tests[8].tests[1].result = ENOTDIR; 452179084Srdivacky tests[8].tests[1].params[0].i = notd_fd; 453179084Srdivacky tests[8].tests[1].params[1].cp = relative_file; 454179084Srdivacky tests[8].tests[1].params[2].m = 0666 | S_IFCHR; 455179084Srdivacky tests[8].tests[1].params[3].d = 15; 456179084Srdivacky tests[8].tests[2].result = 0; 457179084Srdivacky tests[8].tests[2].params[0].i = rel_fd; 458179084Srdivacky tests[8].tests[2].params[1].cp = nod; 459179084Srdivacky tests[8].tests[2].params[2].m = 0666 | S_IFCHR; 460179084Srdivacky tests[8].tests[2].params[3].d = 2570; 461179084Srdivacky 462179084Srdivacky /* openat */ 463179084Srdivacky tests[9].syscall = SYS_openat; 464179084Srdivacky tests[9].num_of_cases = 5; 465179084Srdivacky tests[9].name = "openat"; 466179084Srdivacky tests[9].tests[0].result = EBADF; 467179084Srdivacky tests[9].tests[0].params[0].i = 106; /* invalid fd */ 468179084Srdivacky tests[9].tests[0].params[1].cp = relative_file; 469179084Srdivacky tests[9].tests[0].params[2].i = O_RDONLY; 470179084Srdivacky tests[9].tests[0].params[3].i = 0666; 471179084Srdivacky tests[9].tests[1].result = ENOTDIR; 472179084Srdivacky tests[9].tests[1].params[0].i = notd_fd; 473179084Srdivacky tests[9].tests[1].params[1].cp = relative_file; 474179084Srdivacky tests[9].tests[1].params[2].i = O_RDONLY; 475179084Srdivacky tests[9].tests[1].params[3].i = 0666; 476179084Srdivacky tests[9].tests[2].result = 8; /* hardcoded fd */ 477179084Srdivacky tests[9].tests[2].params[0].i = rel_fd; 478179084Srdivacky tests[9].tests[2].params[1].cp = file; 479179084Srdivacky tests[9].tests[2].params[2].i = O_RDONLY; 480179084Srdivacky tests[9].tests[2].params[3].i = 0400; 481179084Srdivacky tests[9].tests[3].result = 9; /* hardcoded fd */ 482179084Srdivacky tests[9].tests[3].params[0].i = notd_fd; 483179084Srdivacky tests[9].tests[3].params[1].cp = absolute_file; 484179084Srdivacky tests[9].tests[3].params[2].i = O_RDONLY; 485179084Srdivacky tests[9].tests[3].params[3].i = 0400; 486179084Srdivacky tests[9].tests[4].result = 10; /* hardcoded fd */ 487179084Srdivacky tests[9].tests[4].params[0].i = rel_fd; 488179084Srdivacky tests[9].tests[4].params[1].cp = newfile; 489179084Srdivacky tests[9].tests[4].params[2].i = O_RDONLY | O_CREAT; 490179084Srdivacky tests[9].tests[4].params[3].i = 0666; 491179084Srdivacky 492179084Srdivacky /* readlinkat */ 493179084Srdivacky tests[10].syscall = SYS_readlinkat; 494179084Srdivacky tests[10].num_of_cases = 3; 495179084Srdivacky tests[10].name = "readlinkat"; 496179084Srdivacky tests[10].tests[0].result = EBADF; 497179084Srdivacky tests[10].tests[0].params[0].i = 106; /* invalid fd */ 498179084Srdivacky tests[10].tests[0].params[1].cp = relative_file; 499179084Srdivacky tests[10].tests[0].params[2].vp = cbuf; 500179084Srdivacky tests[10].tests[0].params[3].i = PATH_MAX; 501179084Srdivacky tests[10].tests[1].result = ENOTDIR; 502179084Srdivacky tests[10].tests[1].params[0].i = notd_fd; 503179084Srdivacky tests[10].tests[1].params[1].cp = relative_file; 504179084Srdivacky tests[10].tests[1].params[2].vp = cbuf; 505179084Srdivacky tests[10].tests[1].params[3].i = PATH_MAX; 506179084Srdivacky tests[10].tests[2].result = strlen(absolute_file); 507179084Srdivacky tests[10].tests[2].params[0].i = AT_FDCWD; 508179084Srdivacky tests[10].tests[2].params[1].cp = symlinkf; 509179084Srdivacky tests[10].tests[2].params[2].vp = cbuf; 510179084Srdivacky tests[10].tests[2].params[3].i = PATH_MAX; 511179084Srdivacky 512179084Srdivacky /* renameat */ 513179084Srdivacky tests[11].syscall = SYS_renameat; 514179084Srdivacky tests[11].num_of_cases = 5; 515179084Srdivacky tests[11].name = "renameat"; 516179084Srdivacky tests[11].tests[0].result = EBADF; 517179084Srdivacky tests[11].tests[0].params[0].i = 106; /* invalid fd */ 518179084Srdivacky tests[11].tests[0].params[1].cp = file; 519179084Srdivacky tests[11].tests[0].params[2].i = rel_fd; 520179084Srdivacky tests[11].tests[0].params[3].cp = file; 521179084Srdivacky tests[11].tests[1].result = EBADF; 522179084Srdivacky tests[11].tests[1].params[0].i = rel_fd; 523179084Srdivacky tests[11].tests[1].params[1].cp = file; 524179084Srdivacky tests[11].tests[1].params[2].i = 106; /* invalid fd */ 525179084Srdivacky tests[11].tests[1].params[3].cp = file; 526179084Srdivacky tests[11].tests[2].result = ENOTDIR; 527179084Srdivacky tests[11].tests[2].params[0].i = notd_fd; 528179084Srdivacky tests[11].tests[2].params[1].cp = relative_file; 529179084Srdivacky tests[11].tests[2].params[2].i = rel_fd; 530179084Srdivacky tests[11].tests[2].params[3].cp = file; 531179084Srdivacky tests[11].tests[3].result = ENOTDIR; 532179084Srdivacky tests[11].tests[3].params[0].i = rel_fd; 533179084Srdivacky tests[11].tests[3].params[1].cp = file; 534179084Srdivacky tests[11].tests[3].params[2].i = notd_fd; 535179084Srdivacky tests[11].tests[3].params[3].cp = relative_file; 536179084Srdivacky tests[11].tests[4].result = 0; 537179084Srdivacky tests[11].tests[4].params[0].i = rel_fd; 538179084Srdivacky tests[11].tests[4].params[1].cp = newfile; 539179084Srdivacky tests[11].tests[4].params[2].i = AT_FDCWD; 540179084Srdivacky tests[11].tests[4].params[3].cp = newfile; 541179084Srdivacky 542179084Srdivacky /* symlinkat */ 543179084Srdivacky tests[12].syscall = SYS_symlinkat; 544179084Srdivacky tests[12].num_of_cases = 3; 545179084Srdivacky tests[12].name = "symlinkat"; 546179084Srdivacky tests[12].tests[0].result = EBADF; 547179084Srdivacky tests[12].tests[0].params[0].cp = file; 548179084Srdivacky tests[12].tests[0].params[1].i = 106; /* invalid fd */ 549179084Srdivacky tests[12].tests[0].params[2].cp = file; 550179084Srdivacky tests[12].tests[1].result = ENOTDIR; 551179084Srdivacky tests[12].tests[1].params[0].cp = file; 552179084Srdivacky tests[12].tests[1].params[1].i = notd_fd; 553179084Srdivacky tests[12].tests[1].params[2].cp = relative_file; 554179084Srdivacky tests[12].tests[2].result = 0; 555179084Srdivacky tests[12].tests[2].params[0].cp = absolute_file; 556179084Srdivacky tests[12].tests[2].params[1].i = rel_fd; 557179084Srdivacky tests[12].tests[2].params[2].cp = newslink; 558179084Srdivacky 559179084Srdivacky 560179084Srdivacky /* unlinkat */ 561179084Srdivacky tests[13].syscall = SYS_unlinkat; 562179084Srdivacky tests[13].num_of_cases = 7; 563179084Srdivacky tests[13].name = "unlinkat"; 564179084Srdivacky tests[13].tests[0].result = EBADF; 565179084Srdivacky tests[13].tests[0].params[0].i = 106; /* invalid fd */ 566179084Srdivacky tests[13].tests[0].params[1].cp = relative_file; 567179084Srdivacky tests[13].tests[0].params[2].i = 0; 568179084Srdivacky tests[13].tests[1].result = ENOTDIR; 569179084Srdivacky tests[13].tests[1].params[0].i = notd_fd; 570179084Srdivacky tests[13].tests[1].params[1].cp = relative_file; 571179084Srdivacky tests[13].tests[1].params[2].i = 0; 572179084Srdivacky tests[13].tests[2].result = EINVAL; 573179084Srdivacky tests[13].tests[2].params[0].i = rel_fd; 574179084Srdivacky tests[13].tests[2].params[1].cp = file; 575179084Srdivacky tests[13].tests[2].params[2].i = 123; /* invalid flag */ 576179084Srdivacky tests[13].tests[3].result = ENOTDIR; 577179084Srdivacky tests[13].tests[3].params[0].i = rel_fd; 578179084Srdivacky tests[13].tests[3].params[1].cp = not_dir_path; 579179084Srdivacky tests[13].tests[3].params[2].i = AT_REMOVEDIR; 580179084Srdivacky tests[13].tests[4].result = ENOTEMPTY; 581179084Srdivacky tests[13].tests[4].params[0].i = AT_FDCWD; 582179084Srdivacky tests[13].tests[4].params[1].cp = relative_path; 583179084Srdivacky tests[13].tests[4].params[2].i = AT_REMOVEDIR; 584179084Srdivacky tests[13].tests[5].result = 0; 585179084Srdivacky tests[13].tests[5].params[0].i = rel_fd; 586179084Srdivacky tests[13].tests[5].params[1].cp = newdir; 587179084Srdivacky tests[13].tests[5].params[2].i = AT_REMOVEDIR; 588179084Srdivacky tests[13].tests[6].result = 0; 589179084Srdivacky tests[13].tests[6].params[0].i = AT_FDCWD; 590179084Srdivacky tests[13].tests[6].params[1].cp = newfile; 591179084Srdivacky tests[13].tests[6].params[2].i = 0; 592179084Srdivacky 593179084Srdivacky 594179084Srdivacky /* fexecve */ 595179084Srdivacky tests[14].syscall = SYS_fexecve; 596179084Srdivacky tests[14].num_of_cases = 2; 597179084Srdivacky tests[14].name = "fexecve"; 598179084Srdivacky tests[14].tests[0].result = EBADF; 599179084Srdivacky tests[14].tests[0].params[0].i = 106; /* invalid fd */ 600179084Srdivacky tests[14].tests[0].params[1].cpp = pargv; 601179084Srdivacky tests[14].tests[0].params[2].cpp = NULL; 602179084Srdivacky /* This is EXPECTED to execve /bin/date, so dont expect OK output */ 603179084Srdivacky tests[14].tests[1].result = 0; 604179084Srdivacky tests[14].tests[1].params[0].i = exec_fd; 605179084Srdivacky tests[14].tests[1].params[1].cpp = pargv; 606179084Srdivacky tests[14].tests[1].params[2].cpp = NULL; 607179084Srdivacky} 608179084Srdivacky 609179084Srdivackyvoid 610179084Srdivackycleanup() 611179084Srdivacky{ 612179084Srdivacky system("/bin/sh -c 'rm -rf tmp'"); 613179084Srdivacky} 614179084Srdivacky 615179084Srdivackyvoid 616179084Srdivackysetup_once() 617179084Srdivacky{ 618179084Srdivacky} 619179084Srdivacky 620179084Srdivackyint 621179084Srdivackymain(int argc, char *argv[]) 622179084Srdivacky{ 623179084Srdivacky int i,j; 624179084Srdivacky int error; 625179084Srdivacky 626179084Srdivacky setup(); 627179084Srdivacky 628179084Srdivacky for (i = 0; i < NUM_OF_TESTS; i++) { 629179084Srdivacky printf("\nTest: %s\n", tests[i].name); 630179084Srdivacky for (j = 0; j < tests[i].num_of_cases; j++) { 631179084Srdivacky error = syscall(tests[i].syscall, 632179084Srdivacky tests[i].tests[j].params[0], 633179084Srdivacky tests[i].tests[j].params[1], 634179084Srdivacky tests[i].tests[j].params[2], 635179084Srdivacky tests[i].tests[j].params[3], 636179084Srdivacky tests[i].tests[j].params[4]); 637179084Srdivacky if (error == 0) { 638179084Srdivacky if (tests[i].tests[j].result == 0) 639179084Srdivacky printf("#%i ... OK\n", j); 640179084Srdivacky else { 641179084Srdivacky printf("#%i ... BAD: ", j); 642179084Srdivacky printf("expected %i, but got %i\n", tests[i].tests[j].result, error); 643179084Srdivacky } 644179084Srdivacky } else { 645179084Srdivacky if (tests[i].tests[j].result == errno) 646179084Srdivacky printf("#%i ... OK\n", j); 647179084Srdivacky else { 648179084Srdivacky if (error != tests[i].tests[j].result) { 649179084Srdivacky printf("#%i ... BAD: ", j); 650179084Srdivacky printf("expected %i, but got %i\n", tests[i].tests[j].result, error); 651179084Srdivacky } else 652179084Srdivacky printf("#%i ... OK\n", j); 653179084Srdivacky } 654179084Srdivacky } 655179084Srdivacky 656179084Srdivacky 657179084Srdivacky } 658179084Srdivacky } 659179084Srdivacky 660179084Srdivacky cleanup(); 661179084Srdivacky 662179084Srdivacky 663179084Srdivacky return (0); 664179084Srdivacky} 665