int *autostart);
int virDomainSetAutostart (virDomainPtr domain,
int autostart);
+int virDomainGetAutostartOnce(virDomainPtr domain,
+ int *autostart);
+int virDomainSetAutostartOnce(virDomainPtr domain,
+ int autostart);
/**
* virVcpuState:
(*virDrvDomainSetAutostart)(virDomainPtr domain,
int autostart);
+typedef int
+(*virDrvDomainGetAutostartOnce)(virDomainPtr domain,
+ int *autostart);
+
+typedef int
+(*virDrvDomainSetAutostartOnce)(virDomainPtr domain,
+ int autostart);
+
typedef char *
(*virDrvDomainGetSchedulerType)(virDomainPtr domain,
int *nparams);
virDrvDomainDetachDeviceAlias domainDetachDeviceAlias;
virDrvDomainGetAutostart domainGetAutostart;
virDrvDomainSetAutostart domainSetAutostart;
+ virDrvDomainGetAutostartOnce domainGetAutostartOnce;
+ virDrvDomainSetAutostartOnce domainSetAutostartOnce;
virDrvDomainGetSchedulerType domainGetSchedulerType;
virDrvDomainGetSchedulerParameters domainGetSchedulerParameters;
virDrvDomainGetSchedulerParametersFlags domainGetSchedulerParametersFlags;
}
+/**
+ * virDomainGetAutostartOnce:
+ * @domain: a domain object
+ * @autostart: the value returned
+ *
+ * Provides a boolean value indicating whether the domain
+ * is configured to be automatically started the next time
+ * the host machine boots only.
+ *
+ * Returns -1 in case of error, 0 in case of success
+ *
+ * Since: 11.2.0
+ */
+int
+virDomainGetAutostartOnce(virDomainPtr domain,
+ int *autostart)
+{
+ virConnectPtr conn;
+
+ VIR_DOMAIN_DEBUG(domain, "autostart=%p", autostart);
+
+ virResetLastError();
+
+ virCheckDomainReturn(domain, -1);
+ virCheckNonNullArgGoto(autostart, error);
+
+ conn = domain->conn;
+
+ if (conn->driver->domainGetAutostartOnce) {
+ int ret;
+ ret = conn->driver->domainGetAutostartOnce(domain, autostart);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virReportUnsupportedError();
+
+ error:
+ virDispatchError(domain->conn);
+ return -1;
+}
+
+
+/**
+ * virDomainSetAutostartOnce:
+ * @domain: a domain object
+ * @autostart: whether the domain should be automatically started 0 or 1
+ *
+ * Configure the domain to be automatically started
+ * the next time the host machine boots only.
+ *
+ * Returns -1 in case of error, 0 in case of success
+ *
+ * Since: 11.2.0
+ */
+int
+virDomainSetAutostartOnce(virDomainPtr domain,
+ int autostart)
+{
+ virConnectPtr conn;
+
+ VIR_DOMAIN_DEBUG(domain, "autostart=%d", autostart);
+
+ virResetLastError();
+
+ virCheckDomainReturn(domain, -1);
+ conn = domain->conn;
+
+ virCheckReadOnlyGoto(conn->flags, error);
+
+ if (conn->driver->domainSetAutostartOnce) {
+ int ret;
+ ret = conn->driver->domainSetAutostartOnce(domain, autostart);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virReportUnsupportedError();
+
+ error:
+ virDispatchError(domain->conn);
+ return -1;
+}
+
+
/**
* virDomainInjectNMI:
* @domain: pointer to domain object, or NULL for Domain0
virDomainGraphicsReload;
} LIBVIRT_10.1.0;
+LIBVIRT_11.2.0 {
+ global:
+ virDomainGetAutostartOnce;
+ virDomainSetAutostartOnce;
+} LIBVIRT_10.2.0;
+
# .... define new API here using predicted next version number ....
.domainDetachDeviceAlias = remoteDomainDetachDeviceAlias, /* 4.4.0 */
.domainGetAutostart = remoteDomainGetAutostart, /* 0.3.0 */
.domainSetAutostart = remoteDomainSetAutostart, /* 0.3.0 */
+ .domainGetAutostartOnce = remoteDomainGetAutostartOnce, /* 11.2.0 */
+ .domainSetAutostartOnce = remoteDomainSetAutostartOnce, /* 11.2.0 */
.domainGetSchedulerType = remoteDomainGetSchedulerType, /* 0.3.0 */
.domainGetSchedulerParameters = remoteDomainGetSchedulerParameters, /* 0.3.0 */
.domainGetSchedulerParametersFlags = remoteDomainGetSchedulerParametersFlags, /* 0.9.2 */
remote_nonnull_string name;
unsigned int flags;
};
+
+struct remote_domain_get_autostart_once_args {
+ remote_nonnull_domain dom;
+};
+
+struct remote_domain_get_autostart_once_ret {
+ int autostart;
+};
+
+struct remote_domain_set_autostart_once_args {
+ remote_nonnull_domain dom;
+ int autostart;
+};
+
/*----- Protocol. -----*/
/* Define the program number, protocol version and procedure numbers here. */
* @generate: both
* @acl: domain:write
*/
- REMOTE_PROC_DOMAIN_GRAPHICS_RELOAD = 448
+ REMOTE_PROC_DOMAIN_GRAPHICS_RELOAD = 448,
+
+ /**
+ * @generate: both
+ * @priority: high
+ * @acl: domain:read
+ */
+ REMOTE_PROC_DOMAIN_GET_AUTOSTART_ONCE = 449,
+
+ /**
+ * @generate: both
+ * @priority: high
+ * @acl: domain:write
+ */
+ REMOTE_PROC_DOMAIN_SET_AUTOSTART_ONCE = 450
};
remote_nonnull_string name;
u_int flags;
};
+struct remote_domain_get_autostart_once_args {
+ remote_nonnull_domain dom;
+};
+struct remote_domain_get_autostart_once_ret {
+ int autostart;
+};
+struct remote_domain_set_autostart_once_args {
+ remote_nonnull_domain dom;
+ int autostart;
+};
enum remote_procedure {
REMOTE_PROC_CONNECT_OPEN = 1,
REMOTE_PROC_CONNECT_CLOSE = 2,
REMOTE_PROC_NETWORK_EVENT_CALLBACK_METADATA_CHANGE = 446,
REMOTE_PROC_NODE_DEVICE_UPDATE = 447,
REMOTE_PROC_DOMAIN_GRAPHICS_RELOAD = 448,
+ REMOTE_PROC_DOMAIN_GET_AUTOSTART_ONCE = 449,
+ REMOTE_PROC_DOMAIN_SET_AUTOSTART_ONCE = 450,
};
push(@ret_list, "ret->$1 = $1;");
$single_ret_var = $1;
- if ($call->{ProcName} =~ m/GetAutostart$/) {
+ if ($call->{ProcName} =~ m/GetAutostart(Once)?$/) {
$single_ret_by_ref = 1;
} else {
$single_ret_by_ref = 0;
} elsif ($ret_member =~ m/^int (\S+);/) {
my $arg_name = $1;
- if ($call->{ProcName} =~ m/GetAutostart$/) {
+ if ($call->{ProcName} =~ m/GetAutostart(Once)?$/) {
push(@args_list, "int *$arg_name");
push(@ret_list, "if ($arg_name) *$arg_name = ret.$arg_name;");
push(@ret_list, "rv = 0;");
vshPrint(ctl, "%-15s %s\n", _("Autostart:"),
autostart ? _("enable") : _("disable"));
}
+ /* Check and display whether the domain autostarts next boot or not */
+ if (!virDomainGetAutostartOnce(dom, &autostart)) {
+ vshPrint(ctl, "%-15s %s\n", _("Autostart Once:"),
+ autostart ? _("enable") : _("disable"));
+ } else {
+ vshResetLibvirtError();
+ }
has_managed_save = virDomainHasManagedSaveImage(dom, 0);
if (has_managed_save < 0)
.type = VSH_OT_BOOL,
.help = N_("disable autostarting")
},
+ {.name = "once",
+ .type = VSH_OT_BOOL,
+ .help = N_("control next boot state")
+ },
{.name = NULL}
};
g_autoptr(virshDomain) dom = NULL;
const char *name;
int autostart;
+ int once;
if (!(dom = virshCommandOptDomain(ctl, cmd, &name)))
return false;
autostart = !vshCommandOptBool(cmd, "disable");
+ once = vshCommandOptBool(cmd, "once");
+
+ if (once) {
+ if (virDomainSetAutostartOnce(dom, autostart) < 0) {
+ if (autostart)
+ vshError(ctl, _("Failed to mark domain '%1$s' as autostarted on next boot"), name);
+ else
+ vshError(ctl, _("Failed to unmark domain '%1$s' as autostarted on next boot"), name);
+ return false;
+ }
- if (virDomainSetAutostart(dom, autostart) < 0) {
if (autostart)
- vshError(ctl, _("Failed to mark domain '%1$s' as autostarted"), name);
+ vshPrintExtra(ctl, _("Domain '%1$s' marked as autostarted on next boot\n"), name);
else
- vshError(ctl, _("Failed to unmark domain '%1$s' as autostarted"), name);
- return false;
- }
+ vshPrintExtra(ctl, _("Domain '%1$s' unmarked as autostarted on next boot\n"), name);
+ } else {
+ if (virDomainSetAutostart(dom, autostart) < 0) {
+ if (autostart)
+ vshError(ctl, _("Failed to mark domain '%1$s' as autostarted"), name);
+ else
+ vshError(ctl, _("Failed to unmark domain '%1$s' as autostarted"), name);
+ return false;
+ }
- if (autostart)
- vshPrintExtra(ctl, _("Domain '%1$s' marked as autostarted\n"), name);
- else
- vshPrintExtra(ctl, _("Domain '%1$s' unmarked as autostarted\n"), name);
+ if (autostart)
+ vshPrintExtra(ctl, _("Domain '%1$s' marked as autostarted\n"), name);
+ else
+ vshPrintExtra(ctl, _("Domain '%1$s' unmarked as autostarted\n"), name);
+ }
return true;
}