changeset 513:cb882efd4d6d

2004-7-25 Brian Masney <masneyb@gftp.org> * lib/rfc959.c - added rfc959_set_file_time(). This uses the SITE UTIME command. Not many FTP servers appear to support this extension
author masneyb
date Sun, 25 Jul 2004 15:24:37 +0000
parents 2c8a42a63a31
children e55d8b35d809
files ChangeLog lib/rfc959.c
diffstat 2 files changed, 56 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Sun Jul 25 14:25:27 2004 +0000
+++ b/ChangeLog	Sun Jul 25 15:24:37 2004 +0000
@@ -1,4 +1,7 @@
 2004-7-25 Brian Masney <masneyb@gftp.org>
+	* lib/rfc959.c - added rfc959_set_file_time(). This uses the SITE UTIME
+	command. Not many FTP servers appear to support this extension
+
 	* lib/protocols.c (gftp_get_transfer_status) - don't force the user to
 	wait to reconnect if the connection to the server timed out
 
@@ -2621,7 +2624,7 @@
 
 	* cvsclean - added this script
 
-	* *.[ch] - added $Id: ChangeLog,v 1.290 2004/07/25 14:25:27 masneyb Exp $ tags
+	* *.[ch] - added $Id: ChangeLog,v 1.291 2004/07/25 15:24:37 masneyb Exp $ tags
 
 	* debian/* - updated files from Debian maintainer
 
--- a/lib/rfc959.c	Sun Jul 25 14:25:27 2004 +0000
+++ b/lib/rfc959.c	Sun Jul 25 15:24:37 2004 +0000
@@ -1706,6 +1706,57 @@
 }
 
 
+static char *
+rfc959_time_t_to_mdtm (gftp_request * request, time_t datetime)
+{
+  struct tm gt;
+  char *ret;
+
+  if (localtime_r (&datetime, &gt) != NULL)
+    {
+      ret = g_strdup_printf ("%04d%02d%02d%02d%02d%02d", gt.tm_year + 1900,
+                             gt.tm_mon + 1, gt.tm_mday, gt.tm_hour, gt.tm_min,
+                             gt.tm_sec);
+      return (ret);
+    }
+  else
+    {
+      request->logging_function (gftp_logging_error, request,
+                                 "Cannot parse UNIX timestamp %d: %s\n",
+                                 datetime, g_strerror (errno));
+      return (NULL);
+    }
+}
+
+
+static int
+rfc959_set_file_time (gftp_request * request, const char *file, time_t datetime)
+{
+  char *tempstr, *datestr, 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);
+
+  datestr = rfc959_time_t_to_mdtm (request, datetime);
+  if (datestr == NULL)
+    return (GFTP_EFATAL);
+
+  tempstr = g_strconcat ("SITE UTIME ", datestr, " ", file, "\r\n", NULL);
+  g_free (datestr);
+
+  ret = rfc959_send_command (request, tempstr, 1);
+  g_free (tempstr);
+
+  if (ret < 0)
+    return (ret);
+  else if (ret == '2')
+    return (0);
+  else
+    return (GFTP_ERETRYABLE);
+}
+
+
 static int
 rfc959_set_config_options (gftp_request * request)
 {
@@ -1822,7 +1873,7 @@
   request->mkdir = rfc959_mkdir;
   request->rename = rfc959_rename;
   request->chmod = rfc959_chmod;
-  request->set_file_time = NULL;
+  request->set_file_time = rfc959_set_file_time;
   request->site = rfc959_site;
   request->parse_url = NULL;
   request->swap_socks = NULL;