The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxcfs/pull/338
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) === Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
From 486768f0f6d481ea6995a2e09bf31302c522e596 Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Mon, 2 Mar 2020 10:00:32 +0100 Subject: [PATCH 1/8] bindings: cleanup send_creds_clone_wrapper() Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- bindings.c | 21 +++++++++------------ macro.h | 1 + 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/bindings.c b/bindings.c index 128a504..3633fab 100644 --- a/bindings.c +++ b/bindings.c @@ -301,18 +301,15 @@ static struct pidns_init_store *lookup_verify_initpid(struct stat *sb) static int send_creds_clone_wrapper(void *arg) { - struct ucred cred; - char v; - int sock = *(int *)arg; - - /* we are the child */ - cred.uid = 0; - cred.gid = 0; - cred.pid = 1; - v = '1'; - if (send_creds(sock, &cred, v, true) != SEND_CREDS_OK) - return 1; - return 0; + int sock = PTR_TO_INT(arg); + char v = '1'; /* we are the child */ + struct ucred cred = { + .uid = 0, + .gid = 0, + .pid = 1, + }; + + return send_creds(sock, &cred, v, true) != SEND_CREDS_OK; } /* diff --git a/macro.h b/macro.h index b4277cb..15eb1f0 100644 --- a/macro.h +++ b/macro.h @@ -95,6 +95,7 @@ _exit(EXIT_FAILURE); \ }) +#define PTR_TO_INT(p) ((int)((intptr_t)(p))) #define PTR_TO_UINT64(p) ((uint64_t)((intptr_t)(p))) #define INTTYPE_TO_PTR(u) ((void *)((intptr_t)(u))) From 8d601ae224f89d58534656812489098f8a85a8c9 Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Tue, 3 Mar 2020 10:28:26 +0100 Subject: [PATCH 2/8] cpuset_parse: cleanup Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- cpuset_parse.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/cpuset_parse.c b/cpuset_parse.c index efecd30..f67f557 100644 --- a/cpuset_parse.c +++ b/cpuset_parse.c @@ -30,10 +30,10 @@ */ static char *cpuset_nexttok(const char *c) { - char *r = strchr(c+1, ','); - if (r) - return r+1; - return NULL; + char *r; + + r = strchr(c + 1, ','); + return r ? (r + 1) : NULL; } static int cpuset_getrange(const char *c, int *a, int *b) @@ -50,15 +50,14 @@ static int cpuset_getrange(const char *c, int *a, int *b) */ bool cpu_in_cpuset(int cpu, const char *cpuset) { - const char *c; - - for (c = cpuset; c; c = cpuset_nexttok(c)) { + for (const char *c = cpuset; c; c = cpuset_nexttok(c)) { int a, b, ret; ret = cpuset_getrange(c, &a, &b); - if (ret == 1 && cpu == a) // "1" or "1,6" + if (ret == 1 && cpu == a) /* "1" or "1,6" */ return true; - else if (ret == 2 && cpu >= a && cpu <= b) // range match + + if (ret == 2 && cpu >= a && cpu <= b) /* range match */ return true; } @@ -70,17 +69,17 @@ bool cpu_in_cpuset(int cpu, const char *cpuset) */ int cpu_number_in_cpuset(const char *cpuset) { - const char *c; int cpu_number = 0; - for (c = cpuset; c; c = cpuset_nexttok(c)) { + for (const char *c = cpuset; c; c = cpuset_nexttok(c)) { int a, b, ret; ret = cpuset_getrange(c, &a, &b); if (ret == 1) cpu_number++; else if (ret == 2) - cpu_number += a > b ? a - b + 1 : b - a + 1; + cpu_number += a > b ? a - b + 1 : b - a + 1; } + return cpu_number; } From c5369bf87a40f3c8e51ff68534fa5197374cbddf Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Tue, 3 Mar 2020 10:32:28 +0100 Subject: [PATCH 3/8] proc_cpuview: remove alloca() Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- proc_cpuview.c | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/proc_cpuview.c b/proc_cpuview.c index 9551987..6212547 100644 --- a/proc_cpuview.c +++ b/proc_cpuview.c @@ -239,24 +239,15 @@ static struct cg_proc_stat *new_proc_stat_node(struct cpuacct_usage *usage, int static bool cgfs_param_exist(const char *controller, const char *cgroup, const char *file) { - int ret, cfd; - size_t len; - char *fnam; + __do_free char *path = NULL; + int cfd; cfd = get_cgroup_fd(controller); if (cfd < 0) return false; - /* Make sure we pass a relative path to *at() family of functions. - * . + /cgroup + / + file + \0 - */ - len = strlen(cgroup) + strlen(file) + 3; - fnam = alloca(len); - ret = snprintf(fnam, len, "%s%s/%s", dot_or_empty(cgroup), cgroup, file); - if (ret < 0 || (size_t)ret >= len) - return false; - - return (faccessat(cfd, fnam, F_OK, 0) == 0); + path = must_make_path(dot_or_empty(cgroup), cgroup, file); + return (faccessat(cfd, path, F_OK, 0) == 0); } static struct cg_proc_stat *prune_proc_stat_list(struct cg_proc_stat *node) From 71d0e47f74642e152ec8858c1a9a4eb9b3f83a60 Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Tue, 3 Mar 2020 10:53:20 +0100 Subject: [PATCH 4/8] lxcfs: replace alloca() Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- lxcfs.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lxcfs.c b/lxcfs.c index fa614f8..095cd92 100644 --- a/lxcfs.c +++ b/lxcfs.c @@ -1087,7 +1087,7 @@ int main(int argc, char *argv[]) int ret = EXIT_FAILURE; int pidfd = -1; char *pidfile = NULL, *saveptr = NULL, *token = NULL, *v = NULL; - size_t pidfile_len; + char pidfile_buf[STRLITERALLEN(RUNTIME_PATH) + STRLITERALLEN("/lxcfs.pid") + 1] = {}; bool debug = false, nonempty = false; bool load_use = false; /* @@ -1165,9 +1165,8 @@ int main(int argc, char *argv[]) newargv[cnt++] = NULL; if (!pidfile) { - pidfile_len = strlen(RUNTIME_PATH) + strlen("/lxcfs.pid") + 1; - pidfile = alloca(pidfile_len); - snprintf(pidfile, pidfile_len, "%s/lxcfs.pid", RUNTIME_PATH); + snprintf(pidfile_buf, sizeof(pidfile_buf), "%s/lxcfs.pid", RUNTIME_PATH); + pidfile = pidfile_buf; } if ((pidfd = set_pidfile(pidfile)) < 0) goto out; From 151ad6e98800698aed3df97b0ce72858dbacdc4b Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Tue, 3 Mar 2020 11:03:00 +0100 Subject: [PATCH 5/8] lxcfs: cleanup mutex Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- lxcfs.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/lxcfs.c b/lxcfs.c index 095cd92..aee49ad 100644 --- a/lxcfs.c +++ b/lxcfs.c @@ -53,28 +53,26 @@ static void lock_mutex(pthread_mutex_t *l) { int ret; - if ((ret = pthread_mutex_lock(l)) != 0) { - lxcfs_error("returned:%d %s\n", ret, strerror(ret)); - exit(1); - } + ret = pthread_mutex_lock(l); + if (ret) + log_exit("%s - returned: %d\n", strerror(ret), ret); } static void unlock_mutex(pthread_mutex_t *l) { int ret; - if ((ret = pthread_mutex_unlock(l)) != 0) { - lxcfs_error("returned:%d %s\n", ret, strerror(ret)); - exit(1); - } + ret = pthread_mutex_unlock(l); + if (ret) + log_exit("%s - returned: %d\n", strerror(ret), ret); } -static void users_lock(void) +static inline void users_lock(void) { lock_mutex(&user_count_mutex); } -static void users_unlock(void) +static inline void users_unlock(void) { unlock_mutex(&user_count_mutex); } From df410247cde13f5b1f9755c4bc53103ceb3aaf3f Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Tue, 3 Mar 2020 13:33:59 +0100 Subject: [PATCH 6/8] lxcfs: improve logs Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- lxcfs.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/lxcfs.c b/lxcfs.c index aee49ad..2a35eb5 100644 --- a/lxcfs.c +++ b/lxcfs.c @@ -123,34 +123,38 @@ static volatile sig_atomic_t need_reload; * lock and when we know the user_count was 0 */ static void do_reload(void) { + int ret; char lxcfs_lib_path[PATH_MAX]; if (loadavg_pid > 0) stop_loadavg(); if (dlopen_handle) { - lxcfs_debug("%s\n", "Closing liblxcfs.so handle."); + lxcfs_debug("%s\n", "Closing liblxcfs.so handle"); dlclose(dlopen_handle); } /* First try loading using ld.so */ dlopen_handle = dlopen("liblxcfs.so", RTLD_LAZY); if (dlopen_handle) { - lxcfs_debug("%s\n", "Successfully called dlopen() on liblxcfs.so."); + lxcfs_debug("%s\n", "Successfully called dlopen() on liblxcfs.so"); goto good; } #ifdef LIBDIR /* LIBDIR: autoconf will setup this MACRO. Default value is $PREFIX/lib */ - snprintf(lxcfs_lib_path, PATH_MAX, "%s/lxcfs/liblxcfs.so", LIBDIR); + ret = snprintf(lxcfs_lib_path, sizeof(lxcfs_lib_path), "%s/lxcfs/liblxcfs.so", LIBDIR); #else - snprintf(lxcfs_lib_path, PATH_MAX, "/usr/local/lib/lxcfs/liblxcfs.so"); + ret = snprintf(lxcfs_lib_path, sizeof(lxcfs_lib_path), "/usr/local/lib/lxcfs/liblxcfs.so"); #endif + if (ret < 0 || ret >= sizeof(lxcfs_lib_path)) + log_exit("Failed to create path to open liblxcfs"); + dlopen_handle = dlopen(lxcfs_lib_path, RTLD_LAZY); - if (!dlopen_handle) { - lxcfs_error("Failed to open liblxcfs.so: %s.\n", dlerror()); - _exit(1); - } + if (!dlopen_handle) + log_exit("%s - Failed to open liblxcfs.so", dlerror()); + else + lxcfs_debug("Successfully called dlopen() on %s", lxcfs_lib_path); good: if (loadavg_pid > 0) From f0154bbf75d02aab6b80e84eb201b58f834b0bd3 Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Tue, 3 Mar 2020 13:36:00 +0100 Subject: [PATCH 7/8] lxcfs: use cleanup macro for pidfile fd Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- lxcfs.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lxcfs.c b/lxcfs.c index 2a35eb5..651c024 100644 --- a/lxcfs.c +++ b/lxcfs.c @@ -1086,8 +1086,8 @@ static int set_pidfile(char *pidfile) int main(int argc, char *argv[]) { + __do_close_prot_errno int pidfile_fd = -EBADF; int ret = EXIT_FAILURE; - int pidfd = -1; char *pidfile = NULL, *saveptr = NULL, *token = NULL, *v = NULL; char pidfile_buf[STRLITERALLEN(RUNTIME_PATH) + STRLITERALLEN("/lxcfs.pid") + 1] = {}; bool debug = false, nonempty = false; @@ -1170,7 +1170,9 @@ int main(int argc, char *argv[]) snprintf(pidfile_buf, sizeof(pidfile_buf), "%s/lxcfs.pid", RUNTIME_PATH); pidfile = pidfile_buf; } - if ((pidfd = set_pidfile(pidfile)) < 0) + + pidfile_fd = set_pidfile(pidfile); + if (pidfile_fd < 0) goto out; if (load_use && start_loadavg() != 0) @@ -1186,7 +1188,5 @@ int main(int argc, char *argv[]) dlclose(dlopen_handle); if (pidfile) unlink(pidfile); - if (pidfd > 0) - close(pidfd); exit(ret); } From ece2b1c66e42b7967b0bc35d652270e3a3f2e2e3 Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Tue, 3 Mar 2020 14:19:08 +0100 Subject: [PATCH 8/8] lxcfs: cleanup Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- lxcfs.c | 599 +++++++++++++++++++++++++++----------------------------- macro.h | 6 + 2 files changed, 293 insertions(+), 312 deletions(-) diff --git a/lxcfs.c b/lxcfs.c index 651c024..26940e9 100644 --- a/lxcfs.c +++ b/lxcfs.c @@ -80,38 +80,36 @@ static inline void users_unlock(void) static pthread_t loadavg_pid = 0; /* Returns zero on success */ -static int start_loadavg(void) { +static int start_loadavg(void) +{ char *error; pthread_t (*__load_daemon)(int); - dlerror(); /* Clear any existing error */ - - __load_daemon = (pthread_t (*)(int)) dlsym(dlopen_handle, "load_daemon"); + dlerror(); + __load_daemon = (pthread_t(*)(int))dlsym(dlopen_handle, "load_daemon"); error = dlerror(); - if (error != NULL) { - lxcfs_error("load_daemon fails:%s\n", error); - return -1; - } + if (error) + return log_error(-1, "%s - Failed to start loadavg daemon", error); + loadavg_pid = __load_daemon(1); - if (loadavg_pid == 0) + if (!loadavg_pid) return -1; return 0; } /* Returns zero on success */ -static int stop_loadavg(void) { +static int stop_loadavg(void) +{ char *error; int (*__stop_load_daemon)(pthread_t); - __stop_load_daemon = (int (*)(pthread_t)) dlsym(dlopen_handle, "stop_load_daemon"); + __stop_load_daemon = (int (*)(pthread_t))dlsym(dlopen_handle, "stop_load_daemon"); error = dlerror(); - if (error != NULL) { - lxcfs_error("stop_load_daemon error: %s\n", error); - return -1; - } + if (error) + return log_error(-1, "%s - Failed to stop loadavg daemon", error); - if (__stop_load_daemon(loadavg_pid) != 0) + if (__stop_load_daemon(loadavg_pid)) return -1; return 0; @@ -189,63 +187,58 @@ static void reload_handler(int sig) /* Functions to run the library methods */ static int do_cg_getattr(const char *path, struct stat *sb) { - int (*__cg_getattr)(const char *path, struct stat *sb); char *error; - dlerror(); /* Clear any existing error */ - __cg_getattr = (int (*)(const char *, struct stat *)) dlsym(dlopen_handle, "cg_getattr"); + int (*__cg_getattr)(const char *path, struct stat *sb); + + dlerror(); + __cg_getattr = (int (*)(const char *, struct stat *))dlsym(dlopen_handle, "cg_getattr"); error = dlerror(); - if (error != NULL) { - lxcfs_error("%s\n", error); - return -1; - } + if (error) + return log_error(-1, "%s - Failed to find cg_getattr() %s", error); return __cg_getattr(path, sb); } static int do_proc_getattr(const char *path, struct stat *sb) { - int (*__proc_getattr)(const char *path, struct stat *sb); char *error; - dlerror(); /* Clear any existing error */ + int (*__proc_getattr)(const char *path, struct stat *sb); + + dlerror(); __proc_getattr = (int (*)(const char *, struct stat *)) dlsym(dlopen_handle, "proc_getattr"); error = dlerror(); - if (error != NULL) { - lxcfs_error("%s\n", error); - return -1; - } + if (error) + return log_error(-1, "%s - Failed to find proc_getattr() %s", error); return __proc_getattr(path, sb); } static int do_sys_getattr(const char *path, struct stat *sb) { - int (*__sys_getattr)(const char *path, struct stat *sb); char *error; - dlerror(); /* Clear any existing error */ + int (*__sys_getattr)(const char *path, struct stat *sb); + + dlerror(); __sys_getattr = (int (*)(const char *, struct stat *)) dlsym(dlopen_handle, "sys_getattr"); error = dlerror(); - if (error != NULL) { - lxcfs_error("%s\n", error); - return -1; - } + if (error) + return log_error(-1, "%s - Failed to find sys_getattr() %s", error); return __sys_getattr(path, sb); } static int do_cg_read(const char *path, char *buf, size_t size, off_t offset, - struct fuse_file_info *fi) + struct fuse_file_info *fi) { + char *error; int (*__cg_read)(const char *path, char *buf, size_t size, off_t offset, struct fuse_file_info *fi); - char *error; - dlerror(); /* Clear any existing error */ - __cg_read = (int (*)(const char *, char *, size_t, off_t, struct fuse_file_info *)) dlsym(dlopen_handle, "cg_read"); + dlerror(); + __cg_read = (int (*)(const char *, char *, size_t, off_t, struct fuse_file_info *))dlsym(dlopen_handle, "cg_read"); error = dlerror(); - if (error != NULL) { - lxcfs_error("%s\n", error); - return -1; - } + if (error) + return log_error(-1, "%s - Failed to find cg_read() %s", error); return __cg_read(path, buf, size, offset, fi); } @@ -253,116 +246,103 @@ static int do_cg_read(const char *path, char *buf, size_t size, off_t offset, static int do_proc_read(const char *path, char *buf, size_t size, off_t offset, struct fuse_file_info *fi) { + char *error; int (*__proc_read)(const char *path, char *buf, size_t size, off_t offset, struct fuse_file_info *fi); - char *error; - dlerror(); /* Clear any existing error */ - __proc_read = (int (*)(const char *, char *, size_t, off_t, struct fuse_file_info *)) dlsym(dlopen_handle, "proc_read"); + dlerror(); + __proc_read = (int (*)(const char *, char *, size_t, off_t, struct fuse_file_info *))dlsym(dlopen_handle, "proc_read"); error = dlerror(); - if (error != NULL) { - lxcfs_error("%s\n", error); - return -1; - } + if (error) + return log_error(-1, "%s - Failed to find proc_read() %s", error); return __proc_read(path, buf, size, offset, fi); } static int do_sys_read(const char *path, char *buf, size_t size, off_t offset, - struct fuse_file_info *fi) + struct fuse_file_info *fi) { + char *error; int (*__sys_read)(const char *path, char *buf, size_t size, off_t offset, struct fuse_file_info *fi); - char *error; - dlerror(); /* Clear any existing error */ - __sys_read = (int (*)(const char *, char *, size_t, off_t, struct fuse_file_info *)) dlsym(dlopen_handle, "sys_read"); + dlerror(); + __sys_read = (int (*)(const char *, char *, size_t, off_t, struct fuse_file_info *))dlsym(dlopen_handle, "sys_read"); error = dlerror(); - if (error != NULL) { - lxcfs_error("%s\n", error); - return -1; - } + if (error) + return log_error(-1, "%s - Failed to find sys_read() %s", error); return __sys_read(path, buf, size, offset, fi); } -static int do_cg_write(const char *path, const char *buf, size_t size, off_t offset, - struct fuse_file_info *fi) +static int do_cg_write(const char *path, const char *buf, size_t size, + off_t offset, struct fuse_file_info *fi) { + char *error; int (*__cg_write)(const char *path, const char *buf, size_t size, off_t offset, struct fuse_file_info *fi); - char *error; - dlerror(); /* Clear any existing error */ - __cg_write = (int (*)(const char *, const char *, size_t, off_t, struct fuse_file_info *)) dlsym(dlopen_handle, "cg_write"); + + dlerror(); + __cg_write = (int (*)(const char *, const char *, size_t, off_t, struct fuse_file_info *))dlsym(dlopen_handle, "cg_write"); error = dlerror(); - if (error != NULL) { - lxcfs_error("%s\n", error); - return -1; - } + if (error) + return log_error(-1, "%s - Failed to find cg_write() %s", error); return __cg_write(path, buf, size, offset, fi); } static int do_cg_mkdir(const char *path, mode_t mode) { - int (*__cg_mkdir)(const char *path, mode_t mode); char *error; + int (*__cg_mkdir)(const char *path, mode_t mode); - dlerror(); /* Clear any existing error */ - __cg_mkdir = (int (*)(const char *, mode_t)) dlsym(dlopen_handle, "cg_mkdir"); + dlerror(); + __cg_mkdir = (int (*)(const char *, mode_t))dlsym(dlopen_handle, "cg_mkdir"); error = dlerror(); - if (error != NULL) { - lxcfs_error("%s\n", error); - return -1; - } + if (error) + return log_error(-1, "%s - Failed to find cg_mkdir() %s", error); return __cg_mkdir(path, mode); } static int do_cg_chown(const char *path, uid_t uid, gid_t gid) { - int (*__cg_chown)(const char *path, uid_t uid, gid_t gid); char *error; + int (*__cg_chown)(const char *path, uid_t uid, gid_t gid); - dlerror(); /* Clear any existing error */ - __cg_chown = (int (*)(const char *, uid_t, gid_t)) dlsym(dlopen_handle, "cg_chown"); + dlerror(); + __cg_chown = (int (*)(const char *, uid_t, gid_t))dlsym(dlopen_handle, "cg_chown"); error = dlerror(); - if (error != NULL) { - lxcfs_error("%s\n", error); - return -1; - } + if (error) + return log_error(-1, "%s - Failed to find cg_chown() %s", error); return __cg_chown(path, uid, gid); } static int do_cg_rmdir(const char *path) { - int (*__cg_rmdir)(const char *path); char *error; + int (*__cg_rmdir)(const char *path); - dlerror(); /* Clear any existing error */ - __cg_rmdir = (int (*)(const char *path)) dlsym(dlopen_handle, "cg_rmdir"); + dlerror(); + __cg_rmdir = (int (*)(const char *path))dlsym(dlopen_handle, "cg_rmdir"); error = dlerror(); - if (error != NULL) { - lxcfs_error("%s\n", error); - return -1; - } + if (error) + return log_error(-1, "%s - Failed to find cg_rmdir() %s", error); return __cg_rmdir(path); } static int do_cg_chmod(const char *path, mode_t mode) { - int (*__cg_chmod)(const char *path, mode_t mode); char *error; + int (*__cg_chmod)(const char *path, mode_t mode); - dlerror(); /* Clear any existing error */ - __cg_chmod = (int (*)(const char *, mode_t)) dlsym(dlopen_handle, "cg_chmod"); + dlerror(); + __cg_chmod = (int (*)(const char *, mode_t))dlsym(dlopen_handle, "cg_chmod"); error = dlerror(); - if (error != NULL) { - lxcfs_error("%s\n", error); - return -1; - } + if (error) + return log_error(-1, "%s - Failed to find cg_chmod() %s", error); return __cg_chmod(path, mode); } @@ -370,17 +350,15 @@ static int do_cg_chmod(const char *path, mode_t mode) static int do_cg_readdir(const char *path, void *buf, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi) { + char *error; int (*__cg_readdir)(const char *path, void *buf, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi); - char *error; - dlerror(); /* Clear any existing error */ - __cg_readdir = (int (*)(const char *, void *, fuse_fill_dir_t, off_t, struct fuse_file_info *)) dlsym(dlopen_handle, "cg_readdir"); + dlerror(); + __cg_readdir = (int (*)(const char *, void *, fuse_fill_dir_t, off_t, struct fuse_file_info *))dlsym(dlopen_handle, "cg_readdir"); error = dlerror(); - if (error != NULL) { - lxcfs_error("%s\n", error); - return -1; - } + if (error) + return log_error(-1, "%s - Failed to find cg_readdir() %s", error); return __cg_readdir(path, buf, filler, offset, fi); } @@ -388,17 +366,15 @@ static int do_cg_readdir(const char *path, void *buf, fuse_fill_dir_t filler, static int do_proc_readdir(const char *path, void *buf, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi) { + char *error; int (*__proc_readdir)(const char *path, void *buf, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi); - char *error; - dlerror(); /* Clear any existing error */ - __proc_readdir = (int (*)(const char *, void *, fuse_fill_dir_t, off_t, struct fuse_file_info *)) dlsym(dlopen_handle, "proc_readdir"); + dlerror(); + __proc_readdir = (int (*)(const char *, void *, fuse_fill_dir_t, off_t, struct fuse_file_info *))dlsym(dlopen_handle, "proc_readdir"); error = dlerror(); - if (error != NULL) { - lxcfs_error("%s\n", error); - return -1; - } + if (error) + return log_error(-1, "%s - Failed to find proc_readdir() %s", error); return __proc_readdir(path, buf, filler, offset, fi); } @@ -406,17 +382,15 @@ static int do_proc_readdir(const char *path, void *buf, fuse_fill_dir_t filler, static int do_sys_readdir(const char *path, void *buf, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi) { - int (*__sys_readdir)(const char *path, void *buf, fuse_fill_dir_t filler, off_t offset, - struct fuse_file_info *fi); char *error; + int (*__sys_readdir)(const char *path, void *buf, fuse_fill_dir_t filler, + off_t offset, struct fuse_file_info *fi); - dlerror(); /* Clear any existing error */ - __sys_readdir = (int (*)(const char *, void *, fuse_fill_dir_t, off_t, struct fuse_file_info *)) dlsym(dlopen_handle, "sys_readdir"); + dlerror(); + __sys_readdir = (int (*)(const char *, void *, fuse_fill_dir_t, off_t, struct fuse_file_info *))dlsym(dlopen_handle, "sys_readdir"); error = dlerror(); - if (error != NULL) { - lxcfs_error("%s\n", error); - return -1; - } + if (error) + return log_error(-1, "%s - Failed to find sys_readdir() %s", error); return __sys_readdir(path, buf, filler, offset, fi); } @@ -424,190 +398,172 @@ static int do_sys_readdir(const char *path, void *buf, fuse_fill_dir_t filler, static int do_cg_open(const char *path, struct fuse_file_info *fi) { - int (*__cg_open)(const char *path, struct fuse_file_info *fi); char *error; - dlerror(); /* Clear any existing error */ - __cg_open = (int (*)(const char *, struct fuse_file_info *)) dlsym(dlopen_handle, "cg_open"); + int (*__cg_open)(const char *path, struct fuse_file_info *fi); + + dlerror(); + __cg_open = (int (*)(const char *, struct fuse_file_info *))dlsym(dlopen_handle, "cg_open"); error = dlerror(); - if (error != NULL) { - lxcfs_error("%s\n", error); - return -1; - } + if (error) + return log_error(-1, "%s - Failed to find cg_open() %s", error); return __cg_open(path, fi); } static int do_cg_access(const char *path, int mode) { - int (*__cg_access)(const char *path, int mode); char *error; - dlerror(); /* Clear any existing error */ - __cg_access = (int (*)(const char *, int mode)) dlsym(dlopen_handle, "cg_access"); + int (*__cg_access)(const char *path, int mode); + + dlerror(); + __cg_access = (int (*)(const char *, int mode))dlsym(dlopen_handle, "cg_access"); error = dlerror(); - if (error != NULL) { - lxcfs_error("%s\n", error); - return -1; - } + if (error) + return log_error(-1, "%s - Failed to find cg_access() %s", error); return __cg_access(path, mode); } static int do_proc_open(const char *path, struct fuse_file_info *fi) { - int (*__proc_open)(const char *path, struct fuse_file_info *fi); char *error; - dlerror(); /* Clear any existing error */ - __proc_open = (int (*)(const char *path, struct fuse_file_info *fi)) dlsym(dlopen_handle, "proc_open"); + int (*__proc_open)(const char *path, struct fuse_file_info *fi); + + dlerror(); + __proc_open = (int (*)(const char *path, struct fuse_file_info *fi))dlsym(dlopen_handle, "proc_open"); error = dlerror(); - if (error != NULL) { - lxcfs_error("%s\n", error); - return -1; - } + if (error) + return log_error(-1, "%s - Failed to find proc_open() %s", error); return __proc_open(path, fi); } static int do_proc_access(const char *path, int mode) { - int (*__proc_access)(const char *path, int mode); char *error; - dlerror(); /* Clear any existing error */ - __proc_access = (int (*)(const char *, int mode)) dlsym(dlopen_handle, "proc_access"); + int (*__proc_access)(const char *path, int mode); + + dlerror(); + __proc_access = (int (*)(const char *, int mode))dlsym(dlopen_handle, "proc_access"); error = dlerror(); - if (error != NULL) { - lxcfs_error("%s\n", error); - return -1; - } + if (error) + return log_error(-1, "%s - Failed to find proc_access() %s", error); return __proc_access(path, mode); } static int do_sys_open(const char *path, struct fuse_file_info *fi) { - int (*__sys_open)(const char *path, struct fuse_file_info *fi); char *error; - dlerror(); /* Clear any existing error */ - __sys_open = (int (*)(const char *path, struct fuse_file_info *fi)) dlsym(dlopen_handle, "sys_open"); + int (*__sys_open)(const char *path, struct fuse_file_info *fi); + + dlerror(); + __sys_open = (int (*)(const char *path, struct fuse_file_info *fi))dlsym(dlopen_handle, "sys_open"); error = dlerror(); - if (error != NULL) { - lxcfs_error("%s\n", error); - return -1; - } + if (error) + return log_error(-1, "%s - Failed to find sys_open() %s", error); return __sys_open(path, fi); } static int do_sys_access(const char *path, int mode) { - int (*__sys_access)(const char *path, int mode); char *error; - dlerror(); /* Clear any existing error */ - __sys_access = (int (*)(const char *, int mode)) dlsym(dlopen_handle, "sys_access"); + int (*__sys_access)(const char *path, int mode); + + dlerror(); + __sys_access = (int (*)(const char *, int mode))dlsym(dlopen_handle, "sys_access"); error = dlerror(); - if (error != NULL) { - lxcfs_error("%s\n", error); - return -1; - } + if (error) + return log_error(-1, "%s - Failed to find sys_access() %s", error); return __sys_access(path, mode); } static int do_cg_release(const char *path, struct fuse_file_info *fi) { - int (*__cg_release)(const char *path, struct fuse_file_info *fi); char *error; - dlerror(); /* Clear any existing error */ - __cg_release = (int (*)(const char *path, struct fuse_file_info *)) dlsym(dlopen_handle, "cg_release"); + int (*__cg_release)(const char *path, struct fuse_file_info *fi); + + dlerror(); + __cg_release = (int (*)(const char *path, struct fuse_file_info *))dlsym(dlopen_handle, "cg_release"); error = dlerror(); - if (error != NULL) { - lxcfs_error("%s\n", error); - return -1; - } + if (error) + return log_error(-1, "%s - Failed to find cg_release() %s", error); return __cg_release(path, fi); } static int do_proc_release(const char *path, struct fuse_file_info *fi) { - int (*__proc_release)(const char *path, struct fuse_file_info *fi); char *error; - dlerror(); /* Clear any existing error */ + int (*__proc_release)(const char *path, struct fuse_file_info *fi); + + dlerror(); __proc_release = (int (*)(const char *path, struct fuse_file_info *)) dlsym(dlopen_handle, "proc_release"); error = dlerror(); - if (error != NULL) { - lxcfs_error("%s\n", error); - return -1; - } + if (error) + return log_error(-1, "%s - Failed to find proc_release() %s", error); return __proc_release(path, fi); } static int do_sys_release(const char *path, struct fuse_file_info *fi) { - int (*__sys_release)(const char *path, struct fuse_file_info *fi); char *error; - dlerror(); /* Clear any existing error */ - __sys_release = (int (*)(const char *path, struct fuse_file_info *)) dlsym(dlopen_handle, "sys_release"); + int (*__sys_release)(const char *path, struct fuse_file_info *fi); + + dlerror(); + __sys_release = (int (*)(const char *path, struct fuse_file_info *))dlsym(dlopen_handle, "sys_release"); error = dlerror(); - if (error != NULL) { - lxcfs_error("%s\n", error); - return -1; - } + if (error) + return log_error(-1, "%s - Failed to find sys_release() %s", error); return __sys_release(path, fi); } static int do_cg_opendir(const char *path, struct fuse_file_info *fi) { - int (*__cg_opendir)(const char *path, struct fuse_file_info *fi); char *error; - dlerror(); /* Clear any existing error */ - __cg_opendir = (int (*)(const char *path, struct fuse_file_info *fi)) dlsym(dlopen_handle, "cg_opendir"); + int (*__cg_opendir)(const char *path, struct fuse_file_info *fi); + + dlerror(); + __cg_opendir = (int (*)(const char *path, struct fuse_file_info *fi))dlsym(dlopen_handle, "cg_opendir"); error = dlerror(); - if (error != NULL) { - lxcfs_error("%s\n", error); - return -1; - } + if (error) + return log_error(-1, "%s - Failed to find cg_opendir() %s", error); return __cg_opendir(path, fi); } static int do_cg_releasedir(const char *path, struct fuse_file_info *fi) { - int (*__cg_releasedir)(const char *path, struct fuse_file_info *fi); char *error; - dlerror(); /* Clear any existing error */ - __cg_releasedir = (int (*)(const char *path, struct fuse_file_info *)) dlsym(dlopen_handle, "cg_releasedir"); + int (*__cg_releasedir)(const char *path, struct fuse_file_info *fi); + + dlerror(); + __cg_releasedir = (int (*)(const char *path, struct fuse_file_info *))dlsym(dlopen_handle, "cg_releasedir"); error = dlerror(); - if (error != NULL) { - lxcfs_error("%s\n", error); - return -1; - } + if (error) + return log_error(-1, "%s - Failed to find cg_releasedir() %s", error); return __cg_releasedir(path, fi); } static int do_sys_releasedir(const char *path, struct fuse_file_info *fi) { - int (*__sys_releasedir)(const char *path, struct fuse_file_info *fi); char *error; - dlerror(); /* Clear any existing error */ - __sys_releasedir = (int (*)(const char *path, struct fuse_file_info *)) dlsym(dlopen_handle, "sys_releasedir"); + int (*__sys_releasedir)(const char *path, struct fuse_file_info *fi); + + dlerror(); + __sys_releasedir = (int (*)(const char *path, struct fuse_file_info *))dlsym(dlopen_handle, "sys_releasedir"); error = dlerror(); - if (error != NULL) { - lxcfs_error("%s\n", error); - return -1; - } + if (error) + return log_error(-1, "%s - Failed to find sys_releasedir() %s", error); return __sys_releasedir(path, fi); } -/* - * FUSE ops for / - * these just delegate to the /proc and /cgroup ops as - * needed - */ - static int lxcfs_getattr(const char *path, struct stat *sb) { int ret; @@ -630,24 +586,28 @@ static int lxcfs_getattr(const char *path, struct stat *sb) down_users(); return ret; } + if (strncmp(path, "/proc", 5) == 0) { up_users(); ret = do_proc_getattr(path, sb); down_users(); return ret; } + if (strncmp(path, "/sys", 4) == 0) { up_users(); ret = do_sys_getattr(path, sb); down_users(); return ret; } + return -ENOENT; } static int lxcfs_opendir(const char *path, struct fuse_file_info *fi) { int ret; + if (strcmp(path, "/") == 0) return 0; @@ -657,18 +617,21 @@ static int lxcfs_opendir(const char *path, struct fuse_file_info *fi) down_users(); return ret; } + if (strcmp(path, "/proc") == 0) return 0; + if (strncmp(path, "/sys", 4) == 0) return 0; return -ENOENT; } -static int lxcfs_readdir(const char *path, void *buf, fuse_fill_dir_t filler, off_t offset, - struct fuse_file_info *fi) +static int lxcfs_readdir(const char *path, void *buf, fuse_fill_dir_t filler, + off_t offset, struct fuse_file_info *fi) { int ret; + if (strcmp(path, "/") == 0) { if (filler(buf, ".", NULL, 0) != 0 || filler(buf, "..", NULL, 0) != 0 || @@ -676,14 +639,17 @@ static int lxcfs_readdir(const char *path, void *buf, fuse_fill_dir_t filler, of filler(buf, "sys", NULL, 0) != 0 || filler(buf, "cgroup", NULL, 0) != 0) return -ENOMEM; + return 0; } + if (strncmp(path, "/cgroup", 7) == 0) { up_users(); ret = do_cg_readdir(path, buf, filler, offset, fi); down_users(); return ret; } + if (strcmp(path, "/proc") == 0) { up_users(); ret = do_proc_readdir(path, buf, filler, offset, fi); @@ -714,12 +680,14 @@ static int lxcfs_access(const char *path, int mode) down_users(); return ret; } + if (strncmp(path, "/proc", 5) == 0) { up_users(); ret = do_proc_access(path, mode); down_users(); return ret; } + if (strncmp(path, "/sys", 4) == 0) { up_users(); ret = do_sys_access(path, mode); @@ -727,24 +695,27 @@ static int lxcfs_access(const char *path, int mode) return ret; } - return -EACCES; } static int lxcfs_releasedir(const char *path, struct fuse_file_info *fi) { int ret; + if (strcmp(path, "/") == 0) return 0; + if (strncmp(path, "/cgroup", 7) == 0) { up_users(); ret = do_cg_releasedir(path, fi); down_users(); return ret; } + if (strcmp(path, "/proc") == 0) return 0; - if (strncmp(path, "/sys", 4) == 0){ + + if (strncmp(path, "/sys", 4) == 0) { up_users(); ret = do_sys_releasedir(path, fi); down_users(); @@ -757,18 +728,21 @@ static int lxcfs_releasedir(const char *path, struct fuse_file_info *fi) static int lxcfs_open(const char *path, struct fuse_file_info *fi) { int ret; + if (strncmp(path, "/cgroup", 7) == 0) { up_users(); ret = do_cg_open(path, fi); down_users(); return ret; } + if (strncmp(path, "/proc", 5) == 0) { up_users(); ret = do_proc_open(path, fi); down_users(); return ret; } + if (strncmp(path, "/sys", 4) == 0) { up_users(); ret = do_sys_open(path, fi); @@ -776,26 +750,28 @@ static int lxcfs_open(const char *path, struct fuse_file_info *fi) return ret; } - return -EACCES; } static int lxcfs_read(const char *path, char *buf, size_t size, off_t offset, - struct fuse_file_info *fi) + struct fuse_file_info *fi) { int ret; + if (strncmp(path, "/cgroup", 7) == 0) { up_users(); ret = do_cg_read(path, buf, size, offset, fi); down_users(); return ret; } + if (strncmp(path, "/proc", 5) == 0) { up_users(); ret = do_proc_read(path, buf, size, offset, fi); down_users(); return ret; } + if (strncmp(path, "/sys", 4) == 0) { up_users(); ret = do_sys_read(path, buf, size, offset, fi); @@ -803,14 +779,14 @@ static int lxcfs_read(const char *path, char *buf, size_t size, off_t offset, return ret; } - return -EINVAL; } int lxcfs_write(const char *path, const char *buf, size_t size, off_t offset, - struct fuse_file_info *fi) + struct fuse_file_info *fi) { int ret; + if (strncmp(path, "/cgroup", 7) == 0) { up_users(); ret = do_cg_write(path, buf, size, offset, fi); @@ -829,18 +805,21 @@ static int lxcfs_flush(const char *path, struct fuse_file_info *fi) static int lxcfs_release(const char *path, struct fuse_file_info *fi) { int ret; + if (strncmp(path, "/cgroup", 7) == 0) { up_users(); ret = do_cg_release(path, fi); down_users(); return ret; } + if (strncmp(path, "/proc", 5) == 0) { up_users(); ret = do_proc_release(path, fi); down_users(); return ret; } + if (strncmp(path, "/sys", 4) == 0) { up_users(); ret = do_sys_release(path, fi); @@ -848,7 +827,6 @@ static int lxcfs_release(const char *path, struct fuse_file_info *fi) return ret; } - return -EINVAL; } @@ -860,6 +838,7 @@ static int lxcfs_fsync(const char *path, int datasync, struct fuse_file_info *fi int lxcfs_mkdir(const char *path, mode_t mode) { int ret; + if (strncmp(path, "/cgroup", 7) == 0) { up_users(); ret = do_cg_mkdir(path, mode); @@ -873,6 +852,7 @@ int lxcfs_mkdir(const char *path, mode_t mode) int lxcfs_chown(const char *path, uid_t uid, gid_t gid) { int ret; + if (strncmp(path, "/cgroup", 7) == 0) { up_users(); ret = do_cg_chown(path, uid, gid); @@ -885,6 +865,7 @@ int lxcfs_chown(const char *path, uid_t uid, gid_t gid) if (strncmp(path, "/sys", 4) == 0) return -EPERM; + return -ENOENT; } @@ -897,24 +878,28 @@ int lxcfs_truncate(const char *path, off_t newsize) { if (strncmp(path, "/cgroup", 7) == 0) return 0; + return -EPERM; } int lxcfs_rmdir(const char *path) { int ret; + if (strncmp(path, "/cgroup", 7) == 0) { up_users(); ret = do_cg_rmdir(path); down_users(); return ret; } + return -EPERM; } int lxcfs_chmod(const char *path, mode_t mode) { int ret; + if (strncmp(path, "/cgroup", 7) == 0) { up_users(); ret = do_cg_chmod(path, mode); @@ -932,46 +917,42 @@ int lxcfs_chmod(const char *path, mode_t mode) } const struct fuse_operations lxcfs_ops = { - .getattr = lxcfs_getattr, - .readlink = NULL, - .getdir = NULL, - .mknod = NULL, - .mkdir = lxcfs_mkdir, - .unlink = NULL, - .rmdir = lxcfs_rmdir, - .symlink = NULL, - .rename = NULL, - .link = NULL, - .chmod = lxcfs_chmod, - .chown = lxcfs_chown, - .truncate = lxcfs_truncate, - .utime = NULL, - - .open = lxcfs_open, - .read = lxcfs_read, - .release = lxcfs_release, - .write = lxcfs_write, - - .statfs = NULL, - .flush = lxcfs_flush, - .fsync = lxcfs_fsync, - - .setxattr = NULL, - .getxattr = NULL, - .listxattr = NULL, - .removexattr = NULL, - - .opendir = lxcfs_opendir, - .readdir = lxcfs_readdir, - .releasedir = lxcfs_releasedir, - - .fsyncdir = NULL, - .init = NULL, - .destroy = NULL, - .access = lxcfs_access, - .create = NULL, - .ftruncate = NULL, - .fgetattr = NULL, + .access = lxcfs_access, + .chmod = lxcfs_chmod, + .chown = lxcfs_chown, + .flush = lxcfs_flush, + .fsync = lxcfs_fsync, + .getattr = lxcfs_getattr, + .mkdir = lxcfs_mkdir, + .open = lxcfs_open, + .opendir = lxcfs_opendir, + .read = lxcfs_read, + .readdir = lxcfs_readdir, + .release = lxcfs_release, + .releasedir = lxcfs_releasedir, + .rmdir = lxcfs_rmdir, + .truncate = lxcfs_truncate, + .write = lxcfs_write, + + .create = NULL, + .destroy = NULL, + .fgetattr = NULL, + .fsyncdir = NULL, + .ftruncate = NULL, + .getdir = NULL, + .getxattr = NULL, + .init = NULL, + .link = NULL, + .listxattr = NULL, + .mknod = NULL, + .readlink = NULL, + .rename = NULL, + .removexattr = NULL, + .setxattr = NULL, + .statfs = NULL, + .symlink = NULL, + .unlink = NULL, + .utime = NULL, }; static void usage() @@ -988,98 +969,92 @@ static void usage() exit(1); } -static bool is_help(char *w) +static inline bool is_help(char *w) { - if (strcmp(w, "-h") == 0 || - strcmp(w, "--help") == 0 || - strcmp(w, "-help") == 0 || - strcmp(w, "help") == 0) - return true; - return false; + return strcmp(w, "-h") == 0 || + strcmp(w, "--help") == 0 || + strcmp(w, "-help") == 0 || + strcmp(w, "help") == 0; } -static bool is_version(char *w) +static inline bool is_version(char *w) { - if (strcmp(w, "-v") == 0 || - strcmp(w, "--version") == 0 || - strcmp(w, "-version") == 0 || - strcmp(w, "version") == 0) - return true; - return false; + return strcmp(w, "-v") == 0 || + strcmp(w, "--version") == 0 || + strcmp(w, "-version") == 0 || + strcmp(w, "version") == 0; } -bool swallow_arg(int *argcp, char *argv[], char *which) +static bool swallow_arg(int *argcp, char *argv[], char *which) { - int i; - - for (i = 1; argv[i]; i++) { + for (int i = 1; argv[i]; i++) { if (strcmp(argv[i], which) != 0) continue; - for (; argv[i]; i++) { - argv[i] = argv[i+1]; - } + + for (; argv[i]; i++) + argv[i] = argv[i + 1]; + (*argcp)--; return true; } + return false; } -bool swallow_option(int *argcp, char *argv[], char *opt, char **v) +static bool swallow_option(int *argcp, char *argv[], char *opt, char **v) { - int i; - - for (i = 1; argv[i]; i++) { - if (!argv[i+1]) + for (int i = 1; argv[i]; i++) { + if (!argv[i + 1]) continue; + if (strcmp(argv[i], opt) != 0) continue; + do { - *v = strdup(argv[i+1]); + *v = strdup(argv[i + 1]); } while (!*v); - for (; argv[i+1]; i++) { - argv[i] = argv[i+2]; - } + + for (; argv[i + 1]; i++) + argv[i] = argv[i + 2]; + (*argcp) -= 2; return true; } + return false; } static int set_pidfile(char *pidfile) { __do_close_prot_errno int fd = -EBADF; - char buf[50]; - struct flock fl; - - fl.l_type = F_WRLCK; - fl.l_whence = SEEK_SET; - fl.l_start = 0; - fl.l_len = 0; + char buf[INTTYPE_TO_STRLEN(long)]; + int ret; + 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\n", pidfile); - return -1; - } + if (fd < 0) + return log_error(-1, "Could not open pidfile %s: %m", pidfile); - if (fcntl(fd, F_SETLK, &fl) == -1) { + if (fcntl(fd, F_SETLK, &fl) < 0) { if (errno == EAGAIN || errno == EACCES) - return log_error_errno(-1, - errno, "PID file '%s' is already locked", - pidfile); - fprintf(stderr, "Warning; unable to lock PID file, proceeding"); + return log_error(-1, "PID file '%s' is already locked", pidfile); + lxcfs_error("Warning; unable to lock PID file, proceeding"); } if (ftruncate(fd, 0)) - return log_error_errno(-1, errno, - "Error truncating PID file '%s': %m", - pidfile); + return log_error(-1, "Error truncating PID file '%s': %m", pidfile); + + ret = snprintf(buf, sizeof(buf), "%ld\n", (long)getpid()); + if (ret < 0 || ret >= sizeof(buf)) + return log_error(-1, "Failed to convert pid to string %m"); - snprintf(buf, 50, "%ld\n", (long)getpid()); - if (write(fd, buf, strlen(buf)) != strlen(buf)) - return log_error_errno(-1, errno, - "Error writing to PID file '%s': %m", - pidfile); + if (write(fd, buf, ret) != ret) + return log_error(-1, "Error writing to PID file '%s': %m", pidfile); return move_fd(fd); } @@ -1102,7 +1077,7 @@ int main(int argc, char *argv[]) opts = malloc(sizeof(struct lxcfs_opts)); if (opts == NULL) { - fprintf(stderr, "Error allocating memory for options.\n"); + lxcfs_error("Error allocating memory for options"); goto out; } opts->swap_off = false; @@ -1129,7 +1104,7 @@ int main(int argc, char *argv[]) nonempty = true; } else { free(v); - fprintf(stderr, "Warning: unexpected fuse option %s\n", v); + lxcfs_error("Warning: unexpected fuse option %s", v); exit(EXIT_FAILURE); } } @@ -1149,7 +1124,7 @@ int main(int argc, char *argv[]) do_reload(); if (signal(SIGUSR1, reload_handler) == SIG_ERR) { - fprintf(stderr, "Error setting USR1 signal handler: %m\n"); + lxcfs_error("Error setting USR1 signal handler: %m"); goto out; } diff --git a/macro.h b/macro.h index 15eb1f0..ae6e924 100644 --- a/macro.h +++ b/macro.h @@ -55,6 +55,12 @@ __ret__; \ }) +#define log_error(__ret__, format, ...) \ + ({ \ + lxcfs_error(format, ##__VA_ARGS__); \ + __ret__; \ + }) + #define STRLITERALLEN(x) (sizeof(""x"") - 1) /* Calculate the number of chars needed to represent a given integer as a C
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel