changeset 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 462de7034797
children 1ee3c21c1291
files ChangeLog lib/Makefile.am lib/bookmark.c lib/config_file.c lib/gftp.h lib/local.c lib/misc.c lib/options.h lib/protocols.c lib/rfc2068.c lib/rfc959.c lib/sshv2.c src/gtk/transfer.c
diffstat 13 files changed, 673 insertions(+), 585 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Fri Dec 27 14:59:50 2002 +0000
+++ b/ChangeLog	Sun Dec 29 15:16:27 2002 +0000
@@ -1,3 +1,17 @@
+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
+
 2002-12-11 Brian Masney <masneyb@gftp.org>
 	* configure.in - fix for enable/disable gtkport, textport and gtk20
 
@@ -395,7 +409,7 @@
 
 	* cvsclean - added this script
 
-	* *.[ch] - added $Id: ChangeLog,v 1.49 2002/12/12 01:48:44 masneyb Exp $ tags
+	* *.[ch] - added $Id: ChangeLog,v 1.50 2002/12/29 15:16:26 masneyb Exp $ tags
 
 	* debian/* - updated files from Debian maintainer
 
--- a/lib/Makefile.am	Fri Dec 27 14:59:50 2002 +0000
+++ b/lib/Makefile.am	Sun Dec 29 15:16:27 2002 +0000
@@ -2,6 +2,6 @@
 
 noinst_LIBRARIES = libgftp.a
 libgftp_a_SOURCES=bookmark.c cache.c config_file.c local.c misc.c protocols.c \
-                  rfc959.c rfc2068.c ssh.c sshv2.c
+                  rfc959.c rfc2068.c sshv2.c
 INCLUDES=@GLIB_CFLAGS@ @PTHREAD_CFLAGS@ -I../intl -DSHARE_DIR=\"$(datadir)/gftp\" 
 noinst_HEADERS=gftp.h options.h
--- a/lib/bookmark.c	Fri Dec 27 14:59:50 2002 +0000
+++ b/lib/bookmark.c	Sun Dec 29 15:16:27 2002 +0000
@@ -28,8 +28,8 @@
   const char * pos;
   int 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);
   
   if ((pos = strstr (url, "://")) != NULL)
     pos += 3;
@@ -40,14 +40,14 @@
     {
       request->logging_function (gftp_logging_error, request->user_data,
                                  _("Error: Could not find bookmark %s\n"), pos);
-      return (-2);
+      return (GFTP_EFATAL);
     }
   else if (tempentry->hostname == NULL || *tempentry->hostname == '\0' ||
            tempentry->user == NULL || *tempentry->user == '\0')
     {
       request->logging_function (gftp_logging_error, request->user_data,
                                  _("Bookmarks Error: There are some missing entries in this bookmark. Make sure you have a hostname and username\n"));
-      return (-2);
+      return (GFTP_EFATAL);
     }
 
   gftp_set_username (request, tempentry->user);
--- a/lib/config_file.c	Fri Dec 27 14:59:50 2002 +0000
+++ b/lib/config_file.c	Sun Dec 29 15:16:27 2002 +0000
@@ -138,8 +138,6 @@
         N_("Use the ssh-askpass utility to grab the users password"), NULL, GFTP_PORT_GTK},
   {"sshv2_use_sftp_subsys", N_("Use SSH2 SFTP subsys"), &sshv2_use_sftp_subsys, CONFIG_CHECKBOX, 
         N_("Call ssh with the -s sftp flag. This is helpful because you won't have to know the remote path to the remote sftp-server"), NULL, GFTP_PORT_GTK},
-  {"enable_old_ssh", N_("Enable old SSH protocol"), &enable_old_ssh, CONFIG_CHECKBOX, 
-        N_("Enable the old SSH protocol. You will need to download the sftp server from http:///www.xbill.org/sftp"), NULL, GFTP_PORT_ALL},
 
   {"list_dblclk_action", "", &listbox_dblclick_action, CONFIG_HIDEINT, 
 	N_("This defines what will happen when you double click a file in the file listboxes. 0=View file 1=Edit file 2=Transfer file"), NULL, 0},
@@ -438,14 +436,6 @@
       strcpy (default_protocol, "FTP");
     }
 
-  if (!enable_old_ssh)
-    {
-      gftp_protocols[GFTP_SSH_NUM].name = NULL;
-      gftp_protocols[GFTP_SSH_NUM].init = NULL;
-      gftp_protocols[GFTP_SSH_NUM].url_prefix = NULL;
-      gftp_protocols[GFTP_SSH_NUM].shown = 0;
-    }
-
   if ((tempstr = expand_path (LOG_FILE)) == NULL)
     {
       printf (_("gFTP Error: Bad log file name %s\n"), LOG_FILE);
--- a/lib/gftp.h	Fri Dec 27 14:59:50 2002 +0000
+++ b/lib/gftp.h	Sun Dec 29 15:16:27 2002 +0000
@@ -97,6 +97,10 @@
 #include <dmalloc.h>
 #endif
 
+/* Error types */
+#define GFTP_ERETRYABLE		-1
+#define GFTP_EFATAL		-2
+
 /* Some general settings */
 #define BASE_CONF_DIR		"~/.gftp"
 #define CONFIG_FILE		BASE_CONF_DIR "/gftprc"
@@ -487,7 +491,7 @@
            log_height, retries, sleep_time, network_timeout, use_http11, 
            listbox_dblclick_action, file_trans_column, local_columns[6], 
            remote_columns[6], resolve_symlinks, firewall_port, http_proxy_port,
-           overwrite_by_default, append_file_transfers, enable_old_ssh, 
+           overwrite_by_default, append_file_transfers, 
            ssh_need_userpass, ssh_use_askpass, sshv2_use_sftp_subsys, 
            local_sortcol, local_sortasds, remote_sortcol, remote_sortasds;
 extern guint max_log_window_size;
@@ -629,7 +633,6 @@
 #define GFTP_LOCAL_NUM				2
 #define GFTP_SSHV2_NUM				3
 #define GFTP_BOOKMARK_NUM			4
-#define GFTP_SSH_NUM				5
 #define GFTP_TYPE_BINARY			1
 #define GFTP_TYPE_ASCII				2   
 #define GFTP_IS_CONNECTED(request)		((request) != NULL && \
@@ -648,8 +651,6 @@
 
 void local_init 			( gftp_request * request );
 
-void ssh_init 				( gftp_request * request );
-
 void sshv2_init 			( gftp_request * request );
 
 void bookmark_init 			( gftp_request * request );
--- a/lib/local.c	Fri Dec 27 14:59:50 2002 +0000
+++ b/lib/local.c	Sun Dec 29 15:16:27 2002 +0000
@@ -56,8 +56,8 @@
 {
   char tempstr[PATH_MAX];
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, GFTP_EFATAL);
 
   if (request->directory)
     {
@@ -110,9 +110,9 @@
   off_t size;
   int flags;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, -2);
-  g_return_val_if_fail (filename != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (filename != NULL, GFTP_EFATAL);
 
   if (fd <= 0)
     {
@@ -126,28 +126,28 @@
           request->logging_function (gftp_logging_error, request->user_data,
                                    _("Error: Cannot open local file %s: %s\n"),
                                    filename, g_strerror (errno));
-          return (-2);
+          return (GFTP_ERETRYABLE); /* should this be fatal? */
         }
     }
   else
     request->datafd = fd;
 
-  if ((size = lseek (request->datafd, 0, SEEK_END)) == -1)
+  if ((size = lseek (request->datafd, 0, SEEK_END)) < 0)
     {
       request->logging_function (gftp_logging_error, request->user_data,
                                  _("Error: Cannot seek on file %s: %s\n"),
                                  filename, g_strerror (errno));
       gftp_disconnect (request);
-      return (-1);
+      return (GFTP_ERETRYABLE);
     }
 
-  if (lseek (request->datafd, startsize, SEEK_SET) == -1)
+  if (lseek (request->datafd, startsize, SEEK_SET) < 0)
     {
       request->logging_function (gftp_logging_error, request->user_data,
                                  _("Error: Cannot seek on file %s: %s\n"),
                                  filename, g_strerror (errno));
       gftp_disconnect (request);
-      return (-1);
+      return (GFTP_ERETRYABLE);
     }
 
   return (size);
@@ -160,9 +160,9 @@
 {
   int flags;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, -2);
-  g_return_val_if_fail (filename != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (filename != NULL, GFTP_EFATAL);
 
   if (fd <= 0)
     {
@@ -178,28 +178,28 @@
           request->logging_function (gftp_logging_error, request->user_data,
                                    _("Error: Cannot open local file %s: %s\n"),
                                    filename, g_strerror (errno));
-          return (-2);
+          return (GFTP_ERETRYABLE);
         }
     }
   else
     request->datafd = fd;
 
-  if (ftruncate (request->datafd, startsize) == -1)
+  if (ftruncate (request->datafd, startsize) < 0)
     {
       request->logging_function (gftp_logging_error, request->user_data,
                                _("Error: Cannot truncate local file %s: %s\n"),
                                filename, g_strerror (errno));
       gftp_disconnect (request);
-      return (-1);
+      return (GFTP_ERETRYABLE);
     }
     
-  if (lseek (request->datafd, startsize, SEEK_SET) == -1)
+  if (lseek (request->datafd, startsize, SEEK_SET) < 0)
     {
       request->logging_function (gftp_logging_error, request->user_data,
                                  _("Error: Cannot seek on file %s: %s\n"),
                                  filename, g_strerror (errno));
       gftp_disconnect (request);
-      return (-2);
+      return (GFTP_ERETRYABLE);
     }
   return (0);
 }
