]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
the bike shed should be brilliant purple 2008/head
authorTycho Andersen <tycho@tycho.ws>
Thu, 14 Dec 2017 17:38:16 +0000 (17:38 +0000)
committerTycho Andersen <tycho@tycho.ws>
Thu, 14 Dec 2017 17:38:16 +0000 (17:38 +0000)
Signed-off-by: Tycho Andersen <tycho@tycho.ws>
src/lxc/lxc_init.c
src/lxc/tools/arguments.c

index bcdfcc38924a45b3351c617beaa7bce5fd7fe061..dcf9687deef7d69239dc3af786bcc563cc3d31c5 100644 (file)
@@ -46,6 +46,9 @@
 #define OPT_USAGE 0x1000
 #define OPT_VERSION OPT_USAGE - 1   
 
+#define QUOTE(macro) #macro
+#define QUOTEVAL(macro) QUOTE(macro)
+
 lxc_log_define(lxc_init, lxc);
 
 static sig_atomic_t was_interrupted = 0;
@@ -95,40 +98,49 @@ static struct arguments my_args = {
 static void prevent_forking(void)
 {
        FILE *f;
-       char name[PATH_MAX], path[PATH_MAX];
+       char name[MAXPATHLEN], path[MAXPATHLEN];
        int ret;
 
        f = fopen("/proc/self/cgroup", "r");
        if (!f) {
-               SYSERROR("opening /proc/self/cgroup");
+               SYSERROR("Failed to open \"/proc/self/cgroup\"");
                return;
        }
 
        while (!feof(f)) {
-               int fd;
+               int fd, i;
 
-               if (2 != fscanf(f, "%*d:%[^:]:%s", name, path)) {
-                       ERROR("didn't scan the right number of things");
+               if (1 != fscanf(f, "%*d:%" QUOTEVAL(MAXPATHLEN) "s", name)) {
+                       ERROR("Failed to parse \"/proc/self/cgroup\"");
                        goto out;
                }
+               path[0] = 0;
+
+               for (i = 0; i < sizeof(name); i++) {
+                       if (name[i] == ':') {
+                               name[i] = 0;
+                               strncpy(path, name + i + 1, sizeof(path));
+                               break;
+                       }
+               }
 
                if (strcmp(name, "pids"))
                        continue;
 
                ret = snprintf(name, sizeof(name), "/sys/fs/cgroup/pids/%s/pids.max", path);
-               if (ret < 0 || ret >= sizeof(path)) {
-                       ERROR("failed snprintf");
+               if (ret < 0 || (size_t)ret >= sizeof(path)) {
+                       ERROR("Failed to create string");
                        goto out;
                }
 
                fd = open(name, O_WRONLY);
                if (fd < 0) {
-                       SYSERROR("open");
+                       SYSERROR("Failed to open \"%s\"", name);
                        goto out;
                }
 
                if (write(fd, "1", 1) != 1)
-                       SYSERROR("write");
+                       SYSERROR("Failed to write to \"%s\"", name);
 
                close(fd);
                break;
@@ -145,14 +157,14 @@ static void kill_children(pid_t pid)
        int ret;
 
        ret = snprintf(path, sizeof(path), "/proc/%d/task/%d/children", pid, pid);
-       if (ret < 0 || ret >= sizeof(path)) {
-               ERROR("failed snprintf");
+       if (ret < 0 || (size_t)ret >= sizeof(path)) {
+               ERROR("Failed to create string");
                return;
        }
 
        f = fopen(path, "r");
        if (!f) {
-               SYSERROR("couldn't open %s", path);
+               SYSERROR("Failed to open %s", path);
                return;
        }
 
@@ -160,7 +172,7 @@ static void kill_children(pid_t pid)
                pid_t pid;
 
                if (fscanf(f, "%d ", &pid) != 1) {
-                       ERROR("couldn't scan pid");
+                       ERROR("Failed to retrieve pid");
                        fclose(f);
                        return;
                }
@@ -337,10 +349,12 @@ int main(int argc, char *argv[])
                case SIGPWR:
                case SIGTERM:
                        if (!shutdown) {
+                               pid_t mypid = getpid();
+
                                shutdown = 1;
                                prevent_forking();
-                               if (getpid() != 1) {
-                                       kill_children(getpid());
+                               if (mypid != 1) {
+                                       kill_children(mypid);
                                } else {
                                        ret = kill(-1, SIGTERM);
                                        if (ret < 0)
@@ -350,10 +364,12 @@ int main(int argc, char *argv[])
                                alarm(1);
                        }
                        break;
-               case SIGALRM:
+               case SIGALRM: {
+                       pid_t mypid = getpid();
+
                        prevent_forking();
-                       if (getpid() != 1) {
-                               kill_children(getpid());
+                       if (mypid != 1) {
+                               kill_children(mypid);
                        } else {
                                ret = kill(-1, SIGTERM);
                                if (ret < 0)
@@ -361,6 +377,7 @@ int main(int argc, char *argv[])
                                              "all children", strerror(errno));
                        }
                        break;
+               }
                default:
                        ret = kill(pid, was_interrupted);
                        if (ret < 0)
index 585bb14928d8ff13cea68ec3b7da581464b1da94..0907f66d78a6c61d64ea92d82f3445420de5c6aa 100644 (file)
@@ -314,7 +314,7 @@ bool lxc_setup_shared_ns(struct lxc_arguments *args, struct lxc_container *c)
                        continue;
 
                if (!c->set_config_item(c, key, value)) {
-                       fprintf(stderr, "failed to set %s\n", key);
+                       lxc_error(args, "Failed to set \"%s = %s\"", key, value);
                        return false;
                }
        }