# HG changeset patch # User viric@llimona # Date 1148985265 -7200 # Node ID de776a4548da86e492093c634127d20c1c76e49c # Parent 48b8acd6e8783b6f9d037583dbbe4ce16a2421fe Added the check for a pid file (syslog.pid by default). diff -r 48b8acd6e878 -r de776a4548da config.c --- a/config.c Tue May 30 12:05:42 2006 +0200 +++ b/config.c Tue May 30 12:34:25 2006 +0200 @@ -28,6 +28,7 @@ { TO_UDP_PORT, "1235" }, { TCP_MANAGER, "1234" }, { LOG_FILE, "file.log" }, + { PID_FILE, "syslog.pid" }, { ETYPE_END, "" }}; /* Aquesta variable ha de reflexar l'ordre de la enum etype_config de syslog.h*/ @@ -42,6 +43,7 @@ { TO_UDP_PORT, "to_udp_port" }, { TCP_MANAGER, "tcp_manager" }, { LOG_FILE, "log_file" }, + { PID_FILE, "pid_file" }, { ETYPE_END, "" }}; /* Prototypes */ diff -r 48b8acd6e878 -r de776a4548da syslog.h --- a/syslog.h Tue May 30 12:05:42 2006 +0200 +++ b/syslog.h Tue May 30 12:34:25 2006 +0200 @@ -13,6 +13,7 @@ TO_UDP_PORT, TCP_MANAGER, LOG_FILE, + PID_FILE, ETYPE_END }; diff -r 48b8acd6e878 -r de776a4548da syslog_kernel.c --- a/syslog_kernel.c Tue May 30 12:05:42 2006 +0200 +++ b/syslog_kernel.c Tue May 30 12:34:25 2006 +0200 @@ -188,10 +188,109 @@ program_handler(SIGHUP, reconfig_handler); } +static void check_pid() +{ + int fh; + char name[MAX_STRING]; + char buffer[MAX_STRING]; + int buffer_size; + int pid, res; + + assert (get_config(PID_FILE, name, MAX_STRING) > 0); + + fh = open(name, O_RDONLY); + if (fh == -1) + { + /* If the file doesn't exist, it's normal. */ + return; + } + + buffer_size = MAX_STRING; + buffer_size = read(fh, buffer, buffer_size); + if (buffer_size <= 0) + { + fprintf(stderr, "Error reading the pid file: %s\n", + strerror(errno)); + close(fh); + return; + } + buffer[buffer_size] = '\0'; + + pid = atoi(buffer); + + if (pid > 0) + { + res = kill(pid, SIGHUP); + if (res == 0) + { + /* The syslog_kernel seems to be running and restared */ + fprintf(stderr,"syslog_kernel running. Restarted.\n"); + close(fh); + exit(0); + } else if (res == -1) + { + fprintf(stderr,"An old pid file has been found. " + "Ignoring it.\n"); + } + } + + close(fh); +} + +static void write_pid() +{ + int fh; + char name[MAX_STRING]; + char buffer[MAX_STRING]; + int buffer_size; + int res; + + assert (get_config(PID_FILE, name, MAX_STRING) > 0); + + fh = open(name, O_WRONLY | O_TRUNC | O_CREAT, 0644); + if (fh == -1) + { + fprintf(stderr, "Error opening the pid file for write: %s\n", + strerror(errno)); + return; + } + + buffer_size = snprintf(buffer, MAX_STRING, "%i", getpid()); + if (buffer_size < MAX_STRING) + { + buffer[buffer_size++] = '\n'; + } + + res = write(fh, buffer, buffer_size); + if (buffer_size <= 0) + fprintf(stderr, "Error writting the pid file: %s\n", + strerror(errno)); + + close(fh); +} + +static void remove_pid() +{ + int res; + char name[MAX_STRING]; + + assert (get_config(PID_FILE, name, MAX_STRING) > 0); + res = unlink(name); + + if (res == -1) + fprintf(stderr, "Error unlinking the pid file: %s\n", + strerror(errno)); +} + + + int main(int argn, char *argv[]) { int res; + check_pid(); + write_pid(); + install_signal_handlers(); do @@ -228,4 +327,6 @@ wait_childs_die(); } while(reconfig == true); + + remove_pid(); }