From e14459fae5890af6a5481d060c107a15abae2ee2 Mon Sep 17 00:00:00 2001 From: dlezcano Date: Wed, 3 Sep 2008 12:06:19 +0000 Subject: [PATCH] *** empty log message *** --- src/liblxc/conf.c | 82 ++++++++++++++++++++++++++++---------------- src/lxc/lxc_create.c | 4 +-- 2 files changed, 54 insertions(+), 32 deletions(-) diff --git a/src/liblxc/conf.c b/src/liblxc/conf.c index 419a7e2e6..b9af55058 100644 --- a/src/liblxc/conf.c +++ b/src/liblxc/conf.c @@ -792,7 +792,7 @@ static int setup_ip6_addr(const char *dirname, const char *ifname) static int setup_network_cb(const char *name, const char *dirname, const char *file, void *data) { - char *path; + char path[MAXPATHLEN]; char strindex[MAXINDEXLEN]; char ifname[IFNAMSIZ]; char newname[IFNAMSIZ]; @@ -800,7 +800,7 @@ static int setup_network_cb(const char *name, const char *dirname, char *current_ifname = ifname; int ifindex, ret = -1; - asprintf(&path, "%s/%s", dirname, file); + snprintf(path, MAXPATHLEN, "%s/%s", dirname, file); if (read_info(path, "ifindex", strindex, sizeof(strindex))) { lxc_log_error("failed to read ifindex info"); @@ -809,21 +809,25 @@ static int setup_network_cb(const char *name, const char *dirname, ifindex = atoi(strindex); if (!ifindex) { - lxc_log_error("bad index %s", strindex); - goto out; + if (!read_info(path, "up", strindex, sizeof(strindex)) + if (device_up("lo")) { + lxc_log_error("failed to set the loopback up"); + return -1; + } + return 0; } if (!if_indextoname(ifindex, current_ifname)) { lxc_log_error("no interface corresponding to index '%d'", ifindex); - goto out; + return -1; } if (!read_info(path, "name", newname, sizeof(newname))) { if (device_rename(ifname, newname)) { lxc_log_error("failed to rename %s->%s", ifname, newname); - goto out; + return -1; } current_ifname = newname; } @@ -832,38 +836,36 @@ static int setup_network_cb(const char *name, const char *dirname, if (setup_hw_addr(hwaddr, current_ifname)) { lxc_log_error("failed to setup hw address for '%s'", current_ifname); - goto out; + return -1; } } if (setup_ip_addr(path, current_ifname)) { lxc_log_error("failed to setup ip addresses for '%s'", ifname); - goto out; + return -1; } if (setup_ip6_addr(path, current_ifname)) { lxc_log_error("failed to setup ipv6 addresses for '%s'", ifname); - goto out; + return -1; } if (!read_info(path, "up", strindex, sizeof(strindex))) { if (device_up(current_ifname)) { lxc_log_error("failed to set '%s' up", current_ifname); - goto out; + return -1; } /* the network is up, make the loopback up too */ if (device_up("lo")) { lxc_log_error("failed to set the loopback up"); - goto out; + return -1; } } - ret = 0; -out: - return ret; + return 0; } static int setup_network(const char *name) @@ -1007,12 +1009,12 @@ out: } static int instanciate_macvlan(const char *dirname, const char *file, pid_t pid) { - char *path = NULL, *strindex = NULL, *peer = NULL; + char path[MAXPATHLEN], *strindex = NULL, *peer = NULL; char link[IFNAMSIZ]; int ifindex, ret = -1; asprintf(&peer, "%s~%d", file, pid); - asprintf(&path, "%s/%s", dirname, file); + snprintf(path, MAXPATHLEN, "%s/%s", dirname, file); if (read_info(path, "link", link, IFNAMSIZ)) { lxc_log_error("failed to read bridge info"); goto out; @@ -1037,19 +1039,17 @@ static int instanciate_macvlan(const char *dirname, const char *file, pid_t pid) ret = 0; out: - free(path); free(strindex); - free(peer); return ret; } static int instanciate_phys(const char *dirname, const char *file, pid_t pid) { - char *path = NULL, *strindex = NULL; + char path[MAXPATHLEN], *strindex = NULL; char link[IFNAMSIZ]; int ifindex, ret = -1; - asprintf(&path, "%s/%s", dirname, file); + snprintf(path, MAXPATHLEN, "%s/%s", dirname, file); if (read_info(path, "link", link, IFNAMSIZ)) { lxc_log_error("failed to read link info"); goto out; @@ -1069,7 +1069,28 @@ static int instanciate_phys(const char *dirname, const char *file, pid_t pid) ret = 0; out: - free(path); + free(strindex); + return ret; +} + +static int instanciate_empty(const char *dirname, const char *file, pid_t pid) +{ + char path[MAXPATHLEN], *strindex = NULL; + int ret = -1; + + snprintf(path, MAXPATHLEN, "%s/%s", dirname, file); + if (!asprintf(&strindex, "%d", 0)) { + lxc_log_error("not enough memory"); + return -1; + } + + if (write_info(path, "ifindex", strindex)) { + lxc_log_error("failed to write interface index to %s", path); + goto out; + } + + ret = 0; +out: free(strindex); return ret; } @@ -1085,7 +1106,8 @@ static int instanciate_netdev_cb(const char *name, const char *dirname, return instanciate_macvlan(dirname, file, *pid); else if (!strncmp("phys", file, strlen("phys"))) return instanciate_phys(dirname, file, *pid); - + else if (!strncmp("empty", file, strlen("empty")) + return instanciate_empty(dirname, file, *pid); return -1; } @@ -1104,32 +1126,32 @@ static int instanciate_netdev(const char *name, pid_t pid) static int move_netdev_cb(const char *name, const char *dirname, const char *file, void *data) { - char *path, ifname[IFNAMSIZ], strindex[MAXINDEXLEN]; + char path[MAXPATHLEN], ifname[IFNAMSIZ], strindex[MAXINDEXLEN]; pid_t *pid = data; int ifindex, ret = -1; - asprintf(&path, "%s/%s", dirname, file); + snprintf(path, MAXPATHLEN, "%s/%s", dirname, file); if (read_info(path, "ifindex", strindex, MAXINDEXLEN) < 0) { lxc_log_error("failed to read index to from %s", path); goto out; } ifindex = atoi(strindex); + if (!ifindex) + return 0; + if (!if_indextoname(ifindex, ifname)) { lxc_log_error("interface with index %d does not exist", ifindex); - goto out; + return -1; } if (device_move(ifname, *pid)) { lxc_log_error("failed to move %s to %d", ifname, *pid); - goto out; + return -1; } - ret = 0; -out: - free(path); - return ret; + return 0; } static int move_netdev(const char *name, pid_t pid) diff --git a/src/lxc/lxc_create.c b/src/lxc/lxc_create.c index c34b4897d..af230d73d 100644 --- a/src/lxc/lxc_create.c +++ b/src/lxc/lxc_create.c @@ -59,7 +59,7 @@ int main(int argc, char *argv[]) } } - if (!name || !file) + if (!name) usage(argv[0]); if (lxc_config_init(&lxc_conf)) { @@ -67,7 +67,7 @@ int main(int argc, char *argv[]) return 1; } - if (lxc_config_read(file, &lxc_conf)) { + if (file && lxc_config_read(file, &lxc_conf)) { fprintf(stderr, "invalid configuration file\n"); return 1; }