api_create and api_start: work toward making them thread-safe

Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
This commit is contained in:
Serge Hallyn 2013-09-13 21:19:42 -05:00
parent 103a2fc072
commit 002f3cff4d
5 changed files with 30 additions and 3 deletions

View File

@ -30,6 +30,7 @@
#include <sys/un.h> #include <sys/un.h>
#include "log.h" #include "log.h"
#include "lxclock.h"
lxc_log_define(lxc_af_unix, lxc); lxc_log_define(lxc_af_unix, lxc);
@ -100,7 +101,9 @@ int lxc_af_unix_connect(const char *path)
int fd; int fd;
struct sockaddr_un addr; struct sockaddr_un addr;
process_lock();
fd = socket(PF_UNIX, SOCK_STREAM, 0); fd = socket(PF_UNIX, SOCK_STREAM, 0);
process_unlock();
if (fd < 0) if (fd < 0)
return -1; return -1;
@ -113,7 +116,9 @@ int lxc_af_unix_connect(const char *path)
if (connect(fd, (struct sockaddr *)&addr, sizeof(addr))) { if (connect(fd, (struct sockaddr *)&addr, sizeof(addr))) {
int tmp = errno; int tmp = errno;
process_lock();
close(fd); close(fd);
process_unlock();
errno = tmp; errno = tmp;
return -1; return -1;
} }

View File

@ -46,6 +46,7 @@
#include "mainloop.h" #include "mainloop.h"
#include "af_unix.h" #include "af_unix.h"
#include "config.h" #include "config.h"
#include "lxclock.h"
/* /*
* This file provides the different functions for clients to * 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); ret = lxc_cmd_rsp_recv(sock, cmd);
out: out:
if (!stay_connected || ret <= 0) if (!stay_connected || ret <= 0) {
process_lock();
close(sock); close(sock);
process_unlock();
}
if (stay_connected && ret > 0) if (stay_connected && ret > 0)
cmd->rsp.ret = sock; cmd->rsp.ret = sock;

View File

@ -665,7 +665,9 @@ static bool create_container_dir(struct lxc_container *c)
free(s); free(s);
return false; return false;
} }
process_lock();
ret = mkdir(s, 0755); ret = mkdir(s, 0755);
process_unlock();
if (ret) { if (ret) {
if (errno == EEXIST) if (errno == EEXIST)
ret = 0; ret = 0;
@ -1362,11 +1364,15 @@ static bool lxcapi_save_config(struct lxc_container *c, const char *alt_file)
if (lret) if (lret)
return false; return false;
process_lock();
fout = fopen(alt_file, "w"); fout = fopen(alt_file, "w");
process_unlock();
if (!fout) if (!fout)
goto out; goto out;
write_config(fout, c->lxc_conf); write_config(fout, c->lxc_conf);
process_lock();
fclose(fout); fclose(fout);
process_unlock();
ret = true; ret = true;
out: out:

View File

@ -31,6 +31,7 @@
#include "parse.h" #include "parse.h"
#include "config.h" #include "config.h"
#include "utils.h" #include "utils.h"
#include "lxclock.h"
#include <lxc/log.h> #include <lxc/log.h>
/* Workaround for the broken signature of alphasort() in bionic. /* 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; char *line = NULL;
size_t len = 0; size_t len = 0;
process_lock();
f = fopen(file, "r"); f = fopen(file, "r");
process_unlock();
if (!f) { if (!f) {
SYSERROR("failed to open %s", file); SYSERROR("failed to open %s", file);
return -1; return -1;
@ -104,7 +107,9 @@ int lxc_file_for_each_line(const char *file, lxc_file_cb callback, void *data)
if (line) if (line)
free(line); free(line);
process_lock();
fclose(f); fclose(f);
process_unlock();
return err; return err;
} }

View File

@ -47,6 +47,7 @@
#include "utils.h" #include "utils.h"
#include "log.h" #include "log.h"
#include "lxclock.h"
lxc_log_define(lxc_utils, lxc); lxc_log_define(lxc_utils, lxc);
@ -409,7 +410,10 @@ int sha1sum_file(char *fnam, unsigned char *digest)
if (!fnam) if (!fnam)
return -1; 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"); SYSERROR("Error opening template");
return -1; return -1;
} }
@ -439,7 +443,10 @@ int sha1sum_file(char *fnam, unsigned char *digest)
fclose(f); fclose(f);
return -1; return -1;
} }
if (fclose(f) < 0) { process_lock();
ret = fclose(f);
process_unlock();
if (ret < 0) {
SYSERROR("Failre closing template"); SYSERROR("Failre closing template");
free(buf); free(buf);
return -1; return -1;