diff lib/protocols.c @ 84:7ef60ce2bdb2

2002-12-29 Brian Masney <masneyb@gftp.org> * lib/ssh.c lib/config_file.c lib/Makefile.am lib/gftp.h lib/options.h - removed old legacy SSH protocol and option to enable this protocol * lib/gftp.h - added GFTP_ERETRYABLE and GFTP_EFATAL error codes * lib/bookmark.c lib/local.c lib/protocols.c lib/rfc959.c lib/rfc2068.c lib/sshv2.c - return new error codes instead of -1 or -2 * lib/misc.c (gftp_*_sort_function_ds) - changed return values * src/gtk/transfer.c (connect_thread) - if return value of gftp_connect() is GFTP_EFATAL, don't attempt to retry the connection
author masneyb
date Sun, 29 Dec 2002 15:16:27 +0000
parents fe308e435ed5
children 6df043359b41
line wrap: on
line diff
--- a/lib/protocols.c	Fri Dec 27 14:59:50 2002 +0000
+++ b/lib/protocols.c	Sun Dec 29 15:16:27 2002 +0000
@@ -113,10 +113,10 @@
 int
 gftp_connect (gftp_request * request)
 {
-  g_return_val_if_fail (request != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
 
   if (request->connect == NULL)
-    return (-2);
+    return (GFTP_EFATAL);
 
   gftp_set_config_options (request);
 
@@ -152,11 +152,11 @@
 gftp_get_file (gftp_request * request, const char *filename, int fd,
                size_t startsize)
 {
-  g_return_val_if_fail (request != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
 
   request->cached = 0;
   if (request->get_file == NULL)
-    return (-2);
+    return (GFTP_EFATAL);
   return (request->get_file (request, filename, fd, startsize));
 }
 
@@ -165,11 +165,11 @@
 gftp_put_file (gftp_request * request, const char *filename, int fd,
                size_t startsize, size_t totalsize)
 {
-  g_return_val_if_fail (request != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
 
   request->cached = 0;
   if (request->put_file == NULL)
-    return (-2);
+    return (GFTP_EFATAL);
   return (request->put_file (request, filename, fd, startsize, totalsize));
 }
 
@@ -181,31 +181,29 @@
                     int tofd, size_t tosize)
 {
   long size;
-
-  g_return_val_if_fail (fromreq != NULL, -2);
-  g_return_val_if_fail (fromfile != NULL, -2);
-  g_return_val_if_fail (toreq != NULL, -2);
-  g_return_val_if_fail (tofile != NULL, -2);
+  int ret;
 
-  if (strcmp (fromreq->protocol_name, toreq->protocol_name) == 0)
-    {
-      if (fromreq->transfer_file == NULL)
-	return (-2);
-      return (fromreq->transfer_file (fromreq, fromfile, fromsize, toreq, 
-                                      tofile, tosize));
-    }
+  g_return_val_if_fail (fromreq != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (fromfile != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (toreq != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (tofile != NULL, GFTP_EFATAL);
+
+  if (strcmp (fromreq->protocol_name, toreq->protocol_name) == 0 &&
+      fromreq->transfer_file != NULL)
+    return (fromreq->transfer_file (fromreq, fromfile, fromsize, toreq, 
+                                    tofile, tosize));
 
   fromreq->cached = 0;
   toreq->cached = 0;
   if ((size = gftp_get_file (fromreq, fromfile, fromfd, tosize)) < 0)
-    return (-2);
+    return (size);
 
-  if (gftp_put_file (toreq, tofile, tofd, tosize, size) != 0)
+  if ((ret = gftp_put_file (toreq, tofile, tofd, tosize, size)) != 0)
     {
       if (gftp_abort_transfer (fromreq) != 0)
         gftp_end_transfer (fromreq);
 
-      return (-2);
+      return (ret);
     }
 
   return (size);
@@ -215,8 +213,8 @@
 ssize_t 
 gftp_get_next_file_chunk (gftp_request * request, char *buf, size_t size)
 {
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (buf != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (buf != NULL, GFTP_EFATAL);
 
   if (request->get_next_file_chunk != NULL)
     return (request->get_next_file_chunk (request, buf, size));
@@ -228,8 +226,8 @@
 ssize_t 
 gftp_put_next_file_chunk (gftp_request * request, char *buf, size_t size)
 {
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (buf != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (buf != NULL, GFTP_EFATAL);
 
   if (request->put_next_file_chunk != NULL)
     return (request->put_next_file_chunk (request, buf, size));
@@ -246,7 +244,7 @@
 {
   int ret;
 
-  g_return_val_if_fail (request != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
 
   if (!request->cached && 
       request->end_transfer != NULL)
@@ -274,10 +272,10 @@
 int
 gftp_abort_transfer (gftp_request * request)
 {
-  g_return_val_if_fail (request != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
 
   if (request->abort_transfer == NULL)
-    return (-2);
+    return (GFTP_EFATAL);
 
   return (request->abort_transfer (request));
 }
@@ -288,7 +286,7 @@
 {
   int fd;
 
-  g_return_val_if_fail (request != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
 
   request->cached = 0;
   if (request->use_cache && (fd = gftp_find_cache_entry (request)) > 0)
@@ -308,7 +306,7 @@
     }
 
   if (request->list_files == NULL)
-    return (-2);
+    return (GFTP_EFATAL);
   return (request->list_files (request));
 }
 
@@ -323,10 +321,10 @@
   GError * error;
 #endif
 
-  g_return_val_if_fail (request != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
 
   if (request->get_next_file == NULL)
-    return (-2);
+    return (GFTP_EFATAL);
 
   if (request->cached && request->cachefd > 0)
     fd = request->cachefd;
@@ -382,8 +380,8 @@
   const char *stpos;
   int len, i;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (url != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (url != NULL, GFTP_EFATAL);
 
   logging_function = request->logging_function;
   gftp_request_destroy (request, 0);
@@ -402,7 +400,7 @@
         }
 
       if (gftp_protocols[i].url_prefix == NULL)
-        return (-2);
+        return (GFTP_EFATAL);
       *pos = ':';
     }
   else
@@ -493,7 +491,7 @@
 int
 gftp_set_data_type (gftp_request * request, int data_type)
 {
-  g_return_val_if_fail (request != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
 
   if (request->set_data_type == NULL)
     return (0);
@@ -556,8 +554,8 @@
 int
 gftp_set_directory (gftp_request * request, const char *directory)
 {
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (directory != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (directory != NULL, GFTP_EFATAL);
 
 
   if (request->sockfd <= 0 && !request->always_connected)
@@ -572,7 +570,7 @@
       return (0);
     }
   else if (request->chdir == NULL)
-    return (-2);
+    return (GFTP_EFATAL);
   return (request->chdir (request, directory));
 }
 
@@ -650,10 +648,10 @@
 int
 gftp_remove_directory (gftp_request * request, const char *directory)
 {
-  g_return_val_if_fail (request != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
 
   if (request->rmdir == NULL)
-    return (-2);
+    return (GFTP_EFATAL);
   return (request->rmdir (request, directory));
 }
 
@@ -661,10 +659,10 @@
 int
 gftp_remove_file (gftp_request * request, const char *file)
 {
-  g_return_val_if_fail (request != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
 
   if (request->rmfile == NULL)
-    return (-2);
+    return (GFTP_EFATAL);
   return (request->rmfile (request, file));
 }
 
@@ -672,10 +670,10 @@
 int
 gftp_make_directory (gftp_request * request, const char *directory)
 {
-  g_return_val_if_fail (request != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
 
   if (request->mkdir == NULL)
-    return (-2);
+    return (GFTP_EFATAL);
   return (request->mkdir (request, directory));
 }
 
@@ -684,10 +682,10 @@
 gftp_rename_file (gftp_request * request, const char *oldname,
 		  const char *newname)
 {
-  g_return_val_if_fail (request != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
 
   if (request->rename == NULL)
-    return (-2);
+    return (GFTP_EFATAL);
   return (request->rename (request, oldname, newname));
 }
 
@@ -695,10 +693,10 @@
 int
 gftp_chmod (gftp_request * request, const char *file, int mode)
 {
-  g_return_val_if_fail (request != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
 
   if (request->chmod == NULL)
-    return (-2);
+    return (GFTP_EFATAL);
   return (request->chmod (request, file, mode));
 }
 
@@ -706,10 +704,10 @@
 int
 gftp_set_file_time (gftp_request * request, const char *file, time_t datetime)
 {
-  g_return_val_if_fail (request != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
 
   if (request->set_file_time == NULL)
-    return (-2);
+    return (GFTP_EFATAL);
   return (request->set_file_time (request, file, datetime));
 }
 
@@ -717,10 +715,10 @@
 char
 gftp_site_cmd (gftp_request * request, const char *command)
 {
-  g_return_val_if_fail (request != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
 
   if (request->site == NULL)
-    return (-2);
+    return (GFTP_EFATAL);
   return (request->site (request, command));
 }
 
@@ -810,7 +808,7 @@
       request->logging_function (gftp_logging_error, request->user_data,
                                  _("Cannot look up hostname %s: %s\n"),
                                  request->hostname, gai_strerror (errnum));
-      return (-1);
+      return (GFTP_ERETRYABLE);
     }
 
   addr = request->hostp->ai_addr;
@@ -833,7 +831,7 @@
       request->logging_function (gftp_logging_error, request->user_data,
                                  _("Cannot look up hostname %s: %s\n"),
                                  request->hostname, g_strerror (errno));
-      return (-1);
+      return (GFTP_ERETRYABLE);
     }
 
   addr = (struct sockaddr *) request->host.h_addr_list[0];
@@ -1100,7 +1098,7 @@
       startpos = strchr (startpos, ',');
     }
   if ((startpos = strchr (str, 9)) == NULL)
-    return (-2);
+    return (GFTP_EFATAL);
   fle->file = g_malloc (strlen (startpos));
   strcpy (fle->file, startpos + 1);
   fle->user = g_malloc (8);
@@ -1119,7 +1117,7 @@
   startpos = str;
   /* Copy file attributes */
   if ((startpos = copy_token (&fle->attribs, startpos)) == NULL)
-    return (-2);
+    return (GFTP_EFATAL);
 
   if (cols >= 9)
     {
@@ -1128,11 +1126,11 @@
 
       /* Copy the user that owns this file */
       if ((startpos = copy_token (&fle->user, startpos)) == NULL)
-	return (-2);
+	return (GFTP_EFATAL);
 
       /* Copy the group that owns this file */
       if ((startpos = copy_token (&fle->group, startpos)) == NULL)
-	return (-2);
+	return (GFTP_EFATAL);
     }
   else
     {
@@ -1141,7 +1139,7 @@
       if (cols == 8)
 	{
 	  if ((startpos = copy_token (&fle->user, startpos)) == NULL)
-	    return (-2);
+	    return (GFTP_EFATAL);
 	}
       else
 	{
@@ -1174,14 +1172,14 @@
 
       /* Get the minor number */
       if ((endpos = strchr (startpos, ' ')) == NULL)
-	return (-2);
+	return (GFTP_EFATAL);
       fle->size |= strtol (startpos, NULL, 10) & 0xFF;
     }
   else
     {
       /* This is a regular file  */
       if ((endpos = strchr (startpos, ' ')) == NULL)
-	return (-2);
+	return (GFTP_EFATAL);
       fle->size = strtol (startpos, NULL, 10);
     }
 
@@ -1191,7 +1189,7 @@
     startpos++;
 
   if ((fle->datetime = parse_time (&startpos)) == 0)
-    return (-2);
+    return (GFTP_EFATAL);
 
   /* Skip the blanks till we get to the next entry */
   startpos = goto_next_token (startpos);
@@ -1223,7 +1221,7 @@
 
   startpos = str;
   if ((fle->datetime = parse_time (&startpos)) == 0)
-    return (-2);
+    return (GFTP_EFATAL);
 
   /* No such thing on Windoze.. */
   fle->user = g_malloc (8);
@@ -1253,7 +1251,7 @@
   char *startpos;
 
   if (str[12] != ' ')
-    return (-2);
+    return (GFTP_EFATAL);
   str[12] = '\0';
   fle->attribs = g_malloc (13);
   strcpy (fle->attribs, str);
@@ -1263,7 +1261,7 @@
     startpos++;
 
   if ((startpos = copy_token (&fle->user, startpos)) == NULL)
-    return (-2);
+    return (GFTP_EFATAL);
 
   fle->group = g_malloc (8);
   strcpy (fle->group, _("unknown"));
@@ -1272,7 +1270,7 @@
 
   startpos = goto_next_token (startpos);
   if ((fle->datetime = parse_time (&startpos)) == 0)
-    return (-2);
+    return (GFTP_EFATAL);
 
   startpos = goto_next_token (startpos);
   fle->file = g_malloc (strlen (startpos) + 1);
@@ -1287,8 +1285,8 @@
   int result, cols;
   char *str, *pos;
 
-  g_return_val_if_fail (lsoutput != NULL, -2);
-  g_return_val_if_fail (fle != NULL, -2);
+  g_return_val_if_fail (lsoutput != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (fle != NULL, GFTP_EFATAL);
 
   str = g_malloc (strlen (lsoutput) + 1);
   strcpy (str, lsoutput);
@@ -1339,7 +1337,7 @@
       if (cols > 6)
 	result = gftp_parse_ls_unix (str, cols, fle);
       else
-	result = -2;
+	result = GFTP_EFATAL;
     }
   g_free (str);
 
@@ -1482,9 +1480,9 @@
   GHashTable * dirhash;
   gftp_file * curfle;
 
-  g_return_val_if_fail (transfer != NULL, -1);
-  g_return_val_if_fail (transfer->fromreq != NULL, -1);
-  g_return_val_if_fail (transfer->files != NULL, -1);
+  g_return_val_if_fail (transfer != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (transfer->fromreq != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (transfer->files != NULL, GFTP_EFATAL);
 
   if (transfer->toreq != NULL)
     dirhash = gftp_gen_dir_hash (transfer->toreq);
@@ -1640,7 +1638,7 @@
   int errnum;
 
   if ((request->use_proxy = gftp_need_proxy (request, service)) < 0)
-    return (-1);
+    return (request->use_proxy);
   else if (request->use_proxy == 1)
     request->hostp = NULL;
 
@@ -1668,7 +1666,7 @@
 	  request->logging_function (gftp_logging_error, request->user_data,
 				     _("Cannot look up hostname %s: %s\n"),
 				     connect_host, gai_strerror (errnum));
-	  return (-1);
+	  return (GFTP_ERETRYABLE);
 	}
     }
 
@@ -1710,7 +1708,7 @@
           freeaddrinfo (request->hostp);
           request->hostp = NULL;
         }
-      return (-1);
+      return (GFTP_ERETRYABLE);
     }
 
 #else /* !HAVE_GETADDRINFO */
@@ -1719,7 +1717,7 @@
   int curhost;
 
   if ((request->use_proxy = gftp_need_proxy (request, service)) < 0)
-    return (-1);
+    return (request->use_proxy);
   else if (request->use_proxy == 1)
     request->hostp = NULL;
 
@@ -1728,7 +1726,7 @@
       request->logging_function (gftp_logging_error, request->user_data,
                                  _("Failed to create a socket: %s\n"),
                                  g_strerror (errno));
-      return (-1);
+      return (GFTP_ERETRYABLE);
     }
 
   memset (&remote_address, 0, sizeof (remote_address));
@@ -1767,7 +1765,7 @@
                                      _("Cannot look up hostname %s: %s\n"),
                                      connect_host, g_strerror (errno));
           close (sock);
-          return (-1);
+          return (GFTP_ERETRYABLE);
         }
     }
 
@@ -1794,7 +1792,7 @@
   if (request->host.h_addr_list[curhost] == NULL)
     {
       close (sock);
-      return (-1);
+      return (GFTP_ERETRYABLE);
     }
   port = ntohs (port);
 #endif /* HAVE_GETADDRINFO */
@@ -1802,10 +1800,10 @@
   request->logging_function (gftp_logging_misc, request->user_data,
 			     _("Connected to %s:%d\n"), connect_host, port);
 
-  if (gftp_set_sockblocking (request, sock, 1) == -1)
+  if (gftp_set_sockblocking (request, sock, 1) < 0)
     {
       close (sock);
-      return (-1);
+      return (GFTP_ERETRYABLE);
     }
 
   return (sock);
@@ -1916,7 +1914,7 @@
       (*rbuf)->curpos = (*rbuf)->buffer;
     }
 
-  retval = -2;
+  retval = GFTP_ERETRYABLE;
 
   do
     {
@@ -1974,7 +1972,7 @@
           (*rbuf)->cur_bufsize = ret + copysize;
         }
     }
-  while (retval == -2);
+  while (retval == GFTP_ERETRYABLE);
 
   return (retval);
 }
@@ -2015,7 +2013,7 @@
                                          request->hostname);
               gftp_disconnect (request);
             }
-          return (-1);
+          return (GFTP_ERETRYABLE);
         }
 
       if ((ret = read (fd, ptr, size)) < 0)
@@ -2035,7 +2033,7 @@
                                     g_strerror (errno));
               gftp_disconnect (request);
             }
-          return (-1);
+          return (GFTP_ERETRYABLE);
         }
     }
   while (errno == EINTR && !(request != NULL && request->cancel));
@@ -2043,7 +2041,7 @@
   if (errno == EINTR && request != NULL && request->cancel)
     {
       gftp_disconnect (request);
-      return (-1);
+      return (GFTP_ERETRYABLE);
     }
 
   return (ret);
@@ -2085,7 +2083,7 @@
                                          request->hostname);
               gftp_disconnect (request);
             }
-          return (-1);
+          return (GFTP_ERETRYABLE);
         }
 
       if ((w_ret = write (fd, ptr, size)) < 0)
@@ -2105,7 +2103,7 @@
                                     g_strerror (errno));
               gftp_disconnect (request);
             }
