1/* 2 * Part of Very Secure FTPd 3 * Licence: GPL v2 4 * Author: Chris Evans 5 * readwrite.c 6 * 7 * Routines to encapsulate the underlying read / write mechanism (OpenSSL vs. 8 * plain read()/write()). 9 */ 10 11#include "readwrite.h" 12#include "session.h" 13#include "netstr.h" 14#include "ssl.h" 15#include "privsock.h" 16#include "defs.h" 17#include "sysutil.h" 18 19int 20ftp_write_str(const struct vsf_session* p_sess, const struct mystr* p_str, 21 enum EVSFRWTarget target) 22{ 23 if (target == kVSFRWData) 24 { 25 if (p_sess->data_use_ssl) 26 { 27 return ssl_write_str(p_sess->p_data_ssl, p_str); 28 } 29 else 30 { 31 return str_netfd_write(p_str, p_sess->data_fd); 32 } 33 } 34 else 35 { 36 if (p_sess->control_use_ssl && p_sess->ssl_slave_active) 37 { 38 priv_sock_send_cmd(p_sess->ssl_consumer_fd, PRIV_SOCK_WRITE_USER_RESP); 39 priv_sock_send_str(p_sess->ssl_consumer_fd, p_str); 40 return priv_sock_get_int(p_sess->ssl_consumer_fd); 41 } 42 else if (p_sess->control_use_ssl) 43 { 44 return ssl_write_str(p_sess->p_control_ssl, p_str); 45 } 46 else 47 { 48 return str_netfd_write(p_str, VSFTP_COMMAND_FD); 49 } 50 } 51} 52 53int 54ftp_read_data(const struct vsf_session* p_sess, char* p_buf, unsigned int len) 55{ 56 if (p_sess->data_use_ssl) 57 { 58 return ssl_read(p_sess->p_data_ssl, p_buf, len); 59 } 60 else 61 { 62 return vsf_sysutil_read(p_sess->data_fd, p_buf, len); 63 } 64} 65 66int 67ftp_write_data(const struct vsf_session* p_sess, const char* p_buf, 68 unsigned int len) 69{ 70 if (p_sess->data_use_ssl) 71 { 72 return ssl_write(p_sess->p_data_ssl, p_buf, len); 73 } 74 else 75 { 76 return vsf_sysutil_write_loop(p_sess->data_fd, p_buf, len); 77 } 78} 79 80void 81ftp_getline(const struct vsf_session* p_sess, struct mystr* p_str, char* p_buf) 82{ 83 if (p_sess->control_use_ssl && p_sess->ssl_slave_active) 84 { 85 priv_sock_send_cmd(p_sess->ssl_consumer_fd, PRIV_SOCK_GET_USER_CMD); 86 priv_sock_get_str(p_sess->ssl_consumer_fd, p_str); 87 } 88 else if (p_sess->control_use_ssl) 89 { 90 ssl_getline(p_sess, p_str, '\n', p_buf, VSFTP_MAX_COMMAND_LINE); 91 } 92 else 93 { 94 str_netfd_alloc( 95 p_str, VSFTP_COMMAND_FD, '\n', p_buf, VSFTP_MAX_COMMAND_LINE); 96 } 97} 98 99