diff options
author | Dirk Hohndel <dirk@hohndel.org> | 2014-05-18 13:29:40 +0900 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2014-05-19 20:12:55 +0900 |
commit | 047032ee46ef00d924dea0ee68b0f2726975fcd6 (patch) | |
tree | b3a8c1120e2bc873e6996842fba7a820a7a0c282 /linux.c | |
parent | 6d42a99e7f6d3ea3a9c977604c7cc980a4215f18 (diff) | |
download | subsurface-047032ee46ef00d924dea0ee68b0f2726975fcd6.tar.gz |
Divecomputer download: try to offer only those devices that make sense
If the user selects a Uemis divecomputer, don't show serial devices.
If the user selects a serial divecomputer, don't show the Uemis
filesystem.
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'linux.c')
-rw-r--r-- | linux.c | 114 |
1 files changed, 58 insertions, 56 deletions
@@ -49,78 +49,80 @@ const char *system_default_filename(void) return buffer; } -int enumerate_devices(device_callback_t callback, void *userdata) +int enumerate_devices(device_callback_t callback, void *userdata, int dc_type) { int index = -1; DIR *dp = NULL; struct dirent *ep = NULL; size_t i; - const char *dirname = "/dev"; - const char *patterns[] = { - "ttyUSB*", - "ttyS*", - "ttyACM*", - "rfcomm*", - NULL - }; FILE *file; char *line = NULL; char *fname; size_t len; + if (dc_type != DC_TYPE_UEMIS) { + const char *dirname = "/dev"; + const char *patterns[] = { + "ttyUSB*", + "ttyS*", + "ttyACM*", + "rfcomm*", + NULL + }; + + dp = opendir(dirname); + if (dp == NULL) { + return -1; + } - dp = opendir(dirname); - if (dp == NULL) { - return -1; - } - - while ((ep = readdir(dp)) != NULL) { - for (i = 0; patterns[i] != NULL; ++i) { - if (fnmatch(patterns[i], ep->d_name, 0) == 0) { - char filename[1024]; - int n = snprintf(filename, sizeof(filename), "%s/%s", dirname, ep->d_name); - if (n >= sizeof(filename)) { - closedir(dp); - return -1; + while ((ep = readdir(dp)) != NULL) { + for (i = 0; patterns[i] != NULL; ++i) { + if (fnmatch(patterns[i], ep->d_name, 0) == 0) { + char filename[1024]; + int n = snprintf(filename, sizeof(filename), "%s/%s", dirname, ep->d_name); + if (n >= sizeof(filename)) { + closedir(dp); + return -1; + } + callback(filename, userdata); + if (is_default_dive_computer_device(filename)) + index = i; + break; } - callback(filename, userdata); - if (is_default_dive_computer_device(filename)) - index = i; - break; } } + closedir(dp); } - closedir(dp); - - file = fopen("/proc/mounts", "r"); - if (file == NULL) - return index; - - while ((getline(&line, &len, file)) != -1) { - char *ptr = strstr(line, "UEMISSDA"); - if (ptr) { - char *end = ptr, *start = ptr; - while (start > line && *start != ' ') - start--; - if (*start == ' ') - start++; - while (*end != ' ' && *end != '\0') - end++; - - *end = '\0'; - fname = strdup(start); - - callback(fname, userdata); - - if (is_default_dive_computer_device(fname)) - index = i; - i++; - free((void *)fname); + if (dc_type != DC_TYPE_SERIAL) { + file = fopen("/proc/mounts", "r"); + if (file == NULL) + return index; + + while ((getline(&line, &len, file)) != -1) { + char *ptr = strstr(line, "UEMISSDA"); + if (ptr) { + char *end = ptr, *start = ptr; + while (start > line && *start != ' ') + start--; + if (*start == ' ') + start++; + while (*end != ' ' && *end != '\0') + end++; + + *end = '\0'; + fname = strdup(start); + + callback(fname, userdata); + + if (is_default_dive_computer_device(fname)) + index = i; + i++; + free((void *)fname); + } } - } - - free(line); - fclose(file); + free(line); + fclose(file); + } return index; } |