~ubuntu-branches/ubuntu/utopic/vsftpd/utopic-proposed

« back to all changes in this revision

Viewing changes to readwrite.c

  • Committer: Bazaar Package Importer
  • Author(s): Daniel Baumann
  • Date: 2009-05-03 17:49:00 UTC
  • mto: (2.4.1 sid) (1.5.1 upstream)
  • mto: This revision was merged to the branch mainline in revision 15.
  • Revision ID: james.westby@ubuntu.com-20090503174900-0osuifgr8jknvu5e
Tags: upstream-2.1.1~pre1
ImportĀ upstreamĀ versionĀ 2.1.1~pre1

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
#include "defs.h"
17
17
#include "sysutil.h"
18
18
 
 
19
static int plain_peek_adapter(struct vsf_session* p_sess,
 
20
                              char* p_buf,
 
21
                              unsigned int len);
 
22
static int plain_read_adapter(struct vsf_session* p_sess,
 
23
                              char* p_buf,
 
24
                              unsigned int len);
 
25
static int ssl_peek_adapter(struct vsf_session* p_sess,
 
26
                            char* p_buf,
 
27
                            unsigned int len);
 
28
static int ssl_read_adapter(struct vsf_session* p_sess,
 
29
                            char* p_buf,
 
30
                            unsigned int len);
 
31
 
19
32
int
20
33
ftp_write_str(const struct vsf_session* p_sess, const struct mystr* p_str,
21
34
              enum EVSFRWTarget target)
22
35
{
23
36
  if (target == kVSFRWData)
24
37
  {
25
 
    if (p_sess->data_use_ssl)
 
38
    if (p_sess->data_use_ssl && p_sess->ssl_slave_active)
 
39
    {
 
40
      int ret = -1;
 
41
      int written;
 
42
      priv_sock_send_cmd(p_sess->ssl_consumer_fd, PRIV_SOCK_DO_SSL_WRITE);
 
43
      priv_sock_send_str(p_sess->ssl_consumer_fd, p_str);
 
44
      written = priv_sock_get_int(p_sess->ssl_consumer_fd);
 
45
      if (written > 0 && written == (int) str_getlen(p_str))
 
46
      {
 
47
        ret = 0;
 
48
      }
 
49
      return ret;
 
50
    }
 
51
    else if (p_sess->data_use_ssl)
26
52
    {
27
53
      return ssl_write_str(p_sess->p_data_ssl, p_str);
28
54
    }
53
79
int
54
80
ftp_read_data(struct vsf_session* p_sess, char* p_buf, unsigned int len)
55
81
{
56
 
  if (p_sess->data_use_ssl)
57
 
  {
58
 
    return ssl_read(p_sess, p_buf, len);
 
82
  if (p_sess->data_use_ssl && p_sess->ssl_slave_active)
 
83
  {
 
84
    int ret;
 
85
    priv_sock_send_cmd(p_sess->ssl_consumer_fd, PRIV_SOCK_DO_SSL_READ);
 
86
    ret = priv_sock_get_int(p_sess->ssl_consumer_fd);
 
87
    priv_sock_recv_buf(p_sess->ssl_consumer_fd, p_buf, len);
 
88
    return ret;
 
89
  }
 
90
  else if (p_sess->data_use_ssl)
 
91
  {
 
92
    return ssl_read(p_sess, p_sess->p_data_ssl, p_buf, len);
59
93
  }
60
94
  else
61
95
  {
67
101
ftp_write_data(const struct vsf_session* p_sess, const char* p_buf,
68
102
               unsigned int len)
69
103
{
70
 
  if (p_sess->data_use_ssl)
 
104
  if (p_sess->data_use_ssl && p_sess->ssl_slave_active)
 
105
  {
 
106
    priv_sock_send_cmd(p_sess->ssl_consumer_fd, PRIV_SOCK_DO_SSL_WRITE);
 
107
    priv_sock_send_buf(p_sess->ssl_consumer_fd, p_buf, len);
 
108
    return priv_sock_get_int(p_sess->ssl_consumer_fd);
 
109
  }
 
110
  else if (p_sess->data_use_ssl)
71
111
  {
72
112
    return ssl_write(p_sess->p_data_ssl, p_buf, len);
73
113
  }
78
118
}
79
119
 
80
120
void
81
 
ftp_getline(const struct vsf_session* p_sess, struct mystr* p_str, char* p_buf)
 
121
ftp_getline(struct vsf_session* p_sess, struct mystr* p_str, char* p_buf)
82
122
{
83
123
  if (p_sess->control_use_ssl && p_sess->ssl_slave_active)
84
124
  {
85
125
    priv_sock_send_cmd(p_sess->ssl_consumer_fd, PRIV_SOCK_GET_USER_CMD);
86
126
    priv_sock_get_str(p_sess->ssl_consumer_fd, p_str);
87
127
  }
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
128
  else
93
129
  {
94
 
    str_netfd_alloc(
95
 
      p_str, VSFTP_COMMAND_FD, '\n', p_buf, VSFTP_MAX_COMMAND_LINE);
 
130
    str_netfd_read_t p_peek = plain_peek_adapter;
 
131
    str_netfd_read_t p_read = plain_read_adapter;
 
132
    if (p_sess->control_use_ssl)
 
133
    {
 
134
      p_peek = ssl_peek_adapter;
 
135
      p_read = ssl_read_adapter;
 
136
    }
 
137
    str_netfd_alloc(p_sess,
 
138
                    p_str,
 
139
                    '\n',
 
140
                    p_buf,
 
141
                    VSFTP_MAX_COMMAND_LINE,
 
142
                    p_peek,
 
143
                    p_read);
96
144
  }
97
145
}
98
146
 
 
147
static int
 
148
plain_peek_adapter(struct vsf_session* p_sess, char* p_buf, unsigned int len)
 
149
{
 
150
  (void) p_sess;
 
151
  return vsf_sysutil_recv_peek(VSFTP_COMMAND_FD, p_buf, len);
 
152
}
 
153
 
 
154
static int
 
155
plain_read_adapter(struct vsf_session* p_sess, char* p_buf, unsigned int len)
 
156
{
 
157
  (void) p_sess;
 
158
  return vsf_sysutil_read_loop(VSFTP_COMMAND_FD, p_buf, len);
 
159
}
 
160
 
 
161
static int
 
162
ssl_peek_adapter(struct vsf_session* p_sess, char* p_buf, unsigned int len)
 
163
{
 
164
  return ssl_peek(p_sess, p_sess->p_control_ssl, p_buf, len);
 
165
}
 
166
 
 
167
static int
 
168
ssl_read_adapter(struct vsf_session* p_sess, char* p_buf, unsigned int len)
 
169
{
 
170
  return ssl_read(p_sess, p_sess->p_control_ssl, p_buf, len);
 
171
}