/** * rb_sanitize_uri_for_filesystem: * @uri: a URI to sanitize * * Return value: a copy of the URI with characters not allowed by the target filesystem * replaced */ char * rb_sanitize_uri_for_filesystem (const char *uri) { char *filesystem = rb_uri_get_filesystem_type (uri); char *sane_uri = NULL; if (!filesystem) return g_strdup (uri); if (!strcmp (filesystem, "fat") || !strcmp (filesystem, "vfat") || !strcmp (filesystem, "msdos")) { char *hostname = NULL; GError *error = NULL; char *full_path = g_filename_from_uri (uri, &hostname, &error); if (error) { g_error_free (error); g_free (filesystem); g_free (full_path); return g_strdup (uri); } g_strdelimit (full_path, "\"", '\''); g_strdelimit (full_path, ":|<>*?\\", '_'); /* create a new uri from this */ sane_uri = g_filename_to_uri (full_path, hostname, &error); g_free (hostname); g_free (full_path); if (error) { g_error_free (error); g_free (filesystem); return g_strdup (uri); } } /* add workarounds for other filesystems limitations here */ g_free (filesystem); return sane_uri ? sane_uri : g_strdup (uri); }
/** * rb_sanitize_uri_for_filesystem: * @uri: a URI to sanitize * * Removes characters from @uri that are not allowed by the filesystem * on which it would be stored. At present, this only supports MS DOS * filesystems. * * Return value: sanitized copy of @uri, must be freed by caller. */ char * rb_sanitize_uri_for_filesystem (const char *uri) { char *mountpoint = NULL; char *filesystem; char *sane_uri = NULL; filesystem = rb_uri_get_filesystem_type (uri, &mountpoint); if (!filesystem) return g_strdup (uri); if (!strcmp (filesystem, "fat") || !strcmp (filesystem, "vfat") || !strcmp (filesystem, "msdos")) { char *hostname = NULL; GError *error = NULL; char *full_path; char *fat_path; full_path = g_filename_from_uri (uri, &hostname, &error); if (error) { g_error_free (error); g_free (filesystem); g_free (full_path); g_free (mountpoint); return g_strdup (uri); } /* if we got a mount point, don't sanitize it. the mountpoint must be * valid for the filesystem that contains it, but it may not be valid for * the filesystem it contains. for example, a vfat filesystem mounted * at "/media/Pl1:". */ fat_path = full_path; if (mountpoint != NULL) { char *mount_path; mount_path = g_filename_from_uri (mountpoint, NULL, &error); if (error) { rb_debug ("can't convert mountpoint %s to a path: %s", mountpoint, error->message); g_error_free (error); } else if (g_str_has_prefix (full_path, mount_path)) { fat_path = full_path + strlen (mount_path); } else { rb_debug ("path %s doesn't begin with mount path %s somehow", full_path, mount_path); } g_free (mount_path); } else { rb_debug ("couldn't get mount point for %s", uri); } rb_debug ("sanitizing path %s", fat_path); rb_sanitize_path_for_msdos_filesystem (fat_path); /* create a new uri from this */ sane_uri = g_filename_to_uri (full_path, hostname, &error); rb_debug ("sanitized URI: %s", sane_uri); g_free (hostname); g_free (full_path); if (error) { g_error_free (error); g_free (filesystem); g_free (mountpoint); return g_strdup (uri); } } /* add workarounds for other filesystems limitations here */ g_free (filesystem); g_free (mountpoint); return sane_uri ? sane_uri : g_strdup (uri); }