Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Evergreen:11.1
gnome-vfs2
gnome-vfs-submount.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File gnome-vfs-submount.patch of Package gnome-vfs2
--- gnome-vfs-2.11.3/libgnomevfs/gnome-vfs-filesystem-type.c +++ gnome-vfs-2.11.3/libgnomevfs/gnome-vfs-filesystem-type.c @@ -64,6 +64,7 @@ { "reiserfs" , N_("ReiserFS Linux Volume"), 1 }, { "smbfs" , N_("Windows Shared Volume"), 1 }, { "supermount",N_("SuperMount Volume"), 0 }, + { "subfs", N_("SubMount Volume"), 0 }, { "udf" , N_("DVD Volume"), 0 }, { "ufs" , N_("Solaris/BSD Volume"), 1 }, { "udfs" , N_("Udfs Solaris Volume"), 1 }, --- gnome-vfs-2.11.3/libgnomevfs/gnome-vfs-unix-mounts.c +++ gnome-vfs-2.11.3/libgnomevfs/gnome-vfs-unix-mounts.c @@ -594,7 +594,8 @@ } #endif - if ((mntent->mnt_type != NULL && strcmp ("supermount", mntent->mnt_type) == 0) + if ((mntent->mnt_type != NULL && strcmp ("supermount", mntent->mnt_type) == 0) + || (mntent->mnt_type != NULL && strcmp ("subfs", mntent->mnt_type) == 0) #ifdef HAVE_HASMNTOPT || (hasmntopt (mntent, "user") != NULL && hasmntopt (mntent, "user") != hasmntopt (mntent, "user_xattr")) --- gnome-vfs-2.11.3/libgnomevfs/gnome-vfs-volume-monitor-daemon.c +++ gnome-vfs-2.11.3/libgnomevfs/gnome-vfs-volume-monitor-daemon.c @@ -262,10 +262,13 @@ return GNOME_VFS_DEVICE_TYPE_CDROM; } else if (g_str_has_prefix (device_path, "/dev/cd")) { return GNOME_VFS_DEVICE_TYPE_CDROM; + } else if (g_str_has_prefix (device_path, "/dev/dvd")) { + return GNOME_VFS_DEVICE_TYPE_CDROM; } else if (g_str_has_prefix (device_path, "/vol/")) { name = mount_path + strlen ("/"); - if (g_str_has_prefix (name, "cdrom")) { + if (g_str_has_prefix (name, "cdrom") || + g_str_has_prefix (name, "dvd")) { return GNOME_VFS_DEVICE_TYPE_CDROM; } else if (g_str_has_prefix (name, "floppy")) { return GNOME_VFS_DEVICE_TYPE_FLOPPY; @@ -872,7 +875,7 @@ vol->priv->is_mounted = 1; vol->priv->device_type = get_device_type_from_device_and_mount (mount->device_path, mount->mount_path); - + if ((strcmp (mount->filesystem_type, "iso9660") == 0) || (strcmp (mount->filesystem_type, "cd9660") == 0)) { if (vol->priv->device_type == GNOME_VFS_DEVICE_TYPE_UNKNOWN) { @@ -908,7 +911,8 @@ vol->priv->device_type = GNOME_VFS_DEVICE_TYPE_HARDDRIVE; } - if (vol->priv->device_type == GNOME_VFS_DEVICE_TYPE_CDROM) { + if (vol->priv->device_type == GNOME_VFS_DEVICE_TYPE_CDROM && + strcmp (mount->filesystem_type, "subfs")) { fd = 0; disctype = _gnome_vfs_get_cdrom_type (mount->device_path, &fd); @@ -991,6 +995,45 @@ return vol; } +static GList * +remove_submounts (GList *volumes) +{ + GList *l; + GList *new_volumes; + GHashTable *submounts; + + submounts = g_hash_table_new (g_str_hash, g_str_equal); + + for (l = volumes; l != NULL; l = l->next) { + GnomeVFSUnixMount *mount = l->data; + + if (!strcmp (mount->filesystem_type, "subfs")) { + g_hash_table_insert (submounts, + mount->device_path, + mount); + } + } + + new_volumes = NULL; + + for (l = volumes; l != NULL; l = l->next) { + GnomeVFSUnixMount *mount = l->data; + + if (strcmp (mount->filesystem_type, "subfs") != 0 && + g_hash_table_lookup (submounts, mount->device_path)) { + _gnome_vfs_unix_mount_free (mount); + } else { + new_volumes = g_list_prepend (new_volumes, mount); + } + } + + g_list_free (volumes); + + g_hash_table_destroy (submounts); + + return g_list_reverse (new_volumes); +} + static void update_mtab_volumes (GnomeVFSVolumeMonitorDaemon *volume_monitor_daemon) { @@ -1006,6 +1049,8 @@ if (_gnome_vfs_get_current_unix_mounts (&new_mtab)) { new_mtab = g_list_sort (new_mtab, (GCompareFunc) _gnome_vfs_unix_mount_compare); + new_mtab = remove_submounts (new_mtab); + diff_sorted_lists (volume_monitor_daemon->last_mtab, new_mtab, (GCompareFunc) _gnome_vfs_unix_mount_compare, &added, &removed); --- gnome-vfs-2.11.3/libgnomevfs/gnome-vfs-volume-ops.c +++ gnome-vfs-2.11.3/libgnomevfs/gnome-vfs-volume-ops.c @@ -374,6 +374,7 @@ mount_unmount_operation (const char *mount_point, const char *device_path, const char *hal_udi, + const char *filesystem_type, GnomeVFSDeviceType device_type, gboolean should_mount, gboolean should_unmount, @@ -432,6 +433,10 @@ command = find_command (UMOUNT_COMMAND); #else command = find_command (UMOUNT_COMMAND); + /* Don't unmount subfs volumes */ + if (!filesystem_type || strcmp (filesystem_type, "subfs") != 0) { + command = find_command (UMOUNT_COMMAND); + } #endif #ifdef UNMOUNT_ARGUMENT argument = UNMOUNT_ARGUMENT; @@ -590,7 +595,7 @@ GnomeVFSVolumeOpCallback callback, gpointer user_data) { - char *mount_path, *device_path; + char *mount_path, *device_path, *filesystem_type; char *uri; GnomeVFSVolumeType type; @@ -609,14 +614,17 @@ mount_path = gnome_vfs_get_local_path_from_uri (uri); g_free (uri); device_path = gnome_vfs_volume_get_device_path (volume); + filesystem_type = gnome_vfs_volume_get_filesystem_type (volume); mount_unmount_operation (mount_path, device_path, gnome_vfs_volume_get_hal_udi (volume), + filesystem_type, gnome_vfs_volume_get_device_type (volume), FALSE, TRUE, FALSE, callback, user_data); g_free (mount_path); g_free (device_path); + g_free (filesystem_type); } else { unmount_connected_server (volume, callback, user_data); } @@ -637,7 +645,7 @@ GnomeVFSVolumeOpCallback callback, gpointer user_data) { - char *mount_path, *device_path; + char *mount_path, *device_path, *filesystem_type; char *uri; GnomeVFSVolumeType type; @@ -652,11 +660,13 @@ mount_unmount_operation (mount_path, device_path, gnome_vfs_volume_get_hal_udi (volume), + NULL, gnome_vfs_volume_get_device_type (volume), FALSE, TRUE, TRUE, callback, user_data); g_free (mount_path); g_free (device_path); + g_free (filesystem_type); } else { unmount_connected_server (volume, callback, user_data); } @@ -686,6 +696,7 @@ mount_unmount_operation (mount_path, device_path, gnome_vfs_drive_get_hal_udi (drive), + NULL, GNOME_VFS_DEVICE_TYPE_UNKNOWN, TRUE, FALSE, FALSE, callback, user_data); @@ -779,6 +790,7 @@ mount_unmount_operation (mount_path, device_path, gnome_vfs_drive_get_hal_udi (drive), + NULL, GNOME_VFS_DEVICE_TYPE_UNKNOWN, FALSE, FALSE, TRUE, callback, user_data); --- gnome-vfs-2.11.3/modules/computer-method.c +++ gnome-vfs-2.11.3/modules/computer-method.c @@ -494,19 +494,26 @@ volume_list = gnome_vfs_drive_get_mounted_volumes (drive); if (volume_list != NULL) { + char *filesystem_type; + GnomeVFSVolume *volume; volume = GNOME_VFS_VOLUME (volume_list->data); uri = gnome_vfs_volume_get_activation_uri (volume); tmp1 = gnome_vfs_drive_get_display_name (drive); tmp2 = gnome_vfs_volume_get_display_name (volume); - if (strcmp (tmp1, tmp2) != 0) { + + /* Don't bother to figure out subfs volumes */ + filesystem_type = gnome_vfs_volume_get_filesystem_type (volume); + if ((filesystem_type == NULL || strcmp (filesystem_type, "subfs") != 0) + && strcmp (tmp1, tmp2) != 0) { name = g_strconcat (tmp1, ": ", tmp2, NULL); } else { name = g_strdup (tmp1); } g_free (tmp1); g_free (tmp2); + g_free (filesystem_type); icon = gnome_vfs_volume_get_icon (volume); gnome_vfs_volume_unref (volume); } else { --- gnome-vfs-2.11.3/modules/file-method.c +++ gnome-vfs-2.11.3/modules/file-method.c @@ -2425,6 +2425,16 @@ return GNOME_VFS_ERROR_INVALID_URI; } + /* Horrible hack, I hate myself. There are problems + * monitoring subfs volumes, and just about everything in /media + * on suse is going to be a subfs volume */ + if (g_str_has_prefix (filename, "/media")) { + g_free (filename); + + return GNOME_VFS_ERROR_NOT_SUPPORTED; + } + + handle = g_new0 (FileMonitorHandle, 1); handle->uri = uri; handle->cancelled = FALSE;
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor