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
31 void cleanup(void);
32 void setup(void);
33
34 char *TCID = "close01";
35 int TST_TOTAL = 2;
36
37 char fname[40] = "";
38
39 int fild, newfd, pipefildes[2];
40
41 struct test_case_t {
42 int *fd;
43 char *type;
44 } TC[] = {
45 /* file descriptor for a regular file */
46 {
47 &newfd, "file"},
48 /* file descriptor for a pipe */
49 {
50 &pipefildes[0], "pipe"}
51 };
52
main(int ac,char ** av)53 int main(int ac, char **av)
54 {
55
56 int i;
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
65 tst_count = 0;
66
67 if ((fild = creat(fname, 0777)) == -1)
68 tst_brkm(TBROK | TERRNO, cleanup, "can't open file %s",
69 fname);
70
71 if ((newfd = dup(fild)) == -1)
72 tst_brkm(TBROK | TERRNO, cleanup,
73 "can't dup the file des");
74
75 if (pipe(pipefildes) == -1) {
76 tst_brkm(TBROK | TERRNO, cleanup, "can't open pipe");
77 }
78
79 for (i = 0; i < TST_TOTAL; i++) {
80
81 TEST(close(*TC[i].fd));
82
83 if (TEST_RETURN == -1) {
84 tst_resm(TFAIL, "call failed unexpectedly");
85 continue;
86 }
87
88 if (close(*TC[i].fd) == -1) {
89 tst_resm(TPASS, "%s appears closed",
90 TC[i].type);
91 } else {
92 tst_resm(TFAIL, "%s close succeeded on"
93 "second attempt", TC[i].type);
94 }
95 }
96
97 }
98
99 cleanup();
100 tst_exit();
101 }
102
setup(void)103 void setup(void)
104 {
105 int mypid;
106
107 tst_sig(FORK, DEF_HANDLER, cleanup);
108
109 umask(0);
110
111 TEST_PAUSE;
112
113 tst_tmpdir();
114
115 mypid = getpid();
116 sprintf(fname, "fname.%d", mypid);
117 }
118
cleanup(void)119 void cleanup(void)
120 {
121 close(fild);
122
123 tst_rmdir();
124
125 }
126