Added the check for a pid file (syslog.pid by default).
--- 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 */
--- 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
};
--- 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();
}