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