Haptic/Linux: Keep track of device numbers properly to track duplicates.

Fixes Bugzilla #3014.
This commit is contained in:
Ryan C. Gordon 2015-06-16 00:57:45 -04:00
parent d797582376
commit 0c3830a9a9

View file

@ -59,6 +59,7 @@ typedef struct SDL_hapticlist_item
{ {
char *fname; /* Dev path name (like /dev/input/event1) */ char *fname; /* Dev path name (like /dev/input/event1) */
SDL_Haptic *haptic; /* Associated haptic. */ SDL_Haptic *haptic; /* Associated haptic. */
dev_t dev_num;
struct SDL_hapticlist_item *next; struct SDL_hapticlist_item *next;
} SDL_hapticlist_item; } SDL_hapticlist_item;
@ -236,15 +237,11 @@ void haptic_udev_callback(SDL_UDEV_deviceevent udev_type, int udev_class, const
static int static int
MaybeAddDevice(const char *path) MaybeAddDevice(const char *path)
{ {
dev_t dev_nums[MAX_HAPTICS];
struct stat sb; struct stat sb;
int fd; int fd;
int k;
int duplicate;
int success; int success;
SDL_hapticlist_item *item; SDL_hapticlist_item *item;
if (path == NULL) { if (path == NULL) {
return -1; return -1;
} }
@ -255,15 +252,11 @@ MaybeAddDevice(const char *path)
} }
/* check for duplicates */ /* check for duplicates */
duplicate = 0; for (item = SDL_hapticlist; item != NULL; item = item->next) {
for (k = 0; (k < numhaptics) && !duplicate; ++k) { if (item->dev_num == sb.st_rdev) {
if (sb.st_rdev == dev_nums[k]) { return -1; /* duplicate. */
duplicate = 1;
} }
} }
if (duplicate) {
return -1;
}
/* try to open */ /* try to open */
fd = open(path, O_RDWR, 0); fd = open(path, O_RDWR, 0);
@ -293,6 +286,8 @@ MaybeAddDevice(const char *path)
return -1; return -1;
} }
item->dev_num = sb.st_rdev;
/* TODO: should we add instance IDs? */ /* TODO: should we add instance IDs? */
if (SDL_hapticlist_tail == NULL) { if (SDL_hapticlist_tail == NULL) {
SDL_hapticlist = SDL_hapticlist_tail = item; SDL_hapticlist = SDL_hapticlist_tail = item;
@ -301,8 +296,6 @@ MaybeAddDevice(const char *path)
SDL_hapticlist_tail = item; SDL_hapticlist_tail = item;
} }
dev_nums[numhaptics] = sb.st_rdev;
++numhaptics; ++numhaptics;
/* !!! TODO: Send a haptic add event? */ /* !!! TODO: Send a haptic add event? */
@ -546,7 +539,6 @@ SDL_SYS_HapticOpenFromJoystick(SDL_Haptic * haptic, SDL_Joystick * joystick)
int ret; int ret;
SDL_hapticlist_item *item; SDL_hapticlist_item *item;
/* Find the joystick in the haptic list. */ /* Find the joystick in the haptic list. */
for (item = SDL_hapticlist; item; item = item->next) { for (item = SDL_hapticlist; item; item = item->next) {
if (SDL_strcmp(item->fname, joystick->hwdata->fname) == 0) { if (SDL_strcmp(item->fname, joystick->hwdata->fname) == 0) {