#include <netinet/in.h>
#include <net/if.h>
+#include "error.h"
#include <lxc.h>
#define MAXPIDLEN 20
size_t pid;
lock = lxc_get_lock(name);
- if (lock > 0) {
- lxc_log_error("'%s' is not running", name);
+ if (lock >= 0) {
lxc_put_lock(lock);
- return -1;
+ return -LXC_ERROR_EMPTY;
}
- if (lock < 0) {
- lxc_log_error("failed to acquire the lock on '%s':%s",
- name, strerror(-lock));
- return -1;
- }
+ if (lock < 0 && lock != -EWOULDBLOCK)
+ return -LXC_ERROR_LOCK;
snprintf(init, MAXPATHLEN, LXCPATH "/%s/init", name);
fd = open(init, O_RDONLY);
{
char path[MAXPATHLEN];
- if (mkdir(LXCPATH, 0755) && errno != EEXIST) {
- lxc_log_syserror("failed to created %s directory", LXCPATH);
- return -1;
- }
+ if (mkdir(LXCPATH, 0755) && errno != EEXIST)
+ return -errno;
sprintf(path, LXCPATH "/%s", dirname);
- if (mkdir(path, 0755)) {
- lxc_log_syserror("failed to created %s directory", path);
- return -1;
- }
+ if (mkdir(path, 0755))
+ return -errno;
return 0;
}
int lxc_create(const char *name, struct lxc_conf *conf)
{
- int lock, err = -LXC_ERROR_INTERNAL;
-
- if (create_lxc_directory(name)) {
- lxc_log_error("failed to create %s directory", name);
- return -LXC_ERROR_INTERNAL;
- }
+ int lock, err;
+ err = create_lxc_directory(name);
+ if (err < 0)
+ return err == -EEXIST ?
+ -LXC_ERROR_ALREADY_EXISTS:LXC_ERROR_INTERNAL;
+
lock = lxc_get_lock(name);
- if (!lock) {
- lxc_log_error("'%s' is busy", name);
- return -LXC_ERROR_ALREADY_EXISTS;
- }
-
- if (lock < 0) {
- lxc_log_error("failed to acquire lock on '%s':%s",
- name, strerror(-lock));
- goto err;
- }
+ if (lock < 0)
+ return -LXC_ERROR_LOCK;
+ err = LXC_ERROR_INTERNAL;
if (lxc_mkstate(name)) {
lxc_log_error("failed to create the state file for %s", name);
goto err;
char path[MAXPATHLEN];
lock = lxc_get_lock(name);
- if (!lock) {
- lxc_log_error("'%s' is busy", name);
- return -LXC_ERROR_BUSY;
- }
-
if (lock < 0) {
- lxc_log_error("failed to acquire the lock for '%s':%s",
- name, strerror(-lock));
- goto out;
+ if (lock == -EWOULDBLOCK)
+ return -LXC_ERROR_BUSY;
+ if (lock == -ENOENT)
+ return -LXC_ERROR_NOT_FOUND;
+ return -LXC_ERROR_INTERNAL;
}
if (lxc_rmstate(name)) {
*/
#include <stdio.h>
+#include <stdlib.h>
#include "error.h"
+static const char *const catalogue[] = {
-static char *catalogue[] = {
- [LXC_ERROR_EMPTY] = "The container is not running",
+ [LXC_ERROR_LOCK] = "Failed to lock the container",
+
+ [LXC_ERROR_EMPTY] = "The container is empty",
[LXC_ERROR_ALREADY_EXISTS] = "The container already exists",
[LXC_ERROR_BUSY] = "The container is busy",
[LXC_ERROR_NOT_FOUND] = "The container was not found",
const char *const lxc_strerror(int error)
{
- if (error < 0 || error >= LXC_LAST_ERROR)
+ error = abs(error);
+
+ if (error >= LXC_LAST_ERROR)
return NULL;
+
return catalogue[error];
}
#define __lxc_error_h
typedef enum {
+ LXC_SUCCESS, /* 0 == success ;) */
+
+ LXC_ERROR_LOCK,
+
LXC_ERROR_EMPTY,
LXC_ERROR_BUSY,
LXC_ERROR_ALREADY_EXISTS,
* @error : the value of the error
* Returns a string on success or NULL otherwise.
*/
-extern int lxc_strerror(int error);
+extern const char *const lxc_strerror(int error);
/*
* Checkpoint a container previously frozen
{
const char *name = NULL, *file = NULL;
struct lxc_conf lxc_conf;
- int opt;
+ int err, opt;
while ((opt = getopt(argc, argv, "f:n:")) != -1) {
switch (opt) {
return 1;
}
- if (lxc_create(name, &lxc_conf)) {
- fprintf(stderr, "failed to create the container '%s'\n", name);
+ err = lxc_create(name, &lxc_conf);
+ if (err) {
+ fprintf(stderr, "%s\n", lxc_strerror(err));
return 1;
}
char opt;
char *name = NULL;
int nbargs = 0;
+ int err;
while ((opt = getopt(argc, argv, "n:")) != -1) {
switch (opt) {
if (!name)
usage(argv[0]);
- if (lxc_destroy(name)) {
- fprintf(stderr, "failed to destroy '%s'\n", name);
+ err = lxc_destroy(name);
+ if (err) {
+ fprintf(stderr, "%s\n", lxc_strerror(err));
return 1;
}
for (opt = 0; opt < argc; opt++)
args[nbargs++] = argv[optind++];
- if (lxc_start(name, args)) {
- fprintf(stderr, "failed to execute '%s'\n", name);
+ ret = lxc_start(name, args);
+ if (ret) {
+ fprintf(stderr, "%s\n", lxc_strerror(ret));
goto out;
}
fcntl(fd, F_SETFD, FD_CLOEXEC);
if (flock(fd, LOCK_EX|LOCK_NB)) {
- ret = errno == EWOULDBLOCK ? 0 : -errno;
+ ret = -errno;
close(fd);
goto out;
}
char opt;
char *name = NULL;
char **args;
- int nbargs = 0;
+ int err, nbargs = 0;
char *default_args[] = {
"/sbin/init",
'\0',
if (!name)
usage(argv[0]);
- if (lxc_start(name, args)) {
- fprintf(stderr, "failed to start %s\n", name);
+ err = lxc_start(name, args);
+ if (err) {
+ fprintf(stderr, "%s\n", lxc_strerror(err));
return 1;
}
{
char opt;
char *name = NULL;
- int nbargs = 0;
+ int err, nbargs = 0;
while ((opt = getopt(argc, argv, "n:")) != -1) {
switch (opt) {
if (!name)
usage(argv[0]);
- if (lxc_stop(name)) {
- fprintf(stderr, "failed to stop %s\n", name);
+ err = lxc_stop(name);
+ if (err) {
+ fprintf(stderr, "%s\n", lxc_strerror(err));
return 1;
}
#include <sys/wait.h>
#include <sys/mount.h>
+#include "error.h"
#include <lxc/lxc.h>
LXC_TTY_HANDLER(SIGINT);
int clone_flags;
lock = lxc_get_lock(name);
- if (!lock) {
- lxc_log_error("'%s' is busy", name);
- return -1;
- }
-
- if (lock < 0) {
- lxc_log_error("failed to acquire lock on '%s':%s",
- name, strerror(-lock));
- return -1;
- }
+ if (lock < 0)
+ return lock == -EWOULDBLOCK ?
+ -LXC_ERROR_BUSY :
+ -LXC_ERROR_LOCK;
/* Begin the set the state to STARTING*/
if (lxc_setstate(name, STARTING)) {
int clone_flags;
lock = lxc_get_lock(name);
- if (!lock) {
- lxc_log_error("'%s' is busy", name);
- return -LXC_ERROR_BUSY;
- }
-
- if (lock < 0) {
- lxc_log_error("failed to acquire lock on '%s':%s",
- name, strerror(-lock));
- return -LXC_ERROR_INTERNAL;
- }
+ if (lock < 0)
+ return lock == -EWOULDBLOCK ?
+ -LXC_ERROR_BUSY :
+ -LXC_ERROR_LOCK;
/* Begin the set the state to STARTING*/
if (lxc_setstate(name, STARTING)) {
- lxc_log_error("failed to set state %s", lxc_state2str(STARTING));
+ lxc_log_error("failed to set state '%s'", lxc_state2str(STARTING));
goto out;
}
size_t pid;
lock = lxc_get_lock(name);
- if (lock > 0) {
- lxc_log_error("'%s' is not running", name);
+ if (lock >= 0) {
lxc_put_lock(lock);
return -LXC_ERROR_EMPTY;
}
- if (lock < 0) {
- lxc_log_error("failed to acquire the lock on '%s':%s",
- name, strerror(-lock));
- return -LXC_ERROR_INTERNAL;
+ if (lock < 0 && lock != -EWOULDBLOCK) {
+ if (lock == -ENOENT)
+ return -LXC_ERROR_NOT_FOUND;
+ return -LXC_ERROR_LOCK;
}
snprintf(init, MAXPATHLEN, LXCPATH "/%s/init", name);