tty = xenStoreDomainGetConsolePath(conn, id);
vncport = xenStoreDomainGetVNCPort(conn, id);
xenUnifiedUnlock(priv);
- if (!(def = xenDaemonParseSxpr(root,
- priv->xendConfigVersion,
- cpus,
- tty,
- vncport)))
+ if (!(def = xenParseSxpr(root,
+ priv->xendConfigVersion,
+ cpus,
+ tty,
+ vncport)))
goto cleanup;
cleanup:
VIR_DOMAIN_XML_INACTIVE)))
return (NULL);
- if (!(sexpr = xenDaemonFormatSxpr(conn, def, priv->xendConfigVersion))) {
+ if (!(sexpr = xenFormatSxpr(conn, def, priv->xendConfigVersion))) {
virDomainDefFree(def);
return (NULL);
}
switch (dev->type) {
case VIR_DOMAIN_DEVICE_DISK:
- if (xenDaemonFormatSxprDisk(domain->conn,
- dev->data.disk,
- &buf,
- STREQ(def->os.type, "hvm") ? 1 : 0,
- priv->xendConfigVersion, 1) < 0)
+ if (xenFormatSxprDisk(domain->conn,
+ dev->data.disk,
+ &buf,
+ STREQ(def->os.type, "hvm") ? 1 : 0,
+ priv->xendConfigVersion, 1) < 0)
goto cleanup;
if (dev->data.disk->device != VIR_DOMAIN_DISK_DEVICE_CDROM) {
break;
case VIR_DOMAIN_DEVICE_NET:
- if (xenDaemonFormatSxprNet(domain->conn,
- dev->data.net,
- &buf,
- STREQ(def->os.type, "hvm") ? 1 : 0,
- priv->xendConfigVersion, 1) < 0)
+ if (xenFormatSxprNet(domain->conn,
+ dev->data.net,
+ &buf,
+ STREQ(def->os.type, "hvm") ? 1 : 0,
+ priv->xendConfigVersion, 1) < 0)
goto cleanup;
char macStr[VIR_MAC_STRING_BUFLEN];
case VIR_DOMAIN_DEVICE_HOSTDEV:
if (dev->data.hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
dev->data.hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) {
- if (xenDaemonFormatSxprOnePCI(dev->data.hostdev,
- &buf, 0) < 0)
+ if (xenFormatSxprOnePCI(dev->data.hostdev, &buf, 0) < 0)
goto cleanup;
virDomainDevicePCIAddress PCIAddr;
switch (dev->type) {
case VIR_DOMAIN_DEVICE_DISK:
- if (xenDaemonFormatSxprDisk(domain->conn,
- dev->data.disk,
- &buf,
- STREQ(def->os.type, "hvm") ? 1 : 0,
- priv->xendConfigVersion, 1) < 0)
+ if (xenFormatSxprDisk(domain->conn,
+ dev->data.disk,
+ &buf,
+ STREQ(def->os.type, "hvm") ? 1 : 0,
+ priv->xendConfigVersion, 1) < 0)
goto cleanup;
break;
if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV) {
if (dev->data.hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
dev->data.hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) {
- if (xenDaemonFormatSxprOnePCI(dev->data.hostdev,
- &buf, 1) < 0)
+ if (xenFormatSxprOnePCI(dev->data.hostdev, &buf, 1) < 0)
goto cleanup;
} else {
virXendError(VIR_ERR_NO_SUPPORT, "%s",
return (NULL);
}
- if (!(sexpr = xenDaemonFormatSxpr(conn, def, priv->xendConfigVersion))) {
+ if (!(sexpr = xenFormatSxpr(conn, def, priv->xendConfigVersion))) {
virXendError(VIR_ERR_XML_ERROR,
"%s", _("failed to build sexpr"));
goto error;
vncport = xenStoreDomainGetVNCPort(domain->conn, id);
xenUnifiedUnlock(priv);
- if (!(def = xenDaemonParseSxpr(root, priv->xendConfigVersion, NULL, tty,
- vncport)))
+ if (!(def = xenParseSxpr(root, priv->xendConfigVersion, NULL, tty,
+ vncport)))
goto cleanup;
for (i = 0 ; i < def->ndisks ; i++) {
*****************************************************************/
/**
- * xenDaemonParseSxprOS
+ * xenParseSxprOS
* @node: the root of the parsed S-Expression
* @def: the domain config
* @hvm: true or 1 if no contains HVM S-Expression
* Returns 0 in case of success and -1 in case of error
*/
static int
-xenDaemonParseSxprOS(const struct sexpr *node,
- virDomainDefPtr def,
- int hvm)
+xenParseSxprOS(const struct sexpr *node,
+ virDomainDefPtr def,
+ int hvm)
{
if (hvm) {
if (sexpr_node_copy(node, "domain/image/hvm/loader", &def->os.loader) < 0)
}
virDomainChrDefPtr
-xenDaemonParseSxprChar(const char *value,
- const char *tty)
+xenParseSxprChar(const char *value,
+ const char *tty)
{
const char *prefix;
char *tmp;
* Returns 0 if successful or -1 if failed.
*/
static int
-xenDaemonParseSxprDisks(virDomainDefPtr def,
- const struct sexpr *root,
- int hvm,
- int xendConfigVersion)
+xenParseSxprDisks(virDomainDefPtr def,
+ const struct sexpr *root,
+ int hvm,
+ int xendConfigVersion)
{
const struct sexpr *cur, *node;
virDomainDiskDefPtr disk = NULL;
static int
-xenDaemonParseSxprNets(virDomainDefPtr def,
- const struct sexpr *root)
+xenParseSxprNets(virDomainDefPtr def,
+ const struct sexpr *root)
{
virDomainNetDefPtr net = NULL;
const struct sexpr *cur, *node;
int
-xenDaemonParseSxprSound(virDomainDefPtr def,
- const char *str)
+xenParseSxprSound(virDomainDefPtr def,
+ const char *str)
{
if (STREQ(str, "all")) {
int i;
static int
-xenDaemonParseSxprUSB(virDomainDefPtr def,
- const struct sexpr *root)
+xenParseSxprUSB(virDomainDefPtr def,
+ const struct sexpr *root)
{
struct sexpr *cur, *node;
const char *tmp;
}
static int
-xenDaemonParseSxprGraphicsOld(virDomainDefPtr def,
- const struct sexpr *root,
- int hvm,
- int xendConfigVersion, int vncport)
+xenParseSxprGraphicsOld(virDomainDefPtr def,
+ const struct sexpr *root,
+ int hvm,
+ int xendConfigVersion, int vncport)
{
const char *tmp;
virDomainGraphicsDefPtr graphics = NULL;
static int
-xenDaemonParseSxprGraphicsNew(virDomainDefPtr def,
- const struct sexpr *root, int vncport)
+xenParseSxprGraphicsNew(virDomainDefPtr def,
+ const struct sexpr *root, int vncport)
{
virDomainGraphicsDefPtr graphics = NULL;
const struct sexpr *cur, *node;
}
/**
- * xenDaemonParseSxprPCI
+ * xenParseSxprPCI
* @root: root sexpr
*
* This parses out block devices from the domain sexpr
* Returns 0 if successful or -1 if failed.
*/
static int
-xenDaemonParseSxprPCI(virDomainDefPtr def,
- const struct sexpr *root)
+xenParseSxprPCI(virDomainDefPtr def,
+ const struct sexpr *root)
{
const struct sexpr *cur, *tmp = NULL, *node;
virDomainHostdevDefPtr dev = NULL;
/**
- * xenDaemonParseSxpr:
+ * xenParseSxpr:
* @conn: the connection associated with the XML
* @root: the root of the parsed S-Expression
* @xendConfigVersion: version of xend
* the caller must free() the returned value.
*/
virDomainDefPtr
-xenDaemonParseSxpr(const struct sexpr *root,
- int xendConfigVersion,
- const char *cpus, char *tty, int vncport)
+xenParseSxpr(const struct sexpr *root,
+ int xendConfigVersion,
+ const char *cpus, char *tty, int vncport)
{
const char *tmp;
virDomainDefPtr def;
if (def->id != 0) {
if (sexpr_lookup(root, "domain/image")) {
- if (xenDaemonParseSxprOS(root, def, hvm) < 0)
+ if (xenParseSxprOS(root, def, hvm) < 0)
goto error;
}
}
goto no_memory;
/* append block devices */
- if (xenDaemonParseSxprDisks(def, root, hvm, xendConfigVersion) < 0)
+ if (xenParseSxprDisks(def, root, hvm, xendConfigVersion) < 0)
goto error;
- if (xenDaemonParseSxprNets(def, root) < 0)
+ if (xenParseSxprNets(def, root) < 0)
goto error;
- if (xenDaemonParseSxprPCI(def, root) < 0)
+ if (xenParseSxprPCI(def, root) < 0)
goto error;
/* New style graphics device config */
- if (xenDaemonParseSxprGraphicsNew(def, root, vncport) < 0)
+ if (xenParseSxprGraphicsNew(def, root, vncport) < 0)
goto error;
/* Graphics device (HVM <= 3.0.4, or PV <= 3.0.3) vnc config */
if ((def->ngraphics == 0) &&
- xenDaemonParseSxprGraphicsOld(def, root, hvm, xendConfigVersion,
+ xenParseSxprGraphicsOld(def, root, hvm, xendConfigVersion,
vncport) < 0)
goto error;
/* in case of HVM we have USB device emulation */
if (hvm &&
- xenDaemonParseSxprUSB(def, root) < 0)
+ xenParseSxprUSB(def, root) < 0)
goto error;
/* Character device config */
tmp = sexpr_node(root, "domain/image/hvm/serial");
if (tmp && STRNEQ(tmp, "none")) {
virDomainChrDefPtr chr;
- if ((chr = xenDaemonParseSxprChar(tmp, tty)) == NULL)
+ if ((chr = xenParseSxprChar(tmp, tty)) == NULL)
goto error;
if (VIR_REALLOC_N(def->serials, def->nserials+1) < 0) {
virDomainChrDefFree(chr);
if (tmp && STRNEQ(tmp, "none")) {
virDomainChrDefPtr chr;
/* XXX does XenD stuff parallel port tty info into xenstore somewhere ? */
- if ((chr = xenDaemonParseSxprChar(tmp, NULL)) == NULL)
+ if ((chr = xenParseSxprChar(tmp, NULL)) == NULL)
goto error;
if (VIR_REALLOC_N(def->parallels, def->nparallels+1) < 0) {
virDomainChrDefFree(chr);
}
} else {
/* Fake a paravirt console, since that's not in the sexpr */
- if (!(def->console = xenDaemonParseSxprChar("pty", tty)))
+ if (!(def->console = xenParseSxprChar("pty", tty)))
goto error;
def->console->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE;
def->console->targetType = VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_XEN;
if (hvm &&
(tmp = sexpr_node(root, "domain/image/hvm/soundhw")) != NULL &&
*tmp) {
- if (xenDaemonParseSxprSound(def, tmp) < 0)
+ if (xenParseSxprSound(def, tmp) < 0)
goto error;
}
}
virDomainDefPtr
-xenDaemonParseSxprString(const char *sexpr,
+xenParseSxprString(const char *sexpr,
int xendConfigVersion, char *tty, int vncport)
{
struct sexpr *root = string2sexpr(sexpr);
if (!root)
return NULL;
- def = xenDaemonParseSxpr(root, xendConfigVersion, NULL, tty, vncport);
+ def = xenParseSxpr(root, xendConfigVersion, NULL, tty, vncport);
sexpr_free(root);
* Returns 0 in case of success, -1 in case of error
*/
static int
-xenDaemonFormatSxprGraphicsNew(virDomainGraphicsDefPtr def,
- virBufferPtr buf)
+xenFormatSxprGraphicsNew(virDomainGraphicsDefPtr def,
+ virBufferPtr buf)
{
if (def->type != VIR_DOMAIN_GRAPHICS_TYPE_SDL &&
def->type != VIR_DOMAIN_GRAPHICS_TYPE_VNC) {
static int
-xenDaemonFormatSxprGraphicsOld(virDomainGraphicsDefPtr def,
- virBufferPtr buf,
- int xendConfigVersion)
+xenFormatSxprGraphicsOld(virDomainGraphicsDefPtr def,
+ virBufferPtr buf,
+ int xendConfigVersion)
{
if (def->type != VIR_DOMAIN_GRAPHICS_TYPE_SDL &&
def->type != VIR_DOMAIN_GRAPHICS_TYPE_VNC) {
}
int
-xenDaemonFormatSxprChr(virDomainChrDefPtr def,
- virBufferPtr buf)
+xenFormatSxprChr(virDomainChrDefPtr def,
+ virBufferPtr buf)
{
const char *type = virDomainChrTypeToString(def->source.type);
/**
* virDomainParseXMLDiskDesc:
* @node: node containing disk description
- * @conn: pointer to the hypervisor connection
* @buf: a buffer for the result S-Expr
* @xendConfigVersion: xend configuration file format
*
* Returns 0 in case of success, -1 in case of error.
*/
int
-xenDaemonFormatSxprDisk(virConnectPtr conn ATTRIBUTE_UNUSED,
- virDomainDiskDefPtr def,
- virBufferPtr buf,
- int hvm,
- int xendConfigVersion,
- int isAttach)
+xenFormatSxprDisk(virConnectPtr conn ATTRIBUTE_UNUSED,
+ virDomainDiskDefPtr def,
+ virBufferPtr buf,
+ int hvm,
+ int xendConfigVersion,
+ int isAttach)
{
/* Xend (all versions) put the floppy device config
* under the hvm (image (os)) block
}
/**
- * xenDaemonFormatSxprNet
- * @conn: pointer to the hypervisor connection
+ * xenFormatSxprNet
* @node: node containing the interface description
* @buf: a buffer for the result S-Expr
* @xendConfigVersion: xend configuration file format
* Returns 0 in case of success, -1 in case of error.
*/
int
-xenDaemonFormatSxprNet(virConnectPtr conn,
- virDomainNetDefPtr def,
- virBufferPtr buf,
- int hvm,
- int xendConfigVersion,
- int isAttach)
+xenFormatSxprNet(virConnectPtr conn,
+ virDomainNetDefPtr def,
+ virBufferPtr buf,
+ int hvm,
+ int xendConfigVersion,
+ int isAttach)
{
const char *script = DEFAULT_VIF_SCRIPT;
static void
-xenDaemonFormatSxprPCI(virDomainHostdevDefPtr def,
- virBufferPtr buf)
+xenFormatSxprPCI(virDomainHostdevDefPtr def,
+ virBufferPtr buf)
{
virBufferVSprintf(buf, "(dev (domain 0x%04x)(bus 0x%02x)(slot 0x%02x)(func 0x%x))",
def->source.subsys.u.pci.domain,
}
int
-xenDaemonFormatSxprOnePCI(virDomainHostdevDefPtr def,
- virBufferPtr buf,
- int detach)
+xenFormatSxprOnePCI(virDomainHostdevDefPtr def,
+ virBufferPtr buf,
+ int detach)
{
if (def->managed) {
XENXS_ERROR(VIR_ERR_NO_SUPPORT, "%s",
}
virBufferAddLit(buf, "(pci ");
- xenDaemonFormatSxprPCI(def, buf);
+ xenFormatSxprPCI(def, buf);
if (detach)
virBufferAddLit(buf, "(state 'Closing')");
else
}
static int
-xenDaemonFormatSxprAllPCI(virDomainDefPtr def,
- virBufferPtr buf)
+xenFormatSxprAllPCI(virDomainDefPtr def,
+ virBufferPtr buf)
{
int hasPCI = 0;
int i;
return -1;
}
- xenDaemonFormatSxprPCI(def->hostdevs[i], buf);
+ xenFormatSxprPCI(def->hostdevs[i], buf);
}
}
virBufferAddLit(buf, "))");
}
int
-xenDaemonFormatSxprSound(virDomainDefPtr def,
- virBufferPtr buf)
+xenFormatSxprSound(virDomainDefPtr def,
+ virBufferPtr buf)
{
const char *str;
int i;
static int
-xenDaemonFormatSxprInput(virDomainInputDefPtr input,
- virBufferPtr buf)
+xenFormatSxprInput(virDomainInputDefPtr input,
+ virBufferPtr buf)
{
if (input->bus != VIR_DOMAIN_INPUT_BUS_USB)
return 0;
verify(MAX_VIRT_CPUS <= sizeof(1UL) * CHAR_BIT);
/**
- * xenDaemonFormatSxpr:
+ * xenFormatSxpr:
* @conn: pointer to the hypervisor connection
* @def: domain config definition
* @xendConfigVersion: xend configuration file format
* the caller must free() the returned value.
*/
char *
-xenDaemonFormatSxpr(virConnectPtr conn,
- virDomainDefPtr def,
- int xendConfigVersion)
+xenFormatSxpr(virConnectPtr conn,
+ virDomainDefPtr def,
+ int xendConfigVersion)
{
virBuffer buf = VIR_BUFFER_INITIALIZER;
char uuidstr[VIR_UUID_STRING_BUFLEN];
virBufferAddLit(&buf, "(usb 1)");
for (i = 0 ; i < def->ninputs ; i++)
- if (xenDaemonFormatSxprInput(def->inputs[i], &buf) < 0)
+ if (xenFormatSxprInput(def->inputs[i], &buf) < 0)
goto error;
if (def->parallels) {
virBufferAddLit(&buf, "(parallel ");
- if (xenDaemonFormatSxprChr(def->parallels[0], &buf) < 0)
+ if (xenFormatSxprChr(def->parallels[0], &buf) < 0)
goto error;
virBufferAddLit(&buf, ")");
} else {
}
if (def->serials) {
virBufferAddLit(&buf, "(serial ");
- if (xenDaemonFormatSxprChr(def->serials[0], &buf) < 0)
+ if (xenFormatSxprChr(def->serials[0], &buf) < 0)
goto error;
virBufferAddLit(&buf, ")");
} else {
if (def->sounds) {
virBufferAddLit(&buf, "(soundhw '");
- if (xenDaemonFormatSxprSound(def, &buf) < 0)
+ if (xenFormatSxprSound(def, &buf) < 0)
goto error;
virBufferAddLit(&buf, "')");
}
if ((!hvm && xendConfigVersion < XEND_CONFIG_MIN_VERS_PVFB_NEWCONF) ||
(hvm && xendConfigVersion < 4)) {
if ((def->ngraphics == 1) &&
- xenDaemonFormatSxprGraphicsOld(def->graphics[0],
- &buf, xendConfigVersion) < 0)
+ xenFormatSxprGraphicsOld(def->graphics[0],
+ &buf, xendConfigVersion) < 0)
goto error;
}
}
for (i = 0 ; i < def->ndisks ; i++)
- if (xenDaemonFormatSxprDisk(conn, def->disks[i],
- &buf, hvm, xendConfigVersion, 0) < 0)
+ if (xenFormatSxprDisk(conn, def->disks[i],
+ &buf, hvm, xendConfigVersion, 0) < 0)
goto error;
for (i = 0 ; i < def->nnets ; i++)
- if (xenDaemonFormatSxprNet(conn, def->nets[i],
- &buf, hvm, xendConfigVersion, 0) < 0)
+ if (xenFormatSxprNet(conn, def->nets[i],
+ &buf, hvm, xendConfigVersion, 0) < 0)
goto error;
- if (xenDaemonFormatSxprAllPCI(def, &buf) < 0)
+ if (xenFormatSxprAllPCI(def, &buf) < 0)
goto error;
/* New style PV graphics config xen >= 3.0.4,
if ((xendConfigVersion >= XEND_CONFIG_MIN_VERS_PVFB_NEWCONF && !hvm) ||
(xendConfigVersion >= 4 && hvm)) {
if ((def->ngraphics == 1) &&
- xenDaemonFormatSxprGraphicsNew(def->graphics[0], &buf) < 0)
+ xenFormatSxprGraphicsNew(def->graphics[0], &buf) < 0)
goto error;
}
* domain, suitable for later feeding for virDomainCreateXML
*/
virDomainDefPtr
-xenXMDomainConfigParse(virConfPtr conf, int xendConfigVersion,
+xenParseXM(virConfPtr conf, int xendConfigVersion,
virCapsPtr caps) {
const char *str;
int hvm = 0;
if (xenXMConfigGetString(conf, "parallel", &str, NULL) < 0)
goto cleanup;
if (str && STRNEQ(str, "none") &&
- !(chr = xenDaemonParseSxprChar(str, NULL)))
+ !(chr = xenParseSxprChar(str, NULL)))
goto cleanup;
if (chr) {
if (xenXMConfigGetString(conf, "serial", &str, NULL) < 0)
goto cleanup;
if (str && STRNEQ(str, "none") &&
- !(chr = xenDaemonParseSxprChar(str, NULL)))
+ !(chr = xenParseSxprChar(str, NULL)))
goto cleanup;
if (chr) {
def->nserials++;
}
} else {
- if (!(def->console = xenDaemonParseSxprChar("pty", NULL)))
+ if (!(def->console = xenParseSxprChar("pty", NULL)))
goto cleanup;
def->console->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE;
def->console->targetType = VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_XEN;
goto cleanup;
if (str &&
- xenDaemonParseSxprSound(def, str) < 0)
+ xenParseSxprSound(def, str) < 0)
goto cleanup;
}
}
-static int xenXMDomainConfigFormatDisk(virConfValuePtr list,
+static int xenFormatXMDisk(virConfValuePtr list,
virDomainDiskDefPtr disk,
int hvm,
int xendConfigVersion)
return -1;
}
-static int xenXMDomainConfigFormatNet(virConnectPtr conn,
+static int xenFormatXMNet(virConnectPtr conn,
virConfValuePtr list,
virDomainNetDefPtr net,
int hvm, int xendConfigVersion)
static int
-xenXMDomainConfigFormatPCI(virConfPtr conf,
+xenFormatXMPCI(virConfPtr conf,
virDomainDefPtr def)
{
either 32, or 64 on a platform where long is big enough. */
verify(MAX_VIRT_CPUS <= sizeof(1UL) * CHAR_BIT);
-virConfPtr xenXMDomainConfigFormat(virConnectPtr conn,
+virConfPtr xenFormatXM(virConnectPtr conn,
virDomainDefPtr def,
int xendConfigVersion) {
virConfPtr conf = NULL;
if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY)
continue;
- if (xenXMDomainConfigFormatDisk(diskVal, def->disks[i],
- hvm, xendConfigVersion) < 0)
+ if (xenFormatXMDisk(diskVal, def->disks[i],
+ hvm, xendConfigVersion) < 0)
goto cleanup;
}
if (diskVal->list != NULL) {
netVal->list = NULL;
for (i = 0 ; i < def->nnets ; i++) {
- if (xenXMDomainConfigFormatNet(conn, netVal,
- def->nets[i],
- hvm, xendConfigVersion) < 0)
+ if (xenFormatXMNet(conn, netVal,def->nets[i],
+ hvm, xendConfigVersion) < 0)
goto cleanup;
}
if (netVal->list != NULL) {
}
VIR_FREE(netVal);
- if (xenXMDomainConfigFormatPCI(conf, def) < 0)
+ if (xenFormatXMPCI(conf, def) < 0)
goto cleanup;
if (hvm) {
char *str;
int ret;
- ret = xenDaemonFormatSxprChr(def->parallels[0], &buf);
+ ret = xenFormatSxprChr(def->parallels[0], &buf);
str = virBufferContentAndReset(&buf);
if (ret == 0)
ret = xenXMConfigSetString(conf, "parallel", str);
char *str;
int ret;
- ret = xenDaemonFormatSxprChr(def->serials[0], &buf);
+ ret = xenFormatSxprChr(def->serials[0], &buf);
str = virBufferContentAndReset(&buf);
if (ret == 0)
ret = xenXMConfigSetString(conf, "serial", str);
if (def->sounds) {
virBuffer buf = VIR_BUFFER_INITIALIZER;
char *str = NULL;
- int ret = xenDaemonFormatSxprSound(def, &buf);
+ int ret = xenFormatSxprSound(def, &buf);
str = virBufferContentAndReset(&buf);
if (ret == 0)
ret = xenXMConfigSetString(conf, "soundhw", str);