[libvirt] [ PATCH ] fix multiple veth problem for OpenVZ

Dear all This is to fix multiple veth problem. NETIF setting was overwritten after first CT because any CT could not be found by character name. --- src/openvz/openvz_conf.c | 38 ++++++++++++++++++++++++++++++++++++++ src/openvz/openvz_conf.h | 1 + src/openvz/openvz_driver.c | 2 +- 3 files changed, 40 insertions(+), 1 deletions(-) diff --git a/src/openvz/openvz_conf.c b/src/openvz/openvz_conf.c index 43bbaf2..9fb9f7e 100644 --- a/src/openvz/openvz_conf.c +++ b/src/openvz/openvz_conf.c @@ -948,3 +948,41 @@ static int openvzAssignUUIDs(void) VIR_FREE(conf_dir); return 0; } + + +/* + * Return CTID from name + * + */ + +int openvzGetVEID(char *name) { + + char cmd[64]; + int veid; + FILE *fp; + + strcpy( cmd, VZLIST ); + strcat( cmd, " " ); + strcat( cmd, name ); + strcat( cmd, " -ovpsid -H" ); + + if ((fp = popen(cmd, "r")) == NULL) { + openvzError(NULL, VIR_ERR_INTERNAL_ERROR, "%s", _("popen failed")); + return -1; + } + + if (fscanf(fp, "%d\n", &veid ) != 1) { + if (feof(fp)) + return -1; + + openvzError(NULL, VIR_ERR_INTERNAL_ERROR, + "%s", _("Failed to parse vzlist output")); + goto cleanup; + } + + return veid; + + cleanup: + fclose(fp); + return -1; +} diff --git a/src/openvz/openvz_conf.h b/src/openvz/openvz_conf.h index 00e18b4..518c267 100644 --- a/src/openvz/openvz_conf.h +++ b/src/openvz/openvz_conf.h @@ -66,5 +66,6 @@ void openvzFreeDriver(struct openvz_driver *driver); int strtoI(const char *str); int openvzSetDefinedUUID(int vpsid, unsigned char *uuid); unsigned int openvzGetNodeCPUs(void); +int openvzGetVEID(char *name); #endif /* OPENVZ_CONF_H */ diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c index 196fd8c..879b5d0 100644 --- a/src/openvz/openvz_driver.c +++ b/src/openvz/openvz_driver.c @@ -667,7 +667,7 @@ openvzDomainSetNetwork(virConnectPtr conn, const char *vpsid, if (net->type == VIR_DOMAIN_NET_TYPE_BRIDGE) { virBuffer buf = VIR_BUFFER_INITIALIZER; char *dev_name_ve; - int veid = strtoI(vpsid); + int veid = openvzGetVEID(vpsid); //--netif_add ifname[,mac,host_ifname,host_mac] ADD_ARG_LIT("--netif_add") ; -- 1.5.2.2 ----- Yuji Nishida nishidy@nict.go.jp

On Wed, Jan 06, 2010 at 10:36:06PM +0900, Yuji NISHIDA wrote:
Dear all
This is to fix multiple veth problem. NETIF setting was overwritten after first CT because any CT could not be found by character name.
I found that old patch that we apparently forgot.
--- src/openvz/openvz_conf.c | 38 ++++++++++++++++++++++++++++++++++++++ src/openvz/openvz_conf.h | 1 + src/openvz/openvz_driver.c | 2 +- 3 files changed, 40 insertions(+), 1 deletions(-)
diff --git a/src/openvz/openvz_conf.c b/src/openvz/openvz_conf.c index 43bbaf2..9fb9f7e 100644 --- a/src/openvz/openvz_conf.c +++ b/src/openvz/openvz_conf.c @@ -948,3 +948,41 @@ static int openvzAssignUUIDs(void) VIR_FREE(conf_dir); return 0; } + + +/* + * Return CTID from name + * + */ + +int openvzGetVEID(char *name) {
name is actually a "const char *"
+ char cmd[64]; + int veid; + FILE *fp; + + strcpy( cmd, VZLIST ); + strcat( cmd, " " ); + strcat( cmd, name ); + strcat( cmd, " -ovpsid -H" );
and to avoid an horrible out of buffer write if name or VZLIST path is too long I fixed this to use virAsprintf() to allocate and format the command.
+ if ((fp = popen(cmd, "r")) == NULL) { + openvzError(NULL, VIR_ERR_INTERNAL_ERROR, "%s", _("popen failed")); + return -1; + } + + if (fscanf(fp, "%d\n", &veid ) != 1) { + if (feof(fp)) + return -1; + + openvzError(NULL, VIR_ERR_INTERNAL_ERROR, + "%s", _("Failed to parse vzlist output")); + goto cleanup; + } + + return veid; + + cleanup: + fclose(fp); + return -1; +} diff --git a/src/openvz/openvz_conf.h b/src/openvz/openvz_conf.h index 00e18b4..518c267 100644 --- a/src/openvz/openvz_conf.h +++ b/src/openvz/openvz_conf.h @@ -66,5 +66,6 @@ void openvzFreeDriver(struct openvz_driver *driver); int strtoI(const char *str); int openvzSetDefinedUUID(int vpsid, unsigned char *uuid); unsigned int openvzGetNodeCPUs(void); +int openvzGetVEID(char *name);
made the parameter const
#endif /* OPENVZ_CONF_H */ diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c index 196fd8c..879b5d0 100644 --- a/src/openvz/openvz_driver.c +++ b/src/openvz/openvz_driver.c @@ -667,7 +667,7 @@ openvzDomainSetNetwork(virConnectPtr conn, const char *vpsid, if (net->type == VIR_DOMAIN_NET_TYPE_BRIDGE) { virBuffer buf = VIR_BUFFER_INITIALIZER; char *dev_name_ve; - int veid = strtoI(vpsid); + int veid = openvzGetVEID(vpsid);
//--netif_add ifname[,mac,host_ifname,host_mac] ADD_ARG_LIT("--netif_add") ;
That said the patch looks reasonable once those are fixed, so I pushed this, please double check, thanks ! Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/
participants (2)
-
Daniel Veillard
-
Yuji NISHIDA