[Libvir] PATCH: Implement CDROM media change for QEMU/KVM driver
Jim Paris
jim at jtan.com
Sat Oct 13 07:14:04 UTC 2007
Hi Dan,
That's definitely be a useful feature. Some comments...
> @@ -453,7 +454,7 @@ static int qemudOpenMonitor(virConnectPt
> char buf[1024];
> int ret = -1;
>
> - if (!(monfd = open(monitor, O_RDWR))) {
> + if (!(monfd = open(monitor, O_NOCTTY |O_RDWR))) {
Is this just to ensure portability or does it change the behavior?
> @@ -1365,13 +1360,35 @@ static int qemudMonitorCommand(struct qe
> + retry1:
> + if (write(vm->logfile, buf, strlen(buf)) < 0) {
> + /* Log, but ignore failures to write logfile for VM */
> + if (errno == EINTR)
> + goto retry1;
> + qemudLog(QEMUD_WARN, "Unable to log VM console data: %s",
> + strerror(errno));
> + }
> +
> *reply = buf;
> return 0;
> +
> + error:
> + if (buf) {
> + retry2:
> + if (write(vm->logfile, buf, strlen(buf)) < 0) {
> + /* Log, but ignore failures to write logfile for VM */
> + if (errno == EINTR)
> + goto retry2;
> + qemudLog(QEMUD_WARN, "Unable to log VM console data: %s",
> + strerror(errno));
> + }
> + free(buf);
> + }
> + return -1;
I think both of these retry loops could be replaced with safewrite
from util.c:
if (safewrite(vm->logfile, buf, strlen(buf)) != strlen(buf))
qemudLog(...)
> +static int qemudDomainChangeCDROM(virDomainPtr dom,
> + struct qemud_vm *vm,
> + struct qemud_vm_disk_def *olddisk,
> + struct qemud_vm_disk_def *newdisk) {
> + struct qemud_driver *driver = (struct qemud_driver *)dom->conn->privateData;
> + char *cmd;
> + char *reply;
> + /* XXX QEMU only supports a single CDROM for now */
> + /*cmd = malloc(strlen("change ") + strlen(olddisk->dst) + 1 + strlen(newdisk->src) + 2);*/
> + cmd = malloc(strlen("change ") + strlen("cdrom") + 1 + strlen(newdisk->src) + 2);
> + if (!cmd) {
> + qemudReportError(dom->conn, dom, NULL, VIR_ERR_NO_MEMORY, "monitor command");
> + return -1;
> + }
> + strcpy(cmd, "change ");
> + /* XXX QEMU only supports a single CDROM for now */
> + /*strcat(cmd, olddisk->dst);*/
> + strcat(cmd, "cdrom");
> + strcat(cmd, " ");
> + strcat(cmd, newdisk->src);
> + strcat(cmd, "\n");
Commands should be terminated with "\r", otherwise the terminal layer
replaces "\n" -> "\r\n", and bugs in earlier qemu means it would
execute the command twice. Recent qemu will still print the "(qemu) "
prompt twice in this case, which might confuse qemudMonitorCommand
into thinking that a subsequent command is finished before it's even
started.
Unless the O_NOCTTY somehow fixes that?
-jim
More information about the libvir-list
mailing list