[libvirt] [PATCH] Implement autostart commands for xen

Daniel P. Berrange berrange at redhat.com
Thu May 8 13:27:32 UTC 2008


On Wed, May 07, 2008 at 04:21:25PM -0400, Cole Robinson wrote:
> +int
> +xenDaemonDomainGetAutostart(virDomainPtr domain,
> +                            int *autostart)
> +{
> +    struct sexpr *root;
> +    const char *tmp;
> +
> +    if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
> +        virXendError((domain ? domain->conn : NULL), VIR_ERR_INVALID_ARG,
> +                     __FUNCTION__);
> +        return (-1);
> +    }

Since this only works in Xen 3.0.4 or later can you add in:

    /* xm_internal.c (the support for defined domains from /etc/xen
     * config files used by old Xen) will handle this.
     */
    if (priv->xendConfigVersion < 3)
        return(-1);

This ensures that users will get a 'operation not supported' error for older
XenD - at least until we implement the alternate /etc/xen/auto symlink scheme
for xm_internal.c driver.


> +xenDaemonDomainSetAutostart(virDomainPtr domain,
> +                            int autostart)
> +{
> +    struct sexpr *root, *autonode;
> +    const char *autostr;
> +    char buf[4096];
> +    int ret = -1;
> +
> +    if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
> +        virXendError((domain ? domain->conn : NULL), VIR_ERR_INTERNAL_ERROR,
> +                     __FUNCTION__);
> +        return (-1);
> +    }

Same here - add a xendConfigVersion check.

> +    root = sexpr_get(domain->conn, "/xend/domain/%s?detail=1", domain->name);
> +    if (root == NULL) {
> +        virXendError (domain->conn, VIR_ERR_XEN_CALL,
> +                      _("xenDaemonSetAutostart failed to find this domain"));
> +        return (-1);
> +    }
> +
> +    autostr = sexpr_node(root, "domain/on_xend_start");
> +    if (autostr) {
> +        if (!STREQ(autostr, "ignore") && !STREQ(autostr, "start")) {
> +            virXendError(domain->conn, VIR_ERR_INTERNAL_ERROR,
> +                         _("unexpected value from on_xend_start"));
> +            goto error;
> +        }
> +
> +        // Change the autostart value in place, then define the new sexpr
> +        autonode = sexpr_lookup(root, "domain/on_xend_start");
> +        free(autonode->u.s.car->u.value);
> +        autonode->u.s.car->u.value = (autostart ? strdup("start")
> +                                                : strdup("ignore"));
> +        if (!(autonode->u.s.car->u.value)) {
> +            virXendError(domain->conn, VIR_ERR_INTERNAL_ERROR,
> +                         _("no memory"));
> +            goto error;
> +        }
> +
> +        if (sexpr2string(root, buf, 4096) == 0) {

Use sizeof(buf) here instead of duplicating 4096 constant.

Regards,
Dan.
-- 
|: Red Hat, Engineering, Boston   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list