Mercurial > gftp.yaz
comparison lib/sshv2.c @ 538:ee182b8d1a54
2004-8-17 Brian Masney <masneyb@gftp.org>
* lib/sshv2.c - renamed read_buffer in sshv2_params to
transfer_buffer. In sshv2_put_next_file_chunk(), dynamically allocate
memory for transfer_buffer instead of using a fixed buffer on the
stack. This allows for large transfer buffer sizes.
author | masneyb |
---|---|
date | Wed, 18 Aug 2004 04:11:26 +0000 |
parents | c568539856d2 |
children | e46278e7ef1d |
comparison
equal
deleted
inserted
replaced
537:c568539856d2 | 538:ee182b8d1a54 |
---|---|
54 } sshv2_message; | 54 } sshv2_message; |
55 | 55 |
56 typedef struct sshv2_params_tag | 56 typedef struct sshv2_params_tag |
57 { | 57 { |
58 char handle[SSH_MAX_HANDLE_SIZE + 4], /* We'll encode the ID in here too */ | 58 char handle[SSH_MAX_HANDLE_SIZE + 4], /* We'll encode the ID in here too */ |
59 *read_buffer; | 59 *transfer_buffer; |
60 size_t handle_len, transfer_buffer_len; | |
60 | 61 |
61 guint32 id, | 62 guint32 id, |
62 count; | 63 count; |
63 size_t handle_len; | |
64 sshv2_message message; | 64 sshv2_message message; |
65 | 65 |
66 unsigned int initialized : 1, | 66 unsigned int initialized : 1, |
67 dont_log_status : 1; /* For uploading files */ | 67 dont_log_status : 1; /* For uploading files */ |
68 | 68 |
1103 | 1103 |
1104 sshv2_message_free (&message); | 1104 sshv2_message_free (&message); |
1105 params->handle_len = 0; | 1105 params->handle_len = 0; |
1106 } | 1106 } |
1107 | 1107 |
1108 if (params->read_buffer != NULL) | 1108 if (params->transfer_buffer != NULL) |
1109 { | 1109 { |
1110 g_free (params->read_buffer); | 1110 g_free (params->transfer_buffer); |
1111 params->read_buffer = NULL; | 1111 params->transfer_buffer = NULL; |
1112 } | 1112 } |
1113 | 1113 |
1114 return (0); | 1114 return (0); |
1115 } | 1115 } |
1116 | 1116 |
1783 } | 1783 } |
1784 | 1784 |
1785 memset (params->handle, 0, 4); | 1785 memset (params->handle, 0, 4); |
1786 memcpy (params->handle + 4, message.buffer + 4, message.length - 5); | 1786 memcpy (params->handle + 4, message.buffer + 4, message.length - 5); |
1787 params->handle_len = message.length - 1; | 1787 params->handle_len = message.length - 1; |
1788 printf ("FIXME - handle len is %d\n", params->handle_len); | |
1789 sshv2_message_free (&message); | 1788 sshv2_message_free (&message); |
1790 | 1789 |
1791 return (0); | 1790 return (0); |
1792 } | 1791 } |
1793 | 1792 |
1872 g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL); | 1871 g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL); |
1873 g_return_val_if_fail (buf != NULL, GFTP_EFATAL); | 1872 g_return_val_if_fail (buf != NULL, GFTP_EFATAL); |
1874 | 1873 |
1875 params = request->protocol_data; | 1874 params = request->protocol_data; |
1876 | 1875 |
1877 if (params->read_buffer == NULL) | 1876 if (params->transfer_buffer == NULL) |
1878 { | 1877 { |
1879 params->read_buffer = g_malloc (params->handle_len + 12); | 1878 params->transfer_buffer_len = params->handle_len + 12; |
1880 num = htonl (params->handle_len); | 1879 params->transfer_buffer = g_malloc (params->transfer_buffer_len); |
1881 memcpy (params->read_buffer, params->handle, params->handle_len); | 1880 memcpy (params->transfer_buffer, params->handle, params->handle_len); |
1882 } | 1881 } |
1883 | 1882 |
1884 num = htonl (params->id++); | 1883 num = htonl (params->id++); |
1885 memcpy (params->read_buffer, &num, 4); | 1884 memcpy (params->transfer_buffer, &num, 4); |
1886 | 1885 |
1887 sshv2_setup_file_offset (params, params->read_buffer); | 1886 sshv2_setup_file_offset (params, params->transfer_buffer); |
1888 | 1887 |
1889 num = htonl (size); | 1888 num = htonl (size); |
1890 memcpy (params->read_buffer + params->handle_len + 8, &num, 4); | 1889 memcpy (params->transfer_buffer + params->handle_len + 8, &num, 4); |
1891 | 1890 |
1892 if (sshv2_send_command (request, SSH_FXP_READ, params->read_buffer, | 1891 if ((ret = sshv2_send_command (request, SSH_FXP_READ, params->transfer_buffer, |
1893 params->handle_len + 12) < 0) | 1892 params->handle_len + 12)) < 0) |
1894 return (GFTP_ERETRYABLE); | 1893 return (ret); |
1895 | 1894 |
1896 memset (&message, 0, sizeof (message)); | 1895 memset (&message, 0, sizeof (message)); |
1897 if ((ret = sshv2_read_response (request, &message, -1)) != SSH_FXP_DATA) | 1896 if ((ret = sshv2_read_response (request, &message, -1)) != SSH_FXP_DATA) |
1898 { | 1897 { |
1899 if (ret < 0) | 1898 if (ret < 0) |
1931 static ssize_t | 1930 static ssize_t |
1932 sshv2_put_next_file_chunk (gftp_request * request, char *buf, size_t size) | 1931 sshv2_put_next_file_chunk (gftp_request * request, char *buf, size_t size) |
1933 { | 1932 { |
1934 sshv2_params * params; | 1933 sshv2_params * params; |
1935 sshv2_message message; | 1934 sshv2_message message; |
1936 char tempstr[32768]; | |
1937 guint32 num; | 1935 guint32 num; |
1938 size_t len; | |
1939 int ret; | 1936 int ret; |
1940 | 1937 |
1941 g_return_val_if_fail (request != NULL, GFTP_EFATAL); | 1938 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
1942 g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, GFTP_EFATAL); | 1939 g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, GFTP_EFATAL); |
1943 g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL); | 1940 g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL); |
1944 g_return_val_if_fail (buf != NULL, GFTP_EFATAL); | 1941 g_return_val_if_fail (buf != NULL, GFTP_EFATAL); |
1945 g_return_val_if_fail (size <= 32500, GFTP_EFATAL); | |
1946 | 1942 |
1947 params = request->protocol_data; | 1943 params = request->protocol_data; |
1948 | 1944 |
1949 memcpy (tempstr, params->handle, params->handle_len); | 1945 if (params->transfer_buffer == NULL) |
1946 { | |
1947 params->transfer_buffer_len = params->handle_len + size + 12; | |
1948 params->transfer_buffer = g_malloc (params->transfer_buffer_len); | |
1949 memcpy (params->transfer_buffer, params->handle, params->handle_len); | |
1950 } | |
1950 | 1951 |
1951 num = htonl (params->id++); | 1952 num = htonl (params->id++); |
1952 memcpy (tempstr, &num, 4); | 1953 memcpy (params->transfer_buffer, &num, 4); |
1953 | 1954 |
1954 sshv2_setup_file_offset (params, tempstr); | 1955 sshv2_setup_file_offset (params, params->transfer_buffer); |
1955 | 1956 |
1956 num = htonl (size); | 1957 num = htonl (size); |
1957 memcpy (tempstr + params->handle_len + 8, &num, 4); | 1958 memcpy (params->transfer_buffer + params->handle_len + 8, &num, 4); |
1958 memcpy (tempstr + params->handle_len + 12, buf, size); | 1959 memcpy (params->transfer_buffer + params->handle_len + 12, buf, size); |
1959 | 1960 |
1960 len = params->handle_len + size + 12; | 1961 if ((ret = sshv2_send_command (request, SSH_FXP_WRITE, |
1961 if (sshv2_send_command (request, SSH_FXP_WRITE, tempstr, len) < 0) | 1962 params->transfer_buffer, |
1962 { | 1963 params->transfer_buffer_len)) < 0) |
1963 g_free (tempstr); | 1964 return (ret); |
1964 return (GFTP_ERETRYABLE); | |
1965 } | |
1966 | 1965 |
1967 memset (&message, 0, sizeof (message)); | 1966 memset (&message, 0, sizeof (message)); |
1968 params->dont_log_status = 1; | 1967 params->dont_log_status = 1; |
1969 ret = sshv2_read_response (request, &message, -1); | 1968 ret = sshv2_read_response (request, &message, -1); |
1970 if (ret < 0) | 1969 if (ret < 0) |
2037 | 2036 |
2038 dparms = dest_request->protocol_data; | 2037 dparms = dest_request->protocol_data; |
2039 sparms = src_request->protocol_data; | 2038 sparms = src_request->protocol_data; |
2040 | 2039 |
2041 memcpy (dparms->handle, sparms->handle, sizeof (*dparms->handle)); | 2040 memcpy (dparms->handle, sparms->handle, sizeof (*dparms->handle)); |
2042 if (sparms->read_buffer) | 2041 if (sparms->transfer_buffer != NULL) |
2043 dparms->read_buffer = g_strdup (sparms->read_buffer); | 2042 { |
2043 dparms->transfer_buffer = g_malloc (sparms->transfer_buffer_len); | |
2044 memcpy (dparms->transfer_buffer, sparms->transfer_buffer, | |
2045 sparms->transfer_buffer_len); | |
2046 } | |
2044 else | 2047 else |
2045 dparms->read_buffer = NULL; | 2048 dparms->transfer_buffer = NULL; |
2046 | 2049 |
2047 sshv2_copy_message (&sparms->message, &dparms->message); | 2050 sshv2_copy_message (&sparms->message, &dparms->message); |
2048 | 2051 |
2049 dparms->id = sparms->id; | 2052 dparms->id = sparms->id; |
2050 dparms->count = sparms->count; | 2053 dparms->count = sparms->count; |