1 /*
2 *
3 * Copyright (c) International Business Machines Corp., 2002
4 * ported from SPIE, section2/iosuite/dup3.c, by Airong Zhang
5 * Copyright (c) 2013 Cyril Hrubis <chrubis@suse.cz>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
15 * the GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 /*
23 WHAT: Is the access mode the same for both file descriptors?
24 0: read only?
25 1: write only?
26 2: read/write?
27 HOW: Creat a file with each access mode; dup each file descriptor;
28 stat each file descriptor and compare mode of each pair
29 */
30
31 #include <stdio.h>
32 #include <fcntl.h>
33 #include <sys/types.h>
34 #include <sys/stat.h>
35 #include <sys/types.h>
36 #include <sys/stat.h>
37 #include "test.h"
38
39 char *TCID = "dup07";
40 int TST_TOTAL = 3;
41
42 static const char *testfile = "dup07";
43
44 static void setup(void);
45 static void cleanup(void);
46
main(int ac,char ** av)47 int main(int ac, char **av)
48 {
49 struct stat retbuf;
50 struct stat dupbuf;
51 int rdoret, wroret, rdwret;
52 int duprdo, dupwro, duprdwr;
53
54 int lc;
55
56 tst_parse_opts(ac, av, NULL, NULL);
57
58 setup();
59
60 for (lc = 0; TEST_LOOPING(lc); lc++) {
61
62 if ((rdoret = creat(testfile, 0444)) == -1) {
63 tst_resm(TFAIL, "Unable to creat file '%s'", testfile);
64 } else {
65 if ((duprdo = dup(rdoret)) == -1) {
66 tst_resm(TFAIL, "Unable to dup '%s'", testfile);
67 } else {
68 fstat(rdoret, &retbuf);
69 fstat(duprdo, &dupbuf);
70 if (retbuf.st_mode != dupbuf.st_mode) {
71 tst_resm(TFAIL,
72 "rdonly and dup do not match");
73 } else {
74 tst_resm(TPASS,
75 "Passed in read mode.");
76 }
77 close(duprdo);
78 }
79 close(rdoret);
80 }
81
82 unlink(testfile);
83
84 if ((wroret = creat(testfile, 0222)) == -1) {
85 tst_resm(TFAIL, "Unable to creat file '%s'", testfile);
86 } else {
87 if ((dupwro = dup(wroret)) == -1) {
88 tst_resm(TFAIL, "Unable to dup '%s'", testfile);
89 } else {
90 fstat(wroret, &retbuf);
91 fstat(dupwro, &dupbuf);
92 if (retbuf.st_mode != dupbuf.st_mode) {
93 tst_resm(TFAIL,
94 "wronly and dup do not match");
95 } else {
96 tst_resm(TPASS,
97 "Passed in write mode.");
98 }
99 close(dupwro);
100 }
101 close(wroret);
102
103 }
104
105 unlink(testfile);
106
107 if ((rdwret = creat(testfile, 0666)) == -1) {
108 tst_resm(TFAIL, "Unable to creat file '%s'", testfile);
109 } else {
110 if ((duprdwr = dup(rdwret)) == -1) {
111 tst_resm(TFAIL, "Unable to dup '%s'", testfile);
112 } else {
113 fstat(rdwret, &retbuf);
114 fstat(duprdwr, &dupbuf);
115 if (retbuf.st_mode != dupbuf.st_mode) {
116 tst_resm(TFAIL,
117 "rdwr and dup do not match");
118 } else {
119 tst_resm(TPASS,
120 "Passed in read/write mode.");
121 }
122 close(duprdwr);
123 }
124 close(rdwret);
125 }
126
127 unlink(testfile);
128 }
129
130 cleanup();
131 tst_exit();
132 }
133
setup(void)134 static void setup(void)
135 {
136 tst_tmpdir();
137 }
138
cleanup(void)139 static void cleanup(void)
140 {
141 tst_rmdir();
142 }
143