Ignore:
Timestamp:
Dec 20, 2016, 4:07:32 PM (7 years ago)
Author:
Bruno Cornec
Message:

New 3?3 banch for incorporation of latest busybox 1.25. Changing minor version to handle potential incompatibilities.

Location:
branches/3.3
Files:
1 edited
1 copied

Legend:

Unmodified
Added
Removed
  • branches/3.3/mindi-busybox/miscutils/setsid.c

    r3232 r3621  
    1616
    1717//usage:#define setsid_trivial_usage
    18 //usage:       "PROG ARGS"
     18//usage:       "[-c] PROG ARGS"
    1919//usage:#define setsid_full_usage "\n\n"
    2020//usage:       "Run PROG in a new session. PROG will have no controlling terminal\n"
    21 //usage:       "and will not be affected by keyboard signals (Ctrl-C etc).\n"
    22 //usage:       "See setsid(2) for details."
     21//usage:       "and will not be affected by keyboard signals (^C etc).\n"
     22//usage:     "\n    -c  Set controlling terminal to stdin"
    2323
    2424#include "libbb.h"
     
    2727int setsid_main(int argc UNUSED_PARAM, char **argv)
    2828{
    29     if (!argv[1])
    30         bb_show_usage();
     29    unsigned opt;
     30
     31    opt_complementary = "-1"; /* at least one arg */
     32    opt = getopt32(argv, "+c"); /* +: stop on first non-opt */
     33    argv += optind;
    3134
    3235    /* setsid() is allowed only when we are not a process group leader.
    3336     * Otherwise our PID serves as PGID of some existing process group
    34      * and cannot be used as PGID of a new process group. */
     37     * and cannot be used as PGID of a new process group.
     38     *
     39     * Example: setsid() below fails when run alone in interactive shell:
     40     *  $ setsid PROG
     41     * because shell's child (setsid) is put in a new process group.
     42     * But doesn't fail if shell is not interactive
     43     * (and therefore doesn't create process groups for pipes),
     44     * or if setsid is not the first process in the process group:
     45     *  $ true | setsid PROG
     46     * or if setsid is executed in backquotes (`setsid PROG`)...
     47     */
    3548    if (setsid() < 0) {
    3649        pid_t pid = fork_or_rexec(argv);
     
    4457             * does not do such trick.
    4558             */
    46             exit(EXIT_SUCCESS);
     59            return EXIT_SUCCESS;
    4760        }
    4861
     
    5265    }
    5366
    54     argv++;
     67    if (opt) {
     68        /* -c: set (with stealing) controlling tty */
     69        ioctl(0, TIOCSCTTY, 1);
     70    }
     71
    5572    BB_EXECVP_or_die(argv);
    5673}
Note: See TracChangeset for help on using the changeset viewer.