From: Serge Hallyn Date: Sat, 14 Sep 2013 02:19:42 +0000 (-0500) Subject: api_create and api_start: work toward making them thread-safe X-Git-Tag: lxc-1.0.0.alpha2~116 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=002f3cff4d83c0666cfda40599eded8e0d638c6c;p=thirdparty%2Flxc.git api_create and api_start: work toward making them thread-safe Signed-off-by: Serge Hallyn --- diff --git a/src/lxc/af_unix.c b/src/lxc/af_unix.c index 204658d32..d6d18ca15 100644 --- a/src/lxc/af_unix.c +++ b/src/lxc/af_unix.c @@ -30,6 +30,7 @@ #include #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; } diff --git a/src/lxc/commands.c b/src/lxc/commands.c index f12ae2dec..c706a7a5d 100644 --- a/src/lxc/commands.c +++ b/src/lxc/commands.c @@ -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; diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c index 79237dff4..3c51c4ae3 100644 --- a/src/lxc/lxccontainer.c +++ b/src/lxc/lxccontainer.c @@ -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: diff --git a/src/lxc/parse.c b/src/lxc/parse.c index 26cbbdd00..7875c8969 100644 --- a/src/lxc/parse.c +++ b/src/lxc/parse.c @@ -31,6 +31,7 @@ #include "parse.h" #include "config.h" #include "utils.h" +#include "lxclock.h" #include /* 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; } diff --git a/src/lxc/utils.c b/src/lxc/utils.c index 78b234d98..c561c004c 100644 --- a/src/lxc/utils.c +++ b/src/lxc/utils.c @@ -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;