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