1 /*- 2 * Copyright (c) 2008 Peter Holm <pho@FreeBSD.org> 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 */ 27 28 #include <unistd.h> 29 #include <stdio.h> 30 #include <stdlib.h> 31 #include <fcntl.h> 32 #include <string.h> 33 #include <sys/stat.h> 34 #include <sys/param.h> 35 #include <err.h> 36 37 #include "stress.h" 38 39 static char path1[128]; 40 static char path2[] = "tmp"; 41 42 static char rpath[128]; 43 static char apath[128]; 44 45 static int fd; 46 47 int 48 setup(int nb) 49 { 50 umask(0); 51 52 sprintf(path1,"%s.%05d", getprogname(), getpid()); 53 if (mkdir(path1, 0770) < 0) 54 err(1, "mkdir(%s), %s:%d", path1, __FILE__, __LINE__); 55 if (chdir(path1) == -1) 56 err(1, "chdir(%s), %s:%d", path2, __FILE__, __LINE__); 57 58 if (mkdir(path2, 0770) < 0) 59 err(1, "mkdir(%s), %s:%d", path2, __FILE__, __LINE__); 60 if (chdir(path2) == -1) 61 err(1, "chdir(%s), %s:%d", path2, __FILE__, __LINE__); 62 if (getcwd(apath, sizeof(apath)) == NULL) 63 err(1, "getcwd(%s), %s:%d", path2, __FILE__, __LINE__); 64 65 if (chdir("..") == -1) 66 err(1, "chdir(%s), %s:%d", path1, __FILE__, __LINE__); 67 68 if ((fd = open(path2, O_RDONLY)) == -1) 69 err(1, "open(%s), %s:%d", path2, __FILE__, __LINE__); 70 71 strcpy(rpath, "tmp"); 72 return (0); 73 } 74 75 void 76 cleanup(void) 77 { 78 #if 1 79 if (rmdir(path2) == -1) 80 warn("rmdir(%s), %s:%d", path2, __FILE__, __LINE__); 81 (void)chdir(".."); 82 if (rmdir(path1) == -1) 83 warn("rmdir(%s), %s:%d", path1, __FILE__, __LINE__); 84 #endif 85 } 86 87 static void 88 test_openat(void) 89 { 90 int i; 91 pid_t pid; 92 char file[128]; 93 char p[128]; 94 int tfd; 95 96 pid = getpid(); 97 for (i = 0; i < 100; i++) { 98 sprintf(file,"p%05d.%05d", pid, i); 99 if ((tfd = openat(fd, file, O_RDONLY|O_CREAT, 0660)) == -1) 100 err(1, "openat(%s), %s:%d", file, __FILE__, __LINE__); 101 close(tfd); 102 strcpy(p, "tmp/"); 103 strcat(p, file); 104 if (unlink(p) == -1) 105 err(1, "unlink(%s), %s:%d", p, __FILE__, __LINE__); 106 } 107 } 108 109 static void 110 test_renameat(void) 111 { 112 int i; 113 pid_t pid; 114 char file[128]; 115 char file2[128]; 116 int tfd; 117 118 pid = getpid(); 119 for (i = 0; i < 100; i++) { 120 sprintf(file,"p%05d.%05d", pid, i); 121 if ((tfd = openat(fd, file, O_RDONLY|O_CREAT, 0660)) == -1) 122 err(1, "openat(%s), %s:%d", file, __FILE__, __LINE__); 123 close(tfd); 124 125 sprintf(file2,"p%05d.%05d.togo", pid, i); 126 if (renameat(fd, file, fd, file2) == -1) 127 err(1, "renameat(%s)", file2); 128 129 sprintf(file2,"tmp/p%05d.%05d.togo", pid, i); 130 if (unlink(file2) == -1) 131 err(1, "unlink(%s), %s:%d", file2, __FILE__, __LINE__); 132 } 133 } 134 135 static void 136 test_unlinkat(void) 137 { 138 int i; 139 pid_t pid; 140 char file[128]; 141 int tfd; 142 143 pid = getpid(); 144 for (i = 0; i < 100; i++) { 145 sprintf(file,"p%05d.%05d", pid, i); 146 if ((tfd = openat(fd, file, O_RDONLY|O_CREAT, 0660)) == -1) 147 err(1, "openat(%s), %s:%d", file, __FILE__, __LINE__); 148 close(tfd); 149 if (unlinkat(fd, file, 0) == -1) 150 err(1, "unlinkat(%s), %s:%d", file, __FILE__, __LINE__); 151 } 152 } 153 154 int 155 test(void) 156 { 157 test_openat(); 158 test_renameat(); 159 test_unlinkat(); 160 161 return (0); 162 } 163