Mercurial > gftp.yaz
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); +} +
