The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxcfs/pull/76

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===
Add a pidfile so that lxcfs.postinst can easily find the right lxcfs and send a SIGUSR1 to ask it to restart.

From 071109fd71c4cbe5b15e802be66a0dd0c26624d2 Mon Sep 17 00:00:00 2001
From: Serge Hallyn <serge.hal...@ubuntu.com>
Date: Wed, 3 Feb 2016 13:04:04 -0800
Subject: [PATCH 1/3] drop a debugging printf

Signed-off-by: Serge Hallyn <serge.hal...@ubuntu.com>
---
 bindings.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/bindings.c b/bindings.c
index ef96513..30fe31e 100644
--- a/bindings.c
+++ b/bindings.c
@@ -373,7 +373,6 @@ static bool store_hierarchy(char *stridx, char *h)
                size_t n = (num_hierarchies / ALLOC_NUM) + 1;
                n *= ALLOC_NUM;
                char **tmp = realloc(hierarchies, n * sizeof(char *));
-               printf("allocated %d\n", n);
                if (!tmp) {
                        fprintf(stderr, "Out of memory\n");
                        exit(1);

From e190ee91a070999180b780dbe1b769f91d769cdf Mon Sep 17 00:00:00 2001
From: Serge Hallyn <serge.hal...@ubuntu.com>
Date: Wed, 3 Feb 2016 13:24:11 -0800
Subject: [PATCH 2/3] Add a pidfile

and update testsuite to use pidfile

Signed-off-by: Serge Hallyn <serge.hal...@ubuntu.com>
---
 lxcfs.c              | 95 +++++++++++++++++++++++++++++++++++++++++++---------
 tests/main.sh        |  4 ++-
 tests/test_reload.sh |  4 ++-
 3 files changed, 86 insertions(+), 17 deletions(-)

diff --git a/lxcfs.c b/lxcfs.c
index c6bf62a..6e87c4c 100644
--- a/lxcfs.c
+++ b/lxcfs.c
@@ -661,7 +661,8 @@ static void usage(const char *me)
 {
        fprintf(stderr, "Usage:\n");
        fprintf(stderr, "\n");
-       fprintf(stderr, "%s mountpoint\n", me);
+       fprintf(stderr, "%s [-p pidfile] mountpoint\n", me);
+       fprintf(stderr, "  Default pidfile is %s/lxcfs.pid\n", RUNTIME_PATH);
        fprintf(stderr, "%s -h\n", me);
        exit(1);
 }
@@ -691,7 +692,7 @@ void swallow_arg(int *argcp, char *argv[], char *which)
        }
 }
 
-void swallow_option(int *argcp, char *argv[], char *opt, char *v)
+bool swallow_option(int *argcp, char *argv[], char *opt, char **v)
 {
        int i;
 
@@ -700,16 +701,16 @@ void swallow_option(int *argcp, char *argv[], char *opt, 
char *v)
                        continue;
                if (strcmp(argv[i], opt) != 0)
                        continue;
-               if (strcmp(argv[i+1], v) != 0) {
-                       fprintf(stderr, "Warning: unexpected fuse option %s\n", 
v);
-                       exit(1);
-               }
+               do {
+                       *v = strdup(argv[i+1]);
+               } while (!*v);
                for (; argv[i+1]; i++) {
                        argv[i] = argv[i+2];
                }
                (*argcp) -= 2;
-               return;
+               return true;
        }
+       return false;
 }
 
 static bool mkdir_p(const char *dir, mode_t mode)
@@ -833,9 +834,53 @@ static bool cgfs_setup_controllers(void)
        return true;
 }
 
+static int set_pidfile(char *pidfile)
+{
+       int fd;
+       char buf[50];
+       struct flock fl;
+
+       fl.l_type = F_WRLCK;
+       fl.l_whence = SEEK_SET;
+       fl.l_start = 0;
+       fl.l_len = 0;
+
+       fd = open(pidfile, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
+       if (fd == -1) {
+               fprintf(stderr, "Could not open pidfile %s: %m", pidfile);
+               return -1;
+       }
+
+       if (fcntl(fd, F_SETLK, &fl) == -1) {
+               if (errno  == EAGAIN || errno == EACCES) {
+                       fprintf(stderr, "PID file '%s' is already locked.\n", 
pidfile);
+                       close(fd);
+                       return -1;
+               }
+               fprintf(stderr, "Warning; unable to lock PID file, 
proceeding.\n");
+       }
+
+       if (ftruncate(fd, 0) == -1) {
+               fprintf(stderr, "Error truncating PID file '%s': %m", pidfile);
+               close(fd);
+               return -1;
+       }
+
+       snprintf(buf, 50, "%ld\n", (long) getpid());
+       if (write(fd, buf, strlen(buf)) != strlen(buf)) {
+               fprintf(stderr, "Error writing to PID file '%s': %m", pidfile);
+               close(fd);
+               return -1;
+       }
+
+       return fd;
+}
+
 int main(int argc, char *argv[])
 {
-       int ret = -1;
+       int ret = -1, pidfd;
+       char *pidfile = NULL, *v = NULL;
+       size_t pidfile_len;
        /*
         * what we pass to fuse_main is:
         * argv[0] -s -f -o allow_other,directio argv[1] NULL
@@ -843,12 +888,6 @@ int main(int argc, char *argv[])
        int nargs = 5, cnt = 0;
        char *newargv[6];
 
-       dlopen_handle = dlopen("liblxcfs.so", RTLD_LAZY);
-       if (!dlopen_handle) {
-               fprintf(stderr, "Failed to open liblxcfs\n");
-               exit(1);
-       }
-       signal(SIGUSR1, reload_handler);
 #ifdef FORTRAVIS
        /* for travis which runs on 12.04 */
        if (glib_check_version (2, 36, 0) != NULL)
@@ -858,7 +897,16 @@ int main(int argc, char *argv[])
        /* accomodate older init scripts */
        swallow_arg(&argc, argv, "-s");
        swallow_arg(&argc, argv, "-f");
-       swallow_option(&argc, argv, "-o", "allow_other");
+       if (swallow_option(&argc, argv, "-o", &v)) {
+               if (strcmp(v, "allow_other") != 0) {
+                       fprintf(stderr, "Warning: unexpected fuse option %s\n", 
v);
+                       exit(1);
+               }
+               free(v);
+               v = NULL;
+       }
+       if (swallow_option(&argc, argv, "-p", &v))
+               pidfile = v;
 
        if (argc == 2  && strcmp(argv[1], "--version") == 0) {
                fprintf(stderr, "%s\n", VERSION);
@@ -867,6 +915,13 @@ int main(int argc, char *argv[])
        if (argc != 2 || is_help(argv[1]))
                usage(argv[0]);
 
+       dlopen_handle = dlopen("liblxcfs.so", RTLD_LAZY);
+       if (!dlopen_handle) {
+               fprintf(stderr, "Failed to open liblxcfs\n");
+               exit(1);
+       }
+       signal(SIGUSR1, reload_handler);
+
        newargv[cnt++] = argv[0];
        newargv[cnt++] = "-f";
        newargv[cnt++] = "-o";
@@ -877,9 +932,19 @@ int main(int argc, char *argv[])
        if (!cgfs_setup_controllers())
                goto out;
 
+       if (!pidfile) {
+               pidfile_len = strlen(RUNTIME_PATH) + strlen("/lxcfs.pid") + 1;
+               pidfile = alloca(pidfile_len);
+               snprintf(pidfile, pidfile_len, "%s/lxcfs.pid", RUNTIME_PATH);
+       }
+       if ((pidfd = set_pidfile(pidfile)) < 0)
+               goto out;
+
        ret = fuse_main(nargs, newargv, &lxcfs_ops, NULL);
 
        dlclose(dlopen_handle);
+       unlink(pidfile);
+       close(pidfd);
 
 out:
        return ret;
diff --git a/tests/main.sh b/tests/main.sh
index 95c2f3c..01a900b 100755
--- a/tests/main.sh
+++ b/tests/main.sh
@@ -6,6 +6,7 @@ set -ex
 
 # Run lxcfs testsuite
 export LXCFSDIR=$(mktemp -d)
+pidfile=$(mktemp)
 
 cmdline=$(realpath $0)
 dirname=$(dirname ${cmdline})
@@ -22,6 +23,7 @@ cleanup() {
                umount -l ${LXCFSDIR}
                rmdir ${LXCFSDIR}
        fi
+       rm -f ${pidfile}
        if [ ${FAILED} -eq 1 ]; then
                echo "FAILED at $TESTCASE"
                exit 1
@@ -35,7 +37,7 @@ lxcfs=${topdir}/lxcfs
 
 if [ -x ${lxcfs} ]; then
        echo "Running ${lxcfs} ${LXCFSDIR}"
-       ${lxcfs} ${LXCFSDIR} &
+       ${lxcfs} -p ${pidfile} ${LXCFSDIR} &
        p=$!
 else
        pidof lxcfs
diff --git a/tests/test_reload.sh b/tests/test_reload.sh
index e48124a..4560ba2 100755
--- a/tests/test_reload.sh
+++ b/tests/test_reload.sh
@@ -10,6 +10,7 @@ topdir=$(dirname ${dirname})
 
 testdir=`mktemp -t -d libs.XXX`
 installdir=`mktemp -t -d libs.XXX`
+pidfile=$(mktemp)
 libdir=${installdir}/usr/lib
 bindir=${installdir}/usr/bin
 lxcfspid=-1
@@ -26,6 +27,7 @@ cleanup() {
   fi
   rm -rf ${testdir} ${installdir}
   rm -f iwashere
+  rm -f ${pidfile}
   if [ ${FAILED} -eq 1 ]; then
     echo "liblxcfs.so reload test FAILED"
   else
@@ -38,7 +40,7 @@ trap cleanup EXIT SIGHUP SIGINT SIGTERM
 ( cd ${topdir}; DESTDIR=${installdir} make install )
 export LD_LIBRARY_PATH=${libdir}
 
-${bindir}/lxcfs ${testdir} &
+${bindir}/lxcfs -p ${pidfile} ${testdir} &
 lxcfspid=$!
 count=1
 while [ ! -d ${testdir}/proc ]; do

From 3affb0c9537c9dd5853a987c865c1952b48728e9 Mon Sep 17 00:00:00 2001
From: Serge Hallyn <serge.hal...@ubuntu.com>
Date: Wed, 3 Feb 2016 13:25:19 -0800
Subject: [PATCH 3/3] drop glibc travis exceptions - we don't use glibc any
 more

Signed-off-by: Serge Hallyn <serge.hal...@ubuntu.com>
---
 bindings.c |  5 -----
 lxcfs.c    | 11 -----------
 2 files changed, 16 deletions(-)

diff --git a/bindings.c b/bindings.c
index 30fe31e..4bb0631 100644
--- a/bindings.c
+++ b/bindings.c
@@ -28,11 +28,6 @@
 #include <sys/epoll.h>
 #include <wait.h>
 
-#ifdef FORTRAVIS
-#define GLIB_DISABLE_DEPRECATION_WARNINGS
-#include <glib-object.h>
-#endif
-
 #include "bindings.h"
 
 #include "config.h" // for VERSION
diff --git a/lxcfs.c b/lxcfs.c
index 6e87c4c..1d1016c 100644
--- a/lxcfs.c
+++ b/lxcfs.c
@@ -28,11 +28,6 @@
 #include <sys/epoll.h>
 #include <wait.h>
 
-#ifdef FORTRAVIS
-#define GLIB_DISABLE_DEPRECATION_WARNINGS
-#include <glib-object.h>
-#endif
-
 #include "config.h" // for VERSION
 #include "bindings.h"
 
@@ -888,12 +883,6 @@ int main(int argc, char *argv[])
        int nargs = 5, cnt = 0;
        char *newargv[6];
 
-#ifdef FORTRAVIS
-       /* for travis which runs on 12.04 */
-       if (glib_check_version (2, 36, 0) != NULL)
-               g_type_init ();
-#endif
-
        /* accomodate older init scripts */
        swallow_arg(&argc, argv, "-s");
        swallow_arg(&argc, argv, "-f");
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to