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 Name: chown05
22 *
23 * Test Description:
24 * Verify that, chown(2) succeeds to change the owner and group of a file
25 * specified by path to any numeric owner(uid)/group(gid) values when invoked
26 * by super-user.
27 *
28 * Expected Result:
29 * chown(2) should return 0 and the ownership set on the file should match
30 * the numeric values contained in owner and group respectively.
31 *
32 * Algorithm:
33 * Setup:
34 * Setup signal handling.
35 * Create temporary directory.
36 * Pause for SIGUSR1 if option specified.
37 *
38 * Test:
39 * Loop if the proper options are given.
40 * Execute system call
41 * Check return code, if system call failed (return=-1)
42 * Log the errno and Issue a FAIL message.
43 * Otherwise,
44 * Verify the Functionality of system call
45 * if successful,
46 * Issue Functionality-Pass message.
47 * Otherwise,
48 * Issue Functionality-Fail message.
49 * Cleanup:
50 * Print errno log and/or timing stats if options given
51 * Delete the temporary directory created.
52 *
53 * Usage: <for command-line>
54 * chown05 [-c n] [-e] [-f] [-i n] [-I x] [-P x] [-t]
55 * where, -c n : Run n copies concurrently.
56 * -e : Turn on errno logging.
57 * -f : Turn off functionality Testing.
58 * -i n : Execute test n times.
59 * -I x : Execute test for x seconds.
60 * -P x : Pause for x seconds between iterations.
61 * -t : Turn on syscall timing.
62 *
63 * HISTORY
64 * 07/2001 Ported by Wayne Boyer
65 *
66 * RESTRICTIONS:
67 * This test should be run by 'super-user' (root) only.
68 */
69
70 #include <stdio.h>
71 #include <sys/types.h>
72 #include <sys/stat.h>
73 #include <fcntl.h>
74 #include <errno.h>
75 #include <string.h>
76 #include <signal.h>
77
78 #include "test.h"
79 #include "safe_macros.h"
80 #include "compat_16.h"
81
82 #define FILE_MODE (S_IFREG|S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)
83 #define TESTFILE "testfile"
84
85 TCID_DEFINE(chown05);
86
87 struct test_case_t {
88 uid_t user_id;
89 gid_t group_id;
90 } test_cases[] = {
91 {
92 700, 701}, {
93 702, -1}, {
94 703, 701}, {
95 -1, 704}, {
96 703, 705},};
97
98 int TST_TOTAL = ARRAY_SIZE(test_cases);
99
100 void setup(); /* setup function for the test */
101 void cleanup(); /* cleanup function for the test */
102
main(int ac,char ** av)103 int main(int ac, char **av)
104 {
105 struct stat stat_buf; /* stat(2) struct contents */
106 int lc;
107 int i;
108 uid_t user_id; /* user id of the user set for testfile */
109 gid_t group_id; /* group id of the user set for testfile */
110
111 tst_parse_opts(ac, av, NULL, NULL);
112
113 setup();
114
115 for (lc = 0; TEST_LOOPING(lc); lc++) {
116
117 tst_count = 0;
118
119 for (i = 0; i < TST_TOTAL; i++) {
120 user_id = test_cases[i].user_id;
121 group_id = test_cases[i].group_id;
122
123 TEST(CHOWN(cleanup, TESTFILE, user_id, group_id));
124
125 if (TEST_RETURN == -1) {
126 tst_resm(TFAIL | TTERRNO, "chown failed");
127 continue;
128 }
129 if (stat(TESTFILE, &stat_buf) == -1)
130 tst_brkm(TFAIL, cleanup, "stat failed");
131 if (user_id == -1)
132 user_id = test_cases[i - 1].user_id;
133 if (group_id == -1)
134 group_id = test_cases[i - 1].group_id;
135
136 if (stat_buf.st_uid != user_id ||
137 stat_buf.st_gid != group_id)
138 tst_resm(TFAIL, "%s: incorrect "
139 "ownership set, Expected %d "
140 "%d", TESTFILE, user_id,
141 group_id);
142 else
143 tst_resm(TPASS, "chown succeeded");
144 }
145 }
146
147 cleanup();
148 tst_exit();
149 }
150
setup(void)151 void setup(void)
152 {
153 int fd;
154
155 tst_sig(NOFORK, DEF_HANDLER, cleanup);
156
157 tst_require_root();
158
159 TEST_PAUSE;
160
161 tst_tmpdir();
162
163 if ((fd = open(TESTFILE, O_RDWR | O_CREAT, FILE_MODE)) == -1)
164 tst_brkm(TBROK | TERRNO, cleanup, "opening %s failed",
165 TESTFILE);
166 SAFE_CLOSE(cleanup, fd);
167
168 }
169
cleanup(void)170 void cleanup(void)
171 {
172 tst_rmdir();
173 }
174