]> sourceware.org Git - lvm2.git/commitdiff
Add dm_create_lockfile to libdm to handle pidfiles for all daemons.
authorFabio M. Di Nitto <fdinitto@redhat.com>
Tue, 13 Jul 2010 13:51:01 +0000 (13:51 +0000)
committerFabio M. Di Nitto <fdinitto@redhat.com>
Tue, 13 Jul 2010 13:51:01 +0000 (13:51 +0000)
Switch dmeventd to use dm_create_lockfile and drop duplicate code.
Allow clvmd pidfile to be configurable.
Switch cmirrord and clvmd to use dm_create_lockfile.

WHATS_NEW
WHATS_NEW_DM
configure
configure.in
daemons/clvmd/clvmd.c
daemons/cmirrord/clogd.c
daemons/dmeventd/dmeventd.c
daemons/dmeventd/dmeventd.h
lib/misc/configure.h.in
libdm/libdevmapper.h
libdm/libdm-file.c

index b43a557d44101e11a07d5a3293e808fd3266d1b4..f7cfce98410dfc4a7bffea5e39888225984e0440 100644 (file)
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,7 @@
 Version 2.02.71 -
 ===============================
+  Switch cmirrord and clvmd to use dm_create_lockfile.
+  Allow clvmd pidfile to be configurable.
   Update comments about memory handling in lvm2app.h.
   Add more verbose messages while checking volume_list and hosttags settings.
   Add log_error when strdup fails in {vg|lv}_change_tag().
index 520ef1acb079e7d8c69e7407e9535c594c6e1fad..640401e4a3959a17328e64487516e5c7de6237e0 100644 (file)
@@ -1,5 +1,7 @@
 Version 1.02.53 -
 ===============================
+  Switch dmeventd to use dm_create_lockfile and drop duplicate code.
+  Add dm_create_lockfile to libdm to handle pidfiles for all daemons.
   Use "nowatch" udev rule for inappropriate devices.
 
 Version 1.02.52 - 6th July 2010
index 6747822abfff053a20220b0a2c7eef9c5443ebb1..b7e8f1f36e7285c55b5af7db8ac4eb5872991404 100755 (executable)
--- a/configure
+++ b/configure
@@ -736,8 +736,6 @@ CCS_LIBS
 CCS_CFLAGS
 PKGCONFIGINIT_LIBS
 PKGCONFIGINIT_CFLAGS
-PKG_CONFIG_LIBDIR
-PKG_CONFIG_PATH
 PKG_CONFIG
 POW_LIB
 LIBOBJS
@@ -831,6 +829,7 @@ with_replicators
 enable_readline
 enable_realtime
 with_clvmd
+with_clvmd_pidfile
 enable_cmirrord
 with_cmirrord_pidfile
 enable_debug
@@ -877,8 +876,6 @@ LIBS
 CPPFLAGS
 CPP
 PKG_CONFIG
-PKG_CONFIG_PATH
-PKG_CONFIG_LIBDIR
 PKGCONFIGINIT_CFLAGS
 PKGCONFIGINIT_LIBS
 CCS_CFLAGS
@@ -1580,6 +1577,8 @@ Optional Packages:
                            * all                   (autodetect)
                            * none                  (disable build)
                           [TYPE=none]
+  --with-clvmd-pidfile=PATH
+                          clvmd pidfile [/var/run/clvmd.pid]
   --with-cmirrord-pidfile=PATH
                           cmirrord pidfile [/var/run/cmirrord.pid]
   --with-optimisation=OPT C optimisation flag [OPT=-O2]
@@ -1617,10 +1616,6 @@ Some influential environment variables:
               you have headers in a nonstandard directory <include dir>
   CPP         C preprocessor
   PKG_CONFIG  path to pkg-config utility
-  PKG_CONFIG_PATH
-              directories to add to pkg-config's search path
-  PKG_CONFIG_LIBDIR
-              path overriding pkg-config's built-in search path
   PKGCONFIGINIT_CFLAGS
               C compiler flags for PKGCONFIGINIT, overriding pkg-config
   PKGCONFIGINIT_LIBS
@@ -11415,10 +11410,6 @@ $as_echo "$REALTIME" >&6; }
 pkg_config_init() {
 
 
-
-
-
-
 if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
        if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
@@ -11531,6 +11522,7 @@ $as_echo "yes" >&6; }
 $as_echo "no" >&6; }
                PKG_CONFIG=""
        fi