-          return (-1);
+          return (GFTP_ERETRYABLE);
         }
 
       ptr += w_ret;
@@ -2117,7 +2115,7 @@
   if (errno == EINTR && request != NULL && request->cancel)
     {
       gftp_disconnect (request);
-      return (-1);
+      return (GFTP_ERETRYABLE);
     }
 
   return (ret);
@@ -2146,13 +2144,13 @@
 {
   int flags;
 
-  if ((flags = fcntl (fd, F_GETFL, 0)) == -1)
+  if ((flags = fcntl (fd, F_GETFL, 0)) < 0)
     {
       request->logging_function (gftp_logging_error, request->user_data,
                                  _("Cannot get socket flags: %s\n"),
                                  g_strerror (errno));
       gftp_disconnect (request);
-      return (-1);
+      return (GFTP_ERETRYABLE);
     }
 
   if (non_blocking)
@@ -2160,13 +2158,13 @@
   else
     flags &= ~O_NONBLOCK;
 
-  if (fcntl (fd, F_SETFL, flags) == -1)
+  if (fcntl (fd, F_SETFL, flags) < 0)
     {
       request->logging_function (gftp_logging_error, request->user_data,
                                  _("Cannot set socket to non-blocking: %s\n"),
                                  g_strerror (errno));
       gftp_disconnect (request);
-      return (-1);
+      return (GFTP_ERETRYABLE);
     }
 
   return (0);