diff options
author | Shawn Routhier <sar@isc.org> | 2014-12-16 08:36:57 -0800 |
---|---|---|
committer | Shawn Routhier <sar@isc.org> | 2014-12-16 08:36:57 -0800 |
commit | 992dc76542b7e21f8244e45eaba927fb3a8b8c8e (patch) | |
tree | 503cebffbfec31c5ac104e190c965d6a7681b054 /server/dhcpd.c | |
parent | 913d69f6c9b4ce6b40196728eebfccbb42021900 (diff) | |
download | isc-dhcp-992dc76542b7e21f8244e45eaba927fb3a8b8c8e.tar.gz |
[master] Move the check for another server to be earlier
[rt38078] Move the check for another server to be earlier
Move the code that checks if there is already a server
running to be executed earlier in the process. This
puts it before the server touches the database which
should avoid problems with rewriting a database from
under a running server.
Diffstat (limited to 'server/dhcpd.c')
-rw-r--r-- | server/dhcpd.c | 55 |
1 files changed, 32 insertions, 23 deletions
diff --git a/server/dhcpd.c b/server/dhcpd.c index ff5968c5..edd09ea7 100644 --- a/server/dhcpd.c +++ b/server/dhcpd.c @@ -621,6 +621,34 @@ main(int argc, char **argv) { if (cftest && !lftest) exit(0); + /* + * First part of dealing with pid files. Check to see if + * we should continue running or not. We run if: + * - we are testing the lease file out + * - we don't have a pid file to check + * - there is no other process running + */ + if ((lftest == 0) && (no_pid_file == ISC_FALSE)) { + /*Read previous pid file. */ + if ((i = open(path_dhcpd_pid, O_RDONLY)) >= 0) { + status = read(i, pbuf, (sizeof pbuf) - 1); + close(i); + if (status > 0) { + pbuf[status] = 0; + pid = atoi(pbuf); + + /* + * If there was a previous server process and + * it is still running, abort + */ + if (!pid || + (pid != getpid() && kill(pid, 0) == 0)) + log_fatal("There's already a " + "DHCP server running."); + } + } + } + group_write_hook = group_writer; /* Start up the database... */ @@ -696,34 +724,15 @@ main(int argc, char **argv) { } /* - * Deal with pid files. If the user told us - * not to write a file we don't read one either + * Second part of dealing with pid files. Now + * that we have forked we can write our pid if + * appropriate. */ if (no_pid_file == ISC_FALSE) { - /*Read previous pid file. */ - if ((i = open (path_dhcpd_pid, O_RDONLY)) >= 0) { - status = read(i, pbuf, (sizeof pbuf) - 1); - close (i); - if (status > 0) { - pbuf[status] = 0; - pid = atoi(pbuf); - - /* - * If there was a previous server process and - * it is still running, abort - */ - if (!pid || - (pid != getpid() && kill(pid, 0) == 0)) - log_fatal("There's already a " - "DHCP server running."); - } - } - - /* Write new pid file. */ i = open(path_dhcpd_pid, O_WRONLY|O_CREAT|O_TRUNC, 0644); if (i >= 0) { sprintf(pbuf, "%d\n", (int) getpid()); - IGNORE_RET (write(i, pbuf, strlen(pbuf))); + IGNORE_RET(write(i, pbuf, strlen(pbuf))); close(i); } else { log_error("Can't create PID file %s: %m.", |