On Fri, 2006-03-17 at 22:04 +0100, Christian Neumair wrote:

> The attached patch now also handled NULL and "" paths better by
> canonicalizing them to "/", and it adds more DEBUG statements. Thanks to
> Priit Laes for pointing this glitch out.

+if (symlink[0] == '/' || !strcmp (path, "/"))
+       return g_strdup (symlink);

Why the strcmp? resolve("/", "blah") should be "/blah", not "blah". I
removed this.

        p = strrchr (path, '/');
        g_assert (p != NULL);

An assert is a bit harsh in this place, i made it just return symlink in
this case.


+       if (id != expected_id) {
+               g_critical ("ID mismatch (%u != %u)", id, expected_id);

Don't user g_critical for this, as its perfectly possible to return an
error code. g_critical should mainly be used instead of e.g. crashing
with a null-pointer dereference, it should only happen because the app
did something wrong, not because of something the server sent to us. I
realize the sftp code is full of g_criticals, but we shouldn't propagate
this more.

                } else
                        DEBUG (g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG,
                                      "%s: Readlink failed, got unexpected 
filename count (%d, 1
expected)",
                                      __FUNCTION__, count));

This doesn't work well if DEBUG isn't defined. You need { } around it.


I fixed up all the above comments and commited it. However there are
still some issues with the symlink semantics:

+       /* we can't use FSTAT, because it always follows the symlink, but 
doesn't return the target file name.
+        * So we fall back to our home-brewn LSTAT/readlink code. */
+       return get_file_info_for_path (handle->connection,
+                                      handle->path,
+                                      file_info, options);

For file: do_get_file_info_from_handle uses fstat, which also always
follows symlinks, so I think that is the right behaviour. We should do
the same in sftp:.

+                       if (info->type == GNOME_VFS_FILE_TYPE_SYMBOLIC_LINK) {
+                               path = g_build_filename (handle->path, 
filename, NULL);
+                               get_file_info_for_path (handle->connection, 
path,
+                                                       info, 
handle->dir_options);
+                               g_free (path);
+                       } else

This needs to check FOLLOW_SYMLINKS in the options before following the
symlink.

Can you look into this?

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 Alexander Larsson                                            Red Hat, Inc 
                   [EMAIL PROTECTED]    [EMAIL PROTECTED] 
He's a globe-trotting flyboy shaman with a robot buddy named Sparky. She's a 
chain-smoking French-Canadian journalist descended from a line of powerful 
witches. They fight crime! 

_______________________________________________
gnome-vfs-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/gnome-vfs-list

Reply via email to