# HG changeset patch # User masneyb # Date 1089686675 0 # Node ID 76c4e4cd108e873122b59dd044669b0fa9800a54 # Parent e60a6ec4aa85add4efef665028f6b7faeaef3ac6 2004-7-12 Brian Masney * lib/sshv2.c - added sshv2_decode_file_attributes(). This is used by sshv2_get_next_file() and sshv2_get_file_size(). (sshv2_get_next_file_chunk) - if the error SSH_FX_FAILURE was returned, then do not return wrong message received from server to the user * lib/protocols.c (gftp_get_transfer_status) - when there is a transfer error, make sure that an incoming signal does not interrupt the timeout * src/gtk/gftp-gtk.c src/uicommon/gftpui.c - make sure the SIGCHLD signal handler reaps the zombies in the text port. diff -r e60a6ec4aa85 -r 76c4e4cd108e ChangeLog --- a/ChangeLog Tue Jul 13 01:35:15 2004 +0000 +++ b/ChangeLog Tue Jul 13 02:44:35 2004 +0000 @@ -1,4 +1,16 @@ 2004-7-12 Brian Masney + * lib/sshv2.c - added sshv2_decode_file_attributes(). This is used + by sshv2_get_next_file() and sshv2_get_file_size(). + (sshv2_get_next_file_chunk) - if the error SSH_FX_FAILURE was returned, + then do not return wrong message received from server to the user + + * lib/protocols.c (gftp_get_transfer_status) - when there is a + transfer error, make sure that an incoming signal does not + interrupt the timeout + + * src/gtk/gftp-gtk.c src/uicommon/gftpui.c - make sure the SIGCHLD + signal handler reaps the zombies in the text port. + * docs/rfcs/* - added RFCs that are used by this program 2004-7-11 Brian Masney @@ -2537,7 +2549,7 @@ * cvsclean - added this script - * *.[ch] - added $Id: ChangeLog,v 1.276 2004/07/13 01:35:15 masneyb Exp $ tags + * *.[ch] - added $Id: ChangeLog,v 1.277 2004/07/13 02:44:34 masneyb Exp $ tags * debian/* - updated files from Debian maintainer diff -r e60a6ec4aa85 -r 76c4e4cd108e lib/protocols.c --- a/lib/protocols.c Tue Jul 13 01:35:15 2004 +0000 +++ b/lib/protocols.c Tue Jul 13 02:44:35 2004 +0000 @@ -2723,10 +2723,10 @@ int gftp_get_transfer_status (gftp_transfer * tdata, ssize_t num_read) { - int ret1, ret2; intptr_t retries, sleep_time; gftp_file * tempfle; struct timeval tv; + int ret1, ret2; ret1 = ret2 = 0; gftp_lookup_request_option (tdata->fromreq, "retries", &retries); @@ -2783,7 +2783,12 @@ { tv.tv_sec = sleep_time; tv.tv_usec = 0; - select (0, NULL, NULL, NULL, &tv); + + do + { + ret1 = select (0, NULL, NULL, NULL, &tv); + } + while (ret1 == -1 && errno == EINTR); } else tdata->conn_error_no_timeout = 0; diff -r e60a6ec4aa85 -r 76c4e4cd108e lib/sshv2.c --- a/lib/sshv2.c Tue Jul 13 01:35:15 2004 +0000 +++ b/lib/sshv2.c Tue Jul 13 02:44:35 2004 +0000 @@ -105,6 +105,9 @@ #define SSH_FXP_REALPATH 16 #define SSH_FXP_STAT 17 #define SSH_FXP_RENAME 18 +#define SSH_FXP_READLINK 19 +#define SSH_FXP_SYMLINK 20 + #define SSH_FXP_STATUS 101 #define SSH_FXP_HANDLE 102 #define SSH_FXP_DATA 103 @@ -119,6 +122,12 @@ #define SSH_FILEXFER_ATTR_ACMODTIME 0x00000008 #define SSH_FILEXFER_ATTR_EXTENDED 0x80000000 +#define SSH_FILEXFER_TYPE_REGULAR 1 +#define SSH_FILEXFER_TYPE_DIRECTORY 2 +#define SSH_FILEXFER_TYPE_SYMLINK 3 +#define SSH_FILEXFER_TYPE_SPECIAL 4 +#define SSH_FILEXFER_TYPE_UNKNOWN 5 + #define SSH_FXF_READ 0x00000001 #define SSH_FXF_WRITE 0x00000002 #define SSH_FXF_APPEND 0x00000004 @@ -1162,11 +1171,91 @@ static int +sshv2_decode_file_attributes (gftp_request * request, sshv2_message * message, + gftp_file * fle) +{ + gint32 attrs, hinum, num, count; + sshv2_params *params; + int i; + + params = request->protocol_data; + + if ((attrs = sshv2_buffer_get_int32 (request, message, -1)) < 0) + return (attrs); + + if (attrs & SSH_FILEXFER_ATTR_SIZE) + { + if ((hinum = sshv2_buffer_get_int32 (request, message, -1)) < 0) + return (hinum); + + if ((num = sshv2_buffer_get_int32 (request, message, -1)) < 0) + return (num); + +#if G_HAVE_GINT64 + fle->size = (gint64) num | ((gint64) hinum >> 32); +#else + fle->size = num; +#endif + } + + if (attrs & SSH_FILEXFER_ATTR_UIDGID) + { + if ((num = sshv2_buffer_get_int32 (request, message, -1)) < 0) + return (num); + + if ((num = sshv2_buffer_get_int32 (request, message, -1)) < 0) + return (num); + } + + if (attrs & SSH_FILEXFER_ATTR_PERMISSIONS) + { + if ((num = sshv2_buffer_get_int32 (request, message, -1)) < 0) + return (num); + } + + if (attrs & SSH_FILEXFER_ATTR_ACMODTIME) + { + if ((num = sshv2_buffer_get_int32 (request, message, -1)) < 0) + return (num); + + if ((num = sshv2_buffer_get_int32 (request, message, -1)) < 0) + return (num); + + fle->datetime = num; + } + + if (attrs & SSH_FILEXFER_ATTR_EXTENDED) + { + if ((count = sshv2_buffer_get_int32 (request, message, -1)) < 0) + return (GFTP_EFATAL); + + printf ("FIXME - file %d extended attributes\n", count); + for (i=0; ipos + num + 4 > message->end) + return (GFTP_EFATAL); + + message->pos += num + 4; + + if ((num = sshv2_buffer_get_int32 (request, message, -1)) < 0 || + message->pos + num + 4 > message->end) + return (GFTP_EFATAL); + + message->pos += num + 4; + } + } + + return (0); +} + + +static int sshv2_get_next_file (gftp_request * request, gftp_file * fle, int fd) { - gint32 len, attrs, longnamelen; - int ret, i, count, retsize; + gint32 len, longnamelen; sshv2_params *params; + int ret, retsize; char *longname; g_return_val_if_fail (request != NULL, GFTP_EFATAL); @@ -1238,63 +1327,6 @@ return (GFTP_EFATAL); longname = params->message.pos; - params->message.pos += longnamelen; - - if ((attrs = sshv2_buffer_get_int32 (request, ¶ms->message, -1)) < 0) - return (attrs); - - if (attrs & SSH_FILEXFER_ATTR_SIZE) - { - params->message.pos += 8; - if (params->message.pos > params->message.end) - return (sshv2_wrong_response (request, ¶ms->message)); - } - - if (attrs & SSH_FILEXFER_ATTR_UIDGID) - { - params->message.pos += 8; - if (params->message.pos > params->message.end) - return (sshv2_wrong_response (request, ¶ms->message)); - } - - if (attrs & SSH_FILEXFER_ATTR_PERMISSIONS) - { - params->message.pos += 4; - if (params->message.pos > params->message.end) - return (sshv2_wrong_response (request, ¶ms->message)); - } - - if (attrs & SSH_FILEXFER_ATTR_ACMODTIME) - { - params->message.pos += 8; - if (params->message.pos > params->message.end) - return (sshv2_wrong_response (request, ¶ms->message)); - } - - if (attrs & SSH_FILEXFER_ATTR_EXTENDED) - { - if ((count = sshv2_buffer_get_int32 (request, - ¶ms->message, -1)) < 0) - return (GFTP_EFATAL); - - for (i=0; imessage, -1)) < 0 || - params->message.pos + len + 4 > params->message.end) - return (GFTP_EFATAL); - - params->message.pos += len + 4; - - if ((len = sshv2_buffer_get_int32 (request, - ¶ms->message, -1)) < 0 || - params->message.pos + len + 4 > params->message.end) - return (GFTP_EFATAL); - - params->message.pos += len + 4; - } - } - longname[longnamelen] = '\0'; /* The commercial SSH2 puts a / and * after some entries */ @@ -1303,13 +1335,22 @@ if (longname[longnamelen - 1] == '/') longname[--longnamelen] = '\0'; + params->message.pos += longnamelen; + if ((ret = gftp_parse_ls (request, longname, fle, 0)) < 0) { gftp_file_destroy (fle); return (ret); } + + if ((ret = sshv2_decode_file_attributes (request, ¶ms->message, + fle)) < 0) + { + gftp_file_destroy (fle); + return (ret); + } + retsize = strlen (longname); - params->count--; } else if (ret == SSH_FXP_STATUS) @@ -1634,10 +1675,11 @@ static off_t sshv2_get_file_size (gftp_request * request, const char *file) { - gint32 len, highnum, lownum, attrs; sshv2_message message; + gftp_file fle; char *tempstr; int serv_ret; + gint32 len; off_t ret; g_return_val_if_fail (request != NULL, GFTP_EFATAL); @@ -1662,31 +1704,18 @@ return (GFTP_EFATAL); message.pos += 4; - - if ((attrs = sshv2_buffer_get_int32 (request, &message, -1)) < 0) - return (GFTP_ERETRYABLE); - - if (attrs & SSH_FILEXFER_ATTR_SIZE) + memset (&fle, 0, sizeof (fle)); + if ((serv_ret = sshv2_decode_file_attributes (request, &message, &fle)) < 0) { - if ((highnum = sshv2_buffer_get_int32 (request, &message, -1)) < 0) - return (GFTP_ERETRYABLE); - - if ((lownum = sshv2_buffer_get_int32 (request, &message, -1)) < 0) - return (GFTP_ERETRYABLE); - - sshv2_message_free (&message); - -#if G_HAVE_GINT64 - ret = (gint64) lownum | ((gint64) highnum >> 32); - return (ret); -#else - return (lownum); -#endif + gftp_file_destroy (&fle); + return (serv_ret); } + ret = fle.size; + gftp_file_destroy (&fle); sshv2_message_free (&message); - return (0); + return (ret); } @@ -1863,7 +1892,10 @@ if ((num = sshv2_buffer_get_int32 (request, &message, SSH_FX_OK)) < 0) return (num); sshv2_message_free (&message); - if (num != SSH_FX_EOF) + + if (num == SSH_FX_FAILURE) + return (GFTP_ERETRYABLE); + else if (num != SSH_FX_EOF) return (sshv2_wrong_response (request, &message)); return (0); diff -r e60a6ec4aa85 -r 76c4e4cd108e src/gtk/gftp-gtk.c --- a/src/gtk/gftp-gtk.c Tue Jul 13 01:35:15 2004 +0000 +++ b/src/gtk/gftp-gtk.c Tue Jul 13 02:44:35 2004 +0000 @@ -1226,6 +1226,7 @@ gftp_option_types[gftp_option_type_color].write_function = gftp_gtk_config_file_write_color; gftpui_common_init (&argc, &argv, ftp_log); + gftpui_common_child_process_done = 0; g_thread_init (NULL); diff -r e60a6ec4aa85 -r 76c4e4cd108e src/uicommon/gftpui.c --- a/src/uicommon/gftpui.c Tue Jul 13 01:35:15 2004 +0000 +++ b/src/uicommon/gftpui.c Tue Jul 13 02:44:35 2004 +0000 @@ -122,7 +122,18 @@ static RETSIGTYPE gftpui_common_sig_child (int signo) { - gftpui_common_child_process_done = 1; + int ret; + + if (gftpui_common_child_process_done == -1) + { + /* Running from text port */ + while (waitpid (-1, &ret, WNOHANG) > 0) + { + /* Nothing */ + } + } + else + gftpui_common_child_process_done = 1; } @@ -144,6 +155,7 @@ exit (0); gftpui_common_logfunc = logfunc; + gftpui_common_child_process_done = -1; }