@@ -330,9 +330,9 @@
   /* the struct passwd and struct group are not thread safe. But,
      we're ok here because I have threading turned off for the local
      protocol (see use_threads in local_init above) */
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, -2);
-  g_return_val_if_fail (fle != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (fle != NULL, GFTP_EFATAL);
 
   lpd = request->protocol_data;
   memset (fle, 0, sizeof (*fle));
@@ -341,7 +341,7 @@
     {
       closedir (lpd->dir);
       lpd->dir = NULL;
-      return (-2);
+      return (GFTP_ERETRYABLE);
     }
 
   fle->file = g_malloc (strlen (dirp->d_name) + 1);
@@ -350,7 +350,7 @@
     {
       closedir (lpd->dir);
       lpd->dir = NULL;
-      return (-2);
+      return (GFTP_ERETRYABLE);
     }
 
   if ((user = g_hash_table_lookup (lpd->userhash, 
@@ -428,8 +428,8 @@
   local_protocol_data *lpd;
   char *tempstr;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, GFTP_EFATAL);
   lpd = request->protocol_data;
 
   tempstr = g_strconcat (request->directory, "/", NULL);
@@ -440,7 +440,7 @@
                            _("Could not get local directory listing %s: %s\n"),
                            tempstr, g_strerror (errno));
       g_free (tempstr);
-      return (-1);
+      return (GFTP_ERETRYABLE);
     }
 
   g_free (tempstr);
@@ -453,8 +453,8 @@
 {
   struct stat st;
 
-  if (stat (filename, &st) == -1)
-    return (-1);
+  if (stat (filename, &st) < 0)
+    return (GFTP_ERETRYABLE);
   return (st.st_size);
 }
 
@@ -464,9 +464,9 @@
 {
   char tempstr[255];
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, -2);
-  g_return_val_if_fail (directory != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (directory != NULL, GFTP_EFATAL);
 
   if (chdir (directory) == 0)
     {
@@ -480,7 +480,7 @@
               request->logging_function (gftp_logging_error, request->user_data,
                             _("Could not get current working directory: %s\n"),
                             g_strerror (errno));
-	      return (-1);
+	      return (GFTP_ERETRYABLE);
 	    }
           if (request->directory)
 	    g_free (request->directory);
@@ -492,16 +492,16 @@
   request->logging_function (gftp_logging_error, request->user_data,
                              _("Could not change local directory to %s: %s\n"),
                              directory, g_strerror (errno));
-  return (-1);
+  return (GFTP_ERETRYABLE);
 }
 
 
 static int
 local_rmdir (gftp_request * request, const char *directory)
 {
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, -2);
-  g_return_val_if_fail (directory != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (directory != NULL, GFTP_EFATAL);
 
   if (rmdir (directory) == 0)
     {
@@ -514,7 +514,7 @@
       request->logging_function (gftp_logging_error, request->user_data,
                               _("Error: Could not remove directory %s: %s\n"),
                               directory, g_strerror (errno));
-      return (-1);
+      return (GFTP_ERETRYABLE);
     }
 }
 
@@ -522,9 +522,9 @@
 static int
 local_rmfile (gftp_request * request, const char *file)
 {
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, -2);
-  g_return_val_if_fail (file != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (file != NULL, GFTP_EFATAL);
 
   if (unlink (file) == 0)
     {
@@ -537,7 +537,7 @@
       request->logging_function (gftp_logging_error, request->user_data,
                                  _("Error: Could not remove file %s: %s\n"),
                                  file, g_strerror (errno));
-      return (-1);
+      return (GFTP_ERETRYABLE);
     }
 }
 
@@ -545,9 +545,9 @@
 static int
 local_mkdir (gftp_request * request, const char *directory)
 {
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, -2);
-  g_return_val_if_fail (directory != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (directory != NULL, GFTP_EFATAL);
 
   if (mkdir (directory, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) == 0)
     {
@@ -561,7 +561,7 @@
       request->logging_function (gftp_logging_error, request->user_data,
                                  _("Error: Could not make directory %s: %s\n"),
                                  directory, g_strerror (errno));
-      return (-1);
+      return (GFTP_ERETRYABLE);
     }
 }
 
@@ -570,10 +570,10 @@
 local_rename (gftp_request * request, const char *oldname,
 	      const char *newname)
 {
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, -2);
-  g_return_val_if_fail (oldname != NULL, -2);
-  g_return_val_if_fail (newname != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (oldname != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (newname != NULL, GFTP_EFATAL);
 
   if (rename (oldname, newname) == 0)
     {
@@ -587,7 +587,7 @@
       request->logging_function (gftp_logging_error, request->user_data,
                                  _("Error: Could not rename %s to %s: %s\n"),
                                  oldname, newname, g_strerror (errno));
-      return (-1);
+      return (GFTP_ERETRYABLE);
     }
 }
 
@@ -598,9 +598,9 @@
   char buf[10];
   int newmode;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, -2);
-  g_return_val_if_fail (file != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (file != NULL, GFTP_EFATAL);
 
   g_snprintf (buf, sizeof (buf), "%d", mode);
   newmode = strtol (buf, NULL, 8);
@@ -617,7 +617,7 @@
       request->logging_function (gftp_logging_error, request->user_data, 
                           _("Error: Could not change mode of %s to %d: %s\n"),
                           file, mode, g_strerror (errno));
-      return (-1);
+      return (GFTP_ERETRYABLE);
     }
 }
 
@@ -628,12 +628,12 @@
 {
   struct utimbuf time_buf;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, -2);
-  g_return_val_if_fail (file != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (file != NULL, GFTP_EFATAL);
 
   time_buf.modtime = time_buf.actime = datetime;
-  return (utime (file, &time_buf));
+  return (utime (file, &time_buf) == 0 ? 0 : GFTP_ERETRYABLE);
 }
 
 
--- a/lib/misc.c	Fri Dec 27 14:59:50 2002 +0000
+++ b/lib/misc.c	Sun Dec 29 15:16:27 2002 +0000
@@ -999,11 +999,7 @@
   f1 = a;
   f2 = b;
   ret = strcmp (f1->file, f2->file);
-  if (ret < 0)
-    ret = 1;
-  else if (ret > 0)
-    ret = -1;
-  return (ret);
+  return (ret * -1);
 }
 
 
@@ -1027,11 +1023,7 @@
   f1 = a;
   f2 = b;
   ret = strcmp (f1->user, f2->user);
-  if (ret < 0)
-    ret = 1;
-  else if (ret > 0)
-    ret = -1;
-  return (ret);
+  return (ret * -1);
 }
 
 
@@ -1055,11 +1047,7 @@
   f1 = a;
   f2 = b;
   ret = strcmp (f1->group, f2->group);
-  if (ret < 0)
-    ret = 1;
-  else if (ret > 0)
-    ret = -1;
-  return (ret);
+  return (ret * -1);
 }
 
 
@@ -1083,11 +1071,7 @@
   f1 = a;
   f2 = b;
   ret = strcmp (f1->attribs, f2->attribs);
-  if (ret < 0)
-    ret = 1;
-  else if (ret > 0)
-    ret = -1;
-  return (ret);
+  return (ret * -1);
 }
 
 
--- a/lib/options.h	Fri Dec 27 14:59:50 2002 +0000
+++ b/lib/options.h	Sun Dec 29 15:16:27 2002 +0000
@@ -28,7 +28,6 @@
   {"Local", 	local_init, 	"file",		1},
   {"SSH2",	sshv2_init,	"ssh2", 	1},
   {"Bookmark", 	bookmark_init, 	"bookmark", 	0},
-  {"SSH", 	ssh_init, 	"ssh", 		1},
   {NULL, 	NULL, 		NULL,		0}
 };
 
@@ -121,7 +120,6 @@
     append_file_transfers = 1,		/* Append new file transfers onto 
                                            existing ones for the same 
                                            hostname */
-    enable_old_ssh = 0,			/* Enable older SSH protocol */
     ssh_need_userpass = 0,		/* Require a user/pass for SSH
                                            connections */
     ssh_use_askpass = 0,		/* Use the ssh-askpass tool to
--- 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);
--- a/lib/rfc2068.c	Fri Dec 27 14:59:50 2002 +0000
+++ b/lib/rfc2068.c	Sun Dec 29 15:16:27 2002 +0000
@@ -82,14 +82,15 @@
   gftp_getline_buffer * rbuf;
   rfc2068_params * params;
   char tempstr[255];
+  int ret;
 
   params = request->protocol_data;
   params->max_bytes = 0;
 
   rbuf = NULL;
-  if (gftp_get_line (request, &rbuf, tempstr, sizeof (tempstr), 
-                     request->sockfd) < 0)
-    return (-1);
+  if ((ret = gftp_get_line (request, &rbuf, tempstr, sizeof (tempstr), 
+                            request->sockfd)) < 0)
+    return (ret);
 
   if (request->last_ftp_response)
     g_free (request->last_ftp_response);
@@ -103,9 +104,9 @@
   while (1) 
     {
       /* Read rest of proxy header */
-      if (gftp_get_line (request, &rbuf, tempstr, sizeof (tempstr), 
-                         request->sockfd) < 0)
-	return (-1);
+      if ((ret = gftp_get_line (request, &rbuf, tempstr, sizeof (tempstr), 
+                                request->sockfd)) < 0)
+	return (ret);
 
       if (*tempstr == '\r' || *tempstr == '\n')
         break;
@@ -130,9 +131,9 @@
   char *tempstr, *str;
   ssize_t ret;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_HTTP_NUM, -2);
-  g_return_val_if_fail (command != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_HTTP_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (command != NULL, GFTP_EFATAL);
 
   tempstr = g_strdup_printf ("%sUser-Agent: %s\nHost: %s\n", command,
                              version, request->hostname);
@@ -144,7 +145,7 @@
   g_free (tempstr);
 
   if (ret < 0)
-    return (-1);
+    return (ret);
 
   if (request->use_proxy && request->proxy_username != NULL &&
       *request->proxy_username != '\0')
@@ -160,7 +161,7 @@
                            "Proxy-authorization: Basic %s\n", str);
       g_free (str);
       if (ret < 0)
-	return (-2);
+	return (ret);
     }
 
   if (request->username != NULL && *request->username != '\0')
@@ -175,19 +176,20 @@
                            "Authorization: Basic %s\n", str);
       g_free (str);
       if (ret < 0)
-	return (-2);
+	return (ret);
     }
 
   if (extrahdr)
     {
       request->logging_function (gftp_logging_send, request->user_data, "%s",
                                  extrahdr);
-      if (gftp_write (request, extrahdr, strlen (extrahdr), request->sockfd) < 0)
-        return (-1);
+      if ((ret = gftp_write (request, extrahdr, strlen (extrahdr), 
+                             request->sockfd)) < 0)
+        return (ret);
     }
 
-  if (gftp_write (request, "\n", 1, request->sockfd) < 0)
-    return (-1);
+  if ((ret = gftp_write (request, "\n", 1, request->sockfd)) < 0)
+    return (ret);
 
   return (rfc2068_read_response (request));
 }
