diff options
author | Benjamin Otte <otte@redhat.com> | 2011-01-23 23:55:01 +0100 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2011-01-23 23:55:01 +0100 |
commit | 9a4f327cdc9dde66e7417c2c4b426d936b407f02 (patch) | |
tree | 1de8c298039f886305cf3051cd3e91f748f622a5 /daemon/gvfsbackendftp.c | |
parent | 25bbcd4864da0b939144c640c66dbf8179f6b3e1 (diff) | |
download | gvfs-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.c | 56 |
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); |