]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
api_create and api_start: work toward making them thread-safe
authorSerge Hallyn <serge.hallyn@ubuntu.com>
Sat, 14 Sep 2013 02:19:42 +0000 (21:19 -0500)
committerSerge Hallyn <serge.hallyn@ubuntu.com>
Sat, 14 Sep 2013 18:02:50 +0000 (13:02 -0500)
Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
src/lxc/af_unix.c
src/lxc/commands.c
src/lxc/lxccontainer.c
src/lxc/parse.c
src/lxc/utils.c

index 204658d32913d245e6bf7c101baca0e9c5a253c6..d6d18ca158c90ff4b629fe96b75a6920749910e3 100644 (file)
@@ -30,6 +30,7 @@
 #include <sys/un.h>
 
 #include "log.h"
+#include "lxclock.h"
 
 lxc_log_define(lxc_af_unix, lxc);
 
@@ -100,7 +101,9 @@ int lxc_af_unix_connect(const char *path)
        int fd;
        struct sockaddr_un addr;
 
+       process_lock();
        fd = socket(PF_UNIX, SOCK_STREAM, 0);
+       process_unlock();
        if (fd < 0)
                return -1;
 
@@ -113,7 +116,9 @@ int lxc_af_unix_connect(const char *path)
 
        if (connect(fd, (struct sockaddr *)&addr, sizeof(addr))) {
                int tmp = errno;
+               process_lock();
                close(fd);
+               process_unlock();
                errno = tmp;
                return -1;
        }
index f12ae2dece926cd8fb180428a3f910cf38828506..c706a7a5d4e4dda90c8d68c17f6a21b990167017 100644 (file)
@@ -46,6 +46,7 @@
 #include "mainloop.h"
 #include "af_unix.h"
 #include "config.h"
+#include "lxclock.h"
 
 /*
  * This file provides the different functions for clients to
@@ -282,8 +283,11 @@ static int lxc_cmd(const char *name, struct lxc_cmd_rr *cmd, int *stopped,
 
        ret = lxc_cmd_rsp_recv(sock, cmd);
 out:
-       if (!stay_connected || ret <= 0)
+       if (!stay_connected || ret <= 0) {
+               process_lock();
                close(sock);
+               process_unlock();
+       }
        if (stay_connected && ret > 0)
                cmd->rsp.ret = sock;
 
index 79237dff4d004c333f7b042599543532778438bf..3c51c4ae3caf2e9c772791fca2fe46baddc959ac 100644 (file)
@@ -665,7 +665,9 @@ static bool create_container_dir(struct lxc_container *c)
                free(s);
                return false;
        }
+       process_lock();
        ret = mkdir(s, 0755);
+       process_unlock();
        if (ret) {
                if (errno == EEXIST)
                        ret = 0;
@@ -1362,11 +1364,15 @@ static bool lxcapi_save_config(struct lxc_container *c, const char *alt_file)
        if (lret)
                return false;
 
+       process_lock();
        fout = fopen(alt_file, "w");
+       process_unlock();
        if (!fout)
                goto out;
        write_config(fout, c->lxc_conf);
+       process_lock();
        fclose(fout);
+       process_unlock();
        ret = true;
 
 out:
index 26cbbdd00b427971effcfcfdcd0528b9cfc28bb3..7875c8969ce772c4a6f35351e3beafb168c6cee8 100644 (file)
@@ -31,6 +31,7 @@
 #include "parse.h"
 #include "config.h"
 #include "utils.h"
+#include "lxclock.h"
 #include <lxc/log.h>
 
 /* Workaround for the broken signature of alphasort() in bionic.
@@ -90,7 +91,9 @@ int lxc_file_for_each_line(const char *file, lxc_file_cb callback, void *data)
        char *line = NULL;
        size_t len = 0;
 
+       process_lock();
        f = fopen(file, "r");
+       process_unlock();
        if (!f) {
                SYSERROR("failed to open %s", file);
                return -1;
@@ -104,7 +107,9 @@ int lxc_file_for_each_line(const char *file, lxc_file_cb callback, void *data)
 
        if (line)
                free(line);
+       process_lock();
        fclose(f);
+       process_unlock();
        return err;
 }
 
index 78b234d98313ae316e55c9bab6131e87445ef044..c561c004cd3fec42ac3080d54c6faf11092fca60 100644 (file)
@@ -47,6 +47,7 @@
 
 #include "utils.h"
 #include "log.h"
+#include "lxclock.h"
 
 lxc_log_define(lxc_utils, lxc);
 
@@ -409,7 +410,10 @@ int sha1sum_file(char *fnam, unsigned char *digest)
 
        if (!fnam)
                return -1;
-       if ((f = fopen_cloexec(fnam, "r")) < 0) {
+       process_lock();
+       f = fopen_cloexec(fnam, "r");
+       process_unlock();
+       if (f < 0) {
                SYSERROR("Error opening template");
                return -1;
        }
@@ -439,7 +443,10 @@ int sha1sum_file(char *fnam, unsigned char *digest)
                fclose(f);
                return -1;
        }
-       if (fclose(f) < 0) {
+       process_lock();
+       ret = fclose(f);
+       process_unlock();
+       if (ret < 0) {
                SYSERROR("Failre closing template");
                free(buf);
                return -1;