+
 fi
 
 pkg_failed=no
@@ -11573,8 +11565,6 @@ fi
 
 
 if test $pkg_failed = yes; then
-       { $as_echo "$as_me:$LINENO: result: no" >&5
-$as_echo "no" >&6; }
 
 if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
         _pkg_short_errors_supported=yes
        # Put the nasty error message in config.log where it belongs
        echo "$PKGCONFIGINIT_PKG_ERRORS" >&5
 
-       { $as_echo "$as_me:$LINENO: result: pkg-config initialized" >&5
+       { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+                { $as_echo "$as_me:$LINENO: result: pkg-config initialized" >&5
 $as_echo "pkg-config initialized" >&6; }
 elif test $pkg_failed = untried; then
-       { $as_echo "$as_me:$LINENO: result: no" >&5
-$as_echo "no" >&6; }
        { $as_echo "$as_me:$LINENO: result: pkg-config initialized" >&5
 $as_echo "pkg-config initialized" >&6; }
 else
@@ -11601,7 +11591,7 @@ else
        PKGCONFIGINIT_LIBS=$pkg_cv_PKGCONFIGINIT_LIBS
         { $as_echo "$as_me:$LINENO: result: yes" >&5
 $as_echo "yes" >&6; }
-
+       :
 fi
        PKGCONFIG_INIT=1
 }
@@ -11807,8 +11797,6 @@ fi
 
 
 if test $pkg_failed = yes; then
-       { $as_echo "$as_me:$LINENO: result: no" >&5
-$as_echo "no" >&6; }
 
 if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
         _pkg_short_errors_supported=yes
@@ -11823,7 +11811,9 @@ fi
        # Put the nasty error message in config.log where it belongs
        echo "$CCS_PKG_ERRORS" >&5
 
-       NOTFOUND=0
+       { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+                NOTFOUND=0
 
 for ac_header in ccs.h
 do
@@ -11980,8 +11970,6 @@ $as_echo "no pkg for libccs, using -lccs" >&6; }
                        HAVE_CCS=yes
                fi
 elif test $pkg_failed = untried; then
-       { $as_echo "$as_me:$LINENO: result: no" >&5
-$as_echo "no" >&6; }
        NOTFOUND=0
 
 for ac_header in ccs.h
@@ -12186,8 +12174,6 @@ fi
 
 
 if test $pkg_failed = yes; then
-       { $as_echo "$as_me:$LINENO: result: no" >&5
-$as_echo "no" >&6; }
 
 if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
         _pkg_short_errors_supported=yes
@@ -12202,7 +12188,9 @@ fi
        # Put the nasty error message in config.log where it belongs
        echo "$GULM_PKG_ERRORS" >&5
 
-       NOTFOUND=0
+       { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+                NOTFOUND=0
 
 for ac_header in libgulm.h
 do
@@ -12359,8 +12347,6 @@ $as_echo "no pkg for libgulm, using -lgulm" >&6; }
                        HAVE_GULM=yes
                fi
 elif test $pkg_failed = untried; then
-       { $as_echo "$as_me:$LINENO: result: no" >&5
-$as_echo "no" >&6; }
        NOTFOUND=0
 
 for ac_header in libgulm.h
@@ -12568,8 +12554,6 @@ fi
 
 
 if test $pkg_failed = yes; then
-       { $as_echo "$as_me:$LINENO: result: no" >&5
-$as_echo "no" >&6; }
 
 if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
         _pkg_short_errors_supported=yes
@@ -12584,7 +12568,9 @@ fi
        # Put the nasty error message in config.log where it belongs
        echo "$CMAN_PKG_ERRORS" >&5
 
-       NOTFOUND=0
+       { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+                NOTFOUND=0
 
 for ac_header in libcman.h
 do
@@ -12741,8 +12727,6 @@ $as_echo "no pkg for libcman, using -lcman" >&6; }
                        HAVE_CMAN=yes
                fi
 elif test $pkg_failed = untried; then
-       { $as_echo "$as_me:$LINENO: result: no" >&5
-$as_echo "no" >&6; }
        NOTFOUND=0
 
 for ac_header in libcman.h
@@ -12953,8 +12937,6 @@ fi
 
 
 if test $pkg_failed = yes; then
-       { $as_echo "$as_me:$LINENO: result: no" >&5
-$as_echo "no" >&6; }
 
 if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
         _pkg_short_errors_supported=yes
        # Put the nasty error message in config.log where it belongs
        echo "$COROSYNC_PKG_ERRORS" >&5
 
-       $bailout
-elif test $pkg_failed = untried; then
-       { $as_echo "$as_me:$LINENO: result: no" >&5
+       { $as_echo "$as_me:$LINENO: result: no" >&5
 $as_echo "no" >&6; }
+                $bailout
+elif test $pkg_failed = untried; then
        $bailout
 else
        COROSYNC_CFLAGS=$pkg_cv_COROSYNC_CFLAGS
@@ -13026,8 +13008,6 @@ fi
 
 
 if test $pkg_failed = yes; then
-       { $as_echo "$as_me:$LINENO: result: no" >&5
-$as_echo "no" >&6; }
 
 if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
         _pkg_short_errors_supported=yes
        # Put the nasty error message in config.log where it belongs
        echo "$QUORUM_PKG_ERRORS" >&5
 
-       $bailout
-elif test $pkg_failed = untried; then
-       { $as_echo "$as_me:$LINENO: result: no" >&5
+       { $as_echo "$as_me:$LINENO: result: no" >&5
 $as_echo "no" >&6; }
+                $bailout
+elif test $pkg_failed = untried; then
        $bailout
 else
        QUORUM_CFLAGS=$pkg_cv_QUORUM_CFLAGS
@@ -13100,8 +13080,6 @@ fi
 
 
 if test $pkg_failed = yes; then
-       { $as_echo "$as_me:$LINENO: result: no" >&5
-$as_echo "no" >&6; }
 
 if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
         _pkg_short_errors_supported=yes
        # Put the nasty error message in config.log where it belongs
        echo "$SALCK_PKG_ERRORS" >&5
 
-       $bailout
-elif test $pkg_failed = untried; then
-       { $as_echo "$as_me:$LINENO: result: no" >&5
+       { $as_echo "$as_me:$LINENO: result: no" >&5
 $as_echo "no" >&6; }
+                $bailout
+elif test $pkg_failed = untried; then
        $bailout
 else
        SALCK_CFLAGS=$pkg_cv_SALCK_CFLAGS
@@ -13175,8 +13153,6 @@ fi
 
 
 if test $pkg_failed = yes; then
-       { $as_echo "$as_me:$LINENO: result: no" >&5
-$as_echo "no" >&6; }
 
 if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
         _pkg_short_errors_supported=yes
        # Put the nasty error message in config.log where it belongs
        echo "$CONFDB_PKG_ERRORS" >&5
 
-       HAVE_CONFDB=no
-elif test $pkg_failed = untried; then
-       { $as_echo "$as_me:$LINENO: result: no" >&5
+       { $as_echo "$as_me:$LINENO: result: no" >&5
 $as_echo "no" >&6; }
+                HAVE_CONFDB=no
+elif test $pkg_failed = untried; then
        HAVE_CONFDB=no
 else
        CONFDB_CFLAGS=$pkg_cv_CONFDB_CFLAGS
@@ -13413,8 +13389,6 @@ fi
 
 
 if test $pkg_failed = yes; then
-       { $as_echo "$as_me:$LINENO: result: no" >&5
-$as_echo "no" >&6; }
 
 if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
         _pkg_short_errors_supported=yes
        # Put the nasty error message in config.log where it belongs
        echo "$CPG_PKG_ERRORS" >&5
 
-       $bailout
-elif test $pkg_failed = untried; then
-       { $as_echo "$as_me:$LINENO: result: no" >&5
+       { $as_echo "$as_me:$LINENO: result: no" >&5
 $as_echo "no" >&6; }
+                $bailout
+elif test $pkg_failed = untried; then
        $bailout
 else
        CPG_CFLAGS=$pkg_cv_CPG_CFLAGS
@@ -13485,8 +13459,6 @@ fi
 
 
 if test $pkg_failed = yes; then
-       { $as_echo "$as_me:$LINENO: result: no" >&5
-$as_echo "no" >&6; }
 
 if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
         _pkg_short_errors_supported=yes
@@ -13501,7 +13473,9 @@ fi
        # Put the nasty error message in config.log where it belongs
        echo "$DLM_PKG_ERRORS" >&5
 
-       NOTFOUND=0
+       { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+                NOTFOUND=0
 
 for ac_header in libdlm.h
 do
@@ -13658,8 +13632,6 @@ $as_echo "no pkg for libdlm, using -ldlm" >&6; }
                        HAVE_DLM=yes
                fi
 elif test $pkg_failed = untried; then
-       { $as_echo "$as_me:$LINENO: result: no" >&5
-$as_echo "no" >&6; }
        NOTFOUND=0
 
 for ac_header in libdlm.h
@@ -13861,6 +13833,23 @@ $as_echo "Disabling clvmd build. No cluster manager detected." >&6; }
        fi
 fi
 
+################################################################################
+if test "x$CLVMD" != xnone; then
+
+# Check whether --with-clvmd-pidfile was given.
+if test "${with_clvmd_pidfile+set}" = set; then
+  withval=$with_clvmd_pidfile; CLVMD_PIDFILE=$withval
+else
+  CLVMD_PIDFILE="/var/run/clvmd.pid"
+fi
+
+
+cat >>confdefs.h <<_ACEOF
+#define CLVMD_PIDFILE "$CLVMD_PIDFILE"
+_ACEOF
+
+fi
+
 ################################################################################
 { $as_echo "$as_me:$LINENO: checking whether to build cluster mirror log daemon" >&5
 $as_echo_n "checking whether to build cluster mirror log daemon... " >&6; }
@@ -13939,8 +13928,6 @@ fi
 
 
 if test $pkg_failed = yes; then
-       { $as_echo "$as_me:$LINENO: result: no" >&5
-$as_echo "no" >&6; }
 
 if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
         _pkg_short_errors_supported=yes
@@ -13964,7 +13951,8 @@ installed software in a non-standard prefix.
 
 Alternatively, you may set the environment variables SACKPT_CFLAGS
 and SACKPT_LIBS to avoid the need to call pkg-config.
-See the pkg-config man page for more details." >&5
+See the pkg-config man page for more details.
+" >&5
 $as_echo "$as_me: error: Package requirements (libSaCkpt) were not met:
 
 $SACKPT_PKG_ERRORS
@@ -13974,11 +13962,10 @@ installed software in a non-standard prefix.
 
 Alternatively, you may set the environment variables SACKPT_CFLAGS
 and SACKPT_LIBS to avoid the need to call pkg-config.
-See the pkg-config man page for more details." >&2;}
+See the pkg-config man page for more details.
+" >&2;}
    { (exit 1); exit 1; }; }
 elif test $pkg_failed = untried; then
-       { $as_echo "$as_me:$LINENO: result: no" >&5
-$as_echo "no" >&6; }
        { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
 { { $as_echo "$as_me:$LINENO: error: The pkg-config script could not be found or is too old.  Make sure it
@@ -14007,7 +13994,7 @@ else
        SACKPT_LIBS=$pkg_cv_SACKPT_LIBS
         { $as_echo "$as_me:$LINENO: result: yes" >&5
 $as_echo "yes" >&6; }
-
+       :
 fi
        if test x$HAVE_CPG != xyes; then
 
@@ -14051,8 +14038,6 @@ fi
 
 
 if test $pkg_failed = yes; then
-       { $as_echo "$as_me:$LINENO: result: no" >&5
-$as_echo "no" >&6; }
 
 if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
         _pkg_short_errors_supported=yes
@@ -14076,7 +14061,8 @@ installed software in a non-standard prefix.
 
 Alternatively, you may set the environment variables CPG_CFLAGS
 and CPG_LIBS to avoid the need to call pkg-config.
-See the pkg-config man page for more details." >&5
+See the pkg-config man page for more details.
+" >&5
 $as_echo "$as_me: error: Package requirements (libcpg) were not met:
 
 $CPG_PKG_ERRORS
@@ -14086,11 +14072,10 @@ installed software in a non-standard prefix.
 
 Alternatively, you may set the environment variables CPG_CFLAGS
 and CPG_LIBS to avoid the need to call pkg-config.
-See the pkg-config man page for more details." >&2;}
+See the pkg-config man page for more details.
+" >&2;}
    { (exit 1); exit 1; }; }
 elif test $pkg_failed = untried; then
-       { $as_echo "$as_me:$LINENO: result: no" >&5
-$as_echo "no" >&6; }
        { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
 { { $as_echo "$as_me:$LINENO: error: The pkg-config script could not be found or is too old.  Make sure it
@@ -14119,7 +14104,7 @@ else
        CPG_LIBS=$pkg_cv_CPG_LIBS
         { $as_echo "$as_me:$LINENO: result: yes" >&5
 $as_echo "yes" >&6; }
-
+       :
 fi
        fi
 fi
index 439444f168ed538506c58d10d547517113705611..6b5d65a3fdcd054be6e6a52799bdb737dc35e1af 100644 (file)
@@ -600,6 +600,18 @@ if test x$CLVMD = xall; then
        fi
 fi
 
+################################################################################
+dnl -- clvmd pidfile
+if test "x$CLVMD" != xnone; then
+       AC_ARG_WITH(clvmd-pidfile,
+                   AC_HELP_STRING([--with-clvmd-pidfile=PATH],
+                                  [clvmd pidfile [[/var/run/clvmd.pid]]]),
+                   CLVMD_PIDFILE=$withval,
+                   CLVMD_PIDFILE="/var/run/clvmd.pid")
+       AC_DEFINE_UNQUOTED(CLVMD_PIDFILE, ["$CLVMD_PIDFILE"],
+                          [Path to clvmd pidfile.])
+fi
+
 ################################################################################
 dnl -- Build cluster mirror log daemon
 AC_MSG_CHECKING(whether to build cluster mirror log daemon)
index edb134f2545515c4acfc5205bee190e5d5a556eb..4f5ed977c03d71285d0131743458cfc210aea28b 100644 (file)
@@ -271,6 +271,11 @@ static const char *decode_cmd(unsigned char cmdl)
        return buf;
 }
 
+static void remove_lockfile(void)
+{
+       unlink(CLVMD_PIDFILE);
+}
+
 int main(int argc, char *argv[])
 {
        int local_sock;
@@ -370,6 +375,14 @@ int main(int argc, char *argv[])
                be_daemon(start_timeout);
        }
 
+       /* Create pidfile */
+       if (dm_create_lockfile(CLVMD_PIDFILE) == 0) {
+               DEBUGLOG("clvmd: unable to create lockfile\n");
+               exit(1);
+       }
+
+       atexit(remove_lockfile);
+
        DEBUGLOG("CLVMD started\n");
 
        /* Open the Unix socket we listen for commands on.
index ee5e4dadf0a5849a9f631f71a5969e4ccad889ab..7e354d92beebe518b9e1fc1ecfedaf6addce9bc2 100644 (file)
@@ -65,49 +65,6 @@ static void parent_exit_handler(int sig __attribute__((unused)))
        exit_now = 1;
 }
 
-/*
- * create_lockfile - create and lock a lock file
- * @lockfile: location of lock file
- *
- * Returns: 0 on success, -1 otherwise
- */
-static int create_lockfile(const char *lockfile)
-{
-       int fd;
-       struct flock lock;
-       char buffer[50];
-
-       if((fd = open(lockfile, O_CREAT | O_WRONLY,
-                     (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH))) < 0)
-               return -errno;
-
-       lock.l_type = F_WRLCK;
-       lock.l_start = 0;
-       lock.l_whence = SEEK_SET;
-       lock.l_len = 0;
-
-       if (fcntl(fd, F_SETLK, &lock) < 0) {
-               close(fd);
-               return -errno;
-       }
-
-       if (ftruncate(fd, 0) < 0) {
-               close(fd);
-               return -errno;
-       }
-
-       sprintf(buffer, "%d\n", getpid());
-
-       /* FIXME Handle other non-error returns without aborting */
-       if (write(fd, buffer, strlen(buffer)) < strlen(buffer)){
-               close(fd);
-               unlink(lockfile);
-               return -errno;
-       }
-
-       return 0;
-}
-
 static void sig_handler(int sig)
 {
        /* FIXME Races - don't touch signal_mask here. */
@@ -162,6 +119,11 @@ static void process_signals(void)
        }
 }
 
+static void remove_lockfile(void)
+{
+       unlink(CMIRRORD_PIDFILE);
+}
+
 /*
  * daemonize
  *
@@ -226,9 +188,11 @@ static void daemonize(void)
 
        LOG_OPEN("cmirrord", LOG_PID, LOG_DAEMON);
 
-       if (create_lockfile(CMIRRORD_PIDFILE))
+       if (dm_create_lockfile(CMIRRORD_PIDFILE) == 0)
                exit(EXIT_LOCKFILE);
 
+       atexit(remove_lockfile);
+
        /* FIXME Replace with sigaction. (deprecated) */
        signal(SIGINT, &sig_handler);
        signal(SIGQUIT, &sig_handler);
index 1d79f98db75edfd0eb8b5b848e715a0ee71884d0..900f52b1188a46c007b2b969999589011e32bdb3 100644 (file)
@@ -394,26 +394,6 @@ static int _unlock_mutex(void)
        return pthread_mutex_unlock(&_global_mutex);
 }
 
-/* Store pid in pidfile. */
-static int _storepid(int lf)
-{
-       int len;
-       char pid[8];
-
-       if ((len = snprintf(pid, sizeof(pid), "%u\n", getpid())) < 0)
-               return 0;
-
-       if (len > (int) sizeof(pid))
-               len = (int) sizeof(pid);
-
-       if (write(lf, pid, (size_t) len) != len)
-               return 0;
-
-       fsync(lf);
-
-       return 1;
-}
-
 /* Check, if a device exists. */
 static int _fill_device_data(struct thread_status *ts)
 {
@@ -1541,23 +1521,6 @@ static void _exit_handler(int sig __attribute__((unused)))
 
 }
 
-static int _lock_pidfile(void)
-{
-       int lf;
-       char pidfile[] = DMEVENTD_PIDFILE;
-
-       if ((lf = open(pidfile, O_CREAT | O_RDWR, 0644)) < 0)
-               exit(EXIT_OPEN_PID_FAILURE);
-
-       if (flock(lf, LOCK_EX | LOCK_NB) < 0)
-               exit(EXIT_LOCKFILE_INUSE);
-
-       if (!_storepid(lf))
-               exit(EXIT_FAILURE);
-
-       return 0;
-}
-
 #ifdef linux
 /*
  * Protection against OOM killer if kernel supports it
@@ -1589,6 +1552,11 @@ static int _set_oom_adj(int val)
 }
 #endif
 
+static void remove_lockfile(void)
+{
+       unlink(DMEVENTD_PIDFILE);
+}
+
 static void _daemonize(void)
 {
        int child_status;
@@ -1626,12 +1594,8 @@ static void _daemonize(void)
 
                /* Problem with child.  Determine what it is by exit code */
                switch (WEXITSTATUS(child_status)) {
-               case EXIT_LOCKFILE_INUSE:
-                       fprintf(stderr, "Another dmeventd daemon is already running\n");
-                       break;
                case EXIT_DESC_CLOSE_FAILURE:
                case EXIT_DESC_OPEN_FAILURE:
-               case EXIT_OPEN_PID_FAILURE:
                case EXIT_FIFO_FAILURE:
                case EXIT_CHDIR_FAILURE:
                default:
@@ -1717,7 +1681,10 @@ int main(int argc, char *argv[])
 
        openlog("dmeventd", LOG_PID, LOG_DAEMON);
 
-       _lock_pidfile();                /* exits if failure */
+       if (dm_create_lockfile(DMEVENTD_PIDFILE) == 0)
+               exit(EXIT_FAILURE);
+
+       atexit(remove_lockfile);
 
        /* Set the rest of the signals to cause '_exit_now' to be set */
        signal(SIGINT, &_exit_handler);
index c8fe7469802eabbdb7bc78db6aa49484e6ad8eb3..0bf8082d0acd977813727e9e8734c30211b0ece6 100644 (file)
@@ -56,10 +56,10 @@ struct dm_event_fifos {
 
 /*      EXIT_SUCCESS             0 -- stdlib.h */
 /*      EXIT_FAILURE             1 -- stdlib.h */
-#define EXIT_LOCKFILE_INUSE      2
+/*      EXIT_LOCKFILE_INUSE      2 -- obsoleted */
 #define EXIT_DESC_CLOSE_FAILURE  3
 #define EXIT_DESC_OPEN_FAILURE   4
-#define EXIT_OPEN_PID_FAILURE    5
+/*      EXIT_OPEN_PID_FAILURE    5 -- obsoleted */
 #define EXIT_FIFO_FAILURE        6
 #define EXIT_CHDIR_FAILURE       7
 
index 4fc52fb29ce51a8412ac8dc8ed24a79b8a2e388e..01f668cef0362c11b77e998a0959090185c63049 100644 (file)
@@ -9,6 +9,9 @@
 /* Path to clvmd binary. */
 #undef CLVMD_PATH
 
+/* Path to clvmd pidfile. */
+#undef CLVMD_PIDFILE
+
 /* Path to cmirrord pidfile. */
 #undef CMIRRORD_PIDFILE
 
index 6e21faae9db43cf3b62647fc6df0c7fc22dac51f..101ffb7da8d6ea0ed404dbdbe453e5c9c3e838d4 100644 (file)
@@ -980,6 +980,14 @@ int dm_fclose(FILE *stream);
 int dm_asprintf(char **buf, const char *format, ...)
     __attribute__ ((format(printf, 2, 3)));
 
+/*
+ * create lockfile (pidfile) - create and lock a lock file
+ * @lockfile: location of lock file
+ *
+ * Returns: 1 on success, 0 otherwise, errno is handled internally
+ */
+int dm_create_lockfile(const char* lockfile);
+
 /*********************
  * regular expressions
  *********************/
index 749ee4f6b716cd0f30b5c605d306a16e3ec1f080..ae2da76dc3f678f59c5432cba17fd44013843c7c 100644 (file)
@@ -84,3 +84,85 @@ int dm_fclose(FILE *stream)
 
        return prev_fail || fclose_fail ? EOF : 0;
 }
+
+int dm_create_lockfile(const char *lockfile)
+{
+       int fd, value;
+       size_t bufferlen;
+       ssize_t write_out;
+       struct flock lock;
+       char buffer[50];
+
+       if((fd = open(lockfile, O_CREAT | O_WRONLY,
+                     (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH))) < 0) {
+               log_error("Cannot open lockfile [%s], error was [%s]",
+                         lockfile, strerror(errno));
+               return 0;
+       }
+
+       lock.l_type = F_WRLCK;
+       lock.l_start = 0;
+       lock.l_whence = SEEK_SET;
+       lock.l_len = 0;
+       if (fcntl(fd, F_SETLK, &lock) < 0) {
+               if (errno != EACCES && errno != EAGAIN)
+                       log_error("Cannot lock lockfile [%s], error was [%s]",
+                                  lockfile, strerror(errno));
+               else
+                       log_error("process is already running");
+
+               goto fail;
+       }
+
+       if (ftruncate(fd, 0) < 0) {
+               log_error("Cannot truncate pidfile [%s], error was [%s]",
+                         lockfile, strerror(errno));
+
+               goto fail;
+       }
+
+       memset(buffer, 0, sizeof(buffer));
+       snprintf(buffer, sizeof(buffer)-1, "%u\n", getpid());
+
+       bufferlen = strlen(buffer);
+       write_out = write(fd, buffer, bufferlen);
+
+       if ((write_out < 0) || (write_out == 0 && errno)) {
+               log_error("Cannot write pid to pidfile [%s], error was [%s]",
+                         lockfile, strerror(errno));
+
+               goto fail;
+       }
+
+       if ((write_out == 0) || (write_out < bufferlen)) {
+               log_error("Cannot write pid to pidfile [%s], shortwrite of"
+                         "[%" PRIsize_t "] bytes, expected [%" PRIsize_t "]\n",
+                         lockfile, write_out, bufferlen);
+
+               goto fail;
+       }
+
+       if ((value = fcntl(fd, F_GETFD, 0)) < 0) {
+               log_error("Cannot get close-on-exec flag from pidfile [%s], "
+                         "error was [%s]", lockfile, strerror(errno));
+
+               goto fail;
+       }
+       value |= FD_CLOEXEC;
+       if (fcntl(fd, F_SETFD, value) < 0) {
+               log_error("Cannot set close-on-exec flag from pidfile [%s], "
+                         "error was [%s]", lockfile, strerror(errno));
+
+               goto fail;
+       }
+
+       return 1;
+
+fail:
+       if (close(fd))
+               stack;
+       if (unlink(lockfile))
+               stack;
+
+       return 0;
+}
This page took 0.087077 seconds and 5 git commands to generate.