summaryrefslogtreecommitdiff
path: root/ACE/ace/SSL/SSL_SOCK_Acceptor.h
blob: 25fa8741f7da34d3bf641cd05e4d6de28a3ddcfa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
// -*- C++ -*-

//=============================================================================
/**
 *  @file    SSL_SOCK_Acceptor.h
 *
 *  $Id$
 *
 *  @author John Heitmann
 *  @author Chris Zimman
 *  @author Ossama Othman <ossama@uci.edu>
 */
//=============================================================================

#ifndef ACE_SSL_SOCK_ACCEPTOR_H
#define ACE_SSL_SOCK_ACCEPTOR_H

#include /**/ "ace/pre.h"

#include "SSL_Export.h"

#if !defined (ACE_LACKS_PRAGMA_ONCE)
# pragma once
#endif /* ACE_LACKS_PRAGMA_ONCE */

#include "SSL_SOCK_Stream.h"

#include "ace/SOCK_Acceptor.h"
#include "ace/OS_QoS.h"

ACE_BEGIN_VERSIONED_NAMESPACE_DECL

/**
 * @class ACE_SSL_SOCK_Acceptor
 *
 * @brief Defines a factory that creates new @c ACE_SSL_SOCK_Stream
 * objects passively.
 *
 * The ACE_SSL_SOCK_Acceptor has its own @c ACE_SOCK_Acceptor
 * which handles the basic socket acceptance.  This class is a
 * wrapper which adds the SSL acceptance handshake handling.
 * Since SSL is record oriented, some additional steps must be taken
 * after the basic socket acceptance to complete the SSL handshake that
 * takes place at session establishment.
 *
 * @note The user must currently ensure that only one thread services
 *       a given SSL session at any given time since some underlying
 *       SSL implementations, such as OpenSSL, are not entirely
 *       thread-safe or reentrant.
 */
class ACE_SSL_Export ACE_SSL_SOCK_Acceptor : public ACE_SSL_SOCK
{
public:

  /// Default constructor.
  ACE_SSL_SOCK_Acceptor (void);

  /// Default destructor.
  ~ACE_SSL_SOCK_Acceptor (void);

  /**
   * Initiate a passive mode SSL/BSD-style acceptor socket.
   * @param local_sap  The address that we're going to listen for
   *                   connections on. If this is @c ACE_Addr::sap_any,
   *                   this socket listens on an the "any" IP address
   *                   and selects an unused port. To find out what port
   *                   was selected, call this object's
   *                   @c ACE_SOCK::get_local_addr(ACE_Addr&) method
   *                   upon return.
   */
  ACE_SSL_SOCK_Acceptor (const ACE_Addr &local_sap,
                         int reuse_addr = 0,
                         int protocol_family = PF_UNSPEC,
                         int backlog = ACE_DEFAULT_BACKLOG,
                         int protocol = 0);

  /**
   * Initiate a passive-mode QoS-enabled acceptor socket.
   * @param local_sap  The address that we're going to listen for
   *                   connections on. If this is @c ACE_Addr::sap_any,
   *                   this socket listens on an the "any" IP address
   *                   and selects an unused port. To find out what port
   *                   was selected, call this object's
   *                   @c ACE_SOCK::get_local_addr(ACE_Addr&) method
   *                   upon return.
   */
  ACE_SSL_SOCK_Acceptor (const ACE_Addr &local_sap,
                         ACE_Protocol_Info *protocolinfo,
                         ACE_SOCK_GROUP g,
                         u_long flags,
                         int reuse_addr,
                         int protocol_family = PF_UNSPEC,
                         int backlog = ACE_DEFAULT_BACKLOG,
                         int protocol = 0);

  /**
   * Initiate a passive mode SSL/BSD-style acceptor socket.
   * @param local_sap  The address that we're going to listen for
   *                   connections on. If this is @c ACE_Addr::sap_any,
   *                   this socket listens on an the "any" IP address
   *                   and selects an unused port. To find out what port
   *                   was selected, call this object's
   *                   @c ACE_SOCK::get_local_addr(ACE_Addr&) method
   *                   upon return.
   *
   * @return 0 if success; -1 for failure (errno contains error code).
   */
  int open (const ACE_Addr &local_sap,
            int reuse_addr = 0,
            int protocol_family = PF_UNSPEC,
            int backlog = ACE_DEFAULT_BACKLOG,
            int protocol = 0);

  /// Close the listening socket.
  int close (void);

  /**
   * @name Passive Connection "accept" Methods
   *
   * These are the canonical methods exposed by the Acceptor pattern.
   */
  //@{
  /**
   * Accept a new ACE_SSL_SOCK_Stream connection. On successful return,
   * the socket has been accepted and the SSL handshake has been completed.
   * @param new_stream  The @c ACE_SSL_SOCK_Stream object that will receive
   *                    the new SSL socket.
   * @param remote_addr Pointer to an @c ACE_INET_Addr object that will
   *                    receive the address of the peer that connected.
   * @param timeout     The maximum time to wait for the combined socket
   *                    acceptance and handshake completion. 0 means
   *                    block forever, a timeout of {0, 0} means poll.
   * @param restart     1 means "restart if interrupted," that is,
   *                    if errno == EINTR.
   *
   * @return 0 if success; -1 for failure (errno contains error code).
   */
  int accept (ACE_SSL_SOCK_Stream &new_stream,
              ACE_Addr *remote_addr = 0,
              ACE_Time_Value *timeout = 0,
              bool restart = true,
              bool reset_new_handle = false) const;

  /**
   * Accept a new ACE_SSL_SOCK_Stream connection using the RVSP QoS
   * information in qos_params.
   * @param new_stream  The @c ACE_SSL_SOCK_Stream object that will receive
   *                    the new SSL socket.
   * @param remote_addr Pointer to an @c ACE_INET_Addr object that will
   *                    receive the address of the peer that connected.
   * @param timeout     The maximum time to wait for the combined socket
   *                    acceptance and handshake completion. 0 means
   *                    block forever, a timeout of {0, 0} means poll.
   * @param restart     1 means "restart if interrupted," that is,
   *                    if errno == EINTR.
   *
   * @return 0 if success; -1 for failure (errno contains error code).
   */
  int accept (ACE_SSL_SOCK_Stream &new_stream,
              ACE_Accept_QoS_Params qos_params,
              ACE_Addr *remote_addr = 0,
              ACE_Time_Value *timeout = 0,
              bool restart = true,
              bool reset_new_handle = false) const;
  //@}

  /// Meta-type info
  //@{
  typedef ACE_INET_Addr PEER_ADDR;
  typedef ACE_SSL_SOCK_Stream PEER_STREAM;
  //@}

  /// Declare the dynamic allocation hooks.
  ACE_ALLOC_HOOK_DECLARE;

protected:

  /// Complete SSL passive connection establishment.
  int ssl_accept (ACE_SSL_SOCK_Stream &new_stream,
                  ACE_Time_Value *timeout) const;

private:

  /// The BSD-socket workhorse
  ACE_SOCK_Acceptor acceptor_;

};

ACE_END_VERSIONED_NAMESPACE_DECL

#if defined (__ACE_INLINE__)
#include "SSL_SOCK_Acceptor.inl"
#endif /* __ACE_INLINE__ */

#include /**/ "ace/post.h"

#endif /* ACE_SSL_SOCK_ACCEPTOR_H */