From: Mikko Rasa Date: Thu, 20 Oct 2011 12:38:33 +0000 (+0300) Subject: Omit mounted devices from the list X-Git-Url: http://git.tdb.fi/?p=pmount-gui.git;a=commitdiff_plain;h=fbee2822001a0976e9cfff115c51ab82283197a1 Omit mounted devices from the list --- diff --git a/main.c b/main.c index 13e6696..7d941c1 100644 --- a/main.c +++ b/main.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -17,6 +18,7 @@ typedef struct sDevice char *node; char *label; char *description; + int mounted; time_t time; } Device; @@ -159,6 +161,49 @@ void free_properties(Property *props) free(props); } +char **get_mounted_devices(void) +{ + FILE *mtab; + struct mntent *me; + char **mounted = NULL; + int n_mounted = 0; + + mtab = setmntent("/etc/mtab", "r"); + if(!mtab) + return NULL; + + while((me = getmntent(mtab))) + { + mounted = (char **)realloc(mounted, (n_mounted+2)*sizeof(char *)); + mounted[n_mounted] = strdup(me->mnt_fsname); + ++n_mounted; + } + + endmntent(mtab); + mounted[n_mounted] = NULL; + + return mounted; +} + +int is_mounted(char **mounted, char *devname) +{ + int i; + for(i=0; mounted[i]; ++i) + if(!strcmp(devname, mounted[i])) + return 1; + return 0; +} + +void free_mounted_devices(char **mounted) +{ + int i; + if(!mounted) + return; + for(i=0; mounted[i]; ++i) + free(mounted[i]); + free(mounted); +} + Device *get_devices(void) { DIR *dir; @@ -166,11 +211,14 @@ Device *get_devices(void) char fnbuf[256]; Device *devices = NULL; int n_devices = 0; + char **mounted = NULL; dir = opendir("/dev/disk/by-id"); if(!dir) return NULL; + mounted = get_mounted_devices(); + while((de = readdir(dir))) { if(de->d_name[0]=='.' && (de->d_name[1]==0 || (de->d_name[1]=='.' && de->d_name[2]==0))) @@ -180,6 +228,7 @@ Device *get_devices(void) Property *props = get_device_properties(fnbuf); if(match_property_value(props, "ID_BUS", "usb") && match_property_value(props, "DEVTYPE", "partition")) { + char *devname; char *label; char *vendor; char *model; @@ -189,6 +238,8 @@ Device *get_devices(void) /*printf("Using device %s\n", fnbuf);*/ + devname = get_property_value(props, "DEVNAME"); + label = get_property_value(props, "ID_FS_LABEL"); if(!label) label = get_property_value(props, "ID_FS_UUID"); @@ -196,11 +247,12 @@ Device *get_devices(void) { char *ptr; - label = get_property_value(props, "DEVNAME"); + label = devname; for(ptr=label; *ptr; ++ptr) if(*ptr=='/') label = ptr+1; } + vendor = get_property_value(props, "ID_VENDOR"); model = get_property_value(props, "ID_MODEL"); @@ -214,6 +266,7 @@ Device *get_devices(void) devices[n_devices].node = strdup(fnbuf); devices[n_devices].label = strdup(label); devices[n_devices].description = strdup(buf); + devices[n_devices].mounted = is_mounted(mounted, devname); devices[n_devices].time = st.st_mtime; ++n_devices; } @@ -221,11 +274,13 @@ Device *get_devices(void) } closedir(dir); + free_mounted_devices(mounted); if(devices) { devices[n_devices].node = NULL; devices[n_devices].label = NULL; + devices[n_devices].description = NULL; } return devices; @@ -349,15 +404,16 @@ int main(int argc, char **argv) { latest = 0; for(i=0; devices[i].node; ++i) - { - gtk_list_store_append(store, &iter); - gtk_list_store_set(store, &iter, 0, devices[i].description, 1, &devices[i], -1); - if(devices[i].time>latest) + if(!devices[i].mounted) { - latest = devices[i].time; - gtk_tree_selection_select_iter(selection, &iter); + gtk_list_store_append(store, &iter); + gtk_list_store_set(store, &iter, 0, devices[i].description, 1, &devices[i], -1); + if(devices[i].time>latest) + { + latest = devices[i].time; + gtk_tree_selection_select_iter(selection, &iter); + } } - } gtk_widget_show_all(window); }