@@ -198,9 +200,9 @@
 {
   char *service;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_HTTP_NUM, -2);
-  g_return_val_if_fail (request->hostname != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_HTTP_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (request->hostname != NULL, GFTP_EFATAL);
 
   if (request->sockfd > 0)
     return (0);
@@ -208,7 +210,7 @@
   service = request->use_proxy && request->proxy_config != NULL && 
             *request->proxy_config != '\0' ? request->proxy_config : "http";
   if ((request->sockfd = gftp_connect_server (request, service)) < 0)
-    return (-1);
+    return (GFTP_ERETRYABLE);
 
   if (request->directory && *request->directory == '\0')
     {
@@ -253,18 +255,18 @@
                   off_t startsize)
 {
   char *tempstr, *extrahdr, *pos, *proto;
-  int restarted;
+  int restarted, ret;
   off_t size;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_HTTP_NUM, -2);
-  g_return_val_if_fail (filename != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_HTTP_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (filename != NULL, GFTP_EFATAL);
 
   if (fd > 0)
     request->sockfd = fd;
 
-  if (request->sockfd < 0 && rfc2068_connect (request) != 0)
-    return (-2);
+  if (request->sockfd < 0 && (ret = rfc2068_connect (request)) != 0)
+    return (ret);
 
   if (request->proxy_config != NULL && *request->proxy_config != '\0')
     proto = request->proxy_config;
@@ -307,7 +309,7 @@
   if (extrahdr)
     g_free (extrahdr);
   if (size < 0)
-    return (-1);
+    return (size);
 
   restarted = 0;
   if (strlen (request->last_ftp_response) > 9 
@@ -318,7 +320,7 @@
     {
       request->logging_function (gftp_logging_error, request->user_data,
 			         _("Cannot retrieve file %s\n"), filename);
-      return (-2);
+      return (GFTP_ERETRYABLE);
     }
 
   return (restarted ? size + startsize : size);
@@ -331,8 +333,8 @@
   rfc2068_params * params;
   size_t len;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_HTTP_NUM, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_HTTP_NUM, GFTP_EFATAL);
 
   params = request->protocol_data;
   if (params->max_bytes == params->read_bytes)
@@ -343,7 +345,7 @@
     size = params->max_bytes - params->read_bytes;
 
   if ((len = gftp_read (request, buf, size, request->sockfd)) < 0)
-    return (-2);
+    return ((ssize_t) len);
 
   return (len);
 }
@@ -354,11 +356,11 @@
 {
   rfc2068_params * params;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_HTTP_NUM, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_HTTP_NUM, GFTP_EFATAL);
 
   if (request->sockfd < 0)
-    return (-2);
+    return (GFTP_EFATAL);
 
   if (close (request->sockfd) < 0)
     request->logging_function (gftp_logging_error, request->user_data,
@@ -381,13 +383,14 @@
   char *tempstr, *pos, *proto;
   rfc2068_params *params;
   off_t ret;
+  int r;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_HTTP_NUM, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_HTTP_NUM, GFTP_EFATAL);
 
   params = request->protocol_data;
-  if (request->sockfd < 0 && rfc2068_connect (request) != 0)
-    return (-2);
+  if (request->sockfd < 0 && (r = rfc2068_connect (request)) < 0)
+    return (r);
 
   if (request->proxy_config != NULL && *request->proxy_config != '\0')
     proto = request->proxy_config;
@@ -411,7 +414,7 @@
   ret = rfc2068_send_command (request, tempstr, NULL);
   g_free (tempstr);
   if (ret < 0)
-    return (-1);
+    return ((int) ret);
 
   params->read_bytes = 0;
   if (strlen (request->last_ftp_response) > 9 &&
@@ -422,7 +425,7 @@
       return (0);
     }
   
-  return (-2);
+  return (GFTP_ERETRYABLE);
 }
 
 
@@ -431,13 +434,14 @@
 {
   char *tempstr, *pos, *proto;
   off_t size;
+  int ret;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_HTTP_NUM, -2);
-  g_return_val_if_fail (filename != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_HTTP_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (filename != NULL, GFTP_EFATAL);
 
-  if (request->sockfd < 0 && rfc2068_connect (request) != 0)
-    return (-2);
+  if (request->sockfd < 0 && (ret = rfc2068_connect (request)) != 0)
+    return (ret);
 
   if (request->proxy_config != NULL && *request->proxy_config != '\0')
     proto = request->proxy_config;
@@ -459,9 +463,6 @@
 
   size = rfc2068_send_command (request, tempstr, NULL);
   g_free (tempstr);
-  if (size < 0)
-    return (-2);
-
   return (size);
 }
 
@@ -654,10 +655,11 @@
   rfc2068_params * params;
   char tempstr[255];
   size_t len;
+  int ret;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_HTTP_NUM, -2);
-  g_return_val_if_fail (fle != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_HTTP_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (fle != NULL, GFTP_EFATAL);
 
   params = request->protocol_data;
   if (request->last_dir_entry)
@@ -669,8 +671,9 @@
   rbuf = NULL;
   while (1)
     {
-      if (gftp_get_line (request, &rbuf, tempstr, sizeof (tempstr), fd) < 0)
-        return (-2);
+      if ((ret = gftp_get_line (request, &rbuf, tempstr, sizeof (tempstr), 
+                                fd)) < 0)
+        return (ret);
 
       tempstr[sizeof (tempstr) - 1] = '\0';
       params->read_bytes += strlen (tempstr);
@@ -686,7 +689,7 @@
 	  gftp_file_destroy (fle);
 
           if (len < 0)
-            return (-1);
+            return (len);
 
           return (0);
         }
@@ -703,7 +706,7 @@
   if (fle->file == NULL)
     {
       gftp_file_destroy (fle);
-      return (-2);
+      return (GFTP_ERETRYABLE); /* FIXME is this correct? */
     }
 
   len = strlen (tempstr);
@@ -719,9 +722,9 @@
 static int
 rfc2068_chdir (gftp_request * request, const char *directory)
 {
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_HTTP_NUM, -2);
-  g_return_val_if_fail (directory != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_HTTP_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (directory != NULL, GFTP_EFATAL);
 
   if (request->directory != directory)
     {
--- a/lib/rfc959.c	Fri Dec 27 14:59:50 2002 +0000
+++ b/lib/rfc959.c	Sun Dec 29 15:16:27 2002 +0000
@@ -34,9 +34,9 @@
   rfc959_parms * parms;
   ssize_t num_read;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, -2);
-  g_return_val_if_fail (request->sockfd > 0, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL);
 
   *code = '\0';
   if (request->last_ftp_response)
@@ -65,7 +65,7 @@
   while (strncmp (code, tempstr, 4) != 0);
 
   if (num_read < 0)
-    return (-1);
+    return ((int) num_read);
 
   request->last_ftp_response = g_malloc (strlen (tempstr) + 1);
   strcpy (request->last_ftp_response, tempstr);
@@ -81,10 +81,12 @@
 static int
 rfc959_send_command (gftp_request * request, const char *command)
 {
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, -2);
-  g_return_val_if_fail (command != NULL, -2);
-  g_return_val_if_fail (request->sockfd > 0, -2);
+  int ret;
+
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (command != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL);
 
   if (strncmp (command, "PASS", 4) == 0)
     {
@@ -102,9 +104,9 @@
                                  command);
     }
 
-  if (gftp_write (request, command, strlen (command), 
-                   request->sockfd) < 0)
-    return (-1);
+  if ((ret = gftp_write (request, command, strlen (command), 
+                         request->sockfd)) < 0)
+    return (ret);
 
   return (rfc959_read_response (request));
 }
@@ -217,14 +219,14 @@
 
   ret = rfc959_send_command (request, "PWD\r\n");
   if (ret < 0)
-    return (-1);
+    return (ret);
   else if (ret != '2')
     {
       request->logging_function (gftp_logging_error, request->user_data,
 				 _("Received invalid response to PWD command: '%s'\n"),
                                  request->last_ftp_response);
       gftp_disconnect (request);
-      return (-2);
+      return (GFTP_ERETRYABLE);
     }
 
   if ((pos = strchr (request->last_ftp_response, '"')) == NULL)
@@ -233,7 +235,7 @@
 				 _("Received invalid response to PWD command: '%s'\n"),
                                  request->last_ftp_response);
       gftp_disconnect (request);
-      return (-2);
+      return (GFTP_EFATAL);
     }
 
   dir = pos + 1;
@@ -244,7 +246,7 @@
 				 _("Received invalid response to PWD command: '%s'\n"),
                                  request->last_ftp_response);
       gftp_disconnect (request);
-      return (-2);
+      return (GFTP_EFATAL);
     }
 
   *pos = '\0';
@@ -262,10 +264,11 @@
 rfc959_chdir (gftp_request * request, const char *directory)
 {
   char ret, *tempstr;
+  int r;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, -2);
-  g_return_val_if_fail (directory != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (directory != NULL, GFTP_EFATAL);
 
   if (strcmp (directory, "..") == 0)
     ret = rfc959_send_command (request, "CDUP\r\n");
@@ -277,12 +280,12 @@
     }
 
   if (ret != '2')
-    return (-2);
+    return (GFTP_ERETRYABLE);
 
   if (directory != request->directory)
     {
-      if (rfc959_getcwd (request) < 0)
-        return (-1);
+      if ((r = rfc959_getcwd (request)) < 0)
+        return (r);
     }
 
   return (0);
@@ -295,9 +298,9 @@
   char tempchar, *startpos, *endpos, *tempstr;
   int ret, resp;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, -2);
