• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *
3  *   Copyright (C) Bull S.A. 2001
4  *   Copyright (c) International Business Machines  Corp., 2001
5  *
6  *   This program is free software;  you can redistribute it and/or modify
7  *   it under the terms of the GNU General Public License as published by
8  *   the Free Software Foundation; either version 2 of the License, or
9  *   (at your option) any later version.
10  *
11  *   This program is distributed in the hope that it will be useful,
12  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
13  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
14  *   the GNU General Public License for more details.
15  *
16  *   You should have received a copy of the GNU General Public License
17  *   along with this program;  if not, write to the Free Software
18  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 /*
22  * NAME
23  * 	readv03.c
24  *
25  * DESCRIPTION
26  *	Testcase to check the error condition of the readv(2) system call
27  *	when fd refers to a directory.
28  *
29  * CALLS
30  * 	readv()
31  *
32  * ALGORITHM
33  *      loop if that option was specified
34  *      call readv() when fd refers to a directory.
35  *      check the errno value
36  *        issue a PASS message if we get EISDIR - errno 21
37  *      otherwise, the tests fails
38  *        issue a FAIL message
39  *      call cleanup
40  *
41  * USAGE$
42  *	readv03
43  *
44  * HISTORY
45  *	05/2002 Ported by Jacky Malcles
46  *
47  * RESTRICTIONS
48  * 	None
49  */
50 #include <sys/types.h>
51 #include <sys/uio.h>
52 #include <fcntl.h>
53 #include <errno.h>
54 #include <string.h>
55 #include <sys/stat.h>
56 
57 #include "test.h"
58 #include "safe_macros.h"
59 
60 #define	K_1	1024
61 #define MODES   S_IRWXU
62 
63 char buf1[K_1];
64 
65 struct iovec rd_iovec[1] = {
66 	{buf1, K_1}
67 };
68 
69 const char *TEST_DIR = "alpha";
70 int r_val;
71 int fd;
72 
73 char *TCID = "readv03";
74 int TST_TOTAL = 1;
75 
76 void setup();
77 void cleanup();
78 
main(int ac,char ** av)79 int main(int ac, char **av)
80 {
81 	int lc;
82 
83 	tst_parse_opts(ac, av, NULL, NULL);
84 
85 	setup();
86 
87 	/* The following loop checks looping state if -i option given */
88 	for (lc = 0; TEST_LOOPING(lc); lc++) {
89 
90 		/* reset tst_count in case we are looping */
91 		tst_count = 0;
92 
93 		if (readv(fd, rd_iovec, 1) < 0) {
94 			if (errno != EISDIR) {
95 				tst_resm(TFAIL, "expected errno = EISDIR, "
96 					 "got %d", errno);
97 			} else {
98 				tst_resm(TPASS, "got EISDIR");
99 			}
100 		} else {
101 			tst_resm(TFAIL, "Error: readv returned a positive "
102 				 "value");
103 		}
104 
105 	}
106 	cleanup();
107 	tst_exit();
108 
109 }
110 
111 /*
112  * setup() - performs all ONE TIME setup for this test.
113  */
setup(void)114 void setup(void)
115 {
116 
117 	tst_sig(NOFORK, DEF_HANDLER, cleanup);
118 
119 	TEST_PAUSE;
120 
121 	/* make a temporary directory and cd to it */
122 	tst_tmpdir();
123 
124 	/*
125 	 * create a new directory and open it
126 	 */
127 
128 	if ((r_val = mkdir(TEST_DIR, MODES)) == -1) {
129 		tst_brkm(TBROK, cleanup, "%s - mkdir() in main() "
130 			 "failed", TCID);
131 	}
132 
133 	if ((fd = open(TEST_DIR, O_RDONLY)) == -1) {
134 		tst_brkm(TBROK, cleanup, "open of directory failed");
135 	}
136 
137 }
138 
139 /*
140  * cleanup() - performs all ONE TIME cleanup for this test at
141  *	       completion or premature exit.
142  */
cleanup(void)143 void cleanup(void)
144 {
145 	SAFE_CLOSE(cleanup, fd);
146 	tst_rmdir();
147 
148 }
149