2 * Copyright (C) 2013 Felix Fietkau <nbd@openwrt.org>
3 * Copyright (C) 2013 John Crispin <blogic@openwrt.org>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU Lesser General Public License version 2.1
7 * as published by the Free Software Foundation
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
16 #include <sys/types.h>
18 #include <sys/reboot.h>
20 #include <libubox/uloop.h>
32 #include "../utils/utils.h"
34 #include "../watchdog.h"
36 unsigned int debug
= 0;
39 signal_shutdown(int signal
, siginfo_t
*siginfo
, void *data
)
41 fprintf(stderr
, "reboot\n");
50 static struct sigaction sa_shutdown
= {
51 .sa_sigaction
= signal_shutdown
,
52 .sa_flags
= SA_SIGINFO
62 res
= get_cmdline_val("init_debug", line
, sizeof(line
));
64 r
= strtol(line
, NULL
, 10);
65 if ((r
!= LONG_MIN
) && (r
!= LONG_MAX
))
71 main(int argc
, char **argv
)
75 ulog_open(ULOG_KMSG
, LOG_DAEMON
, "init");
77 sigaction(SIGTERM
, &sa_shutdown
, NULL
);
78 sigaction(SIGUSR1
, &sa_shutdown
, NULL
);
79 sigaction(SIGUSR2
, &sa_shutdown
, NULL
);
80 sigaction(SIGPWR
, &sa_shutdown
, NULL
);
88 char *kmod
[] = { "/sbin/kmodloader", "/etc/modules-boot.d/", NULL
};
91 patch_stdio("/dev/null");
93 execvp(kmod
[0], kmod
);
94 ERROR("Failed to start kmodloader: %m\n");
98 ERROR("Failed to start kmodloader instance: %m\n");
100 const struct timespec req
= {0, 10 * 1000 * 1000};
103 for (i
= 0; i
< 1200; i
++) {
104 if (waitpid(pid
, NULL
, WNOHANG
) > 0)
106 nanosleep(&req
, NULL
);