diff lib/protocols.c @ 41:4bcfaf6307b5

2002-10-29 Brian Masney <masneyb@gftp.org> * lib/config_file.c lib/gftp.h lib/options.h src/gtk/menu-items.c src/gtk/view_dialog.c - removed tmp_directory variable. Instead use g_get_tmp_dir () * lib/gftp.h (struct gftp_request) - added int cancel : 1 * lib/misc.c lib/protocols.c lib/rfc2068.c lib/rfc959.c lib/ssh.c lib/sshv2.c - check for interrupted signal calls * lib/protocols.c - added gftp_fgets() and gftp_fwrite() functions * src/gtk/delete_dialog.c src/gtk/misc-gtk.c src/gtk/transfer.c - use g_main_context_iteration in GTK+ 2.0 port * src/gtk/misc-gtk.c - use g_object_unref instead of gdk_drawable_unref in GTK+ 2.0 port
author masneyb
date Wed, 30 Oct 2002 02:53:21 +0000
parents 66c064fd05bc
children 311e29c40ed6
line wrap: on
line diff
--- a/lib/protocols.c	Fri Oct 18 02:53:52 2002 +0000
+++ b/lib/protocols.c	Wed Oct 30 02:53:21 2002 +0000
@@ -241,6 +241,7 @@
   struct timeval tv;
   fd_set fset;
   size_t len;
+  int ret;
   
   g_return_val_if_fail (request != NULL, -2);
   g_return_val_if_fail (buf != NULL, -2);
@@ -248,28 +249,57 @@
   if (request->get_next_file_chunk != NULL)
     return (request->get_next_file_chunk (request, buf, size));
 
-  FD_ZERO (&fset);
-  FD_SET (fileno (request->datafd), &fset);
-  tv.tv_sec = request->network_timeout;
-  tv.tv_usec = 0;
-  if (select (fileno (request->datafd) + 1, &fset, NULL, NULL, &tv) <= 0)
+  errno = 0;
+  len = 0;
+  do 
     {
-      request->logging_function (gftp_logging_error, request->user_data,
-                                 _("Connection to %s timed out\n"),
-                                 request->hostname);
+      FD_ZERO (&fset);
+      FD_SET (fileno (request->datafd), &fset);
+      tv.tv_sec = request->network_timeout;
+      tv.tv_usec = 0;
+      ret = select (fileno (request->datafd) + 1, &fset, NULL, NULL, &tv);
+      if (ret == -1 && errno == EINTR)
+        {
+          if (request->cancel)
+            break;
+          else
+            continue;
+        }
+      else if (ret <= 0)
+        {
+          request->logging_function (gftp_logging_error, request->user_data,
+                                     _("Connection to %s timed out\n"),
+                                     request->hostname);
+          gftp_disconnect (request);
+          return (-1);
+        }
+
+      if ((len = read (fileno (request->datafd), buf, size)) == -1)
+        {
+          if (errno == EINTR)
+            {
+              if (request->cancel)
+                break;
+              else
+                continue;
+            }
+
+          request->logging_function (gftp_logging_error, request->user_data,
+                                     _("Error reading from host %s: %s\n"),
+                                     request->hostname,
+                                     g_strerror (errno));
+          gftp_disconnect (request);
+          return (-1);
+        }
+    }
+  while (errno == EINTR && !request->cancel);
+
+  if (errno == EINTR && request->cancel)
+    {
       gftp_disconnect (request);
       return (-1);
     }
 
-  if ((len = read (fileno (request->datafd), buf, size)) == -1)
-    {
-      request->logging_function (gftp_logging_error, request->user_data,
-                                 _("Error reading from host %s: %s\n"),
-                                 request->hostname,
-                                 g_strerror (errno));
-      gftp_disconnect (request);
-      return (-1);
-    }
   return (len);
 }
 
@@ -281,6 +311,7 @@
   size_t len, ret;
   fd_set fset;
   char *pos;
+  int sret;
   
   g_return_val_if_fail (request != NULL, -2);
 
