Hi again.
Completely untested gio port attached. Unfortunately the binaries are
still linking against alot of useless libraries, including gnome-vfs
which means the package still depends on it.
I hope you might find some use for this...
--
Regards,
Andreas Henriksson
diff -uri nautilus-open-terminal-0.9/src/nautilus-open-terminal.c nautilus-open-terminal-0.9-gio/src/nautilus-open-terminal.c
--- nautilus-open-terminal-0.9/src/nautilus-open-terminal.c 2008-02-28 00:03:34.000000000 +0100
+++ nautilus-open-terminal-0.9-gio/src/nautilus-open-terminal.c 2008-04-14 00:32:12.000000000 +0200
@@ -35,12 +35,13 @@
#include <gtk/gtkmain.h>
#include <gconf/gconf-client.h>
#include <libgnome/gnome-desktop-item.h>
-#include <libgnomevfs/gnome-vfs-utils.h>
+#include <gio/gio.h>
#include <errno.h>
#include <fcntl.h>
-#include <string.h> /* for strcmp */
+#include <string.h> /* for strcmp, strdup, ... */
#include <unistd.h> /* for chdir */
+#include <stdlib.h> /* for atoi */
#include <sys/stat.h>
#define SSH_DEFAULT_PORT 22
@@ -66,7 +67,8 @@
g_assert (file_info);
uri_scheme = nautilus_file_info_get_activation_uri (file_info);
- if (p = strchr (uri_scheme, ':')) {
+ p = strchr (uri_scheme, ':');
+ if (p) {
*p = 0;
}
@@ -143,31 +145,75 @@
#endif
static void
+parse_sftp_uri (GFile *file, char **host, guint *port, char **user,
+ char **path)
+{
+ char *uri = g_file_get_uri (file);
+ char *u, *h, *s, *p;
+ char *h_end;
+
+ g_assert (uri != NULL);
+
+ u = strchr(uri, ':');
+ g_assert (u != NULL);
+ u+=2;
+
+ p = strchr (u, '/');
+
+ h = strchr(u, '@');
+
+ if (h && (p == NULL || h < p)) {
+ *h='\0';
+ h++;
+ } else {
+ h = u;
+ u = NULL;
+ }
+
+ s = strchr(h, ':');
+
+ if (s && (p == NULL || s < p)) {
+ h_end = s-1;
+ *s = '\0';
+ s++;
+ } else {
+ h_end = p;
+ s = NULL;
+ }
+
+ if (h_end == NULL) {
+ h_end = h + strlen(h);
+ }
+
+ *user = strdup(u);
+ *port = s == NULL ? 0 : atoi(s); /* FIXME: getservbyname ? */
+ *path = g_uri_unescape_string (p, "/");
+ *h_end = '\0';
+ *host = strdup(h);
+
+ g_free (uri);
+}
+
+static void
append_sftp_info (char **terminal_exec,
NautilusFileInfo *file_info)
{
- GnomeVFSURI *vfs_uri;
- const char *host_name, *path, *user_name;
- char *uri, *user_host, *cmd, *quoted_cmd, *unescaped_path;
+ GFile *vfs_uri;
+ char *host_name, *path, *user_name;
+ char *user_host, *cmd, *quoted_cmd;
guint host_port;
g_assert (terminal_exec != NULL);
g_assert (file_info != NULL);
- uri = nautilus_file_info_get_activation_uri (file_info);
- g_assert (uri != NULL);
- g_assert (strncmp (uri, "sftp", strlen ("sftp")) == 0 ||
- strncmp (uri, "ssh", strlen ("ssh")) == 0);
-
- vfs_uri = gnome_vfs_uri_new (uri);
+
+ vfs_uri = g_file_new_for_uri (nautilus_file_info_get_activation_uri (file_info));
g_assert (vfs_uri != NULL);
- host_name = gnome_vfs_uri_get_host_name (vfs_uri);
- host_port = gnome_vfs_uri_get_host_port (vfs_uri);
- user_name = gnome_vfs_uri_get_user_name (vfs_uri);
- path = gnome_vfs_uri_get_path (vfs_uri);
- /* FIXME to we have to consider the remote file encoding? */
- unescaped_path = gnome_vfs_unescape_string (path, NULL);
+ g_assert (g_file_has_uri_scheme(vfs_uri, "sftp")==TRUE ||
+ g_file_has_uri_scheme(vfs_uri, "ssh")==TRUE);
+
+ parse_sftp_uri (vfs_uri, &host_name, &host_port, &user_name, &path);
if (host_port == 0) {
host_port = SSH_DEFAULT_PORT;
@@ -179,7 +225,7 @@
user_host = g_strdup (host_name);
}
- cmd = g_strdup_printf ("ssh %s -p %d -t \"cd \'%s\' && $SHELL -l\"", user_host, host_port, unescaped_path);
+ cmd = g_strdup_printf ("ssh %s -p %d -t \"cd \'%s\' && $SHELL -l\"", user_host, host_port, path);
quoted_cmd = g_shell_quote (cmd);
g_free (cmd);
@@ -187,11 +233,13 @@
strcpy (*terminal_exec + strlen (*terminal_exec), " -e ");
strcpy (*terminal_exec + strlen (*terminal_exec), quoted_cmd);
+ g_free (host_name);
+ g_free (user_name);
+ g_free (path);
+
g_free (quoted_cmd);
g_free (user_host);
- g_free (unescaped_path);
- g_free (uri);
- gnome_vfs_uri_unref (vfs_uri);
+ g_object_unref (vfs_uri);
}
static void