diff options
Diffstat (limited to 'src/dumm')
-rw-r--r-- | src/dumm/cowfs.c | 4 | ||||
-rw-r--r-- | src/dumm/guest.c | 1 | ||||
-rw-r--r-- | src/dumm/iface.c | 8 | ||||
-rw-r--r-- | src/dumm/mconsole.c | 23 |
4 files changed, 21 insertions, 15 deletions
diff --git a/src/dumm/cowfs.c b/src/dumm/cowfs.c index 4c16c7c5d..f7984635a 100644 --- a/src/dumm/cowfs.c +++ b/src/dumm/cowfs.c @@ -858,13 +858,15 @@ cowfs_t *cowfs_create(char *master, char *host, char *mount) { DBG1("failed to open master filesystem '%s'", master); free(this); + return NULL; } this->host_fd = open(host, O_RDONLY | O_DIRECTORY); - if (this->master_fd < 0) + if (this->host_fd < 0) { DBG1("failed to open host filesystem '%s'", host); close(this->master_fd); free(this); + return NULL; } this->over_fd = -1; diff --git a/src/dumm/guest.c b/src/dumm/guest.c index 4b2652688..d43f46d99 100644 --- a/src/dumm/guest.c +++ b/src/dumm/guest.c @@ -424,6 +424,7 @@ static void destroy(private_guest_t *this) { close(this->dir); } + this->ifaces->destroy(this->ifaces); free(this->dirname); free(this->name); free(this); diff --git a/src/dumm/iface.c b/src/dumm/iface.c index b78c10bec..b1fc641d0 100644 --- a/src/dumm/iface.c +++ b/src/dumm/iface.c @@ -205,10 +205,6 @@ iface_t *iface_create(char *guest, char *guestif, mconsole_t *mconsole) free(this); return NULL; } - if (!iface_control(this->hostif, TRUE)) - { - DBG1("bringing iface '%s' up failed: %m", this->hostif); - } if (!this->mconsole->add_iface(this->mconsole, this->guestif, this->hostif)) { DBG1("creating interface '%s' in guest failed", this->guestif); @@ -218,6 +214,10 @@ iface_t *iface_create(char *guest, char *guestif, mconsole_t *mconsole) free(this); return NULL; } + if (!iface_control(this->hostif, TRUE)) + { + DBG1("bringing iface '%s' up failed: %m", this->hostif); + } return &this->public; } diff --git a/src/dumm/mconsole.c b/src/dumm/mconsole.c index d9864f676..78c97fb6b 100644 --- a/src/dumm/mconsole.c +++ b/src/dumm/mconsole.c @@ -156,21 +156,25 @@ static int request(private_mconsole_t *this, char *command, */ static bool add_iface(private_mconsole_t *this, char *guest, char *host) { - char buf[128]; - int len; + char in[128], out[128]; + int len, tries = 0; - len = snprintf(buf, sizeof(buf), "config %s=tuntap,%s", guest, host); - if (len < 0 || len >= sizeof(buf)) + len = snprintf(in, sizeof(in), "config %s=tuntap,%s", guest, host); + if (len < 0 || len >= sizeof(in)) { return FALSE; } - len = sizeof(buf); - if (request(this, buf, buf, &len) != 0) + while (tries++ < 10) { - DBG1("adding interface failed: %.*s", len, buf); - return FALSE; + len = sizeof(in); + if (request(this, in, out, &len) == 0) + { + return TRUE; + } + usleep(10000 * tries); } - return TRUE; + DBG1("adding interface failed: %.*s", len, out); + return FALSE; } /** @@ -188,7 +192,6 @@ static bool del_iface(private_mconsole_t *this, char *guest) } if (request(this, buf, buf, &len) != 0) { - DBG1("removing interface failed: %.*s", len, buf); return FALSE; } return TRUE; |