summaryrefslogtreecommitdiff
path: root/daemon/gvfsbackendftp.c
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2011-01-23 23:55:01 +0100
committerBenjamin Otte <otte@redhat.com>2011-01-23 23:55:01 +0100
commit9a4f327cdc9dde66e7417c2c4b426d936b407f02 (patch)
tree1de8c298039f886305cf3051cd3e91f748f622a5 /daemon/gvfsbackendftp.c
parent25bbcd4864da0b939144c640c66dbf8179f6b3e1 (diff)
downloadgvfs-9a4f327cdc9dde66e7417c2c4b426d936b407f02.tar.gz
ftp: Parse SITE HELP output to detect chmod support
Support for it will come in later patches. The patch also detects chgrp support, but we're not intending to use it yet.
Diffstat (limited to 'daemon/gvfsbackendftp.c')
-rw-r--r--daemon/gvfsbackendftp.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/daemon/gvfsbackendftp.c b/daemon/gvfsbackendftp.c
index a257d75f..4f0a44bc 100644
--- a/daemon/gvfsbackendftp.c
+++ b/daemon/gvfsbackendftp.c
@@ -142,6 +142,61 @@ gvfs_backend_ftp_determine_features (GVfsFtpTask *task)
}
static void
+gvfs_backend_ftp_determine_site_features (GVfsFtpTask *task)
+{
+ const struct {
+ const char * name; /* name of feature */
+ GVfsFtpFeature enable; /* flags to enable with this feature */
+ } features[] = {
+ { "CHMOD", G_VFS_FTP_FEATURE_CHMOD },
+ { "CHGRP", G_VFS_FTP_FEATURE_CHGRP },
+ };
+ guint i, j;
+ char **reply;
+
+ if (g_vfs_ftp_task_is_in_error (task))
+ return;
+
+ if (!g_vfs_ftp_task_send_and_check (task, 0, NULL, NULL, &reply, "SITE HELP"))
+ {
+ g_vfs_ftp_task_clear_error (task);
+ return;
+ }
+
+ if (g_strv_length (reply) == 1)
+ {
+ /* vsftpd returns just a single string, so we split it into multiple
+ * and then treat it like a regular reply */
+ char **split;
+
+ split = g_strsplit (reply[0], " ", -1);
+ g_strfreev (reply);
+ reply = split;
+ }
+
+ for (i = 1; reply[i]; i++)
+ {
+ char *feature = reply[i];
+
+ while (g_ascii_isspace (feature[0]))
+ feature++;
+
+ for (j = 0; j < G_N_ELEMENTS (features); j++)
+ {
+ if (g_ascii_strcasecmp (feature, features[j].name) == 0)
+ {
+ g_debug ("# site feature %s supported\n", features[j].name);
+ task->backend->features |= 1 << features[j].enable;
+ }
+ }
+ }
+
+ g_strfreev (reply);
+
+ return;
+}
+
+static void
gvfs_backend_ftp_determine_system (GVfsFtpTask *task)
{
static const struct {
@@ -507,6 +562,7 @@ try_login:
}
g_vfs_ftp_task_setup_connection (&task);
gvfs_backend_ftp_determine_system (&task);
+ gvfs_backend_ftp_determine_site_features (&task);
gvfs_backend_ftp_setup_directory_cache (ftp);
gvfs_backend_ftp_determine_default_location (&task);