]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Add API for using 'usb_add' for disk devices
authorDaniel P. Berrange <berrange@redhat.com>
Wed, 23 Sep 2009 14:38:43 +0000 (15:38 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Tue, 29 Sep 2009 10:59:02 +0000 (11:59 +0100)
* src/qemu/qemu_monitor.c, src/qemu/qemu_monitor.h: Add new
  qemuMonitorAddUSBDisk() API
* src/qemu/qemu_driver.c: Switch USB disk hotplug to the new
  src/qemu/qemu_driver.c API.

src/qemu/qemu_driver.c
src/qemu/qemu_monitor_text.c
src/qemu/qemu_monitor_text.h

index ef509c93e25fde33b3ab7eec24f50cd5235177b6..5c7abcc356ebc83a839788f620945732312812b9 100644 (file)
@@ -4698,59 +4698,32 @@ static int qemudDomainAttachUsbMassstorageDevice(virConnectPtr conn,
                                                  virDomainObjPtr vm,
                                                  virDomainDeviceDefPtr dev)
 {
-    int ret, i;
-    char *safe_path;
-    char *cmd, *reply;
+    int i;
 
     for (i = 0 ; i < vm->def->ndisks ; i++) {
         if (STREQ(vm->def->disks[i]->dst, dev->data.disk->dst)) {
-            qemudReportError(conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
+            qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
                            _("target %s already exists"), dev->data.disk->dst);
             return -1;
         }
     }
 
-    if (VIR_REALLOC_N(vm->def->disks, vm->def->ndisks+1) < 0) {
-        virReportOOMError(conn);
-        return -1;
-    }
-
-    safe_path = qemudEscapeMonitorArg(dev->data.disk->src);
-    if (!safe_path) {
-        virReportOOMError(conn);
+    if (!dev->data.disk->src) {
+        qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
+                         "%s", _("disk source path is missing"));
         return -1;
     }
 
-    ret = virAsprintf(&cmd, "usb_add disk:%s", safe_path);
-    VIR_FREE(safe_path);
-    if (ret == -1) {
+    if (VIR_REALLOC_N(vm->def->disks, vm->def->ndisks+1) < 0) {
         virReportOOMError(conn);
-        return ret;
-    }
-
-    if (qemudMonitorCommand(vm, cmd, &reply) < 0) {
-        qemudReportError(conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
-                         "%s", _("cannot attach usb disk"));
-        VIR_FREE(cmd);
         return -1;
     }
 
-    DEBUG ("%s: attach_usb reply: %s",vm->def->name,  reply);
-    /* If the command failed qemu prints:
-     * Could not add ... */
-    if (strstr(reply, "Could not add ")) {
-        qemudReportError (conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
-                          "%s",
-                          _("adding usb disk failed"));
-        VIR_FREE(reply);
-        VIR_FREE(cmd);
+    if (qemuMonitorAddUSBDisk(vm, dev->data.disk->src) < 0)
         return -1;
-    }
 
     virDomainDiskInsertPreAlloced(vm->def, dev->data.disk);
 
-    VIR_FREE(reply);
-    VIR_FREE(cmd);
     return 0;
 }
 
index 78b5dfec6c38e68f99727d7d8fca1d34930975c4..9e94a3ee569605362a055f1fb0bfd7aa538a4c72 100644 (file)
@@ -1199,3 +1199,46 @@ cleanup:
     VIR_FREE(dest);
     return ret;
 }
+
+
+int qemuMonitorAddUSBDisk(const virDomainObjPtr vm,
+                          const char *path)
+{
+    char *cmd = NULL;
+    char *safepath;
+    int ret = -1;
+    char *info = NULL;
+
+    safepath = qemudEscapeMonitorArg(path);
+    if (!safepath) {
+        virReportOOMError(NULL);
+        return -1;
+    }
+
+    if (virAsprintf(&cmd, "usb_add disk:%s", safepath) < 0) {
+        virReportOOMError(NULL);
+        goto cleanup;
+    }
+
+    if (qemudMonitorCommand(vm, cmd, &info) < 0) {
+        qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
+                         "%s", _("cannot run monitor command to add usb disk"));
+        goto cleanup;
+    }
+
+    DEBUG ("%s: usb_add reply: %s", vm->def->name, info);
+    /* If the command failed qemu prints:
+     * Could not add ... */
+    if (strstr(info, "Could not add ")) {
+        qemudReportError(NULL, NULL, NULL, VIR_ERR_OPERATION_FAILED,
+                         _("unable to add USB disk %s: %s"), path, info);
+        goto cleanup;
+    }
+
+    ret = 0;
+
+cleanup:
+    VIR_FREE(cmd);
+    VIR_FREE(safepath);
+    return ret;
+}
index b43b410974a50528aab6a43da8c185c45b07d345..095e1f7848cd0c56974a0c0fb317848d7f736deb 100644 (file)
@@ -136,4 +136,8 @@ int qemuMonitorMigrateToCommand(const virDomainObjPtr vm,
                                 const char * const *argv,
                                 const char *target);
 
+
+int qemuMonitorAddUSBDisk(const virDomainObjPtr vm,
+                          const char *path);
+
 #endif /* QEMU_MONITOR_TEXT_H */