From d8e35a4fed044b6722c1d46b9cbf394100e256f5 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Sat, 6 Oct 2012 13:08:54 +0300 Subject: [PATCH] More comprehensive check for mountable devices --- main.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 89 insertions(+), 1 deletion(-) diff --git a/main.c b/main.c index 55cfe0f..6be8352 100644 --- a/main.c +++ b/main.c @@ -1,6 +1,8 @@ #include #include #include +#include +#include #include #include #include @@ -220,6 +222,92 @@ void free_mounted_devices(char **mounted) free(mounted); } +int is_removable(char *devpath) +{ + char fnbuf[256]; + int len; + char *ptr; + int fd; + + len = snprintf(fnbuf, sizeof(fnbuf), "/sys%s", devpath); + if(len+10>=(int)sizeof(fnbuf)) + return 0; + + for(ptr=fnbuf+len; (ptr>fnbuf && *ptr!='/'); --ptr) ; + strcpy(ptr, "/removable"); + fd = open(fnbuf, O_RDONLY); + if(fd!=-1) + { + char c; + read(fd, &c, 1); + close(fd); + if(c=='1') + { + if(verbosity>=2) + printf(" Removable\n"); + return 1; + } + if(verbosity>=2) + printf(" Not removable\n"); + } + + return 0; +} + +int check_buses(char *devpath, char **buses) +{ + char fnbuf[256]; + char *ptr; + int len; + + len = snprintf(fnbuf, sizeof(fnbuf), "/sys%s", devpath); + if(len+10>=(int)sizeof(fnbuf)) + return 0; + + for(ptr=fnbuf+len; ptr>fnbuf+12; --ptr) + if(*ptr=='/') + { + char linkbuf[256]; + strcpy(ptr, "/subsystem"); + len = readlink(fnbuf, linkbuf, sizeof(linkbuf)-1); + *ptr = 0; + + if(len!=-1) + { + int i; + linkbuf[len] = 0; + for(; (len>0 && linkbuf[len-1]!='/'); --len) ; + if(verbosity>=2) + printf(" Subsystem of %s is %s\n", fnbuf, linkbuf+len); + for(i=0; buses[i]; ++i) + if(strcmp(linkbuf+len, buses[i])==0) + return 1; + } + } + + return 0; +} + +int can_mount(Property *props) +{ + static char *removable_buses[] = { "usb", "firewire", 0 }; + char *devpath; + int i; + + if(!match_property_value(props, "DEVTYPE", "partition")) + return 0; + + devpath = get_property_value(props, "DEVPATH"); + if(is_removable(devpath)) + return 1; + + for(i=0; removable_buses[i]; ++i) + if(match_property_value(props, "ID_BUS", removable_buses[i])) + return 1; + + return check_buses(devpath, removable_buses); +} + char **get_device_nodes(char *dirname) { DIR *dir; @@ -327,7 +415,7 @@ Device *get_devices(void) printf(" %s = %s\n", props[j].name, props[j].value); } - if(match_property_value(props, "ID_BUS", "usb") && match_property_value(props, "DEVTYPE", "partition")) + if(can_mount(props)) { char *devname; char *label; -- 2.45.2