source: MondoRescue/trunk/mindi-busybox/libbb/vfork_daemon_rexec.c@ 929

Last change on this file since 929 was 821, checked in by Bruno Cornec, 18 years ago

Addition of busybox 1.2.1 as a mindi-busybox new package
This should avoid delivering binary files in mindi not built there (Fedora and Debian are quite serious about that)

File size: 1.5 KB
Line 
1/* vi: set sw=4 ts=4: */
2/*
3 * Rexec program for system have fork() as vfork() with foreground option
4 *
5 * Copyright (C) Vladimir N. Oleynik <dzo@simtreas.ru>
6 * Copyright (C) 2003 Russ Dill <Russ.Dill@asu.edu>
7 *
8 * daemon() portion taken from uClibc:
9 *
10 * Copyright (c) 1991, 1993
11 * The Regents of the University of California. All rights reserved.
12 *
13 * Modified for uClibc by Erik Andersen <andersee@debian.org>
14 *
15 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
16 */
17
18#include <unistd.h>
19#include <stdio.h>
20#include <fcntl.h>
21#include <paths.h>
22#include "libbb.h"
23
24
25#ifdef BB_NOMMU
26void vfork_daemon_rexec(int nochdir, int noclose,
27 int argc, char **argv, char *foreground_opt)
28{
29 int fd;
30 char **vfork_args;
31 int a = 0;
32
33 setsid();
34
35 if (!nochdir)
36 chdir("/");
37
38 if (!noclose && (fd = open(bb_dev_null, O_RDWR, 0)) != -1) {
39 dup2(fd, STDIN_FILENO);
40 dup2(fd, STDOUT_FILENO);
41 dup2(fd, STDERR_FILENO);
42 if (fd > 2)
43 close(fd);
44 }
45
46 vfork_args = xcalloc(sizeof(char *), argc + 3);
47 vfork_args[a++] = "/bin/busybox";
48 while(*argv) {
49 vfork_args[a++] = *argv;
50 argv++;
51 }
52 vfork_args[a] = foreground_opt;
53 switch (vfork()) {
54 case 0: /* child */
55 /* Make certain we are not a session leader, or else we
56 * might reacquire a controlling terminal */
57 if (vfork())
58 _exit(0);
59 execv(vfork_args[0], vfork_args);
60 bb_perror_msg_and_die("execv %s", vfork_args[0]);
61 case -1: /* error */
62 bb_perror_msg_and_die("vfork");
63 default: /* parent */
64 exit(0);
65 }
66}
67#endif /* BB_NOMMU */
Note: See TracBrowser for help on using the repository browser.