@@ -294,30 +325,57 @@
   pos = buf;
   while (size > 0)
     {
-      FD_ZERO (&fset);
-      FD_SET (fileno (request->datafd), &fset);
-      tv.tv_sec = request->network_timeout;
-      tv.tv_usec = 0;
-      if (!select (fileno (request->datafd) + 1, NULL, &fset, NULL, &tv))
+      errno = 0;
+      do 
         {
-          request->logging_function (gftp_logging_error, request->user_data,
-			             _("Connection to %s timed out\n"),
-                                     request->hostname);
-          gftp_disconnect (request);
-          return (-1);
+          FD_ZERO (&fset);
+          FD_SET (fileno (request->datafd), &fset);
+          tv.tv_sec = request->network_timeout;
+          tv.tv_usec = 0;
+          sret = select (fileno (request->datafd) + 1, NULL, &fset, NULL, &tv);
+          if (sret == -1 && errno == EINTR)
+            {
+              if (request->cancel)
+                break;
+              else
+                continue;
+            }
+          else if (sret <= 0)
+            {
+              request->logging_function (gftp_logging_error, request->user_data,
+                                         _("Connection to %s timed out\n"),
+                                         request->hostname);
+              gftp_disconnect (request);
+              return (-1);
+            }
+
+          if ((len = write (fileno (request->datafd), pos, size)) < 0)
+            {
+              if (sret == -1 && errno == EINTR)
+                {
+                  if (request->cancel)
+                    break;
+                  else
+                    continue;
+                }
+
+              request->logging_function (gftp_logging_error, request->user_data,
+                                         _("Error writing to host %s: %s\n"),
+                                         request->hostname,
+                                         g_strerror (errno));
+              gftp_disconnect (request);
+              return (-1);
+            }
+          size -= len;
+          pos += len;
         }
+      while (errno == EINTR && !request->cancel);
+    }
 
-      if ((len = write (fileno (request->datafd), pos, size)) < 0)
-        {
-          request->logging_function (gftp_logging_error, request->user_data,
-                                     _("Error writing to host %s: %s\n"),
-                                     request->hostname,
-                                     g_strerror (errno));
-          gftp_disconnect (request);
-          return (-1);
-        }
-      size -= len;
-      pos += len;
+  if (errno == EINTR && request->cancel)
+    {
+      gftp_disconnect (request);
+      return (-1);
     }
 
   return (ret); 
@@ -1970,3 +2028,105 @@
   printf ("--END OF FILE LISTING--\n");
 }
 
+
+char *
+gftp_fgets (gftp_request * request, char * str, size_t len, FILE * fd)
+{
+  char * ret = NULL;
+
+  errno = 0;
+  do 
+    {
+      ret = fgets (str, len, fd);
+      if (ferror (fd))
+        {
+          if (errno == EINTR)
+            {
+              clearerr (fd);
+              if (request->cancel)
+                break;
+              else
+                continue;
+            }
+
+          request->logging_function (gftp_logging_error, request->user_data,
+                                   _("Error: Could not read from socket: %s\n"),
+                                   g_strerror (errno));
+          gftp_disconnect (request);
+          return (NULL);
+        }
+    }
+  while (errno == EINTR && !request->cancel);
+
+  if (errno == EINTR && request->cancel)
+    {
+      gftp_disconnect (request);
+      return (NULL);
+    }
+
+  return (ret);
+}
+
+
+size_t 
+gftp_fwrite (gftp_request * request, const void *ptr, size_t size, FILE * fd)
+{
+  size_t ret;
+
+  errno = 0;
+  ret = 0;
+  do
+    {
+      ret = fwrite (ptr, size, 1, fd);
+      if (ferror (fd))
+        {
+          if (errno == EINTR)
+            {
+              if (request->cancel)
+                break;
+              else
+                {
+                  clearerr (fd);
+                  continue;
+                }
+             }
+ 
+          request->logging_function (gftp_logging_error, request->user_data,
+                                    _("Error: Could not write to socket: %s\n"),
+                                    g_strerror (errno));
+          gftp_disconnect (request);
+          return (-1);
+        }
+
+      fflush (request->sockfd_write);
+      if (ferror (fd))
+        {
+          if (errno == EINTR)
+            {
+              if (request->cancel)
+                break;
+              else
+                {
+                  clearerr (fd);
+                  continue;
+                }
+             }
+ 
+          request->logging_function (gftp_logging_error, request->user_data,
+                                    _("Error: Could not write to socket: %s\n"),
+                                    g_strerror (errno));
+          gftp_disconnect (request);
+          return (-1);
+        }
+    }
+  while (errno == EINTR && !request->cancel);
+
+  if (errno == EINTR && request->cancel)
+    {
+      gftp_disconnect (request);
+      return (-1);
+    }
+
+  return (ret);
+}
+