67 #include <sys/types.h>    84 #define NUM_EXTRA ((int) (sizeof(extra_arguments) / sizeof(*extra_arguments)))    89         "Usage: %s [--pidfile PIDFILE] [--min-delay SECONDS] BOXPATH [boxoptions...]\n",
   109         fprintf(stderr, 
"%s: malloc: %s\n", 
progname, strerror(errno));
   122     for (i = 0; i < argc; i++) {
   125     *argp++ = (
char *)NULL;
   136     fd = open(
pidfile, O_WRONLY|O_NOCTTY|O_TRUNC|O_CREAT, 0644);
   138         fprintf(stderr, 
"%s: open: %s: %s\n", 
progname, 
pidfile, strerror(errno));
   144         fprintf(stderr, 
"%s: fdopen: %s\n", 
progname, strerror(errno));
   148     fprintf(f, 
"%ld\n", (
long)getpid());
   150         fprintf(stderr, 
"%s: writing %s: %s\n", 
progname, 
pidfile, strerror(errno));
   170     devnullfd = open(
"/dev/null", O_RDONLY);
   172         fprintf(stderr, 
"%s: cannot open /dev/null: %s\n",
   176     devfullfd = open(
"/dev/full", O_WRONLY);
   178         devfullfd = devnullfd;
   183     if (dup2(devnullfd, 0) < 0 ||
   184         dup2(devfullfd, 1) < 0 ||
   185         dup2(devfullfd, 2) < 0) {
   186         fprintf(stderr, 
"%s: dup2: %s\n", 
progname, strerror(errno));
   200     max = sysconf(_SC_OPEN_MAX);
   214     for (fd = 3; fd < max; fd++) {
   246     signal(signum, SIG_DFL);
   247     kill(getpid(), signum);
   264     time_t next_fork = 0;
   275         time_t this_time = time(NULL);
   276         if (this_time <= next_fork) {
   277             sleep(next_fork - this_time);
   292             if (errno == ECHILD) {
   298             if (errno == EINTR) {
   307 int main(
int argc, 
char *argv[])
   310     char *boxfile = NULL;
   322     for (i = 1; i < argc && !boxfile; i++) {
   323         if (strcmp(argv[i], 
"--pidfile") == 0) {
   325                 fprintf(stderr, 
"Missing argument for option %s\n", argv[i]);
   330         } 
else if (strcmp(argv[i], 
"--min-delay") == 0) {
   332                 fprintf(stderr, 
"Missing argument for option %s", argv[i]);
   337         } 
else if (strcmp(argv[i], 
"--no-extra-args") == 0) {
   339         } 
else if (argv[i][0] == 
'-') {
   340             fprintf(stderr, 
"Unknown option %s\n", argv[i]);
   362         fprintf(stderr, 
"%s: fork: %s\n", 
progname, strerror(errno));
   373         fprintf(stderr, 
"%s: setsid: %s\n", 
progname, strerror(errno));
   379     if (chdir(
"/") < 0) {
   380         fprintf(stderr, 
"%s: chdir to root: %s\n", 
progname, strerror(errno));
 static void rebind_standard_streams(void)
 
static void remove_pidfile(void)
 
int main(int argc, char *argv[])
 
static void setup_signals(void)
 
static int main_loop(char *boxfile)
 
static char * extra_arguments[]
 
static char ** box_arglist
 
static void signal_transfer(int signum)
 
static void signal_transfer_and_die(int signum)
 
static void close_extra_files(void)
 
static int use_extra_args
 
static void print_usage(FILE *stream)
 
static void write_pidfile(void)
 
static void build_box_arglist(char *boxfile, int argc, char **argv)
 
static int open_max(void)
 
static int min_restart_delay