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