Home | History | Annotate | Download | only in clone
      1 /*
      2  * Copyright (c) Wipro Technologies Ltd, 2002.  All Rights Reserved.
      3  * Copyright (c) 2012 Wanlong Gao <gaowanlong (at) cn.fujitsu.com>
      4  *
      5  * This program is free software; you can redistribute it and/or modify it
      6  * under the terms of version 2 of the GNU General Public License as
      7  * published by the Free Software Foundation.
      8  *
      9  * This program is distributed in the hope that it would be useful, but
     10  * WITHOUT ANY WARRANTY; without even the implied warranty of
     11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     12  *
     13  * You should have received a copy of the GNU General Public License along
     14  * with this program; if not, write the Free Software Foundation, Inc.,
     15  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
     16  *
     17  */
     18 
     19 /*
     20  *	This is a test for the clone(2) system call.
     21  *	It is intended to provide a limited exposure of the system call.
     22  */
     23 
     24 #if defined UCLINUX && !__THROW
     25 /* workaround for libc bug */
     26 #define __THROW
     27 #endif
     28 
     29 #include <errno.h>
     30 #include <sched.h>
     31 #include <sys/wait.h>
     32 #include "test.h"
     33 #include "clone_platform.h"
     34 
     35 static void setup(void);
     36 static void cleanup(void);
     37 static int do_child();
     38 
     39 char *TCID = "clone01";
     40 int TST_TOTAL = 1;
     41 
     42 int main(int ac, char **av)
     43 {
     44 	void *child_stack;
     45 	int status, child_pid;
     46 
     47 	tst_parse_opts(ac, av, NULL, NULL);
     48 
     49 	setup();
     50 
     51 	child_stack = malloc(CHILD_STACK_SIZE);
     52 	if (child_stack == NULL)
     53 		tst_brkm(TBROK, cleanup, "Cannot allocate stack for child");
     54 
     55 	tst_count = 0;
     56 
     57 	TEST(ltp_clone(SIGCHLD, do_child, NULL, CHILD_STACK_SIZE, child_stack));
     58 	if (TEST_RETURN == -1)
     59 		tst_resm(TFAIL | TTERRNO, "clone failed");
     60 
     61 	child_pid = wait(&status);
     62 	if (child_pid == -1)
     63 		tst_brkm(TBROK | TERRNO, cleanup, "wait failed, status: %d",
     64 			 status);
     65 
     66 	if (TEST_RETURN == child_pid)
     67 		tst_resm(TPASS, "clone returned %ld", TEST_RETURN);
     68 	else
     69 		tst_resm(TFAIL, "clone returned %ld, wait returned %d",
     70 			 TEST_RETURN, child_pid);
     71 
     72 	free(child_stack);
     73 
     74 	cleanup();
     75 
     76 	tst_exit();
     77 }
     78 
     79 static void setup(void)
     80 {
     81 	tst_sig(FORK, DEF_HANDLER, cleanup);
     82 	TEST_PAUSE;
     83 }
     84 
     85 static void cleanup(void)
     86 {
     87 }
     88 
     89 static int do_child(void)
     90 {
     91 	exit(0);
     92 }
     93