OSDN Git Service

0835c66a3c28e7920223c008d7ba6a3a831b7192
[pf3gnuchains/pf3gnuchains3x.git] / winsup / testsuite / winsup.api / ltp / setpgid01.c
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., 59
21  * Temple Place - Suite 330, Boston MA 02111-1307, 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$ */
34 /**********************************************************
35  * 
36  *    OS Test - Silicon Graphics, Inc.
37  * 
38  *    TEST IDENTIFIER   : setpgid01
39  * 
40  *    EXECUTED BY       : anyone
41  * 
42  *    TEST TITLE        : Basic test for setpgid(2) 
43  * 
44  *    PARENT DOCUMENT   : usctpl01
45  * 
46  *    TEST CASE TOTAL   : 1
47  * 
48  *    WALL CLOCK TIME   : 1
49  * 
50  *    CPU TYPES         : ALL
51  * 
52  *    AUTHOR            : William Roske
53  * 
54  *    CO-PILOT          : Dave Fenner
55  * 
56  *    DATE STARTED      : 03/30/92
57  * 
58  *    INITIAL RELEASE   : UNICOS 7.0
59  * 
60  *    TEST CASES
61  * 
62  *      1.) setpgid(2) returns...(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  *      
70  *    DURATION
71  *      Terminates - with frequency and infinite modes.
72  * 
73  *    SIGNALS
74  *      Uses SIGUSR1 to pause before test if option set.
75  *      (See the parse_opts(3) man page).
76  *
77  *    RESOURCES
78  *      None
79  * 
80  *    ENVIRONMENTAL NEEDS
81  *      No run-time environmental needs.
82  * 
83  *    SPECIAL PROCEDURAL REQUIREMENTS
84  *      None
85  * 
86  *    INTERCASE DEPENDENCIES
87  *      None
88  * 
89  *    DETAILED DESCRIPTION
90  *      This is a Phase I test for the setpgid(2) system call.  It is intended
91  *      to provide a limited exposure of the system call, for now.  It
92  *      should/will be extended when full functional tests are written for
93  *      setpgid(2).
94  * 
95  *      Setup:
96  *        Setup signal handling.
97  *        Pause for SIGUSR1 if option specified.
98  * 
99  *      Test:
100  *       Loop if the proper options are given.
101  *        Execute system call
102  *        Check return code, if system call failed (return=-1)
103  *              Log the errno and Issue a FAIL message.
104  *        Otherwise, Issue a PASS message.
105  * 
106  *      Cleanup:
107  *        Print errno log and/or timing stats if options given
108  * 
109  * 
110  *#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#**/
111
112 #include <errno.h>
113 #include <string.h>
114 #include <signal.h>
115 #include <sys/wait.h>
116 #include "test.h"
117 #include "usctest.h"
118
119 extern void setup();
120 extern void cleanup() __attribute__ ((noreturn));
121
122 const char *TCID="setpgid01";   /* Test program identifier.    */
123 int TST_TOTAL=1;                /* Total number of test cases. */
124 extern int Tst_count;           /* Test Case counter for tst_* routines */
125
126 int exp_enos[]={0, 0};
127 int pgid, pid;
128
129 int
130 main(int ac, char **av)
131 {
132     int lc;             /* loop counter */
133     const char *msg;            /* message returned from parse_opts */
134     
135     /***************************************************************
136      * parse standard options
137      ***************************************************************/
138     if ( (msg=parse_opts(ac, av, (option_t *) NULL, NULL)) != (char *) NULL )
139         tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg);
140
141     /***************************************************************
142      * perform global setup for test
143      ***************************************************************/
144     setup();
145
146     /* set the expected errnos... */
147     TEST_EXP_ENOS(exp_enos);
148
149     /***************************************************************
150      * check looping state if -c option given
151      ***************************************************************/
152     for (lc=0; TEST_LOOPING(lc); lc++) {
153         
154         /* reset Tst_count in case we are looping. */
155         Tst_count=0;
156         
157         /* 
158          * Call setpgid(2) 
159          */
160         TEST(setpgid(pid, pgid));
161         
162         /* check return code */
163         if ( TEST_RETURN == -1 ) {
164             TEST_ERROR_LOG(TEST_ERRNO);
165             tst_resm(TFAIL, "setpgid(%d, %d) Failed, errno=%d : %s", pid, pgid,
166                      TEST_ERRNO, strerror(TEST_ERRNO));
167         } else {
168             /***************************************************************
169              * only perform functional verification if flag set (-f not given)
170              ***************************************************************/
171             if ( STD_FUNCTIONAL_TEST ) {
172                 /* No Verification test, yet... */
173                 tst_resm(TPASS, "setpgid(%d, %d) returned %d", pid, pgid,  TEST_RETURN);
174             } 
175         }
176     }   /* End for TEST_LOOPING */
177
178     /***************************************************************
179      * cleanup and exit
180      ***************************************************************/
181     cleanup();
182
183     return 0;
184 }       /* End main */
185
186 /***************************************************************
187  * setup() - performs all ONE TIME setup for this test.
188  ***************************************************************/
189 void 
190 setup()
191 {
192     int status;
193
194     /* capture signals */
195     tst_sig(FORK, DEF_HANDLER, cleanup);
196
197     /* Pause if that option was specified */
198     TEST_PAUSE;
199
200     /*
201      * Make sure current process is NOT a session or pgrp leader
202      */
203
204     pgid=getpgrp();
205     pid=getpid();
206
207     if (pgid == pid) {
208         if ((pid = fork()) == -1) {
209             tst_brkm(TBROK, cleanup, "fork() in setup() failed - errno %d",
210                      errno);
211         }
212
213         if (pid != 0) {             /* parent - sits and waits */
214             wait(&status);
215             exit(WEXITSTATUS(status));
216         } else {                    /* child - continues with test */
217             pid = getpid();
218         }
219     }
220 }       /* End setup() */
221
222
223 /***************************************************************
224  * cleanup() - performs all ONE TIME cleanup for this test at
225  *              completion or premature exit.
226  ***************************************************************/
227 void 
228 cleanup()
229 {
230     /*
231      * print timing stats if that option was specified.
232      * print errno log if that option was specified.
233      */
234     TEST_CLEANUP;
235
236     /* exit with return code appropriate for results */
237     tst_exit();
238 }       /* End cleanup() */