Message ID | 20181116051843.13569-1-eric@anholt.net (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [libdrm,1/2] Avoid hardcoded strlens in drmParseSubsystemType(). | expand |
On Thursday, 2018-11-15 21:18:42 -0800, Eric Anholt wrote: > Having people count characters is error-prone, when we could just have > a computer do it. Reviewed-by: Eric Engestrom <eric.engestrom@intel.com> > --- > 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 > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel
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",