summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorBen Pfaff <blp@nicira.com>2011-03-29 09:44:55 -0700
committerBen Pfaff <blp@nicira.com>2011-03-29 10:09:47 -0700
commit18e124a20b366ee96e73600624a1a4000c816604 (patch)
treea585254ce03d364d2fa016bde8ab5c7bc467b776 /lib
parent2159de839136af40641738284c7eabde1b0fc72b (diff)
downloadopenvswitch-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.c59
-rw-r--r--lib/daemon.h1
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 */