diff options
| author | Ben Pfaff <blp@nicira.com> | 2011-03-29 09:44:55 -0700 |
|---|---|---|
| committer | Ben Pfaff <blp@nicira.com> | 2011-03-29 10:09:47 -0700 |
| commit | 18e124a20b366ee96e73600624a1a4000c816604 (patch) | |
| tree | a585254ce03d364d2fa016bde8ab5c7bc467b776 /lib | |
| parent | 2159de839136af40641738284c7eabde1b0fc72b (diff) | |
| download | openvswitch-18e124a20b366ee96e73600624a1a4000c816604.tar.gz | |
daemon: Avoid redundant code in already_running().
This function substantially duplicated read_pidfile(), so reuse that
code instead.
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/daemon.c | 59 | ||||
| -rw-r--r-- | lib/daemon.h | 1 |
2 files changed, 30 insertions, 30 deletions
diff --git a/lib/daemon.c b/lib/daemon.c index 17ec9f5e2..cb440d168 100644 --- a/lib/daemon.c +++ b/lib/daemon.c @@ -139,37 +139,17 @@ daemon_set_monitor(void) monitor = true; } -/* If a pidfile has been configured and that pidfile already exists and is - * locked by a running process, returns the pid of the running process. - * Otherwise, returns 0. */ -static pid_t -already_running(void) -{ - pid_t pid = 0; - if (pidfile) { - int fd = open(pidfile, O_RDWR); - if (fd >= 0) { - struct flock lck; - lck.l_type = F_WRLCK; - lck.l_whence = SEEK_SET; - lck.l_start = 0; - lck.l_len = 0; - if (fcntl(fd, F_GETLK, &lck) != -1 && lck.l_type != F_UNLCK) { - pid = lck.l_pid; - } - close(fd); - } - } - return pid; -} - /* If a locked pidfile exists, issue a warning message and, unless * ignore_existing_pidfile() has been called, terminate the program. */ void die_if_already_running(void) { - pid_t pid = already_running(); - if (pid) { + pid_t pid; + if (!pidfile) { + return; + } + pid = read_pidfile_if_exists(pidfile); + if (pid > 0) { if (!overwrite_pidfile) { VLOG_ERR("%s: %s already running as pid %ld, aborting", get_pidfile(), program_name, (long int) pid); @@ -509,10 +489,8 @@ daemon_usage(void) ovs_rundir(), program_name); } -/* Opens and reads a PID from 'pidfile'. Returns the nonnegative PID if - * successful, otherwise a negative errno value. */ -pid_t -read_pidfile(const char *pidfile) +static pid_t +read_pidfile__(const char *pidfile, bool must_exist) { char line[128]; struct flock lck; @@ -533,6 +511,9 @@ read_pidfile(const char *pidfile) file = fopen(pidfile, "r"); if (!file) { + if (errno == ENOENT && !must_exist) { + return 0; + } error = errno; VLOG_WARN("%s: open: %s", pidfile, strerror(error)); goto error; @@ -581,3 +562,21 @@ error: } return -error; } + +/* Opens and reads a PID from 'pidfile'. Returns the positive PID if + * successful, otherwise a negative errno value. */ +pid_t +read_pidfile(const char *pidfile) +{ + return read_pidfile__(pidfile, true); +} + + +/* Opens and reads a PID from 'pidfile', if it exists. Returns 0 if 'pidfile' + * doesn't exist, the positive PID if successful, otherwise a negative errno + * value. */ +pid_t +read_pidfile_if_exists(const char *pidfile) +{ + return read_pidfile__(pidfile, false); +} diff --git a/lib/daemon.h b/lib/daemon.h index dd85b4631..8f4fe3902 100644 --- a/lib/daemon.h +++ b/lib/daemon.h @@ -71,5 +71,6 @@ void die_if_already_running(void); void ignore_existing_pidfile(void); void daemon_usage(void); pid_t read_pidfile(const char *name); +pid_t read_pidfile_if_exists(const char *name); #endif /* daemon.h */ |