-  g_return_val_if_fail (request->hostname != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (request->hostname != NULL, GFTP_EFATAL);
 
   if (request->sockfd > 0)
     return (0);
@@ -311,13 +314,13 @@
     gftp_set_password (request, emailaddr);
     
   if ((request->sockfd = gftp_connect_server (request, "ftp")) < 0)
-    return (-1);
+    return (request->sockfd);
 
   /* Get the banner */
-  if (rfc959_read_response (request) != '2')
+  if ((ret = rfc959_read_response (request)) != '2')
     {
       gftp_disconnect (request);
-      return (-2);
+      return (ret);
     }
 
   /* Login the proxy server if available */
@@ -333,7 +336,7 @@
 	      if (*endpos != '\0')
 		*(endpos + 1) = '\0';
 	      if ((resp = rfc959_send_command (request, startpos)) < 0)
-                return (-2);
+                return (resp);
 	      if (*endpos != '\0')
 		*(endpos + 1) = tempchar;
 	      else
@@ -350,14 +353,14 @@
       resp = rfc959_send_command (request, tempstr);
       g_free (tempstr);
       if (resp < 0)
-        return (-2);
+        return (GFTP_ERETRYABLE);
       if (resp == '3')
 	{
 	  tempstr = g_strconcat ("PASS ", request->password, "\r\n", NULL);
 	  resp = rfc959_send_command (request, tempstr);
 	  g_free (tempstr);
           if (resp < 0)
-            return (-2);
+            return (GFTP_ERETRYABLE);
         }
       if (resp == '3' && request->account)
 	{
@@ -365,14 +368,14 @@
 	  resp = rfc959_send_command (request, tempstr);
 	  g_free (tempstr);
           if (resp < 0)
-            return (-2);
+            return (GFTP_ERETRYABLE);
 	}
     }
 
   if (resp != '2')
     {
       gftp_disconnect (request);
-      return (-2);
+      return (GFTP_EFATAL);
     }
 
   if (request->data_type == GFTP_TYPE_BINARY)
@@ -380,25 +383,25 @@
   else
     tempstr = "TYPE A\r\n";
 
-  if (rfc959_send_command (request, tempstr) < 0)
-    return (-2);
+  if ((ret = rfc959_send_command (request, tempstr)) < 0)
+    return (ret);
 
   ret = -1;
   if (request->directory != NULL && *request->directory != '\0')
     {
       ret = rfc959_chdir (request, request->directory);
       if (request->sockfd < 0)
-        return (-2);
+        return (ret);
     }
 
   if (ret != 0)
     {
-      if (rfc959_getcwd (request) < 0)
-        return (-1);
+      if ((ret = rfc959_getcwd (request)) < 0)
+        return (ret);
     }
 
   if (request->sockfd < 0)
-    return (-2);
+    return (GFTP_EFATAL);
 
   return (0);
 }
@@ -436,9 +439,9 @@
   unsigned char ad[6];
   int i;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, -2);
-  g_return_val_if_fail (request->sockfd > 0, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL);
 
   if ((request->datafd = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
     {
@@ -446,7 +449,7 @@
 				 _("Failed to create a socket: %s\n"),
 				 g_strerror (errno));
       gftp_disconnect (request);
-      return (-1);
+      return (GFTP_ERETRYABLE);
     }
 
   data_addr_len = sizeof (data_addr);
@@ -458,7 +461,7 @@
       if ((resp = rfc959_send_command (request, "PASV\r\n")) != '2')
 	{
           if (request->sockfd < 0)
-            return (-2);
+            return (resp);
 
 	  request->transfer_type = gftp_transfer_active;
 	  return (rfc959_data_connection_new (request));
@@ -474,7 +477,7 @@
                       _("Cannot find an IP address in PASV response '%s'\n"),
                       request->last_ftp_response);
           gftp_disconnect (request);
-          return (-2);
+          return (GFTP_EFATAL);
         }
 
       if (sscanf (pos, "%u,%u,%u,%u,%u,%u", &temp[0], &temp[1], &temp[2],
@@ -484,7 +487,7 @@
                       _("Cannot find an IP address in PASV response '%s'\n"),
                       request->last_ftp_response);
           gftp_disconnect (request);
-          return (-2);
+          return (GFTP_EFATAL);
         }
 
       for (i = 0; i < 6; i++)
@@ -499,7 +502,7 @@
                                     _("Cannot create a data connection: %s\n"),
                                     g_strerror (errno));
           gftp_disconnect (request);
-          return (-1);
+          return (GFTP_ERETRYABLE);
 	}
     }
   else
@@ -511,7 +514,7 @@
 				     _("Cannot get socket name: %s\n"),
 				     g_strerror (errno));
           gftp_disconnect (request);
-	  return (-1);
+	  return (GFTP_ERETRYABLE);
         }
 
       data_addr.sin_port = 0;
@@ -522,7 +525,7 @@
 				     _("Cannot bind a port: %s\n"),
 				     g_strerror (errno));
           gftp_disconnect (request);
-	  return (-1);
+	  return (GFTP_ERETRYABLE);
 	}
 
       if (getsockname (request->datafd, (struct sockaddr *) &data_addr, 
@@ -532,7 +535,7 @@
 				     _("Cannot get socket name: %s\n"),
 				     g_strerror (errno));
           gftp_disconnect (request);
-	  return (-1);
+	  return (GFTP_ERETRYABLE);
         }
 
       if (listen (request->datafd, 1) == -1)
@@ -542,7 +545,7 @@
 				     ntohs (data_addr.sin_port),
 				     g_strerror (errno));
           gftp_disconnect (request);
-	  return (-1);
+	  return (GFTP_ERETRYABLE);
 	}
 
       pos = (char *) &data_addr.sin_addr;
@@ -556,7 +559,7 @@
       if (resp != '2')
 	{
           gftp_disconnect (request);
-	  return (-2);
+	  return (GFTP_ERETRYABLE);
 	}
     }
 
@@ -569,17 +572,17 @@
 {
   struct sockaddr_in cli_addr;
   size_t cli_addr_len;
-  int infd;
+  int infd, ret;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, -2);
-  g_return_val_if_fail (request->datafd > 0, -2);
-  g_return_val_if_fail (request->transfer_type == gftp_transfer_active, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL);
+  g_return_val_if_fail (request->transfer_type == gftp_transfer_active, GFTP_EFATAL);
 
   cli_addr_len = sizeof (cli_addr);
 
-  if (gftp_set_sockblocking (request, request->datafd, 0) == -1)
-    return (-1);
+  if ((ret = gftp_set_sockblocking (request, request->datafd, 0)) < 0)
+    return (ret);
 
   if ((infd = accept (request->datafd, (struct sockaddr *) &cli_addr,
        &cli_addr_len)) == -1)
@@ -588,14 +591,14 @@
                                 _("Cannot accept connection from server: %s\n"),
                                 g_strerror (errno));
       gftp_disconnect (request);
-      return (-1);
+      return (GFTP_ERETRYABLE);
     }
 
   close (request->datafd);
 
   request->datafd = infd;
-  if (gftp_set_sockblocking (request, request->datafd, 1) == -1)
-    return (-1);
+  if ((ret = gftp_set_sockblocking (request, request->datafd, 1)) < 0)
+    return (ret);
 
   return (0);
 }
@@ -608,10 +611,10 @@
   char *command, *tempstr, resp;
   int ret;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, -2);
-  g_return_val_if_fail (filename != NULL, -2);
-  g_return_val_if_fail (request->sockfd > 0, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (filename != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL);
 
   if (fd > 0)
     request->datafd = fd;
@@ -620,8 +623,8 @@
       (ret = rfc959_data_connection_new (request)) < 0)
     return (ret);
 
-  if (gftp_set_sockblocking (request, request->datafd, 1) == -1)
-    return (-1);
+  if ((ret = gftp_set_sockblocking (request, request->datafd, 1)) < 0)
+    return (ret);
 
   if (startsize > 0)
     {
@@ -637,7 +640,7 @@
         {
           close (request->datafd);
           request->datafd = -1;
-	  return (-2);
+	  return (GFTP_ERETRYABLE);
         }
     }
 
@@ -649,7 +652,7 @@
     {
       close (request->datafd);
       request->datafd = -1;
-      return (-2);
+      return (GFTP_ERETRYABLE);
     }
 
   if (request->transfer_type == gftp_transfer_active &&
@@ -676,10 +679,10 @@
   char *command, *tempstr, resp;
   int ret;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, -2);
-  g_return_val_if_fail (filename != NULL, -2);
-  g_return_val_if_fail (request->sockfd > 0, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (filename != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL);
 
   if (fd > 0)
     fd = request->datafd;
@@ -688,8 +691,8 @@
       (ret = rfc959_data_connection_new (request)) < 0)
     return (ret);
 
-  if (gftp_set_sockblocking (request, request->datafd, 1) == -1)
-    return (-1);
+  if ((ret = gftp_set_sockblocking (request, request->datafd, 1)) < 0)
+    return (ret);
 
   if (startsize > 0)
     {
@@ -704,7 +707,7 @@
         {
           close (request->datafd);
           request->datafd = -1;
-	  return (-2);
+	  return (GFTP_ERETRYABLE);
         }
     }
 
@@ -715,7 +718,7 @@
     {
       close (request->datafd);
       request->datafd = -1;
-      return (-2);
+      return (GFTP_ERETRYABLE);
     }
 
   if (request->transfer_type == gftp_transfer_active && 
@@ -732,25 +735,26 @@
                       const char *tofile, off_t tosize)
 {
   char *tempstr, *pos, *endpos;
+  int ret;
 
-  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);
-  g_return_val_if_fail (fromreq->sockfd > 0, -2);
-  g_return_val_if_fail (toreq->sockfd > 0, -2);
+  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);
+  g_return_val_if_fail (fromreq->sockfd > 0, GFTP_EFATAL);
+  g_return_val_if_fail (toreq->sockfd > 0, GFTP_EFATAL);
 
   fromreq->transfer_type = gftp_transfer_passive;
   toreq->transfer_type = gftp_transfer_active;
 
-  if (rfc959_send_command (fromreq, "PASV\r\n") != '2')
-    return (-2);
+  if ((ret = rfc959_send_command (fromreq, "PASV\r\n")) != '2')
+    return (ret);
 
   pos = fromreq->last_ftp_response + 4;
   while (!isdigit ((int) *pos) && *pos != '\0') 
     pos++;
   if (*pos == '\0') 
-    return (-2);
+    return (GFTP_EFATAL);
 
   endpos = pos;
   while (*endpos != ')' && *endpos != '\0') 
@@ -759,34 +763,35 @@
     *endpos = '\0';
 
   tempstr = g_strconcat ("PORT ", pos, "\r\n", NULL);
-  if (rfc959_send_command (toreq, tempstr) != '2')
+  if ((ret = rfc959_send_command (toreq, tempstr)) != '2')
      {
        g_free (tempstr);
-       return (-2);
+       return (ret);
      }
   g_free (tempstr);
 
   tempstr = g_strconcat ("RETR ", fromfile, "\r\n", NULL);
-  if (gftp_write (fromreq, tempstr, strlen (tempstr), 
-                   fromreq->sockfd) < 0)
+  if ((ret = gftp_write (fromreq, tempstr, strlen (tempstr), 
+                         fromreq->sockfd)) < 0)
     {
       g_free (tempstr);
-      return (-2);
+      return (ret);
     }
   g_free (tempstr);
 
   tempstr = g_strconcat ("STOR ", tofile, "\r\n", NULL);
-  if (gftp_write (toreq, tempstr, strlen (tempstr), toreq->sockfd) < 0)
+  if ((ret = gftp_write (toreq, tempstr, strlen (tempstr), toreq->sockfd)) < 0)
     {
       g_free (tempstr);
-      return (-2);
+      return (ret);
     }
   g_free (tempstr);
 
-  if (rfc959_read_response (fromreq) < 0)
-    return (-2);
-  if (rfc959_read_response (toreq) < 0)
-    return (-2);
+  if ((ret = rfc959_read_response (fromreq)) < 0)
+    return (ret);
+
+  if ((ret = rfc959_read_response (toreq)) < 0)
+    return (ret);
 
   return (0);
 }
@@ -795,16 +800,26 @@
 static int
 rfc959_end_transfer (gftp_request * request)
 {
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, -2);
-  g_return_val_if_fail (request->sockfd > 0, -2);
+  int ret;
+
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL);
 
   if (request->datafd > 0)
     {
       close (request->datafd);
       request->datafd = -1;
     }
-  return (rfc959_read_response (request) == '2' ? 0 : -2);
+
+  ret = rfc959_read_response (request);
+
+  if (ret < 0)
+    return (ret);
+  else if (ret == '2')
+    return (0);
+  else
+    return (GFTP_ERETRYABLE);
 }
 
 
@@ -813,9 +828,9 @@
 {
   int ret;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, -2);
-  g_return_val_if_fail (request->sockfd > 0, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL);
 
   if (request->datafd > 0)
     {
@@ -825,8 +840,8 @@
 
   /* We need to read two lines of output. The first one is acknowleging
      the transfer and the second line acknowleges the ABOR command */
-  if (rfc959_send_command (request, "ABOR\r\n") < 0)
-    return (-2);
+  if ((ret = rfc959_send_command (request, "ABOR\r\n")) < 0)
+    return (ret);
 
   if (request->sockfd > 0)
     {
@@ -844,9 +859,9 @@
   char *tempstr, parms[3];
   int ret;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, -2);
-  g_return_val_if_fail (request->sockfd > 0, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL);
 
   if ((ret = rfc959_data_connection_new (request)) < 0)
     return (ret);
@@ -861,7 +876,7 @@
   g_free (tempstr);
 
   if (ret != '1')
-    return (-2);
+    return (GFTP_ERETRYABLE);
 
   ret = 0;
   if (request->transfer_type == gftp_transfer_active)
@@ -878,10 +893,10 @@
   char tempstr[255];
   ssize_t len;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, -2);
-  g_return_val_if_fail (fle != NULL, -2);
-  g_return_val_if_fail (fd > 0, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (fle != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (fd > 0, GFTP_EFATAL);
 
   if (request->last_dir_entry)
     {
@@ -929,9 +944,10 @@
 rfc959_set_data_type (gftp_request * request, int data_type)
 {
   char *tempstr;
+  int ret;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL);
 
   if (request->sockfd > 0 && request->data_type != data_type)
     {
@@ -940,8 +956,8 @@
       else
 	tempstr = "TYPE A\r\n";
 
-      if (rfc959_send_command (request, tempstr) != '2')
-	return (-2);
+      if ((ret = rfc959_send_command (request, tempstr)) != '2')
+	return (ret);
     }
   request->data_type = data_type;
   return (0);
@@ -955,7 +971,7 @@
   int ret;
 
   g_return_val_if_fail (request != NULL, 0);
-  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, -2);
+  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL);
   g_return_val_if_fail (filename != NULL, 0);
   g_return_val_if_fail (request->sockfd > 0, 0);
 
@@ -963,7 +979,7 @@
   ret = rfc959_send_command (request, tempstr);
   g_free (tempstr);
   if (ret < 0)
-    return (-2);
+    return (ret);
 
   if (*request->last_ftp_response != '2')
     return (0);
@@ -976,15 +992,21 @@
 {
   char *tempstr, ret;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, -2);
-  g_return_val_if_fail (directory != NULL, -2);
-  g_return_val_if_fail (request->sockfd > 0, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (directory != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL);
 
   tempstr = g_strconcat ("RMD ", directory, "\r\n", NULL);
   ret = rfc959_send_command (request, tempstr);
   g_free (tempstr);
-  return (ret == '2' ? 0 : -2);
+
+  if (ret < 0)
+    return (ret);
+  else if (ret == '2')
+    return (0);
+  else
+    return (GFTP_ERETRYABLE);
 }
 
 
@@ -993,15 +1015,21 @@
 {
   char *tempstr, ret;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, -2);
-  g_return_val_if_fail (file != NULL, -2);
-  g_return_val_if_fail (request->sockfd > 0, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (file != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL);
 
   tempstr = g_strconcat ("DELE ", file, "\r\n", NULL);
   ret = rfc959_send_command (request, tempstr);
   g_free (tempstr);
-  return (ret == '2' ? 0 : -2);
+
+  if (ret < 0)
+    return (ret);
+  else if (ret == '2')
+    return (0);
+  else
+    return (GFTP_ERETRYABLE);
 }
 
 
@@ -1010,15 +1038,21 @@
 {
   char *tempstr, ret;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, -2);
-  g_return_val_if_fail (directory != NULL, -2);
-  g_return_val_if_fail (request->sockfd > 0, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (directory != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL);
 
   tempstr = g_strconcat ("MKD ", directory, "\r\n", NULL);
   ret = rfc959_send_command (request, tempstr);
   g_free (tempstr);
-  return (ret == '2' ? 0 : -2);
+
+  if (ret < 0)
+    return (ret);
+  else if (ret == '2')
+    return (0);
+  else
+    return (GFTP_ERETRYABLE);
 }
 
 
@@ -1028,22 +1062,31 @@
 {
   char *tempstr, ret;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, -2);
-  g_return_val_if_fail (oldname != NULL, -2);
-  g_return_val_if_fail (newname != NULL, -2);
-  g_return_val_if_fail (request->sockfd > 0, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (oldname != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (newname != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL);
 
   tempstr = g_strconcat ("RNFR ", oldname, "\r\n", NULL);
   ret = rfc959_send_command (request, tempstr);
   g_free (tempstr);
-  if (ret != '3')
-    return (-2);
+
+  if (ret < 0)
+    return (ret);
+  else if (ret != '2')
+    return (GFTP_ERETRYABLE);
 
   tempstr = g_strconcat ("RNTO ", newname, "\r\n", NULL);
   ret = rfc959_send_command (request, tempstr);
   g_free (tempstr);
-  return (ret == '2' ? 0 : -2);
+
+  if (ret < 0)
+    return (ret);
+  else if (ret == '2')
+    return (0);
+  else
+    return (GFTP_ERETRYABLE);
 }
 
 
@@ -1052,16 +1095,22 @@
 {
   char *tempstr, ret;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, -2);
-  g_return_val_if_fail (file != NULL, -2);
-  g_return_val_if_fail (request->sockfd > 0, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (file != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL);
 
   tempstr = g_malloc (strlen (file) + (mode / 10) + 16);
   sprintf (tempstr, "SITE CHMOD %d %s\r\n", mode, file);
   ret = rfc959_send_command (request, tempstr);
   g_free (tempstr);
-  return (ret == '2' ? 0 : -2);
+
+  if (ret < 0)
+    return (ret);
+  else if (ret == '2')
+    return (0);
+  else
+    return (GFTP_ERETRYABLE);
 }
 
 
@@ -1070,15 +1119,21 @@
 {
   char *tempstr, ret;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, -2);
-  g_return_val_if_fail (command != NULL, -2);
-  g_return_val_if_fail (request->sockfd > 0, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (command != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL);
 
   tempstr = g_strconcat ("SITE ", command, "\r\n", NULL);
   ret = rfc959_send_command (request, tempstr);
   g_free (tempstr);
-  return (request->sockfd > 0 ? ret : -2);
+
+  if (ret < 0)
+    return (ret);
+  else if (ret == '2')
+    return (0);
+  else
+    return (GFTP_ERETRYABLE);
 }
 
 
--- a/lib/sshv2.c	Fri Dec 27 14:59:50 2002 +0000
+++ b/lib/sshv2.c	Sun Dec 29 15:16:27 2002 +0000
@@ -281,13 +281,14 @@
 {
   char buf[34000];
   gint32 clen;
+  int ret;
 
   if (len > 33995)
     {
       request->logging_function (gftp_logging_error, request->user_data,
                              _("Error: Message size %d too big\n"), len);
       gftp_disconnect (request);
-      return (-1);
+      return (GFTP_EFATAL);
     }
 
   clen = htonl (len + 1);
@@ -305,10 +306,10 @@
 
   sshv2_log_command (request, gftp_logging_send, type, buf + 5, len);
 
-  if (gftp_write (request, buf, len + 5, request->sockfd) < 0)
-    return (-2);
+  if ((ret = gftp_write (request, buf, len + 5, request->sockfd)) < 0)
+    return (ret);
 
-  return 0;
+  return (0);
 }
 
 
@@ -327,7 +328,7 @@
   while (rem > 0)
     {
       if ((numread = gftp_read (request, pos, rem, fd)) < 0)
-        return (-2);
+        return ((int) numread);
       rem -= numread;
       pos += numread;
     }
@@ -341,7 +342,7 @@
                              message->length);
       memset (message, 0, sizeof (*message));
       gftp_disconnect (request);
-      return (-1);
+      return (GFTP_EFATAL);
     }
 
   message->command = buf[4];
@@ -355,7 +356,7 @@
   while (rem > 0)
     {
       if ((numread = gftp_read (request, pos, rem, fd)) < 0)
-        return (-2);
+        return ((int) numread);
       rem -= numread;
       pos += numread;
     }
