]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
conf: Add unix socket support to virChrdevOpen
authorJohn Eckersberg <jeckersb@redhat.com>
Wed, 2 Jan 2013 15:38:53 +0000 (10:38 -0500)
committerEric Blake <eblake@redhat.com>
Sat, 5 Jan 2013 01:07:11 +0000 (18:07 -0700)
This also changes the function signature to take a
virDomainChrSourceDefPtr instead of just a path, since it needs to
differentiate behavior based on source->type.

src/conf/virchrdev.c
src/conf/virchrdev.h
src/qemu/qemu_driver.c

index dcb064fda7944284980a3c9342af08972b5c9e9c..1802324a772bba8e729946ec783a4f944254a339 100644 (file)
@@ -324,7 +324,7 @@ void virChrdevFree(virChrdevsPtr devs)
  * same FD by two processes.
  *
  * @devs Pointer to private structure holding data about device streams.
- * @path Path to the character device to be opened.
+ * @source Pointer to private structure holding data about device source.
  * @st Stream the client wishes to use for the device connection.
  * @force On true, close active device streams for the selected character
  *        device before opening this connection.
@@ -334,14 +334,29 @@ void virChrdevFree(virChrdevsPtr devs)
  * error and 1 if the device stream is open and busy.
  */
 int virChrdevOpen(virChrdevsPtr devs,
-                   const char *path,
-                   virStreamPtr st,
-                   bool force)
+                  virDomainChrSourceDefPtr source,
+                  virStreamPtr st,
+                  bool force)
 {
     virChrdevStreamInfoPtr cbdata = NULL;
     virStreamPtr savedStream;
+    const char *path;
     int ret;
 
+    switch (source->type) {
+    case VIR_DOMAIN_CHR_TYPE_PTY:
+        path = source->data.file.path;
+        break;
+    case VIR_DOMAIN_CHR_TYPE_UNIX:
+        path = source->data.nix.path;
+        break;
+    default:
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                       _("Unsupported device type '%s'"),
+                       virDomainChrTypeToString(source->type));
+        return -1;
+    }
+
     virMutexLock(&devs->lock);
 
     if ((savedStream = virHashLookup(devs->hash, path))) {
@@ -391,8 +406,21 @@ int virChrdevOpen(virChrdevsPtr devs,
     }
 
     /* open the character device */
-    if (virFDStreamOpenFile(st, path, 0, 0, O_RDWR) < 0)
+    switch (source->type) {
+    case VIR_DOMAIN_CHR_TYPE_PTY:
+        if (virFDStreamOpenFile(st, path, 0, 0, O_RDWR) < 0)
+            goto error;
+        break;
+    case VIR_DOMAIN_CHR_TYPE_UNIX:
+        if (virFDStreamConnectUNIX(st, path, false) < 0)
+            goto error;
+        break;
+    default:
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                       _("Unsupported device type '%s'"),
+                       virDomainChrTypeToString(source->type));
         goto error;
+    }
 
     /* add cleanup callback */
     virFDStreamSetInternalCloseCb(st,
index 57d75769b1f339b5af640f61bd324939b5693e7e..e1990e8e2d216b0c09650cde84db618e8fd6dfb6 100644 (file)
@@ -24,6 +24,7 @@
 # define __VIR_CHRDEV_H__
 
 # include "internal.h"
+# include "domain_conf.h"
 
 typedef struct _virChrdevs virChrdevs;
 typedef virChrdevs *virChrdevsPtr;
@@ -31,6 +32,6 @@ typedef virChrdevs *virChrdevsPtr;
 virChrdevsPtr virChrdevAlloc(void);
 void virChrdevFree(virChrdevsPtr devs);
 
-int virChrdevOpen(virChrdevsPtr devs, const char *path,
-                   virStreamPtr st, bool force);
+int virChrdevOpen(virChrdevsPtr devs, virDomainChrSourceDefPtr source,
+                  virStreamPtr st, bool force);
 #endif /*__VIR_CHRDEV_H__*/
index 992af02c444386bb0a10af03031e46de8a8f416b..20e2001441a7a095b4e7ffb17fde195fe05b85e5 100644 (file)
@@ -12577,7 +12577,7 @@ qemuDomainOpenConsole(virDomainPtr dom,
 
     /* handle mutually exclusive access to console devices */
     ret = virChrdevOpen(priv->devs,
-                        chr->source.data.file.path,
+                        &chr->source,
                         st,
                         (flags & VIR_DOMAIN_CONSOLE_FORCE) != 0);