conn.h
上传用户:gzpyjq
上传日期:2013-01-31
资源大小:1852k
文件大小:11k
源码类别:

手机WAP编程

开发平台:

WINDOWS

  1. /*
  2.  * conn.h - declare Connection type to wrap a file descriptor
  3.  *
  4.  * This file defines operations on the Connection type, which provides
  5.  * input and output buffers for a two-way file descriptor, such as a
  6.  * socket or a serial device.
  7.  *
  8.  * The operations are designed for non-blocking use.  Blocking can be
  9.  * done explicitly with conn_wait() or conn_flush().  A thread that
  10.  * blocks in these functions can be woken up with gwthread_wakeup.
  11.  *
  12.  * The write operations will queue the data for sending.  They will
  13.  * try to send whatever data can be sent immediately, if there's enough
  14.  * of it queued.  "Enough" is defined by a value which can be set with
  15.  * conn_set_output_buffering.  The caller must call either conn_wait
  16.  * or conn_flush to actually send the data.
  17.  *
  18.  * The read operations will return whatever data is immediately
  19.  * available.  If none is, then the caller should not simply re-try
  20.  * the request (that would cause a busy-loop); instead, it should
  21.  * wait for more data with conn_wait().
  22.  *
  23.  * The Connection structure has internal locks, so it can be shared
  24.  * safely between threads.  There is a race condition in the interface,
  25.  * however, that can cause threads to wait unnecessarily if there are
  26.  * multiple readers.  But in that case there will always be at least one
  27.  * thread busy reading.
  28.  *
  29.  * The overhead of locking can be avoided by "claiming" a Connection.
  30.  * This means that only one thread will ever do operations on that
  31.  * Connection; the caller must guarantee this.
  32.  *
  33.  * If any operation returns a code that indicates that the connection
  34.  * is broken (due to an I/O error, normally), it will also have closed
  35.  * the connection.  Most operations work only on open connections;
  36.  * not much can be done with a closed connection except destroy it.
  37.  */
  38. typedef struct Connection Connection;
  39. /* If conn_register was called for this connection, a callback function
  40.  * of type conn_callback_t will be called when new input is available,
  41.  * or when all data that was previously queued for output is sent.
  42.  * The data pointer is the one supplied by the caller of conn_register.
  43.  * NOTE: Beware of concurrency issues.  The callback function will run
  44.  * in the fdset's private thread, not in the caller's thread.
  45.  * This also means that if the callback does a lot of work it will slow
  46.  * down the polling process.  This may be good or bad. */
  47. typedef void conn_callback_t(Connection *conn, void *data);
  48. #ifdef HAVE_LIBSSL
  49. /* Open an SSL connection to the given host and port.  Same behavior
  50.  * as conn_open_tcp() below. 'certkeyfile' specifies a PEM-encoded
  51.  * file where OpenSSL looks for a private key and a certificate. 
  52.  */
  53. Connection *conn_open_ssl(Octstr *host, int port, Octstr *certkeyfile,
  54. Octstr *our_host);
  55. void server_ssl_init(void); /* used by http.c */
  56. #endif /* HAVE_LIBSSL */
  57. /*
  58.  * get the SSL config parameters from the provided Config group.
  59.  * For a non-SSL system this is a no-op that does nothing.
  60.  */
  61. void conn_config_ssl (CfgGroup *grp);
  62. /* Open a TCP/IP connection to the given host and port.  Return the
  63.  * new Connection.  If the connection can not be made, return NULL
  64.  * and log the problem. */
  65. Connection *conn_open_tcp(Octstr *host, int port, Octstr *our_host);
  66. /* As above, but binds our end to 'our_port'. If 'our_port' is 0, uses
  67.  * any port like conn_open_tcp. */
  68. Connection *conn_open_tcp_with_port(Octstr *host, int port, int our_port,
  69. Octstr *our_host);
  70. /* Create a Connection structure around the given file descriptor.
  71.  * The file descriptor must not be used for anything else after this;
  72.  * it must always be accessed via the Connection operations.  This
  73.  * operation cannot fail. Second var indicates if the is a SSL enabled
  74.  * connection. */
  75. Connection *conn_wrap_fd(int fd, int ssl);
  76. /* Close and deallocate a Connection.  Log any errors reported by
  77.  * the close operation. */
  78. void conn_destroy(Connection *conn);
  79. /* Assert that the calling thread will be the only one to ever
  80.  * use this Connection.  From now on no locking will be done
  81.  * on this Connection.
  82.  * It is a fatal error for two threads to try to claim one Connection,
  83.  * or for another thread to try to use a Connection that has been claimed.
  84.  */
  85. void conn_claim(Connection *conn);
  86. /* Return the length of the unsent data queued for sending, in octets. */
  87. long conn_outbuf_len(Connection *conn);
  88. /* Return the length of the unprocessed data ready for reading, in octets. */
  89. long conn_inbuf_len(Connection *conn);
  90. /* Return 1 iff there was an end-of-file indication from the last read or
  91.  * wait operation. */
  92. int conn_eof(Connection *conn);
  93. /* Return 1 iff there was an error indication from the last read or wait
  94.  * operation. */
  95. int conn_read_error(Connection *conn);
  96. /* Try to write data in chunks of this size or more.  Set it to 0 to
  97.  * get an unbuffered connection.  See the discussion on output buffering
  98.  * at the top of this file for more information. */
  99. void conn_set_output_buffering(Connection *conn, unsigned int size);
  100. /* Register this connection with an FDSet.  This will make it unnecessary
  101.  * to call conn_wait.  Instead, the callback function will be called when
  102.  * there is new data available, or when all data queued for output is
  103.  * sent (note that small amounts are usually sent immediately without
  104.  * queuing, and thus won't trigger the callback).  A connection can be
  105.  * registered with only one FDSet at a time.  Return -1 if it was
  106.  * already registered with a different FDSet, otherwise return 0.
  107.  * A connection can be re-registered with the same FDSet.  This will
  108.  * change only the callback information, and is much more efficient
  109.  * than calling conn_unregister first.
  110.  * NOTE: Using conn_register will always mean that the Connection will be
  111.  * used by more than one thread, so don't also call conn_claim. */
  112. int conn_register(Connection *conn, FDSet *fdset,
  113.                   conn_callback_t callback, void *data);
  114. /* Remove the current registration. */
  115. void conn_unregister(Connection *conn);
  116. /* Block the thread until one of the following is true:
  117.  *   - The timeout expires
  118.  *   - New data is available for reading
  119.  *   - Some data queued for output is sent (if there was any)
  120.  *   - The thread is woken up via the wakeup interface (in gwthread.h)
  121.  * Return 1 if the timeout expired.  Return 0 otherwise, if the
  122.  * connection is okay.  Return -1 if the connection is broken.
  123.  * If the timeout is 0 seconds, check for the conditions above without
  124.  * actually blocking.  If it is negative, block indefinitely.
  125.  */
  126. int conn_wait(Connection *conn, double seconds);
  127. /* Try to send all data currently queued for output.  Block until this
  128.  * is done, or until the thread is interrupted or woken up.  Return 0
  129.  * if it worked, 1 if there was an interruption, or -1 if the connection
  130.  * is broken. */
  131. int conn_flush(Connection *conn);
  132. /* Output functions.  Each of these takes an open connection and some
  133.  * data, formats the data and queues it for sending.  It may also
  134.  * try to send the data immediately.  The current implementation always
  135.  * does so.
  136.  * Return 0 if the data was sent, 1 if it was queued for sending,
  137.  * and -1 if the connection is broken.
  138.  */
  139. int conn_write(Connection *conn, Octstr *data);
  140. int conn_write_data(Connection *conn, unsigned char *data, long length);
  141. /* Write the length of the octstr as a standard network long, then
  142.  * write the octstr itself. */
  143. int conn_write_withlen(Connection *conn, Octstr *data);
  144. /* Input functions.  Each of these takes an open connection and
  145.  * returns data if it's available, or NULL if it's not.  They will
  146.  * not block.  They will try to read in more data if there's not
  147.  * enough in the buffer to fill the request. */
  148. /* Return whatever data is available. */
  149. Octstr *conn_read_everything(Connection *conn);
  150. /* Return exactly "length" octets of data, if at least that many
  151.  * are available.  Otherwise return NULL.
  152.  */
  153. Octstr *conn_read_fixed(Connection *conn, long length);
  154. /* If the input buffer starts with a full line of data (terminated by
  155.  * LF or CR LF), then return that line as an Octstr and remove it
  156.  * from the input buffer.  Otherwise return NULL.
  157.  */
  158. Octstr *conn_read_line(Connection *conn);
  159. /* Read a standard network long giving the length of the following
  160.  * data, then read the data itself, and pack it into an Octstr and
  161.  * remove it from the input buffer.  Otherwise return NULL.
  162.  */
  163. Octstr *conn_read_withlen(Connection *conn);
  164. /* If the input buffer contains a packet delimited by the "startmark"
  165.  * and "endmark" characters, then return that packet (including the marks)
  166.  * and delete everything up to the end of that packet from the input buffer.
  167.  * Otherwise return NULL.
  168.  * Everything up to the first startmark is discarded.
  169.   */
  170. Octstr *conn_read_packet(Connection *conn, int startmark, int endmark);
  171. #ifdef HAVE_LIBSSL
  172. #include <openssl/x509.h>
  173. #include <openssl/ssl.h>
  174. /* Returns the SSL peer certificate for the given Connection or NULL
  175.  * if none. 
  176.  */
  177. X509 *get_peer_certificate(Connection *conn);
  178. /* Sets OpenSSL locking for callback within conn.c (client SSL) and 
  179.  * http.c (server SSL).
  180.  */
  181. void openssl_locking_function(int mode, int n, const char *file, int line);
  182. /* These must be called if SSL is used. Currently http.c calls 
  183.  * conn_init_ssl and server_init_ssl from http_init and 
  184.  * conn_shutdown_ssl and server_shutdown_ssl from http_shutdown. 
  185.  */
  186. void conn_init_ssl(void);
  187. void conn_shutdown_ssl(void);
  188. void server_init_ssl(void);
  189. void server_shutdown_ssl(void);
  190. /* Specifies a global PEM-encoded certificate and a private key file 
  191.  * to be used with SSL client connections (outgoing HTTP requests). 
  192.  * conn_init_ssl() must be called first. This checks that the private 
  193.  * key matches with the certificate and will panic if it doesn't.
  194.  */
  195. void use_global_client_certkey_file(Octstr *certkeyfile);
  196. /* Specifies a global PEM-encoded certificate and a private key file 
  197.  * to be used with SSL server connections (incoming HTTP requests). 
  198.  * conn_init_ssl() must be called first. This checks that the private 
  199.  * key matches with the certificate and will panic if it doesn't.
  200.  */
  201. void use_global_server_certkey_file(Octstr *certfile, Octstr *keyfile); 
  202. /* Configures all global variables for client and server SSL mode 
  203.  * from the values specified within the configuration file.
  204.  */
  205. void conn_config_ssl(CfgGroup *grp);
  206. /* Returns the pointer to the SSL structure of the Connection given.
  207.  * This should be used for determining if certain connections are 
  208.  * SSL enabled outside of the scope of conn.c.
  209.  */
  210. SSL *conn_get_ssl(Connection *conn);
  211. X509 *conn_get_peer_certificate(Connection *conn);
  212. RSA *tmp_rsa_callback(SSL *ssl, int export, int key_len);
  213. void openssl_server_locking_function(int mode, int n, const char *file, int line);
  214. #endif /* HAVE_LIBSSL */
  215. int conn_get_id(Connection *conn);