1/*
2 * Copyright (c) 2000 Silicon Graphics, Inc.  All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of version 2 of the GNU General Public License as
6 * published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it would be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11 *
12 * Further, this software is distributed without any warranty that it is
13 * free of the rightful claim of any third person regarding infringement
14 * or the like.  Any license provided herein, whether implied or
15 * otherwise, applies only to this software file.  Patent licenses, if
16 * any, provided herein do not apply to combinations of this program with
17 * other software, or any other product whatsoever.
18 *
19 * You should have received a copy of the GNU General Public License along
20 * with this program; if not, write the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 *
23 * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
24 * Mountain View, CA  94043, or:
25 *
26 * http://www.sgi.com
27 *
28 * For further information regarding this notice, see:
29 *
30 * http://oss.sgi.com/projects/GenInfo/NoticeExplan/
31 *
32 */
33/* $Id: dup02.c,v 1.6 2009/10/13 14:00:46 subrata_modak Exp $ */
34/**********************************************************
35 *
36 *    OS Test - Silicon Graphics, Inc.
37 *
38 *    TEST IDENTIFIER	: dup02
39 *
40 *    EXECUTED BY	: anyone
41 *
42 *    TEST TITLE	: Negative test for dup(2) with bad fd.
43 *
44 *    PARENT DOCUMENT	: usctpl01
45 *
46 *    TEST CASE TOTAL	: 2
47 *
48 *    WALL CLOCK TIME	: 1
49 *
50 *    CPU TYPES		: ALL
51 *
52 *    AUTHOR		: Richard Logan
53 *
54 *    CO-PILOT		: William Roske
55 *
56 *    DATE STARTED	: 06/94
57 *
58 *    INITIAL RELEASE	: UNICOS 7.0
59 *
60 *    TEST CASES
61 *
62 * 	1-?.) dup(2) returns -1 with errno set to EBADF...(See Description)
63 *
64 *    INPUT SPECIFICATIONS
65 * 	The standard options for system call tests are accepted.
66 *	(See the parse_opts(3) man page).
67 *
68 *    OUTPUT SPECIFICATIONS
69 *	Standard tst_res formatted output
70 *$
71 *    DURATION
72 * 	Terminates - with frequency and infinite modes.
73 *
74 *    SIGNALS
75 * 	Uses SIGUSR1 to pause before test if option set.
76 * 	(See the parse_opts(3) man page).
77 *
78 *    RESOURCES
79 * 	None
80 *
81 *    ENVIRONMENTAL NEEDS
82 *      No run-time environmental needs.
83 *
84 *    SPECIAL PROCEDURAL REQUIREMENTS
85 * 	None
86 *
87 *    INTERCASE DEPENDENCIES
88 * 	None
89 *
90 *    DETAILED DESCRIPTION
91 *
92 * 	Setup:
93 * 	  Setup signal handling.
94 *	  Pause for SIGUSR1 if option specified.
95 *
96 * 	Test:
97 *	 Loop if the proper options are given.
98 *	  Loop through the test cases
99 * 	   Execute system call
100 *	   Check return code, if system call failed (return=-1)
101 *		if doing functional check
102 *		   check if errno set correctly, report results
103 *	  Otherwise, Issue a FAIL message.
104 *
105 * 	Cleanup:
106 * 	  Print errno log and/or timing stats if options given
107 *
108 *
109 *#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#**/
110
111#include <sys/types.h>
112#include <fcntl.h>
113#include <errno.h>
114#include <string.h>
115#include <signal.h>
116#include "test.h"
117
118void setup();
119void cleanup();
120
121char *TCID = "dup02";
122int TST_TOTAL = 2;
123
124int Fds[] = { -1, 1500 };
125
126int main(int ac, char **av)
127{
128	int lc;
129	int nfds = sizeof(Fds) / sizeof(int);
130	int ind;
131
132	tst_parse_opts(ac, av, NULL, NULL);
133
134	setup();
135
136	for (lc = 0; TEST_LOOPING(lc); lc++) {
137
138		tst_count = 0;
139
140		for (ind = 0; ind < nfds; ind++) {
141
142			TEST(dup(Fds[ind]));
143
144			if (TEST_RETURN == -1) {
145				if (TEST_ERRNO == EBADF)
146					tst_resm(TPASS,
147						 "dup failed as expected "
148						 "with EBADF");
149				else
150					tst_resm(TFAIL | TTERRNO,
151						 "dup failed unexpectedly");
152			} else {
153				tst_resm(TFAIL, "dup succeeded unexpectedly");
154
155				if (close(TEST_RETURN) == -1)
156					tst_brkm(TBROK | TERRNO, cleanup,
157						 "close failed");
158			}
159		}
160	}
161
162	cleanup();
163	tst_exit();
164}
165
166void setup(void)
167{
168
169	tst_sig(FORK, DEF_HANDLER, cleanup);
170
171	TEST_PAUSE;
172
173	tst_tmpdir();
174
175}
176
177void cleanup(void)
178{
179	tst_rmdir();
180}
181