@@ -401,7 +402,7 @@
                      _("Received wrong response from server, disconnecting\n"));
       sshv2_message_free (message);
       gftp_disconnect (request);
-      return (-2);
+      return (GFTP_EFATAL);
     }
 
   memcpy (&ret, message->pos, 4);
@@ -414,7 +415,7 @@
                      _("Received wrong response from server, disconnecting\n"));
       sshv2_message_free (message);
       gftp_disconnect (request);
-      return (-2);
+      return (GFTP_EFATAL);
     }
 
   return (ret);
@@ -457,8 +458,8 @@
   size_t len;
   int ret;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, GFTP_EFATAL);
 
   if (request->directory == NULL || *request->directory == '\0')
     dir = ".";
@@ -475,10 +476,11 @@
 
   num = htonl (len);
   memcpy (tempstr + 4, &num, 4);
-  if (sshv2_send_command (request, SSH_FXP_REALPATH, tempstr, len + 8) < 0)
+  if ((ret = sshv2_send_command (request, SSH_FXP_REALPATH, tempstr, 
+                                 len + 8)) < 0)
     {
       g_free (tempstr);
-      return (-2);
+      return (ret);
     }
 
   g_free (tempstr);
@@ -490,10 +492,12 @@
 
   memset (&message, 0, sizeof (message));
   ret = sshv2_read_response (request, &message, -1);
-  if (ret == SSH_FXP_STATUS)
+  if (ret < 0)
+    return (ret);
+  else if (ret == SSH_FXP_STATUS)
     {
       sshv2_message_free (&message);
-      return (-2);
+      return (GFTP_ERETRYABLE);
     }
   else if (ret != SSH_FXP_NAME)
     {
@@ -501,15 +505,15 @@
                      _("Received wrong response from server, disconnecting\n"));
       sshv2_message_free (&message);
       gftp_disconnect (request);
-      return (-2);
+      return (GFTP_EFATAL);
     }
 
   message.pos += 4;
-  if (sshv2_buffer_get_int32 (request, &message, 1) < 0)
-    return (-2);
+  if ((ret = sshv2_buffer_get_int32 (request, &message, 1)) < 0)
+    return (ret);
 
   if ((request->directory = sshv2_buffer_get_string (request, &message)) == NULL)
-    return (-2);
+    return (GFTP_EFATAL);
 
   sshv2_message_free (&message);
   return (0);
@@ -520,13 +524,13 @@
 sshv2_connect (gftp_request * request)
 {
   char **args, *tempstr, pts_name[20], *p1, p2, *exepath, port[6];
-  int version, fdm, fds, s[2];
+  int version, fdm, fds, s[2], ret;
   sshv2_message message;
   pid_t child;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, -2);
-  g_return_val_if_fail (request->hostname != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (request->hostname != NULL, GFTP_EFATAL);
   
   if (request->sockfd > 0)
     return (0);
@@ -564,7 +568,7 @@
           request->logging_function (gftp_logging_error, request->user_data,
                                      _("Cannot create a socket pair: %s\n"),
                                      g_strerror (errno));
-          return (-2);
+          return (GFTP_ERETRYABLE);
         }
     }
   else
@@ -575,7 +579,7 @@
           request->logging_function (gftp_logging_error, request->user_data,
                                 _("Cannot open master pty %s: %s\n"), pts_name,
                                 g_strerror (errno));
-          return (-2);
+          return (GFTP_ERETRYABLE);
         }
     }
  
@@ -593,7 +597,7 @@
             {
               printf ("Cannot open slave pts %s: %s\n", pts_name, 
                       g_strerror (errno));
-              return (-1);
+              return (GFTP_ERETRYABLE);
             }
           close (fdm);
         }
@@ -608,7 +612,7 @@
               ssh_prog_name : "ssh", args);
 
       printf (_("Error: Cannot execute ssh: %s\n"), g_strerror (errno));
-      return (-1);
+      exit (1);
     }
   else if (child > 0)
     {
@@ -627,7 +631,7 @@
             {
               g_free (args);
               g_free (exepath);
-              return (-2);
+              return (GFTP_EFATAL);
             }
           g_free (tempstr);
         }
@@ -637,17 +641,22 @@
       request->sockfd = fdm;
 
       version = htonl (SSH_MY_VERSION);
-      if (sshv2_send_command (request, SSH_FXP_INIT, (char *) &version, 4) < 0)
-        return (-2);
+      if ((ret = sshv2_send_command (request, SSH_FXP_INIT, (char *) 
+                                     &version, 4)) < 0)
+        return (ret);
 
       memset (&message, 0, sizeof (message));
-      if (sshv2_read_response (request, &message, -1) != SSH_FXP_VERSION)
+      if ((ret = sshv2_read_response (request, &message, -1)) != SSH_FXP_VERSION)
         {
           request->logging_function (gftp_logging_error, request->user_data,
                    _("Received wrong response from server, disconnecting\n"));
           sshv2_message_free (&message);
           gftp_disconnect (request);
-          return (-2);
+
+          if (ret < 0)
+            return (ret);
+          else
+            return (GFTP_ERETRYABLE);
         }
       sshv2_message_free (&message);
 
@@ -661,7 +670,7 @@
                                  _("Cannot fork another process: %s\n"),
                                  g_strerror (errno));
       g_free (args);
-      return (-1);
+      return (GFTP_ERETRYABLE);
     }
 
   if (sshv2_getcwd (request) < 0)
@@ -670,10 +679,10 @@
         g_free (request->directory);
 
       request->directory = g_strdup (".");
-      if (sshv2_getcwd (request) < 0)
+      if ((ret = sshv2_getcwd (request)) < 0)
         {
           gftp_disconnect (request);
-          return (-2);
+          return (ret);
         }
     }
 
@@ -716,9 +725,10 @@
   sshv2_params * params;
   sshv2_message message;
   gint32 len;
+  int ret;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, GFTP_EFATAL);
 
   params = request->protocol_data;
   if (params->message.buffer != NULL)
@@ -732,18 +742,21 @@
       len = htonl (params->id++);
       memcpy (params->handle, &len, 4);
 
-      if (sshv2_send_command (request, SSH_FXP_CLOSE, params->handle, 
-                              params->handle_len) < 0)
-        return (-2);
+      if ((ret = sshv2_send_command (request, SSH_FXP_CLOSE, params->handle, 
+                                     params->handle_len)) < 0)
+        return (ret);
 
       memset (&message, 0, sizeof (message));
-      if (sshv2_read_response (request, &message, -1) != SSH_FXP_STATUS)
+      if ((ret = sshv2_read_response (request, &message, -1)) != SSH_FXP_STATUS)
         {
           request->logging_function (gftp_logging_error, request->user_data,
                      _("Received wrong response from server, disconnecting\n"));
           sshv2_message_free (&message);
           gftp_disconnect (request);
-          return (-2);
+          if (ret < 0)
+            return (ret);
+          else
+            return (GFTP_ERETRYABLE);
         }
       sshv2_message_free (&message);
       params->handle_len = 0;
@@ -768,9 +781,9 @@
   gint32 len;
   int ret;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, -2);
-  g_return_val_if_fail (request->sockfd > 0, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL);
 
   params = request->protocol_data;
 
@@ -785,20 +798,22 @@
   len = htonl (strlen (request->directory));
   memcpy (tempstr + 4, &len, 4);
   strcpy (tempstr + 8, request->directory);
-  if (sshv2_send_command (request, SSH_FXP_OPENDIR, tempstr, 
-                          strlen (request->directory) + 8) < 0)
+  if ((ret = sshv2_send_command (request, SSH_FXP_OPENDIR, tempstr, 
+                                 strlen (request->directory) + 8)) < 0)
     {
       g_free (tempstr);
-      return (-2);
+      return (ret);
     }
   g_free (tempstr);
 
   memset (&message, 0, sizeof (message));
   ret = sshv2_read_response (request, &message, -1);
-  if (ret == SSH_FXP_STATUS)
+  if (ret < 0)
+    return (ret);
+  else if (ret == SSH_FXP_STATUS)
     {
       sshv2_message_free (&message);
-      return (-2);
+      return (GFTP_ERETRYABLE);
     }
   else if (ret != SSH_FXP_HANDLE)
     {
@@ -806,7 +821,7 @@
                      _("Received wrong response from server, disconnecting\n"));
       sshv2_message_free (&message);
       gftp_disconnect (request);
-      return (-2);
+      return (GFTP_EFATAL);
     }
 
   if (message.length - 4 > SSH_MAX_HANDLE_SIZE)
@@ -816,7 +831,7 @@
                              message.length - 4);
       sshv2_message_free (&message);
       gftp_disconnect (request);
-      return (-1);
+      return (GFTP_EFATAL);
         
     }
 
@@ -837,9 +852,9 @@
   sshv2_params *params;
   char *longname;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, -2);
-  g_return_val_if_fail (fle != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (fle != NULL, GFTP_EFATAL);
 
   params = request->protocol_data;
 
@@ -863,13 +878,14 @@
           len = htonl (params->id++);
           memcpy (params->handle, &len, 4);
 
-          if (sshv2_send_command (request, SSH_FXP_READDIR, params->handle,
-                                  params->handle_len) < 0)
-            return (-2);
+          if ((ret = sshv2_send_command (request, SSH_FXP_READDIR,  
+                                         params->handle,
+                                         params->handle_len)) < 0)
+            return (ret);
         }
 
       if ((ret = sshv2_read_response (request, &params->message, fd)) < 0)
-        return (-2);
+        return (ret);
 
       if (!request->cached)
         {
@@ -887,7 +903,7 @@
           params->message.pos = params->message.buffer + 4;
           if ((params->count = sshv2_buffer_get_int32 (request, 
                        &params->message, -1)) < 0)
-            return (-2);
+            return (params->count);
         }
     }
 
