]> xenbits.xensource.com Git - libvirt.git/commitdiff
Add helper module for dealing with USB host devices
authorDaniel P. Berrange <berrange@redhat.com>
Fri, 14 Aug 2009 13:19:32 +0000 (14:19 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Thu, 10 Sep 2009 13:34:06 +0000 (14:34 +0100)
* src/Makefile.am: Add usb.h and usb.h to libvirt_util.la
* src/libvirt_private.syms: Export symbols
* src/usb.c, src/usb.h: Helper APIs for USB host devices

src/Makefile.am
src/hostusb.c [new file with mode: 0644]
src/hostusb.h [new file with mode: 0644]
src/libvirt_private.syms

index 628edc5a018b60708fcc1d41781b26edd761bf33..8bdfe3cf78fd54bdb626b0c7a9e024de3227560e 100644 (file)
@@ -51,6 +51,7 @@ UTIL_SOURCES =                                                        \
                logging.c logging.h                             \
                memory.c memory.h                               \
                pci.c pci.h                                     \
+               hostusb.c hostusb.h                             \
                qparams.c qparams.h                             \
                storage_encryption_conf.h storage_encryption_conf.c     \
                threads.c threads.h                             \
diff --git a/src/hostusb.c b/src/hostusb.c
new file mode 100644 (file)
index 0000000..07e10b1
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2009 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
+ *
+ * Authors:
+ *     Daniel P. Berrange <berrange@redhat.com>
+ */
+
+#include <config.h>
+
+#include <dirent.h>
+#include <fcntl.h>
+#include <inttypes.h>
+#include <limits.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "hostusb.h"
+#include "logging.h"
+#include "memory.h"
+#include "util.h"
+#include "virterror_internal.h"
+
+#define USB_DEVFS "/dev/bus/usb/"
+#define USB_ID_LEN 10 /* "XXXX XXXX" */
+#define USB_ADDR_LEN 8 /* "XXX:XXX" */
+
+struct _usbDevice {
+    unsigned      bus;
+    unsigned      dev;
+
+    char          name[USB_ADDR_LEN]; /* domain:bus:slot.function */
+    char          id[USB_ID_LEN];     /* product vendor */
+    char          path[PATH_MAX];
+};
+
+/* For virReportOOMError()  and virReportSystemError() */
+#define VIR_FROM_THIS VIR_FROM_NONE
+
+#define usbReportError(conn, code, fmt...)                     \
+    virReportErrorHelper(conn, VIR_FROM_NONE, code, __FILE__,  \
+                         __FUNCTION__, __LINE__, fmt)
+
+
+usbDevice *
+usbGetDevice(virConnectPtr conn,
+             unsigned bus,
+             unsigned devno)
+{
+    usbDevice *dev;
+
+    if (VIR_ALLOC(dev) < 0) {
+        virReportOOMError(conn);
+        return NULL;
+    }
+
+    dev->bus     = bus;
+    dev->dev     = devno;
+
+    snprintf(dev->name, sizeof(dev->name), "%.3o:%.3o",
+             dev->bus, dev->dev);
+    snprintf(dev->path, sizeof(dev->path),
+             USB_DEVFS "%03o/%03o", dev->bus, dev->dev);
+
+    /* XXX fixme. this should be product/vendor */
+    snprintf(dev->id, sizeof(dev->id), "%d %d", dev->bus, dev->dev);
+
+    VIR_DEBUG("%s %s: initialized", dev->id, dev->name);
+
+    return dev;
+}
+
+void
+usbFreeDevice(virConnectPtr conn ATTRIBUTE_UNUSED, usbDevice *dev)
+{
+    VIR_DEBUG("%s %s: freeing", dev->id, dev->name);
+    VIR_FREE(dev);
+}
+
+
+int usbDeviceFileIterate(virConnectPtr conn,
+                         usbDevice *dev,
+                         usbDeviceFileActor actor,
+                         void *opaque)
+{
+    return (actor)(conn, dev, dev->path, opaque);
+}
diff --git a/src/hostusb.h b/src/hostusb.h
new file mode 100644 (file)
index 0000000..b1654eb
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2009 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
+ *
+ * Authors:
+ *     Daniel P. Berrange <berrange@redhat.com>
+ */
+
+#ifndef __VIR_USB_H__
+#define __VIR_USB_H__
+
+#include "internal.h"
+#include "domain_conf.h"
+
+typedef struct _usbDevice usbDevice;
+
+usbDevice *usbGetDevice      (virConnectPtr  conn,
+                              unsigned       bus,
+                              unsigned       devno);
+void       usbFreeDevice     (virConnectPtr  conn,
+                              usbDevice     *dev);
+
+/*
+ * Callback that will be invoked once for each file
+ * associated with / used for USB host device access.
+ *
+ * Should return 0 if successfully processed, or
+ * -1 to indicate error and abort iteration
+ */
+typedef int (*usbDeviceFileActor)(virConnectPtr conn, usbDevice *dev,
+                                  const char *path, void *opaque);
+
+int usbDeviceFileIterate(virConnectPtr conn,
+                         usbDevice *dev,
+                         usbDeviceFileActor actor,
+                         void *opaque);
+
+
+#endif /* __VIR_USB_H__ */
index 8dd279d1068c961c8029c0b73702f737904973a0..998b8433bc2eb19264fb349e21c6814eeb88e45c 100644 (file)
@@ -411,6 +411,10 @@ virGetUserID;
 virGetGroupID;
 virFileFindMountPoint;
 
+# usb.h
+usbGetDevice;
+usbFreeDevice;
+usbDeviceFileIterate;
 
 # uuid.h
 virUUIDFormat;