[PATCH libdrm 1/2] Avoid hardcoded strlens in drmParseSubsystemType().
Eric Anholt
eric at anholt.net
Fri Nov 16 05:18:42 UTC 2018
Having people count characters is error-prone, when we could just have
a computer do it.
---
xf86drm.c | 31 ++++++++++++++++---------------
1 file changed, 16 insertions(+), 15 deletions(-)
diff --git a/xf86drm.c b/xf86drm.c
index 10df682b7870..60fbc49b3d35 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -59,6 +59,8 @@
#endif
#include <math.h>
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
+
/* Not all systems have MAP_FAILED defined */
#ifndef MAP_FAILED
#define MAP_FAILED ((void *)-1)
@@ -2984,6 +2986,16 @@ static int drmParseSubsystemType(int maj, int min)
char path[PATH_MAX + 1];
char link[PATH_MAX + 1] = "";
char *name;
+ struct {
+ const char *name;
+ int bus_type;
+ } bus_types[] = {
+ { "/pci", DRM_BUS_PCI },
+ { "/usb", DRM_BUS_USB },
+ { "/platform", DRM_BUS_PLATFORM },
+ { "/host1x", DRM_BUS_HOST1X },
+ { "/virtio", DRM_BUS_VIRTIO },
+ };
snprintf(path, PATH_MAX, "/sys/dev/char/%d:%d/device/subsystem",
maj, min);
@@ -2995,20 +3007,10 @@ static int drmParseSubsystemType(int maj, int min)
if (!name)
return -EINVAL;
- if (strncmp(name, "/pci", 4) == 0)
- return DRM_BUS_PCI;
-
- if (strncmp(name, "/usb", 4) == 0)
- return DRM_BUS_USB;
-
- if (strncmp(name, "/platform", 9) == 0)
- return DRM_BUS_PLATFORM;
-
- if (strncmp(name, "/host1x", 7) == 0)
- return DRM_BUS_HOST1X;
-
- if (strncmp(name, "/virtio", 7) == 0)
- return DRM_BUS_VIRTIO;
+ for (unsigned i = 0; i < ARRAY_SIZE(bus_types); i++) {
+ if (strncmp(name, bus_types[i].name, strlen(bus_types[i].name)) == 0)
+ return bus_types[i].bus_type;
+ }
return -EINVAL;
#elif defined(__OpenBSD__)
@@ -3149,7 +3151,6 @@ static int parse_separate_sysfs_files(int maj, int min,
drmPciDeviceInfoPtr device,
bool ignore_revision)
{
-#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
static const char *attrs[] = {
"revision", /* Older kernels are missing the file, so check for it first */
"vendor",
--
2.19.1
More information about the dri-devel
mailing list