1 /*
2 * Copyright (c) International Business Machines Corp., 2001
3 * 07/2001 Ported by Wayne Boyer
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 Foundation,
17 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 */
19
20 /*
21 * DESCRIPTION
22 * Test that closing a regular file and a pipe works correctly
23 */
24
25 #include <stdio.h>
26 #include <errno.h>
27 #include <fcntl.h>
28 #include <sys/stat.h>
29 #include "test.h"
30 #include "safe_macros.h"
31
32 void cleanup(void);
33 void setup(void);
34
35 char *TCID = "close01";
36 int TST_TOTAL = 2;
37
38 char fname[40] = "";
39
40 int fild, newfd, pipefildes[2];
41
42 struct test_case_t {
43 int *fd;
44 char *type;
45 } TC[] = {
46 /* file descriptor for a regular file */
47 {
48 &newfd, "file"},
49 /* file descriptor for a pipe */
50 {
51 &pipefildes[0], "pipe"}
52 };
53
main(int ac,char ** av)54 int main(int ac, char **av)
55 {
56
57 int i;
58 int lc;
59
60 tst_parse_opts(ac, av, NULL, NULL);
61
62 setup();
63
64 for (lc = 0; TEST_LOOPING(lc); lc++) {
65
66 tst_count = 0;
67
68 if ((fild = creat(fname, 0777)) == -1)
69 tst_brkm(TBROK | TERRNO, cleanup, "can't open file %s",
70 fname);
71
72 if ((newfd = dup(fild)) == -1)
73 tst_brkm(TBROK | TERRNO, cleanup,
74 "can't dup the file des");
75
76 SAFE_PIPE(cleanup, pipefildes);
77
78 for (i = 0; i < TST_TOTAL; i++) {
79
80 TEST(close(*TC[i].fd));
81
82 if (TEST_RETURN == -1) {
83 tst_resm(TFAIL, "call failed unexpectedly");
84 continue;
85 }
86
87 if (close(*TC[i].fd) == -1) {
88 tst_resm(TPASS, "%s appears closed",
89 TC[i].type);
90 } else {
91 tst_resm(TFAIL, "%s close succeeded on"
92 "second attempt", TC[i].type);
93 }
94 }
95
96 }
97
98 cleanup();
99 tst_exit();
100 }
101
setup(void)102 void setup(void)
103 {
104 int mypid;
105
106 tst_sig(FORK, DEF_HANDLER, cleanup);
107
108 umask(0);
109
110 TEST_PAUSE;
111
112 tst_tmpdir();
113
114 mypid = getpid();
115 sprintf(fname, "fname.%d", mypid);
116 }
117
cleanup(void)118 void cleanup(void)
119 {
120 close(fild);
121
122 tst_rmdir();
123
124 }
125