-
-void udhcp_logging(int level, const char *fmt, ...)
-{
- int e = errno;
- va_list p;
-
- va_start(p, fmt);
- if(!daemonized) {
- printf("%s, ", syslog_level_msg[level]);
- errno = e;
- vprintf(fmt, p);
- putchar('\n');
- fflush(stdout);
- }
- va_end(p);
-}
-
-void start_log(const char *client_server)
-{
- udhcp_logging(LOG_INFO, "%s (v%s) started", client_server, VERSION);
-}
-#endif
-
-static const char *saved_pidfile;
-
-static void exit_fun(void)
-{
- if (saved_pidfile) unlink(saved_pidfile);
-}
-
-void background(const char *pidfile)
-{
-#ifdef __uClinux__
- LOG(LOG_ERR, "Cannot background in uclinux (yet)");
-#else /* __uClinux__ */
- int pid_fd = -1;
-
- if (pidfile) {
- pid_fd = open(pidfile, O_CREAT | O_WRONLY, 0644);
- if (pid_fd < 0) {
- LOG(LOG_ERR, "Unable to open pidfile %s: %m", pidfile);
- } else {
- lockf(pid_fd, F_LOCK, 0);
- if(!saved_pidfile)
- atexit(exit_fun); /* set atexit one only */
- saved_pidfile = pidfile; /* but may be rewrite */
- }
- }
- while (pid_fd >= 0 && pid_fd < 3) pid_fd = dup(pid_fd); /* don't let daemon close it */
- if (daemon(0, 0) == -1) {
- perror("fork");
- exit(1);
- }
- daemonized++;
- if (pid_fd >= 0) {
- FILE *out;
-
- if ((out = fdopen(pid_fd, "w")) != NULL) {
- fprintf(out, "%d\n", getpid());
- fclose(out);
- }
- lockf(pid_fd, F_UNLCK, 0);
- close(pid_fd);
- }
-#endif /* __uClinux__ */
-}
-
-/* Signal handler */
-int udhcp_signal_pipe[2];
-static void signal_handler(int sig)
-{
- if (send(udhcp_signal_pipe[1], &sig, sizeof(sig), MSG_DONTWAIT) < 0) {
- LOG(LOG_ERR, "Could not send signal: %m");
- }
-}
-
-void udhcp_set_signal_pipe(int sig_add)
-{
- socketpair(AF_UNIX, SOCK_STREAM, 0, udhcp_signal_pipe);
- signal(SIGUSR1, signal_handler);
- signal(SIGTERM, signal_handler);
- if(sig_add)
- signal(sig_add, signal_handler);
-}