]> git.proxmox.com Git - mirror_lxc.git/commitdiff
*** empty log message ***
authordlezcano <dlezcano>
Wed, 3 Sep 2008 12:06:19 +0000 (12:06 +0000)
committerdlezcano <dlezcano>
Wed, 3 Sep 2008 12:06:19 +0000 (12:06 +0000)
src/liblxc/conf.c
src/lxc/lxc_create.c

index 419a7e2e69de42926c2248582966393909d16e85..b9af55058d5535bb72cea7eefb730b89ea7dbc9a 100644 (file)
@@ -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)
index c34b4897da4a269b487fe872d858ce2a23fad8f6..af230d73da54cd5f8566b22342b559da3a0d4676 100644 (file)
@@ -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;
        }