source: MondoRescue/branches/stable/mindi-busybox/libbb/vfork_daemon_rexec.c @ 821

Last change on this file since 821 was 821, checked in by Bruno Cornec, 14 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.