1 /* 2 * Copyright (c) Wipro Technologies Ltd, 2002. All Rights Reserved. 3 * 4 * This program is free software; you can redistribute it and/or modify it 5 * under the terms of version 2 of the GNU General Public License as 6 * published by the Free Software Foundation. 7 * 8 * This program is distributed in the hope that it would be useful, but 9 * WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 11 * 12 * You should have received a copy of the GNU General Public License along 13 * with this program; if not, write the Free Software Foundation, Inc., 14 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 15 * 16 */ 17 /************************************************************************** 18 * 19 * TEST IDENTIFIER : reboot02 20 * 21 * 22 * EXECUTED BY : root / superuser 23 * 24 * TEST TITLE : Test checking for basic error conditions 25 * for reboot(2) 26 * 27 * TEST CASE TOTAL : 2 28 * 29 * AUTHOR : Aniruddha Marathe <aniruddha.marathe (at) wipro.com> 30 * 31 * SIGNALS 32 * Uses SIGUSR1 to pause before test if option set. 33 * (See the parse_opts(3) man page). 34 * 35 * DESCRIPTION 36 * This test case checks whether reboot(2) system call returns 37 * appropriate error number for invalid 38 * flag parameter or invalid user. 39 * 40 * Setup: 41 * Setup signal handling. 42 * Pause for SIGUSR1 if option specified. 43 * For testing error on invalid user, change the effective uid 44 * 45 * Test: 46 * Loop if the proper options are given. 47 * Execute system call with invaid flag parameter 48 * and then for invalid user 49 * Check return code, if system call fails with errno == expected errno 50 * Issue syscall passed with expected errno 51 * Otherwise, 52 * Issue syscall failed to produce expected errno 53 * 54 * Cleanup: 55 * Do cleanup for the test. 56 * $ 57 * USAGE: <for command-line> 58 * reboot02 [-c n] [-e] [-i n] [-I x] [-p x] [-t] [-h] [-f] [-p] 59 * where 60 * -c n: run n copies simultaneously 61 * -e : Turn on errno logging. 62 * -i n : Execute test n times. 63 * -I x : Execute test for x seconds. 64 * -p : Pause for SIGUSR1 before starting 65 * -P x : Pause for x seconds between iterations. 66 * -t : Turn on syscall timing. 67 * 68 *RESTRICTIONS: 69 *for lib4 and lib5 reboot(2) system call is implemented as 70 *int reboot(int magic, int magic2, int flag, void *arg); This test case 71 *is written for int reboot(int flag); which is implemented under glibc 72 *Therefore this testcase may not work under libc4 and libc5 libraries 73 *****************************************************************************/ 74 75 #include <unistd.h> 76 #include <sys/reboot.h> 77 #include <errno.h> 78 #include <linux/reboot.h> 79 #include <pwd.h> 80 #include "test.h" 81 82 #define INVALID_PARAMETER 100 83 84 static void setup(); 85 static void cleanup(); 86 static int setup_test(); 87 88 char *TCID = "reboot02"; 89 int TST_TOTAL = 2; 90 char nobody_uid[] = "nobody"; 91 struct passwd *ltpuser; 92 93 static struct test_case_t { 94 char *err_desc; /*error description */ 95 int exp_errno; /* expected error number */ 96 char *exp_errval; /*Expected errorvalue string */ 97 } testcase[] = { 98 { 99 "Invalid flag", EINVAL, "EINVAL"}, { 100 "Permission denied", EPERM, "EPERM "} 101 }; 102 103 int main(int ac, char **av) 104 { 105 106 int lc, i; 107 108 tst_parse_opts(ac, av, NULL, NULL); 109 110 setup(); 111 112 for (lc = 0; TEST_LOOPING(lc); lc++) { 113 114 for (i = 0; i < TST_TOTAL; i++) { 115 116 tst_count = 0; 117 if (i == 0) { 118 TEST(reboot(INVALID_PARAMETER)); 119 } else { 120 /*change the user to nobody */ 121 if (setup_test() == 0) { 122 TEST(reboot(LINUX_REBOOT_CMD_CAD_ON)); 123 /* Set effective user id back to root */ 124 if (seteuid(0) == -1) { 125 tst_brkm(TBROK, cleanup, 126 "seteuid failed to " 127 "set the effective uid" 128 " to root"); 129 perror("seteuid"); 130 } 131 } else { 132 tst_resm(TWARN, "skipping the test"); 133 continue; 134 } 135 } 136 /* check return code */ 137 if ((TEST_RETURN == -1) 138 && (TEST_ERRNO == testcase[i].exp_errno)) { 139 tst_resm(TPASS, 140 "reboot(2) expected failure;" 141 " Got errno - %s : %s", 142 testcase[i].exp_errval, 143 testcase[i].err_desc); 144 } else { 145 tst_resm(TFAIL, "reboot(2) failed to produce" 146 " expected error; %d, errno" 147 ": %s and got %d", 148 testcase[i].exp_errno, 149 testcase[i].exp_errval, TEST_ERRNO); 150 } 151 } /*End of TEST LOOPS */ 152 } 153 154 /*Clean up and exit */ 155 cleanup(); 156 157 tst_exit(); 158 } /*End of main */ 159 160 /* 161 * setup_test() - This function sets the user as nobdy 162 */ 163 int setup_test(void) 164 { 165 if ((ltpuser = getpwnam(nobody_uid)) == NULL) { 166 tst_resm(TWARN, "\"nobody\" user not present. skipping test"); 167 return -1; 168 } 169 if (seteuid(ltpuser->pw_uid) == -1) { 170 tst_resm(TWARN, "seteuid failed to " 171 "to set the effective uid to %d", ltpuser->pw_uid); 172 perror("seteuid"); 173 return -1; 174 } 175 return 0; 176 } 177 178 /* setup() - performs all ONE TIME setup for this test */ 179 void setup(void) 180 { 181 tst_require_root(); 182 183 tst_sig(NOFORK, DEF_HANDLER, cleanup); 184 185 TEST_PAUSE; 186 187 } 188 189 /* 190 * cleanup() - Performs one time cleanup for this test at 191 * completion or premature exit 192 */ 193 void cleanup(void) 194 { 195 196 } 197