[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 1/2] accomodate OpenFirmware device paths in suff
From: |
Laszlo Ersek |
Subject: |
[Qemu-devel] [PATCH v2 1/2] accomodate OpenFirmware device paths in sufficient storage |
Date: |
Wed, 25 Jul 2012 02:19:54 +0200 |
Signed-off-by: Laszlo Ersek <address@hidden>
---
hw/qdev.c | 54 +++++++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 43 insertions(+), 11 deletions(-)
diff --git a/hw/qdev.c b/hw/qdev.c
index af54467..59cc0c2 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -25,6 +25,8 @@
inherit from a particular bus (e.g. PCI or I2C) rather than
this API directly. */
+#include <stdarg.h>
+
#include "net.h"
#include "qdev.h"
#include "sysemu.h"
@@ -495,36 +497,66 @@ static char *bus_get_fw_dev_path(BusState *bus,
DeviceState *dev)
return NULL;
}
+static int snprintf_helper(char *p, int size, int len, const char *format, ...)
+{
+ char *target;
+ int free_sz;
+ va_list args;
+ int ret;
+
+ if (len < size) {
+ target = p + len;
+ free_sz = size - len;
+ }
+ else {
+ target = NULL;
+ free_sz = 0;
+ }
+
+ va_start(args, format);
+ ret = vsnprintf(target, free_sz, format, args);
+ va_end(args);
+
+ assert(ret >= 0);
+ return ret;
+}
+
+
static int qdev_get_fw_dev_path_helper(DeviceState *dev, char *p, int size)
{
- int l = 0;
+ int len = 0;
if (dev && dev->parent_bus) {
char *d;
- l = qdev_get_fw_dev_path_helper(dev->parent_bus->parent, p, size);
+ len = qdev_get_fw_dev_path_helper(dev->parent_bus->parent, p, size);
d = bus_get_fw_dev_path(dev->parent_bus, dev);
if (d) {
- l += snprintf(p + l, size - l, "%s", d);
+ len += snprintf_helper(p, size, len, "%s", d);
g_free(d);
} else {
- l += snprintf(p + l, size - l, "%s",
object_get_typename(OBJECT(dev)));
+ len += snprintf_helper(p, size, len, "%s",
+ object_get_typename(OBJECT(dev)));
}
}
- l += snprintf(p + l , size - l, "/");
+ len += snprintf_helper(p, size, len, "/");
- return l;
+ return len;
}
char* qdev_get_fw_dev_path(DeviceState *dev)
{
- char path[128];
- int l;
+ int len, len2;
+ char *path;
- l = qdev_get_fw_dev_path_helper(dev, path, 128);
+ len = qdev_get_fw_dev_path_helper(dev, NULL, 0);
+ path = g_malloc(len + 1);
- path[l-1] = '\0';
+ len2 = qdev_get_fw_dev_path_helper(dev, path, len + 1);
+ assert(len2 == len);
- return strdup(path);
+ assert(len > 0);
+ path[len - 1] = '\0';
+ return path;
}
char *qdev_get_dev_path(DeviceState *dev)
--
1.7.1
- [Qemu-devel] [PATCH] check for available room when formatting OpenFirmware device path, Laszlo Ersek, 2012/07/23
- Re: [Qemu-devel] [PATCH] check for available room when formatting OpenFirmware device path, Peter Maydell, 2012/07/23
- Re: [Qemu-devel] [PATCH] check for available room when formatting OpenFirmware device path, Markus Armbruster, 2012/07/23
- Re: [Qemu-devel] [PATCH] check for available room when formatting OpenFirmware device path, Laszlo Ersek, 2012/07/23
- Re: [Qemu-devel] [PATCH] check for available room when formatting OpenFirmware device path, Markus Armbruster, 2012/07/23
- Re: [Qemu-devel] [PATCH] check for available room when formatting OpenFirmware device path, Laszlo Ersek, 2012/07/23
- Re: [Qemu-devel] [PATCH] check for available room when formatting OpenFirmware device path, Markus Armbruster, 2012/07/23
- [Qemu-devel] [PATCH v2 0/2] assorted device path formatting cleanups, Laszlo Ersek, 2012/07/24
- [Qemu-devel] [PATCH v2 1/2] accomodate OpenFirmware device paths in sufficient storage,
Laszlo Ersek <=
- Re: [Qemu-devel] [PATCH v2 1/2] accomodate OpenFirmware device paths in sufficient storage, Peter Maydell, 2012/07/25
- Re: [Qemu-devel] [PATCH v2 1/2] accomodate OpenFirmware device paths in sufficient storage, Markus Armbruster, 2012/07/25
- [Qemu-devel] [PATCH v2 2/2] get_fw_dev_path() impls should allocate memory with glib functions, Laszlo Ersek, 2012/07/24