[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 2/2] pci: rewrite devaddr parsing
From: |
Michael S. Tsirkin |
Subject: |
[Qemu-devel] [PATCH 2/2] pci: rewrite devaddr parsing |
Date: |
Thu, 16 Feb 2012 20:15:29 +0200 |
User-agent: |
Mutt/1.5.21 (2010-09-15) |
Use scanf instead of manual string scanning.
Signed-off-by: Michael S. Tsirkin <address@hidden>
---
hw/pci.c | 81 +++++++++++++++++++++++++++++---------------------------------
1 files changed, 38 insertions(+), 43 deletions(-)
diff --git a/hw/pci.c b/hw/pci.c
index 5827c0e..a8c0b69 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -479,61 +479,56 @@ static void pci_set_default_subsystem_id(PCIDevice
*pci_dev)
* [[<domain>:]<bus>:]<slot>.<func>, return -1 on error
*/
static int pci_parse_devaddr(const char *addr, int *domp, int *busp,
- unsigned int *slotp, unsigned int *funcp)
-{
- const char *p;
- char *e;
- unsigned long val;
- unsigned long dom = 0, bus = 0;
- unsigned int slot = 0;
- unsigned int func = 0;
-
- p = addr;
- val = strtoul(p, &e, 16);
- if (e == p)
- return -1;
- if (*e == ':') {
- bus = val;
- p = e + 1;
- val = strtoul(p, &e, 16);
- if (e == p)
- return -1;
- if (*e == ':') {
- dom = bus;
- bus = val;
- p = e + 1;
- val = strtoul(p, &e, 16);
- if (e == p)
- return -1;
- }
- }
-
- slot = val;
-
- if (funcp != NULL) {
- if (*e != '.')
- return -1;
+ unsigned int *slotp, unsigned int *funcp)
+{
+ unsigned dom, bus, slot, func;
+ int n = -1;
+
+ /* Parse [[<domain>:]<bus>:]<slot> */
+ sscanf(addr, "%x:%x:%x%n", &dom, &bus, &slot, &n);
+ if (n == -1) {
+ dom = 0;
+ sscanf(addr, "%x:%x%n", &bus, &slot, &n);
+ if (n == -1) {
+ bus = 0;
+ sscanf(addr, "%x%n", &slot, &n);
+ if (n == -1) {
+ return -1;
+ }
+ }
+ }
- p = e + 1;
- val = strtoul(p, &e, 16);
- if (e == p)
+ /* Parse the optional .func */
+ addr += n;
+ if (!*addr) {
+ func = 0;
+ } else {
+ sscanf(addr, ".%x%n", &func, &n);
+ if (n == -1) {
return -1;
+ }
+ addr += n;
+ }
- func = val;
+ /* Anything left? Malformed input. */
+ if (*addr) {
+ return -1;
}
- /* if funcp == NULL func is 0 */
- if (dom > 0xffff || bus > 0xff || slot > 0x1f || func > 7)
- return -1;
+ if (funcp == NULL) {
+ func = 0;
+ }
- if (*e)
+ if (dom > 0xffff || bus > 0xff || slot > 0x1f || func > 7) {
return -1;
+ }
*domp = dom;
*busp = bus;
*slotp = slot;
- if (funcp != NULL)
+ if (funcp != NULL) {
*funcp = func;
+ }
return 0;
}
--
1.7.9.111.gf3fb0
- [Qemu-devel] [PATCH 0/2] pci devaddr parsing cleanups, Michael S. Tsirkin, 2012/02/16
- [Qemu-devel] [PATCH 1/2] pci: don't export an internal function, Michael S. Tsirkin, 2012/02/16
- [Qemu-devel] [PATCH 2/2] pci: rewrite devaddr parsing,
Michael S. Tsirkin <=
- Re: [Qemu-devel] [PATCH 2/2] pci: rewrite devaddr parsing, malc, 2012/02/16
- Re: [Qemu-devel] [PATCH 2/2] pci: rewrite devaddr parsing, Eric Blake, 2012/02/16
- Re: [Qemu-devel] [PATCH 2/2] pci: rewrite devaddr parsing, malc, 2012/02/16
- Re: [Qemu-devel] [PATCH 2/2] pci: rewrite devaddr parsing, Michael S. Tsirkin, 2012/02/17
- Re: [Qemu-devel] [PATCH 2/2] pci: rewrite devaddr parsing, Markus Armbruster, 2012/02/17
- Re: [Qemu-devel] [PATCH 2/2] pci: rewrite devaddr parsing, Michael S. Tsirkin, 2012/02/19
- Re: [Qemu-devel] [PATCH 2/2] pci: rewrite devaddr parsing, Michael S. Tsirkin, 2012/02/19
- Re: [Qemu-devel] [PATCH 2/2] pci: rewrite devaddr parsing, Michael S. Tsirkin, 2012/02/17
- Re: [Qemu-devel] [PATCH 2/2] pci: rewrite devaddr parsing, malc, 2012/02/17
- Re: [Qemu-devel] [PATCH 2/2] pci: rewrite devaddr parsing, Michael S. Tsirkin, 2012/02/17