diff lib/rfc959.c @ 541:e46278e7ef1d

2004-8-21 Brian Masney <masneyb@gftp.org> * lib/rfc959.c lib/ftpcommon.h - added internal option to quote the filename in the SITE command. This is only enabled for servers that return UNIX in the SYST output. It is disabled if it is a BSD based FTP server * lib/sshv2.c (sshv2_start_login_sequence) - pass the search strings through gettext so that logins will work properly for non-english users * lib/pty.c (gftp_exec) - redirect STDERR of the child process to the opened pty so that stderr is shown properly in the log window
author masneyb
date Sat, 21 Aug 2004 14:40:41 +0000
parents 0f43d84c7f7c
children 34a3f10d8bae
line wrap: on
line diff
--- a/lib/rfc959.c	Fri Aug 20 16:46:22 2004 +0000
+++ b/lib/rfc959.c	Sat Aug 21 14:40:41 2004 +0000
@@ -386,12 +386,14 @@
 static int
 rfc959_syst (gftp_request * request)
 {
+  rfc959_parms * parms;
   char *stpos, *endpos;
   int ret;
 
   g_return_val_if_fail (request != NULL, GFTP_EFATAL);
   g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL);
 
+  parms = request->protocol_data;
   ret = rfc959_send_command (request, "SYST\r\n", 1);
 
   if (ret < 0)
@@ -408,8 +410,14 @@
     return (GFTP_ERETRYABLE);
 
   *endpos = '\0';
+  parms->quote_filename = 0;
+
   if (strcmp (stpos, "UNIX") == 0)
-    request->server_type = GFTP_DIRTYPE_UNIX;
+    {
+      request->server_type = GFTP_DIRTYPE_UNIX;
+      if (strstr (endpos + 1, "BSD") == NULL)
+        parms->quote_filename = 1;
+    }
   else if (strcmp (stpos, "VMS") == 0)
     request->server_type = GFTP_DIRTYPE_VMS;
   else if (strcmp (stpos, "MVS") == 0 ||
@@ -1656,6 +1664,7 @@
 static int
 rfc959_chmod (gftp_request * request, const char *file, mode_t mode)
 {
+  rfc959_parms * parms;
   char *tempstr;
   int ret;
 
@@ -1663,7 +1672,12 @@
   g_return_val_if_fail (file != NULL, GFTP_EFATAL);
   g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL);
 
-  tempstr = g_strdup_printf ("SITE CHMOD %o \"%s\"\r\n", mode, file);
+  parms = request->protocol_data;
+  if (parms->quote_filename)
+    tempstr = g_strdup_printf ("SITE CHMOD %o \"%s\"\r\n", mode, file);
+  else
+    tempstr = g_strdup_printf ("SITE CHMOD %o %s\r\n", mode, file);
+
   ret = rfc959_send_command (request, tempstr, 1);
   g_free (tempstr);
 
@@ -1730,17 +1744,24 @@
 rfc959_set_file_time (gftp_request * request, const char *file, time_t datetime)
 {
   char *tempstr, *datestr;
+  rfc959_parms * parms;
   int ret;
 
   g_return_val_if_fail (request != NULL, GFTP_EFATAL);
   g_return_val_if_fail (file != NULL, GFTP_EFATAL);
   g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL);
 
+  parms = request->protocol_data;
+
   datestr = rfc959_time_t_to_mdtm (request, datetime);
   if (datestr == NULL)
     return (GFTP_EFATAL);
 
-  tempstr = g_strconcat ("SITE UTIME ", datestr, " \"", file, "\"\r\n", NULL);
+  if (parms->quote_filename)
+    tempstr = g_strconcat ("SITE UTIME ", datestr, " \"", file, "\"\r\n", NULL);
+  else
+    tempstr = g_strconcat ("SITE UTIME ", datestr, " ", file, "\r\n", NULL);
+
   g_free (datestr);
 
   ret = rfc959_send_command (request, tempstr, 1);
@@ -1806,6 +1827,7 @@
   sparms = src_request->protocol_data;
 
   dparms->data_connection = -1;
+  dparms->quote_filename = sparms->quote_filename;
   dparms->is_ascii_transfer = sparms->is_ascii_transfer;
   dparms->is_fxp_transfer = sparms->is_fxp_transfer;
   dparms->auth_tls_start = sparms->auth_tls_start;