summaryrefslogtreecommitdiff
path: root/server/dhcpd.c
diff options
context:
space:
mode:
authorShawn Routhier <sar@isc.org>2014-12-16 08:36:57 -0800
committerShawn Routhier <sar@isc.org>2014-12-16 08:36:57 -0800
commit992dc76542b7e21f8244e45eaba927fb3a8b8c8e (patch)
tree503cebffbfec31c5ac104e190c965d6a7681b054 /server/dhcpd.c
parent913d69f6c9b4ce6b40196728eebfccbb42021900 (diff)
downloadisc-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.c55
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.",