ret = -errno; 
int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv,	       unsigned long *stack_out){	struct helper_data data;	unsigned long stack, sp;	int pid, fds[2], ret, n;	if((stack_out != NULL) && (*stack_out != 0))		stack = *stack_out;	else stack = alloc_stack(0, um_in_interrupt());	if(stack == 0)		return(-ENOMEM);	ret = os_pipe(fds, 1, 0);	if(ret < 0){		printk("run_helper : pipe failed, ret = %d\n", -ret);		goto out_free;	}	ret = os_set_exec_close(fds[1], 1);	if(ret < 0){		printk("run_helper : setting FD_CLOEXEC failed, ret = %d\n",		       -ret);		goto out_close;	}	sp = stack + page_size() - sizeof(void *);	data.pre_exec = pre_exec;	data.pre_data = pre_data;	data.argv = argv;	data.fd = fds[1];	pid = clone(helper_child, (void *) sp, CLONE_VM | SIGCHLD, &data);	if(pid < 0){		printk("run_helper : clone failed, errno = %d\n", errno);		ret = -errno;		goto out_close;	}	os_close_file(fds[1]);	fds[1] = -1;	/*Read the errno value from the child.*/	n = os_read_file(fds[0], &ret, sizeof(ret));	if(n < 0){		printk("run_helper : read on pipe failed, ret = %d\n", -n);		ret = n;		os_kill_process(pid, 1);	}	else if(n != 0){		CATCH_EINTR(n = waitpid(pid, NULL, 0));		ret = -errno;	} else {		ret = pid;	}out_close:	if (fds[1] != -1)		os_close_file(fds[1]);	os_close_file(fds[0]);out_free:	if(stack_out == NULL)		free_stack(stack, 0);	else *stack_out = stack;	return(ret);}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/b4fd310e163477236a241580b3b8c29aee65f4cc/helper.c/clean/arch/um/kernel/helper.c