]> git.tdb.fi Git - pmount-gui.git/blobdiff - main.c
More efficient way to recognize removable buses
[pmount-gui.git] / main.c
diff --git a/main.c b/main.c
index cd95cc943cc78cabd0142b2b881367847bda9567..d1a2853c48dcb4d512cd78623893e3e449c06dd7 100644 (file)
--- a/main.c
+++ b/main.c
@@ -211,6 +211,16 @@ char **get_mounted_devices(void)
        return get_mount_entries("/etc/mtab", NULL);
 }
 
+int is_user_mountable(struct mntent *me)
+{
+       return hasmntopt(me, "user")!=NULL;
+}
+
+char **get_fstab_devices(void)
+{
+       return get_mount_entries("/etc/fstab", &is_user_mountable);
+}
+
 int is_in_array(char **names, char *devname)
 {
        int i;
@@ -298,11 +308,16 @@ int check_buses(char *devpath, char **buses)
        return 0;
 }
 
-int can_mount(Property *props)
+int can_mount(Property *props, char **allowed)
 {
        static char *removable_buses[] = { "usb", "firewire", 0 };
+       char *devname;
        char *devpath;
-       int i;
+       char *bus;
+
+       devname = get_property_value(props, "DEVNAME");
+       if(is_in_array(allowed, devname))
+               return 1;
 
        if(!match_property_value(props, "DEVTYPE", "partition"))
                return 0;
@@ -311,9 +326,9 @@ int can_mount(Property *props)
        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;
+       bus = get_property_value(props, "ID_BUS");
+       if(is_in_array(removable_buses, bus))
+               return 1;
 
        return check_buses(devpath, removable_buses);
 }
@@ -400,10 +415,12 @@ Device *get_devices(void)
        Device *devices = NULL;
        int n_devices = 0;
        char **mounted = NULL;
+       char **fstab = NULL;
        int i;
 
        nodes = get_device_nodes("/dev/disk/by-id");
        mounted = get_mounted_devices();
+       fstab = get_fstab_devices();
 
        for(i=0; nodes[i]; ++i)
        {
@@ -425,7 +442,7 @@ Device *get_devices(void)
                                printf("  %s = %s\n", props[j].name, props[j].value);
                }
 
-               if(can_mount(props))
+               if(can_mount(props, fstab))
                {
                        char *devname;
                        char *label;