static int qemudMonitorCommand(const virDomainObjPtr vm,
const char *cmd,
char **reply);
+static int qemudMonitorCommandWithFd(const virDomainObjPtr vm,
+ const char *cmd,
+ int scm_fd,
+ char **reply);
static int qemudMonitorCommandExtra(const virDomainObjPtr vm,
const char *cmd,
const char *extra,
const char *extraPrompt,
+ int scm_fd,
char **reply);
static int qemudDomainSetMemoryBalloon(virConnectPtr conn,
virDomainObjPtr vm,
vm->def->graphics[0]->data.vnc.passwd :
driver->vncPassword,
QEMU_PASSWD_PROMPT,
- &info) < 0) {
+ -1, &info) < 0) {
qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
"%s", _("setting VNC password failed"));
return -1;
static int
qemudMonitorSendUnix(const virDomainObjPtr vm,
const char *cmd,
- size_t cmdlen)
+ size_t cmdlen,
+ int scm_fd)
{
struct msghdr msg;
struct iovec iov[1];
msg.msg_iov = iov;
msg.msg_iovlen = 1;
+ if (scm_fd != -1) {
+ char control[CMSG_SPACE(sizeof(int))];
+ struct cmsghdr *cmsg;
+
+ msg.msg_control = control;
+ msg.msg_controllen = sizeof(control);
+
+ cmsg = CMSG_FIRSTHDR(&msg);
+ cmsg->cmsg_len = CMSG_LEN(sizeof(int));
+ cmsg->cmsg_level = SOL_SOCKET;
+ cmsg->cmsg_type = SCM_RIGHTS;
+ memcpy(CMSG_DATA(cmsg), &scm_fd, sizeof(int));
+ }
+
do {
ret = sendmsg(vm->monitor, &msg, 0);
} while (ret < 0 && errno == EINTR);
static int
qemudMonitorSend(const virDomainObjPtr vm,
- const char *cmd)
+ const char *cmd,
+ int scm_fd)
{
char *full;
size_t len;
switch (vm->monitor_chr->type) {
case VIR_DOMAIN_CHR_TYPE_UNIX:
- if (qemudMonitorSendUnix(vm, full, len) < 0)
+ if (qemudMonitorSendUnix(vm, full, len, scm_fd) < 0)
goto out;
break;
default:
const char *cmd,
const char *extra,
const char *extraPrompt,
+ int scm_fd,
char **reply) {
int size = 0;
char *buf = NULL;
qemuMonitorDiscardPendingData(vm);
- if (qemudMonitorSend(vm, cmd) < 0)
+ if (qemudMonitorSend(vm, cmd, scm_fd) < 0)
return -1;
*reply = NULL;
if (buf) {
if (extra) {
if (strstr(buf, extraPrompt) != NULL) {
- if (qemudMonitorSend(vm, extra) < 0)
+ if (qemudMonitorSend(vm, extra, -1) < 0)
return -1;
extra = NULL;
}
return -1;
}
+static int
+qemudMonitorCommandWithFd(const virDomainObjPtr vm,
+ const char *cmd,
+ int scm_fd,
+ char **reply) {
+ return qemudMonitorCommandExtra(vm, cmd, NULL, NULL, scm_fd, reply);
+}
+
static int
qemudMonitorCommand(const virDomainObjPtr vm,
const char *cmd,
char **reply) {
- return qemudMonitorCommandExtra(vm, cmd, NULL, NULL, reply);
+ return qemudMonitorCommandWithFd(vm, cmd, -1, reply);
}
-
-
static virDrvOpenStatus qemudOpen(virConnectPtr conn,
virConnectAuthPtr auth ATTRIBUTE_UNUSED,
int flags ATTRIBUTE_UNUSED) {