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;