[libvirt] [PATCH 1/6] Add helper module for dealing with USB host devices

Daniel P. Berrange berrange at redhat.com
Tue Sep 1 15:28:54 UTC 2009


* 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          |    1 +
 src/hostusb.c            |  103 ++++++++++++++++++++++++++++++++++++++++++++++
 src/hostusb.h            |   45 ++++++++++++++++++++
 src/libvirt_private.syms |    4 ++
 4 files changed, 153 insertions(+), 0 deletions(-)
 create mode 100644 src/hostusb.c
 create mode 100644 src/hostusb.h

diff --git a/src/Makefile.am b/src/Makefile.am
index 9567490..62946a6 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -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				\
 		threads.c threads.h				\
 		threads-pthread.h				\
diff --git a/src/hostusb.c b/src/hostusb.c
new file mode 100644
index 0000000..07e10b1
--- /dev/null
+++ b/src/hostusb.c
@@ -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 at 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
index 0000000..634548e
--- /dev/null
+++ b/src/hostusb.h
@@ -0,0 +1,45 @@
+/*
+ * 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 at 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);
+
+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__ */
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 2bf4e15..67f7aa2 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -401,6 +401,10 @@ virGetUserName;
 virGetUserID;
 virGetGroupID;
 
+# usb.h
+usbGetDevice;
+usbFreeDevice;
+usbDeviceFileIterate;
 
 # uuid.h
 virUUIDFormat;
-- 
1.6.2.5




More information about the libvir-list mailing list