diff options
Diffstat (limited to 'networking/udhcp/common.c')
-rw-r--r-- | networking/udhcp/common.c | 142 |
1 files changed, 71 insertions, 71 deletions
diff --git a/networking/udhcp/common.c b/networking/udhcp/common.c index babd980..bfdc7ba 100644 --- a/networking/udhcp/common.c +++ b/networking/udhcp/common.c @@ -1,8 +1,9 @@ /* common.c * - * Functions to assist in the writing and removing of pidfiles. + * Functions for debugging and logging as well as some other + * simple helper functions. * - * Russ Dill <Russ.Dill@asu.edu> Soptember 2001 + * Russ Dill <Russ.Dill@asu.edu> 2001-2003 * Rewrited by Vladimir Oleynik <dzo@simtreas.ru> (C) 2003 * * This program is free software; you can redistribute it and/or modify @@ -26,18 +27,54 @@ #include <string.h> #include <stdlib.h> #include <signal.h> +#include <paths.h> #include <sys/socket.h> +#include <stdarg.h> #include "common.h" +#include "pidfile.h" static int daemonized; -#ifdef CONFIG_FEATURE_UDHCP_SYSLOG +/* + * This function makes sure our first socket calls + * aren't going to fd 1 (printf badness...) and are + * not later closed by daemon() + */ +static inline void sanitize_fds(void) +{ + int zero; + if ((zero = open(_PATH_DEVNULL, O_RDWR, 0)) < 0) return; + while (zero < 3) zero = dup(zero); + close(zero); +} + + +void background(const char *pidfile) +{ +#ifdef __uClinux__ + LOG(LOG_ERR, "Cannot background in uclinux (yet)"); +#else /* __uClinux__ */ + int pid_fd; + + if (!pidfile) return; + + pid_fd = pidfile_acquire(pidfile); /* hold lock during fork. */ + if (daemon(0, 0) == -1) { + perror("fork"); + exit(1); + } + daemonized++; + pidfile_write_release(pid_fd); +#endif /* __uClinux__ */ +} + + +#ifdef UDHCP_SYSLOG void udhcp_logging(int level, const char *fmt, ...) { - int e = errno; va_list p; va_list p2; @@ -46,21 +83,34 @@ void udhcp_logging(int level, const char *fmt, ...) if(!daemonized) { vprintf(fmt, p); putchar('\n'); - fflush(stdout); - errno = e; } vsyslog(level, fmt, p2); va_end(p); } -void start_log(const char *client_server) + +void start_log_and_pid(const char *client_server, const char *pidfile) { - openlog(bb_applet_name, LOG_PID | LOG_CONS, LOG_LOCAL0); + int pid_fd; + + /* Make sure our syslog fd isn't overwritten */ + sanitize_fds(); + + /* do some other misc startup stuff while we are here to save bytes */ + pid_fd = pidfile_acquire(pidfile); + pidfile_write_release(pid_fd); + + /* equivelent of doing a fflush after every \n */ + setlinebuf(stdout); + + openlog(client_server, LOG_PID | LOG_CONS, LOG_LOCAL0); udhcp_logging(LOG_INFO, "%s (v%s) started", client_server, VERSION); } + #else + static char *syslog_level_msg[] = { [LOG_EMERG] = "EMERGENCY!", [LOG_ALERT] = "ALERT!", @@ -71,86 +121,36 @@ static char *syslog_level_msg[] = { [LOG_DEBUG] = "debug" }; + 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) + +void start_log_and_pid(const char *client_server, const char *pidfile) { - udhcp_logging(LOG_INFO, "%s (v%s) started", client_server, VERSION); -} -#endif + int pid_fd; -static const char *saved_pidfile; + /* Make sure our syslog fd isn't overwritten */ + sanitize_fds(); -static void exit_fun(void) -{ - if (saved_pidfile) unlink(saved_pidfile); -} + /* do some other misc startup stuff while we are here to save bytes */ + pid_fd = pidfile_acquire(pidfile); + pidfile_write_release(pid_fd); -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__ */ -} + /* equivelent of doing a fflush after every \n */ + setlinebuf(stdout); -/* 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"); - } + udhcp_logging(LOG_INFO, "%s (v%s) started", client_server, VERSION); } +#endif -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); -} |