@@ -895,20 +911,20 @@
     {
       if ((len = sshv2_buffer_get_int32 (request, &params->message, -1)) < 0 ||
           params->message.pos + len > params->message.end)
-        return (-2);
+        return (GFTP_EFATAL);
 
       params->message.pos += len;
 
       if ((longnamelen = sshv2_buffer_get_int32 (request, 
                                                  &params->message, -1)) < 0 || 
            params->message.pos + longnamelen > params->message.end)
-        return (-2);
+        return (GFTP_EFATAL);
 
       longname = params->message.pos;
       params->message.pos += longnamelen;
 
       if ((attrs = sshv2_buffer_get_int32 (request, &params->message, -1)) < 0)
-        return (-2);
+        return (attrs);
 
       if (attrs & SSH_FILEXFER_ATTR_SIZE)
         {
@@ -919,7 +935,7 @@
                      _("Received wrong response from server, disconnecting\n"));
               sshv2_message_free (&params->message);
               gftp_disconnect (request);
-              return (-2);
+              return (GFTP_EFATAL);
             }
         }
 
@@ -932,7 +948,7 @@
                      _("Received wrong response from server, disconnecting\n"));
               sshv2_message_free (&params->message);
               gftp_disconnect (request);
-              return (-2);
+              return (GFTP_EFATAL);
             }
         }
 
@@ -945,7 +961,7 @@
                      _("Received wrong response from server, disconnecting\n"));
               sshv2_message_free (&params->message);
               gftp_disconnect (request);
-              return (-2);
+              return (GFTP_EFATAL);
             }
         }
 
@@ -958,7 +974,7 @@
                      _("Received wrong response from server, disconnecting\n"));
               sshv2_message_free (&params->message);
               gftp_disconnect (request);
-              return (-2);
+              return (GFTP_EFATAL);
             }
         }
 
@@ -966,21 +982,21 @@
         {
           if ((count = sshv2_buffer_get_int32 (request,
                                                &params->message, -1)) < 0)
-            return (-2);
+            return (GFTP_EFATAL);
 
           for (i=0; i<count; i++)
             {
               if ((len = sshv2_buffer_get_int32 (request, 
                                                  &params->message, -1)) < 0 ||
                   params->message.pos + len + 4 > params->message.end)
-                return (-2);
+                return (GFTP_EFATAL);
 
               params->message.pos += len + 4;
 
               if ((len = sshv2_buffer_get_int32 (request, 
                                                  &params->message, -1)) < 0 ||
                   params->message.pos + len + 4 > params->message.end)
-                return (-2);
+                return (GFTP_EFATAL);
            
               params->message.pos += len + 4;
             }
@@ -994,10 +1010,10 @@
       if (longname[longnamelen - 1] == '/')
         longname[--longnamelen] = '\0';
 
-      if (gftp_parse_ls (longname, fle) != 0)
+      if ((ret = gftp_parse_ls (longname, fle)) < 0)
         {
           gftp_file_destroy (fle);
-          return (-2);
+          return (ret);
         }
       retsize = strlen (longname);
 
@@ -1014,7 +1030,7 @@
                      _("Received wrong response from server, disconnecting\n"));
       sshv2_message_free (&params->message);
       gftp_disconnect (request);
-      return (-2);
+      return (GFTP_EFATAL);
     }
 
   return (retsize);
@@ -1031,8 +1047,8 @@
   size_t len;
   int ret;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, GFTP_EFATAL);
 
   params = request->protocol_data;
   if (request->directory != directory)
@@ -1057,19 +1073,21 @@
 
       num = htonl (len - 8);
       memcpy (tempstr + 4, &num, 4);
-      if (sshv2_send_command (request, SSH_FXP_REALPATH, tempstr, len) < 0)
+      if ((ret = sshv2_send_command (request, SSH_FXP_REALPATH, tempstr, len)) < 0)
         {
           g_free (tempstr);
-          return (-2);
+          return (ret);
         }
       g_free (tempstr);
 
       memset (&message, 0, sizeof (message));
       ret = sshv2_read_response (request, &message, -1);
-      if (ret == SSH_FXP_STATUS)
+      if (ret < 0)
+        return (ret);
+      else if (ret == SSH_FXP_STATUS)
         {
           sshv2_message_free (&message);
-          return (-2);
+          return (GFTP_ERETRYABLE);
         }
       else if (ret != SSH_FXP_NAME)
         {
@@ -1077,15 +1095,15 @@
                      _("Received wrong response from server, disconnecting\n"));
           sshv2_message_free (&message);
           gftp_disconnect (request);
-          return (-2);
+          return (GFTP_EFATAL);
         }
 
       message.pos += 4;
       if (sshv2_buffer_get_int32 (request, &message, 1) != 1)
-        return (-2);
+        return (GFTP_EFATAL);
 
       if ((dir = sshv2_buffer_get_string (request, &message)) == NULL)
-        return (-2);
+        return (GFTP_EFATAL);
 
       if (request->directory)
         g_free (request->directory);
@@ -1106,10 +1124,11 @@
   char *tempstr;
   gint32 num;
   size_t len;
+  int ret;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, -2);
-  g_return_val_if_fail (directory != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (directory != NULL, GFTP_EFATAL);
 
   params = request->protocol_data;
 
@@ -1137,17 +1156,17 @@
   if (sshv2_send_command (request, SSH_FXP_RMDIR, tempstr, len) < 0)
     {
       g_free (tempstr);
-      return (-2);
+      return (GFTP_ERETRYABLE);
     }
   g_free (tempstr);
 
   memset (&message, 0, sizeof (message));
-  if (sshv2_read_response (request, &message, -1) < 0)
-    return (-2);
+  if ((ret = sshv2_read_response (request, &message, -1)) < 0)
+    return (ret);
 
   message.pos += 4;
-  if (sshv2_buffer_get_int32 (request, &message, SSH_FX_OK) < 0)
-    return (-2);
+  if ((ret = sshv2_buffer_get_int32 (request, &message, SSH_FX_OK)) < 0)
+    return (ret);
 
   sshv2_message_free (&message);
 
@@ -1163,10 +1182,11 @@
   char *tempstr;
   gint32 num;
   size_t len;
+  int ret;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, -2);
-  g_return_val_if_fail (file != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (file != NULL, GFTP_EFATAL);
 
   params = request->protocol_data;
 
@@ -1194,17 +1214,17 @@
   if (sshv2_send_command (request, SSH_FXP_REMOVE, tempstr, len) < 0)
     {
       g_free (tempstr);
-      return (-2);
+      return (GFTP_ERETRYABLE);
     }
   g_free (tempstr);
 
   memset (&message, 0, sizeof (message));
-  if (sshv2_read_response (request, &message, -1) < 0)
-    return (-2);
+  if ((ret = sshv2_read_response (request, &message, -1)) < 0)
+    return (ret);
 
   message.pos += 4;
-  if (sshv2_buffer_get_int32 (request, &message, SSH_FX_OK) < 0)
-    return (-2);
+  if ((ret = sshv2_buffer_get_int32 (request, &message, SSH_FX_OK)) < 0)
+    return (ret);
 
   sshv2_message_free (&message);
 
@@ -1220,10 +1240,11 @@
   sshv2_message message;
   gint32 num;
   size_t len;
+  int ret;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, -2);
-  g_return_val_if_fail (file != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (file != NULL, GFTP_EFATAL);
 
   params = request->protocol_data;
 
@@ -1258,17 +1279,17 @@
   if (sshv2_send_command (request, SSH_FXP_SETSTAT, tempstr, len) < 0)
     {
       g_free (tempstr);
-      return (-2);
+      return (GFTP_ERETRYABLE);
     }
   g_free (tempstr);
 
   memset (&message, 0, sizeof (message));
-  if (sshv2_read_response (request, &message, -1) < 0)
-    return (-2);
+  if ((ret = sshv2_read_response (request, &message, -1)) < 0)
+    return (ret);
 
   message.pos += 4;
-  if (sshv2_buffer_get_int32 (request, &message, SSH_FX_OK) < 0)
-    return (-2);
+  if ((ret = sshv2_buffer_get_int32 (request, &message, SSH_FX_OK)) < 0)
+    return (ret);
 
   sshv2_message_free (&message);
 
@@ -1284,10 +1305,11 @@
   char *tempstr;
   gint32 num;
   size_t len;
+  int ret;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, -2);
-  g_return_val_if_fail (newdir != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (newdir != NULL, GFTP_EFATAL);
 
   params = request->protocol_data;
 
@@ -1316,17 +1338,17 @@
   if (sshv2_send_command (request, SSH_FXP_MKDIR, tempstr, len) < 0)
     {
       g_free (tempstr);
-      return (-2);
+      return (GFTP_ERETRYABLE);
     }
   g_free (tempstr);
 
   memset (&message, 0, sizeof (message));
-  if (sshv2_read_response (request, &message, -1) < 0)
-    return (-2);
+  if ((ret = sshv2_read_response (request, &message, -1)) < 0)
+    return (ret);
 
   message.pos += 4;
-  if (sshv2_buffer_get_int32 (request, &message, SSH_FX_OK) < 0)
-    return (-2);
+  if ((ret = sshv2_buffer_get_int32 (request, &message, SSH_FX_OK)) < 0)
+    return (ret);
 
   sshv2_message_free (&message);
 
@@ -1340,13 +1362,14 @@
   char *tempstr, *oldstr, *newstr;
   sshv2_params * params;
   sshv2_message message;
+  size_t oldlen, newlen;
   gint32 num;
-  size_t oldlen, newlen;
+  int ret;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, -2);
-  g_return_val_if_fail (oldname != NULL, -2);
-  g_return_val_if_fail (newname != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (oldname != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (newname != NULL, GFTP_EFATAL);
 
   params = request->protocol_data;
 
@@ -1387,17 +1410,17 @@
   if (sshv2_send_command (request, SSH_FXP_RENAME, tempstr, oldlen + newlen + 12) < 0)
     {
       g_free (tempstr);
-      return (-2);
+      return (GFTP_ERETRYABLE);
     }
   g_free (tempstr);
 
   memset (&message, 0, sizeof (message));
-  if (sshv2_read_response (request, &message, -1) < 0)
-    return (-2);
+  if ((ret = sshv2_read_response (request, &message, -1)) < 0)
+    return (ret);
 
   message.pos += 4;
-  if (sshv2_buffer_get_int32 (request, &message, SSH_FX_OK) < 0)
-    return (-2);
+  if ((ret = sshv2_buffer_get_int32 (request, &message, SSH_FX_OK)) < 0)
+    return (ret);
 
   sshv2_message_free (&message);
 
@@ -1413,10 +1436,11 @@
   char *tempstr;
   gint32 num;
   size_t len;
+  int ret;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, -2);
-  g_return_val_if_fail (file != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (file != NULL, GFTP_EFATAL);
 
   params = request->protocol_data;
 
@@ -1453,17 +1477,17 @@
   if (sshv2_send_command (request, SSH_FXP_SETSTAT, tempstr, len) < 0)
     {
       g_free (tempstr);
-      return (-2);
+      return (GFTP_ERETRYABLE);
     }
   g_free (tempstr);
 
   memset (&message, 0, sizeof (message));
-  if (sshv2_read_response (request, &message, -1) < 0)
-    return (-2);
+  if ((ret = sshv2_read_response (request, &message, -1)) < 0)
+    return (ret);
 
   message.pos += 4;
-  if (sshv2_buffer_get_int32 (request, &message, SSH_FX_OK) < 0)
-    return (-2);
+  if ((ret = sshv2_buffer_get_int32 (request, &message, SSH_FX_OK)) < 0)
+    return (ret);
 
   sshv2_message_free (&message);
 
@@ -1482,9 +1506,9 @@
   gint64 ret;
 #endif
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, -2);
-  g_return_val_if_fail (file != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (file != NULL, GFTP_EFATAL);
 
   params = request->protocol_data;
 
@@ -1512,16 +1536,18 @@
   if (sshv2_send_command (request, SSH_FXP_STAT, tempstr, len + 8) < 0)
     {
       g_free (tempstr);
-      return (-2);
+      return (GFTP_ERETRYABLE);
     }
   g_free (tempstr);
 
   memset (&params->message, 0, sizeof (params->message));
   serv_ret = sshv2_read_response (request, &params->message, -1);
-  if (serv_ret == SSH_FXP_STATUS)
+  if (serv_ret < 0)
+    return (serv_ret);
+  else if (serv_ret == SSH_FXP_STATUS)
     {
       sshv2_message_free (&params->message);
-      return (-2);
+      return (GFTP_ERETRYABLE);
     }
   else if (serv_ret != SSH_FXP_ATTRS)
     {
@@ -1529,23 +1555,23 @@
                      _("Received wrong response from server, disconnecting\n"));
       sshv2_message_free (&params->message);
       gftp_disconnect (request);
-      return (-2);
+      return (GFTP_ERETRYABLE);
     }
 
   if (params->message.length < 5)
-    return (-2);
+    return (GFTP_ERETRYABLE);
   params->message.pos += 4;
 
   if ((attrs = sshv2_buffer_get_int32 (request, &params->message, -1)) < 0)
-    return (-2);
+    return (GFTP_ERETRYABLE);
 
   if (attrs & SSH_FILEXFER_ATTR_SIZE)
     {
       if ((highnum = sshv2_buffer_get_int32 (request, &params->message, -1)) < 0)
-        return (-2);
+        return (GFTP_ERETRYABLE);
 
       if ((lownum = sshv2_buffer_get_int32 (request, &params->message, -1)) < 0)
-        return (-2);
+        return (GFTP_ERETRYABLE);
 
       sshv2_message_free (&params->message);
 
@@ -1575,9 +1601,9 @@
   gint32 num;
   int ret;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, -2);
-  g_return_val_if_fail (request->sockfd > 0, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL);
   /* fd ignored for this protocol */
 
   params = request->protocol_data;
@@ -1612,16 +1638,18 @@
   if (sshv2_send_command (request, SSH_FXP_OPEN, tempstr, stlen + 16) < 0)
     {
       g_free (tempstr);
-      return (-2);
+      return (GFTP_ERETRYABLE);
     }
 
   g_free (tempstr);
   memset (&message, 0, sizeof (message));
   ret = sshv2_read_response (request, &message, -1);
-  if (ret == SSH_FXP_STATUS)
+  if (ret < 0)
+    return (ret);
+  else if (ret == SSH_FXP_STATUS)
     {
       sshv2_message_free (&message);
-      return (-2);
+      return (GFTP_ERETRYABLE);
     }
   else if (ret != SSH_FXP_HANDLE)
     {
@@ -1629,7 +1657,7 @@
                      _("Received wrong response from server, disconnecting\n"));
       sshv2_message_free (&message);
       gftp_disconnect (request);
-      return (-2);
+      return (GFTP_ERETRYABLE);
     }
 
   if (message.length - 4 > SSH_MAX_HANDLE_SIZE)
