1 /* 2 * 3 * Copyright (c) International Business Machines Corp., 2001 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 13 * the GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 18 */ 19 20 /* 21 * Test Description: 22 * Verify that access() succeeds to check the existance of a file if 23 * search access is permitted on the pathname of the specified file. 24 * 25 * 07/2001 Ported by Wayne Boyer 26 */ 27 28 #include <stdio.h> 29 #include <unistd.h> 30 #include <sys/types.h> 31 #include <errno.h> 32 #include <fcntl.h> 33 #include <string.h> 34 #include <signal.h> 35 #include <sys/stat.h> 36 #include <pwd.h> 37 38 #include "test.h" 39 40 #define TESTDIR "testdir" 41 #define TESTFILE "testdir/testfile" 42 #define DIR_MODE (S_IRWXU | S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP) 43 #define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) 44 45 char *TCID = "access04"; 46 int TST_TOTAL = 1; 47 48 static const char nobody_uid[] = "nobody"; 49 static struct passwd *ltpuser; 50 51 static void setup(void); 52 static void cleanup(void); 53 54 int main(int ac, char **av) 55 { 56 struct stat stat_buf; 57 int lc; 58 59 tst_parse_opts(ac, av, NULL, NULL); 60 61 setup(); 62 63 for (lc = 0; TEST_LOOPING(lc); lc++) { 64 tst_count = 0; 65 66 TEST(access(TESTFILE, F_OK)); 67 68 if (TEST_RETURN == -1) { 69 tst_resm(TFAIL | TTERRNO, "access(%s, F_OK) failed", 70 TESTFILE); 71 continue; 72 } 73 74 if (stat(TESTFILE, &stat_buf) < 0) { 75 tst_resm(TFAIL | TERRNO, "stat(%s) failed", 76 TESTFILE); 77 } else { 78 tst_resm(TPASS, "functionality of " 79 "access(%s, F_OK) ok", TESTFILE); 80 } 81 } 82 83 cleanup(); 84 tst_exit(); 85 } 86 87 static void setup(void) 88 { 89 int fd; 90 91 tst_sig(NOFORK, DEF_HANDLER, cleanup); 92 tst_require_root(); 93 94 ltpuser = getpwnam(nobody_uid); 95 if (ltpuser == NULL) 96 tst_brkm(TBROK | TERRNO, NULL, "getpwnam failed"); 97 98 if (setuid(ltpuser->pw_uid) == -1) 99 tst_brkm(TINFO | TERRNO, NULL, "setuid failed"); 100 101 TEST_PAUSE; 102 tst_tmpdir(); 103 104 if (mkdir(TESTDIR, DIR_MODE) < 0) 105 tst_brkm(TBROK | TERRNO, cleanup, "mkdir(%s, %#o) failed", 106 TESTDIR, DIR_MODE); 107 108 if (chmod(TESTDIR, DIR_MODE) < 0) 109 tst_brkm(TBROK | TERRNO, cleanup, "chmod(%s, %#o) failed", 110 TESTDIR, DIR_MODE); 111 112 fd = open(TESTFILE, O_RDWR | O_CREAT, FILE_MODE); 113 if (fd == -1) 114 tst_brkm(TBROK | TERRNO, cleanup, 115 "open(%s, O_RDWR|O_CREAT, %#o) failed", 116 TESTFILE, FILE_MODE); 117 118 if (close(fd) == -1) 119 tst_brkm(TBROK | TERRNO, cleanup, "close(%s) failed", TESTFILE); 120 121 if (chmod(TESTFILE, 0) < 0) 122 tst_brkm(TBROK | TERRNO, cleanup, 123 "chmod(%s, 0) failed", TESTFILE); 124 } 125 126 static void cleanup(void) 127 { 128 tst_rmdir(); 129 } 130