Le mercredi 08 septembre 2010 à 19:56 +0100, Adam D. Barratt a écrit : > block 596122 by 590274 > thanks > > On Wed, 2010-09-08 at 20:32 +0200, Josselin Mouette wrote: > > please unblock gvfs for squeeze, it is only a trivial RC bug fix. > > > > gvfs (1.6.3-2) unstable; urgency=low > > . > > * Depend on fuse-utils 2.8.4. Closes: #585648. > > While the gvfs fix is indeed trivial, fuse 2.8.4-1 is unable to migrate > due to a FTBFS on kfreebsd-* (#590274); marking this bug as blocked by > that.
So, the situation has evolved. First, fuse has been fixed in the meantime by a NMU. It’s just needing an unblock. Second, gvfs has been updated again. This update is appropriate for squeeze, but the timing is unfortunate. It is solely a new upstream release. Major changes in 1.6.4 ====================== * Lots of translation updates * afc: Add support for photo thumbnails on iOS4 * daemons: Move GConf initialization from backend constructor * sftp: Use poll() to cope with openssh-5.6 changes The OpenSSH change is not necessary per se since we ship 5.5, but the GConf one fixes a deadlock, and iOS4 support really looks like a good idea. Non-translation changes attached. Cheers, -- .''`. Josselin Mouette : :' : `. `' “If you behave this way because you are blackmailed by someone, `- […] I will see what I can do for you.” -- Jörg Schilling
--- gvfs-1.6.3/daemon/gvfsbackendafc.c 2010-07-12 15:22:38.000000000 +0000 +++ gvfs-1.6.4/daemon/gvfsbackendafc.c 2010-09-27 14:51:51.000000000 +0000 @@ -43,6 +43,14 @@ #define AFC_E_INVALID_ARG AFC_E_INVALID_ARGUMENT #endif /* !AFC_E_INVALID_ARG */ +typedef enum { + IOS_UNKNOWN = 0, + IOS1, + IOS2, + IOS3, + IOS4 +} HostOSVersion; + struct _GVfsBackendAfc { GVfsBackend backend; @@ -50,6 +58,7 @@ char *service; char *model; gboolean connected; + HostOSVersion version; idevice_t dev; afc_client_t afc_cli; @@ -391,6 +400,42 @@ g_vfs_backend_set_icon_name (G_VFS_BACKEND(self), "phone-apple-iphone"); } + /* Get the major OS version */ + value = NULL; + self->version = IOS_UNKNOWN; + if (G_LIKELY(g_vfs_backend_lockdownd_check (lockdownd_get_value (lockdown_cli, NULL, "ProductVersion", &value), G_VFS_JOB(job)) == 0)) + { + if (plist_get_node_type(value) == PLIST_STRING) + { + char *version_string = NULL; + + plist_get_string_val(value, &version_string); + if (version_string) + { + /* parse version */ + int maj = 0; + int min = 0; + int rev = 0; + + sscanf(version_string, "%d.%d.%d", &maj, &min, &rev); + free(version_string); + + switch (maj) + { + case 2: + self->version = IOS2; + break; + case 3: + self->version = IOS3; + break; + case 4: + self->version = IOS4; + break; + } + } + } + } + lockdownd_client_free (lockdown_cli); lockdown_cli = NULL; @@ -1026,33 +1071,98 @@ strlen (basename) > 4 && basename[strlen(basename) - 4] == '.') { - char *thumb_uri, *thumb_base, *thumb_path; - char *parent, *ptr, *no_suffix; + char *thumb_uri, *thumb_path; + char *no_suffix; char **thumb_afcinfo; GFile *thumb_file; + const char *suffix; GMountSpec *mount_spec; const char *port; - /* Parent directory */ - ptr = strrchr (path, '/'); - if (ptr == NULL) - return; - parent = g_strndup (path, ptr - path); + /* Handle thumbnails for movies as well */ + if (g_str_has_suffix (path, ".MOV")) + suffix = "JPG"; + else + suffix = "THM"; - /* Basename with suffix replaced */ - no_suffix = g_strndup (basename, strlen (basename) - 3); - thumb_base = g_strdup_printf ("%s%s", no_suffix, "THM"); - g_free (no_suffix); + if (self->version == IOS2) + { + /* The thumbnails are side-by-side with the + * THM files in iOS2 */ - /* Full thumbnail path */ - thumb_path = g_build_filename (parent, ".MISC", thumb_base, NULL); + /* Remove the suffix */ + no_suffix = g_strndup (path, strlen (path) - 3); + /* Replace with THM */ + thumb_path = g_strdup_printf ("%s%s", no_suffix, suffix); + g_free (no_suffix); + } + else if (self->version == IOS3) + { + char *parent, *ptr; + char *thumb_base; - g_free (parent); - g_free (thumb_base); + /* The thumbnails are in the .MISC sub-directory, relative to the + * image itself, so: + * afc://xxx/DCIM/100APPLE/IMG_0001.JPG + * => + * afc://xxx/DCIM/100APPLE/.MISC/IMG_0001.THM + */ + + /* Parent directory */ + ptr = strrchr (path, '/'); + if (ptr == NULL) + return; + parent = g_strndup (path, ptr - path); + + /* Basename with suffix replaced */ + no_suffix = g_strndup (basename, strlen (basename) - 3); + thumb_base = g_strdup_printf ("%s%s", no_suffix, suffix); + g_free (no_suffix); + + /* Full thumbnail path */ + thumb_path = g_build_filename (parent, ".MISC", thumb_base, NULL); + + g_free (parent); + g_free (thumb_base); + } + else if (self->version == IOS4) + { + char **components; + + /* The thumbnails are in the PhotoData/ so: + * afc://xxx/DCIM/100APPLE/IMG_0001.JPG + * => + * afc://xxx/PhotoData/100APPLE/IMG_0001.THM + */ + + /* Replace the JPG by THM */ + no_suffix = g_strndup (path, strlen (path) - 3); + thumb_path = g_strdup_printf ("%s%s", no_suffix, suffix); + g_free (no_suffix); + + /* Replace DCIM with PhotoData */ + components = g_strsplit (thumb_path, "/", -1); + g_free (thumb_path); + for (i = 0; components[i] != NULL; i++) + { + if (g_str_equal (components[i], "DCIM")) + { + g_free (components[i]); + components[i] = g_strdup ("PhotoData"); + } + } + thumb_path = g_strjoinv ("/", components); + g_strfreev (components); + } + else + { + thumb_path = NULL; + } thumb_afcinfo = NULL; - if (afc_get_file_info (self->afc_cli, thumb_path, &thumb_afcinfo) != 0) + if (thumb_path == NULL || + afc_get_file_info (self->afc_cli, thumb_path, &thumb_afcinfo) != 0) { g_strfreev (thumb_afcinfo); g_free (thumb_path); @@ -1064,6 +1174,7 @@ mount_spec = g_vfs_backend_get_mount_spec (G_VFS_BACKEND (self)); port = g_mount_spec_get (mount_spec, "port"); thumb_uri = g_strdup_printf ("afc://%s%s%s", self->uuid, port ? port : "", thumb_path); + g_free (thumb_path); thumb_file = g_file_new_for_uri (thumb_uri); g_free (thumb_uri); --- gvfs-1.6.3/daemon/gvfsbackendsftp.c 2010-07-12 15:22:38.000000000 +0000 +++ gvfs-1.6.4/daemon/gvfsbackendsftp.c 2010-09-27 14:52:28.000000000 +0000 @@ -24,6 +24,7 @@ #include <config.h> #include <stdlib.h> +#include <sys/poll.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/time.h> @@ -837,10 +838,9 @@ GVfsBackendSftp *op_backend = G_VFS_BACKEND_SFTP (backend); GInputStream *prompt_stream; GOutputStream *reply_stream; - fd_set ifds; - struct timeval tv; int ret; int prompt_fd; + struct pollfd fds[2]; char buffer[1024]; gsize len; gboolean aborted = FALSE; @@ -864,14 +864,12 @@ ret_val = TRUE; while (1) { - FD_ZERO (&ifds); - FD_SET (stdout_fd, &ifds); - FD_SET (prompt_fd, &ifds); - - tv.tv_sec = SFTP_READ_TIMEOUT; - tv.tv_usec = 0; + fds[0].fd = stdout_fd; + fds[0].events = POLLIN; + fds[1].fd = prompt_fd; + fds[1].events = POLLIN; - ret = select (MAX (stdout_fd, prompt_fd)+1, &ifds, NULL, NULL, &tv); + ret = poll(fds, 2, SFTP_READ_TIMEOUT); if (ret <= 0) { @@ -882,11 +880,11 @@ break; } - if (FD_ISSET (stdout_fd, &ifds)) + if (fds[0].revents) break; /* Got reply to initial INIT request */ - g_assert (FD_ISSET (prompt_fd, &ifds)); - + if (!(fds[1].revents & POLLIN)) + continue; len = g_input_stream_read (prompt_stream, buffer, sizeof (buffer) - 1, @@ -955,16 +953,18 @@ g_free (new_password); if (op_backend->user_specified) - /* Translators: the first %s is the username, the second the host name */ if (strcmp (authtype, "publickey") == 0) + /* Translators: the first %s is the username, the second the host name */ prompt = g_strdup_printf (_("Enter passphrase for key for ssh as %s on %s"), op_backend->user, op_backend->host); else + /* Translators: the first %s is the username, the second the host name */ prompt = g_strdup_printf (_("Enter password for ssh as %s on %s"), op_backend->user, op_backend->host); else - /* translators: %s here is the hostname */ if (strcmp (authtype, "publickey") == 0) + /* Translators: %s is the hostname */ prompt = g_strdup_printf (_("Enter passphrase for key for ssh on %s"), op_backend->host); else + /* Translators: %s is the hostname */ prompt = g_strdup_printf (_("Enter password for ssh on %s"), op_backend->host); if (!g_mount_source_ask_password (mount_source, --- gvfs-1.6.3/daemon/gvfsbackendsmbbrowse.c 2010-02-11 06:32:21.000000000 +0000 +++ gvfs-1.6.4/daemon/gvfsbackendsmbbrowse.c 2010-09-27 14:51:51.000000000 +0000 @@ -247,11 +247,35 @@ static void g_vfs_backend_smb_browse_init (GVfsBackendSmbBrowse *backend) { +#ifdef HAVE_GCONF + GConfClient *gclient; +#endif + backend->entries_lock = g_mutex_new (); backend->update_cache_lock = g_mutex_new (); if (mount_tracker == NULL) mount_tracker = g_mount_tracker_new (NULL); + +#ifdef HAVE_GCONF + gclient = gconf_client_get_default (); + if (gclient) + { + char *workgroup; + + workgroup = gconf_client_get_string (gclient, + PATH_GCONF_GNOME_VFS_SMB_WORKGROUP, NULL); + + if (workgroup && workgroup[0]) + default_workgroup = workgroup; + else + g_free (workgroup); + + g_object_unref (gclient); + } +#endif + + DEBUG ("g_vfs_backend_smb_browse_init: default workgroup = '%s'\n", default_workgroup ? default_workgroup : "NULL"); } /** @@ -1456,9 +1480,6 @@ { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GVfsBackendClass *backend_class = G_VFS_BACKEND_CLASS (klass); -#ifdef HAVE_GCONF - GConfClient *gclient; -#endif gobject_class->finalize = g_vfs_backend_smb_browse_finalize; @@ -1475,26 +1496,6 @@ backend_class->try_query_info = try_query_info; backend_class->enumerate = do_enumerate; backend_class->try_enumerate = try_enumerate; - -#ifdef HAVE_GCONF - gclient = gconf_client_get_default (); - if (gclient) - { - char *workgroup; - - workgroup = gconf_client_get_string (gclient, - PATH_GCONF_GNOME_VFS_SMB_WORKGROUP, NULL); - - if (workgroup && workgroup[0]) - default_workgroup = workgroup; - else - g_free (workgroup); - - g_object_unref (gclient); - } -#endif - - DEBUG ("g_vfs_backend_smb_browse_class_init - default workgroup = '%s'\n", default_workgroup ? default_workgroup : "NULL"); } void --- gvfs-1.6.3/daemon/gvfsbackendsmb.c 2010-02-11 06:32:25.000000000 +0000 +++ gvfs-1.6.4/daemon/gvfsbackendsmb.c 2010-09-27 14:51:51.000000000 +0000 @@ -121,6 +121,27 @@ static void g_vfs_backend_smb_init (GVfsBackendSmb *backend) { +#ifdef HAVE_GCONF + GConfClient *gclient; +#endif + +#ifdef HAVE_GCONF + gclient = gconf_client_get_default (); + if (gclient) + { + char *workgroup; + + workgroup = gconf_client_get_string (gclient, + PATH_GCONF_GNOME_VFS_SMB_WORKGROUP, NULL); + + if (workgroup && workgroup[0]) + default_workgroup = workgroup; + else + g_free (workgroup); + + g_object_unref (gclient); + } +#endif } /** @@ -2109,9 +2130,6 @@ { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GVfsBackendClass *backend_class = G_VFS_BACKEND_CLASS (klass); -#ifdef HAVE_GCONF - GConfClient *gclient; -#endif gobject_class->finalize = g_vfs_backend_smb_finalize; @@ -2138,25 +2156,6 @@ backend_class->move = do_move; backend_class->try_query_settable_attributes = try_query_settable_attributes; backend_class->set_attribute = do_set_attribute; - -#ifdef HAVE_GCONF - gclient = gconf_client_get_default (); - if (gclient) - { - char *workgroup; - - workgroup = gconf_client_get_string (gclient, - PATH_GCONF_GNOME_VFS_SMB_WORKGROUP, NULL); - - if (workgroup && workgroup[0]) - default_workgroup = workgroup; - else - g_free (workgroup); - - g_object_unref (gclient); - } -#endif - } void
signature.asc
Description: This is a digitally signed message part