@@ -1639,7 +1667,7 @@
                              message.length - 4);
       sshv2_message_free (&message);
       gftp_disconnect (request);
-      return (-1);
+      return (GFTP_ERETRYABLE);
         
     }
 
@@ -1663,9 +1691,9 @@
   gint32 num;
   int ret;
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, -2);
-  g_return_val_if_fail (request->sockfd > 0, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL);
   /* fd ignored for this protocol */
 
   params = request->protocol_data;
@@ -1703,16 +1731,18 @@
   if (sshv2_send_command (request, SSH_FXP_OPEN, tempstr, stlen + 16) < 0)
     {
       g_free (tempstr);
-      return (-2);
+      return (GFTP_ERETRYABLE);
     }
 
   g_free (tempstr);
   memset (&message, 0, sizeof (message));
   ret = sshv2_read_response (request, &message, -1);
-  if (ret == SSH_FXP_STATUS)
+  if (ret < 0)
+    return (ret);
+  else if (ret == SSH_FXP_STATUS)
     {
       sshv2_message_free (&message);
-      return (-2);
+      return (GFTP_ERETRYABLE);
     }
   else if (ret != SSH_FXP_HANDLE)
     {
@@ -1720,7 +1750,7 @@
                      _("Received wrong response from server, disconnecting\n"));
       sshv2_message_free (&message);
       gftp_disconnect (request);
-      return (-2);
+      return (GFTP_ERETRYABLE);
     }
 
   if (message.length - 4 > SSH_MAX_HANDLE_SIZE)
@@ -1730,7 +1760,7 @@
                              message.length - 4);
       sshv2_message_free (&message);
       gftp_disconnect (request);
-      return (-1);
+      return (GFTP_ERETRYABLE);
         
     }
 
@@ -1749,6 +1779,7 @@
   sshv2_params * params;
   sshv2_message message;
   gint32 num;
+  int ret;
 
 #ifdef G_HAVE_GINT64
   gint64 offset;
@@ -1756,10 +1787,10 @@
   gint32 offset;
 #endif
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, -2);
-  g_return_val_if_fail (request->sockfd > 0, -2);
-  g_return_val_if_fail (buf != NULL, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL);
+  g_return_val_if_fail (buf != NULL, GFTP_EFATAL);
 
   params = request->protocol_data;
 
@@ -1786,21 +1817,24 @@
   memcpy (params->read_buffer + params->handle_len + 8, &num, 4);
   
   if (sshv2_send_command (request, SSH_FXP_READ, params->read_buffer, params->handle_len + 12) < 0)
-    return (-2);
+    return (GFTP_ERETRYABLE);
 
   memset (&message, 0, sizeof (message));
-  if (sshv2_read_response (request, &message, -1) != SSH_FXP_DATA)
+  if ((ret = sshv2_read_response (request, &message, -1)) != SSH_FXP_DATA)
     {
+      if (ret < 0)
+        return (ret);
+
       message.pos += 4;
       if ((num = sshv2_buffer_get_int32 (request, &message, SSH_FX_OK)) < 0)
-        return (-2);
+        return (num);
       sshv2_message_free (&message);
       if (num != SSH_FX_EOF)
         {
           request->logging_function (gftp_logging_error, request->user_data,
                      _("Received wrong response from server, disconnecting\n"));
           gftp_disconnect (request);
-          return (-2);
+          return (GFTP_ERETRYABLE);
         }
       return (0);
     }
@@ -1814,7 +1848,7 @@
                              num);
       sshv2_message_free (&message);
       gftp_disconnect (request);
-      return (-1);
+      return (GFTP_ERETRYABLE);
         
     }
 
@@ -1840,11 +1874,11 @@
   gint32 offset;
 #endif
 
-  g_return_val_if_fail (request != NULL, -2);
-  g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, -2);
-  g_return_val_if_fail (request->sockfd > 0, -2);
-  g_return_val_if_fail (buf != NULL, -2);
-  g_return_val_if_fail (size <= 32500, -2);
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL);
+  g_return_val_if_fail (buf != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (size <= 32500, GFTP_EFATAL);
 
   params = request->protocol_data;
 
@@ -1870,12 +1904,15 @@
   if (sshv2_send_command (request, SSH_FXP_WRITE, tempstr, params->handle_len + size + 12) < 0)
     {
       g_free (tempstr);
-      return (-2);
+      return (GFTP_ERETRYABLE);
     }
 
   memset (&message, 0, sizeof (message));
   params->dont_log_status = 1;
   ret = sshv2_read_response (request, &message, -1);
+  if (ret < 0)
+    return (ret);
+
   params->dont_log_status = 0;
   if (ret != SSH_FXP_STATUS)
    {
@@ -1883,18 +1920,18 @@
                      _("Received wrong response from server, disconnecting\n"));
      sshv2_message_free (&message);
      gftp_disconnect (request);
-     return (-2);
+     return (GFTP_ERETRYABLE);
    }
 
   message.pos += 4;
   if ((num = sshv2_buffer_get_int32 (request, &message, SSH_FX_OK)) < 0)
-    return (-2);
+    return (GFTP_ERETRYABLE);
   sshv2_message_free (&message);
 
   if (num == SSH_FX_EOF)
     return (0);
   else if (num != SSH_FX_OK)
-    return (-1);
+    return (GFTP_ERETRYABLE);
 
   params->offset += size;
   return (size);
--- a/src/gtk/transfer.c	Fri Dec 27 14:59:50 2002 +0000
+++ b/src/gtk/transfer.c	Sun Dec 29 15:16:27 2002 +0000
@@ -259,11 +259,19 @@
       conn_num++;
       if (request->network_timeout > 0)
         alarm (request->network_timeout);
-      ret = gftp_connect (request) == 0;
+      ret = gftp_connect (request);
       alarm (0);
 
-      if (ret)
-        break;
+      if (ret == GFTP_EFATAL)
+        {
+          ret = 0;
+          break;
+        }
+      else if (ret == 0)
+        {
+          ret = 1;
+          break;
+        }
       else if (request->retries == 0 || conn_num < request->retries)
         {
           request->logging_function (gftp_logging_misc, request->user_data,