Mercurial > gftp.yaz
diff lib/sshv2.c @ 58:c01d91c10f6c
2002-11-20 Brian Masney <masneyb@gftp.org>
* lib/protocols.c lib/gftp.h - added gftp_get_line(), gftp_read(),
gftp_write(), gftp_writefmt(), and gftp_set_sockblocking() functions.
Added struct_gftp_getline_buffer for gftp_get_line function()
* lib/cache.c lib/gftp.h lib/local.c lib/misc.c lib/protocols.c
lib/rfc2068.c lib/rfc959.c lib/ssh.c lib/sshv2.c - *_get_file() returns
off_t instead of long. *_{get,put}_next_file_chunk returns ssize_t
instead of size_t. Added *_set_config_options function to gftp_request
structure and protocol files. Use the new network functions
documented above. Convert usage of ANSI C IO (FILE *) to standard BSD
sockets so that I can use timeouts properly with select
* lib/misc.c (ssh_start_login_sequence) - use gftp_set_sockblock(),
gftp_read() and gftp_write() functions
* lib/protocols.c - move some protocol specific code to the protocol
specific files
* lib/local.c - log succesful messages to gftp_logging_misc instead
of gftp_logging_error
* lib/cache.c - log some more error conditions to the user
* lib/rfc959.c - added rfc959_getcwd(). In,
rfc959_accept_active_connection(), set set socket to blocking mode
before calling accept()
* src/text/gftk-text.c - If we get no files in gftp_text_ls(),
return instead of segfaulting
* src/gtk/gftp-gtk.c - expand the port field in the toolbar to be 45
pixels wide
* src/text/gftp-text.c src/gtk/misc-gtk.c src/gtk/transfer.c
src/gtk/view_dialog.c - changes for conversion of request->{sock,data}
from ANSI C IO (FILE *) to standard BSD sockets
author | masneyb |
---|---|
date | Thu, 21 Nov 2002 00:33:51 +0000 |
parents | a12bcbc2fce4 |
children | 42df9e4be8e0 |
line wrap: on
line diff
--- a/lib/sshv2.c Tue Nov 12 00:04:44 2002 +0000 +++ b/lib/sshv2.c Thu Nov 21 00:33:51 2002 +0000 @@ -305,7 +305,7 @@ sshv2_log_command (request, gftp_logging_send, type, buf + 5, len); - if (gftp_fwrite (request, buf, len + 5, request->sockfd_write) < 0) + if (gftp_write (request, buf, len + 5, request->sockfd) < 0) return (-2); return 0; @@ -314,30 +314,23 @@ static int sshv2_read_response (gftp_request * request, sshv2_message * message, - FILE * fd) + int fd) { ssize_t numread; char buf[5]; - if (fd == NULL) + if (fd <= 0) fd = request->sockfd; - numread = fread (buf, 5, 1, fd); - if (ferror (fd)) - { - request->logging_function (gftp_logging_error, request->user_data, - _("Error: Could not read from socket: %s\n"), - g_strerror (errno)); - gftp_disconnect (request); - return (-1); - } + if ((numread = gftp_read (request, buf, 5, fd)) < 0) + return (-2); -#ifdef DEBUG +/* #ifdef DEBUG*/ printf ("\rReceived: "); for (numread=0; numread<5; numread++) printf ("%x ", buf[numread]); fflush (stdout); -#endif +/* #endif*/ memcpy (&message->length, buf, 4); message->length = ntohl (message->length); @@ -350,29 +343,24 @@ gftp_disconnect (request); return (-1); } + message->command = buf[4]; message->buffer = g_malloc (message->length); message->pos = message->buffer; message->end = message->buffer + message->length - 1; - numread = fread (message->buffer, message->length - 1, 1, fd); - if (ferror (fd)) - { - request->logging_function (gftp_logging_error, request->user_data, - _("Error: Could not read from socket: %s\n"), - g_strerror (errno)); - gftp_disconnect (request); - return (-1); - } + if ((numread = gftp_read (request, message->buffer, message->length -1, fd)) < 0) + + return (-2); + message->buffer[message->length - 1] = '\0'; -#ifdef DEBUG - printf ("\rReceived: "); +/* #ifdef DEBUG*/ for (numread=0; numread<message->length - 1; numread++) printf ("%x ", message->buffer[numread]); printf ("\n"); -#endif +/* #endif*/ sshv2_log_command (request, gftp_logging_recv, message->command, message->buffer, message->length); @@ -500,7 +488,7 @@ } memset (&message, 0, sizeof (message)); - if (sshv2_read_response (request, &message, NULL) != SSH_FXP_NAME) + if (sshv2_read_response (request, &message, -1) != SSH_FXP_NAME) { request->logging_function (gftp_logging_error, request->user_data, _("Received wrong response from server, disconnecting\n")); @@ -526,14 +514,13 @@ char **args, *tempstr, pts_name[20], *p1, p2, *exepath, port[6]; int version, fdm, fds, s[2]; sshv2_message message; - const gchar *errstr; 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); - if (request->sockfd != NULL) + if (request->sockfd > 0) return (0); request->logging_function (gftp_logging_misc, request->user_data, @@ -612,11 +599,7 @@ execvp (ssh_prog_name != NULL && *ssh_prog_name != '\0' ? ssh_prog_name : "ssh", args); - tempstr = _("Error: Cannot execute ssh: "); - write (1, tempstr, strlen (tempstr)); - errstr = g_strerror (errno); - write (1, errstr, strlen (errstr)); - write (1, "\n", 1); + printf (_("Error: Cannot execute ssh: %s\n"), g_strerror (errno)); return (-1); } else if (child > 0) @@ -645,30 +628,14 @@ g_free (args); g_free (exepath); - if ((request->sockfd = fdopen (fdm, "rb+")) == NULL) - { - request->logging_function (gftp_logging_error, request->user_data, - _("Cannot fdopen() socket: %s\n"), - g_strerror (errno)); - close (fdm); - return (-2); - } - - if ((request->sockfd_write = fdopen (fdm, "wb+")) == NULL) - { - request->logging_function (gftp_logging_error, request->user_data, - _("Cannot fdopen() socket: %s\n"), - g_strerror (errno)); - gftp_disconnect (request); - return (-2); - } + request->sockfd = fdm; version = htonl (SSH_MY_VERSION); if (sshv2_send_command (request, SSH_FXP_INIT, (char *) &version, 4) < 0) return (-2); memset (&message, 0, sizeof (message)); - if (sshv2_read_response (request, &message, NULL) != SSH_FXP_VERSION) + if (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")); @@ -692,7 +659,7 @@ } sshv2_getcwd (request); - if (request->sockfd == NULL) + if (request->sockfd < 0) return (-2); return (0); @@ -709,13 +676,18 @@ params = request->protocol_data; - if (request->sockfd != NULL) + if (request->sockfd > 0) { request->logging_function (gftp_logging_misc, request->user_data, _("Disconnecting from site %s\n"), request->hostname); - fclose (request->sockfd); - request->sockfd = request->sockfd_write = NULL; + + if (close (request->sockfd) < 0) + request->logging_function (gftp_logging_error, request->user_data, + _("Error closing file descriptor: %s\n"), + g_strerror (errno)); + + request->sockfd = -1; } if (params->message.buffer != NULL) @@ -750,7 +722,7 @@ return (-2); memset (&message, 0, sizeof (message)); - if (sshv2_read_response (request, &message, NULL) != SSH_FXP_STATUS) + if (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")); @@ -782,7 +754,7 @@ 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 != NULL, -2); + g_return_val_if_fail (request->sockfd > 0, -2); params = request->protocol_data; @@ -806,7 +778,7 @@ g_free (tempstr); memset (&message, 0, sizeof (message)); - if (sshv2_read_response (request, &message, NULL) != SSH_FXP_HANDLE) + if (sshv2_read_response (request, &message, -1) != SSH_FXP_HANDLE) { request->logging_function (gftp_logging_error, request->user_data, _("Received wrong response from server, disconnecting\n")); @@ -836,7 +808,7 @@ static int -sshv2_get_next_file (gftp_request * request, gftp_file * fle, FILE * fd) +sshv2_get_next_file (gftp_request * request, gftp_file * fle, int fd) { gint32 len, attrs, longnamelen; int ret, i, count, retsize; @@ -1070,7 +1042,7 @@ g_free (tempstr); memset (&message, 0, sizeof (message)); - if (sshv2_read_response (request, &message, NULL) != SSH_FXP_NAME) + if (sshv2_read_response (request, &message, -1) != SSH_FXP_NAME) { request->logging_function (gftp_logging_error, request->user_data, _("Received wrong response from server, disconnecting\n")); @@ -1140,7 +1112,7 @@ g_free (tempstr); memset (&message, 0, sizeof (message)); - if (sshv2_read_response (request, &message, NULL) < 0) + if (sshv2_read_response (request, &message, -1) < 0) return (-2); message.pos += 4; @@ -1197,7 +1169,7 @@ g_free (tempstr); memset (&message, 0, sizeof (message)); - if (sshv2_read_response (request, &message, NULL) < 0) + if (sshv2_read_response (request, &message, -1) < 0) return (-2); message.pos += 4; @@ -1261,7 +1233,7 @@ g_free (tempstr); memset (&message, 0, sizeof (message)); - if (sshv2_read_response (request, &message, NULL) < 0) + if (sshv2_read_response (request, &message, -1) < 0) return (-2); message.pos += 4; @@ -1319,7 +1291,7 @@ g_free (tempstr); memset (&message, 0, sizeof (message)); - if (sshv2_read_response (request, &message, NULL) < 0) + if (sshv2_read_response (request, &message, -1) < 0) return (-2); message.pos += 4; @@ -1390,7 +1362,7 @@ g_free (tempstr); memset (&message, 0, sizeof (message)); - if (sshv2_read_response (request, &message, NULL) < 0) + if (sshv2_read_response (request, &message, -1) < 0) return (-2); message.pos += 4; @@ -1456,7 +1428,7 @@ g_free (tempstr); memset (&message, 0, sizeof (message)); - if (sshv2_read_response (request, &message, NULL) < 0) + if (sshv2_read_response (request, &message, -1) < 0) return (-2); message.pos += 4; @@ -1514,7 +1486,7 @@ g_free (tempstr); memset (¶ms->message, 0, sizeof (params->message)); - if (sshv2_read_response (request, ¶ms->message, NULL) != SSH_FXP_ATTRS) + if (sshv2_read_response (request, ¶ms->message, -1) != SSH_FXP_ATTRS) { request->logging_function (gftp_logging_error, request->user_data, _("Received wrong response from server, disconnecting\n")); @@ -1555,8 +1527,8 @@ } -static long -sshv2_get_file (gftp_request * request, const char *file, FILE * fd, +static off_t +sshv2_get_file (gftp_request * request, const char *file, int fd, off_t startsize) { sshv2_params * params; @@ -1567,7 +1539,7 @@ 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 != NULL, -2); + g_return_val_if_fail (request->sockfd > 0, -2); /* fd ignored for this protocol */ params = request->protocol_data; @@ -1607,7 +1579,7 @@ g_free (tempstr); memset (&message, 0, sizeof (message)); - if (sshv2_read_response (request, &message, NULL) != SSH_FXP_HANDLE) + if (sshv2_read_response (request, &message, -1) != SSH_FXP_HANDLE) { request->logging_function (gftp_logging_error, request->user_data, _("Received wrong response from server, disconnecting\n")); @@ -1637,7 +1609,7 @@ static int -sshv2_put_file (gftp_request * request, const char *file, FILE * fd, +sshv2_put_file (gftp_request * request, const char *file, int fd, off_t startsize, off_t totalsize) { sshv2_params * params; @@ -1648,7 +1620,7 @@ 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 != NULL, -2); + g_return_val_if_fail (request->sockfd > 0, -2); /* fd ignored for this protocol */ params = request->protocol_data; @@ -1691,7 +1663,7 @@ g_free (tempstr); memset (&message, 0, sizeof (message)); - if (sshv2_read_response (request, &message, NULL) != SSH_FXP_HANDLE) + if (sshv2_read_response (request, &message, -1) != SSH_FXP_HANDLE) { request->logging_function (gftp_logging_error, request->user_data, _("Received wrong response from server, disconnecting\n")); @@ -1720,7 +1692,7 @@ } -static size_t +static ssize_t sshv2_get_next_file_chunk (gftp_request * request, char *buf, size_t size) { sshv2_params * params; @@ -1735,7 +1707,7 @@ 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 != NULL, -2); + g_return_val_if_fail (request->sockfd > 0, -2); g_return_val_if_fail (buf != NULL, -2); params = request->protocol_data; @@ -1766,7 +1738,7 @@ return (-2); memset (&message, 0, sizeof (message)); - if (sshv2_read_response (request, &message, NULL) != SSH_FXP_DATA) + if (sshv2_read_response (request, &message, -1) != SSH_FXP_DATA) { message.pos += 4; if ((num = sshv2_buffer_get_int32 (request, &message, SSH_FX_OK)) < 0) @@ -1802,7 +1774,7 @@ } -static size_t +static ssize_t sshv2_put_next_file_chunk (gftp_request * request, char *buf, size_t size) { sshv2_params * params; @@ -1819,7 +1791,7 @@ 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 != NULL, -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); @@ -1852,7 +1824,7 @@ memset (&message, 0, sizeof (message)); params->dont_log_status = 1; - ret = sshv2_read_response (request, &message, NULL); + ret = sshv2_read_response (request, &message, -1); params->dont_log_status = 0; if (ret != SSH_FXP_STATUS) { @@ -1878,6 +1850,26 @@ } +static void +sshv2_set_config_options (gftp_request * request) +{ + if (request->sftpserv_path != NULL) + { + if (ssh2_sftp_path != NULL && + strcmp (ssh2_sftp_path, request->sftpserv_path) == 0) + return; + + g_free (request->sftpserv_path); + request->sftpserv_path = NULL; + } + + if (ssh2_sftp_path != NULL) + request->sftpserv_path = g_strdup (ssh2_sftp_path); + + request->need_userpass = ssh_need_userpass; +} + + void sshv2_init (gftp_request * request) { @@ -1910,6 +1902,7 @@ request->set_file_time = sshv2_set_file_time; request->site = NULL; request->parse_url = NULL; + request->set_config_options = sshv2_set_config_options; request->url_prefix = "ssh2"; request->protocol_name = "SSH2"; request->need_hostport = 1;