⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 conn.h

📁 The Kannel Open Source WAP and SMS gateway works as both an SMS gateway, for implementing keyword b
💻 H
字号:
/* ====================================================================  * The Kannel Software License, Version 1.0  *  * Copyright (c) 2001-2004 Kannel Group   * Copyright (c) 1998-2001 WapIT Ltd.    * All rights reserved.  *  * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions  * are met:  *  * 1. Redistributions of source code must retain the above copyright  *    notice, this list of conditions and the following disclaimer.  *  * 2. Redistributions in binary form must reproduce the above copyright  *    notice, this list of conditions and the following disclaimer in  *    the documentation and/or other materials provided with the  *    distribution.  *  * 3. The end-user documentation included with the redistribution,  *    if any, must include the following acknowledgment:  *       "This product includes software developed by the  *        Kannel Group (http://www.kannel.org/)."  *    Alternately, this acknowledgment may appear in the software itself,  *    if and wherever such third-party acknowledgments normally appear.  *  * 4. The names "Kannel" and "Kannel Group" must not be used to  *    endorse or promote products derived from this software without  *    prior written permission. For written permission, please   *    contact org@kannel.org.  *  * 5. Products derived from this software may not be called "Kannel",  *    nor may "Kannel" appear in their name, without prior written  *    permission of the Kannel Group.  *  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE  * DISCLAIMED.  IN NO EVENT SHALL THE KANNEL GROUP OR ITS CONTRIBUTORS  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,   * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT   * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR   * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,   * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE   * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,   * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  * ====================================================================  *  * This software consists of voluntary contributions made by many  * individuals on behalf of the Kannel Group.  For more information on   * the Kannel Group, please see <http://www.kannel.org/>.  *  * Portions of this software are based upon software originally written at   * WapIT Ltd., Helsinki, Finland for the Kannel project.   */ /* * conn.h - declare Connection type to wrap a file descriptor * * This file defines operations on the Connection type, which provides * input and output buffers for a two-way file descriptor, such as a * socket or a serial device. * * The operations are designed for non-blocking use.  Blocking can be * done explicitly with conn_wait() or conn_flush().  A thread that * blocks in these functions can be woken up with gwthread_wakeup. * * The write operations will queue the data for sending.  They will * try to send whatever data can be sent immediately, if there's enough * of it queued.  "Enough" is defined by a value which can be set with * conn_set_output_buffering.  The caller must call either conn_wait * or conn_flush to actually send the data. * * The read operations will return whatever data is immediately * available.  If none is, then the caller should not simply re-try * the request (that would cause a busy-loop); instead, it should * wait for more data with conn_wait(). * * The Connection structure has internal locks, so it can be shared * safely between threads.  There is a race condition in the interface, * however, that can cause threads to wait unnecessarily if there are * multiple readers.  But in that case there will always be at least one * thread busy reading. * * The overhead of locking can be avoided by "claiming" a Connection. * This means that only one thread will ever do operations on that * Connection; the caller must guarantee this. * * If any operation returns a code that indicates that the connection * is broken (due to an I/O error, normally), it will also have closed * the connection.  Most operations work only on open connections; * not much can be done with a closed connection except destroy it. */typedef struct Connection Connection;/* If conn_register was called for this connection, a callback function * of type conn_callback_t will be called when new input is available, * or when all data that was previously queued for output is sent. * The data pointer is the one supplied by the caller of conn_register. * NOTE: Beware of concurrency issues.  The callback function will run * in the fdset's private thread, not in the caller's thread. * This also means that if the callback does a lot of work it will slow * down the polling process.  This may be good or bad. */typedef void conn_callback_t(Connection *conn, void *data);#ifdef HAVE_LIBSSL/* Open an SSL connection to the given host and port.  Same behavior * as conn_open_tcp() below. 'certkeyfile' specifies a PEM-encoded * file where OpenSSL looks for a private key and a certificate.  */Connection *conn_open_ssl(Octstr *host, int port, Octstr *certkeyfile,		Octstr *our_host);void server_ssl_init(void); /* used by http.c */#endif /* HAVE_LIBSSL *//* * get the SSL config parameters from the provided Config group. * For a non-SSL system this is a no-op that does nothing. */void conn_config_ssl (CfgGroup *grp);/* Open a TCP/IP connection to the given host and port.  Return the * new Connection.  If the connection can not be made, return NULL * and log the problem. */Connection *conn_open_tcp(Octstr *host, int port, Octstr *our_host);/* As above, but binds our end to 'our_port'. If 'our_port' is 0, uses * any port like conn_open_tcp. */Connection *conn_open_tcp_with_port(Octstr *host, int port, int our_port,		Octstr *our_host);/* Open a TCP/IP connection to the given host and port.  Return NULL in case of * error. Overwise return new Connection. */Connection *conn_open_tcp_nb(Octstr *host, int port, Octstr *our_host);/* As above, but binds our end to 'our_port'. If 'our_port' is 0, uses * any port like conn_open_tcp. */Connection *conn_open_tcp_nb_with_port(Octstr *host, int port, int our_port,				       Octstr *our_host);/* Returns 0 if socket is connected, -1 overwise */int conn_is_connected(Connection *conn);/* If socket is in the 'connecting' state, it must be listen by poller. * After poller returns, connection must be checked for connection  * procedure's result. Return 0 if connection done successfully */int conn_get_connect_result(Connection *conn);/* Create a Connection structure around the given file descriptor. * The file descriptor must not be used for anything else after this; * it must always be accessed via the Connection operations.  This * operation cannot fail. Second var indicates if the is a SSL enabled * connection. */Connection *conn_wrap_fd(int fd, int ssl);/* Close and deallocate a Connection.  Log any errors reported by * the close operation. */void conn_destroy(Connection *conn);/* Assert that the calling thread will be the only one to ever * use this Connection.  From now on no locking will be done * on this Connection. * It is a fatal error for two threads to try to claim one Connection, * or for another thread to try to use a Connection that has been claimed. */void conn_claim(Connection *conn);/* Return the length of the unsent data queued for sending, in octets. */long conn_outbuf_len(Connection *conn);/* Return the length of the unprocessed data ready for reading, in octets. */long conn_inbuf_len(Connection *conn);/* Return 1 if there was an end-of-file indication from the last read or * wait operation. */int conn_eof(Connection *conn);/* Return 1 if there was an error indication from the last read or wait * operation. */int conn_error(Connection *conn);/* Try to write data in chunks of this size or more.  Set it to 0 to * get an unbuffered connection.  See the discussion on output buffering * at the top of this file for more information. */void conn_set_output_buffering(Connection *conn, unsigned int size);/* Register this connection with an FDSet.  This will make it unnecessary * to call conn_wait.  Instead, the callback function will be called when * there is new data available, or when all data queued for output is * sent (note that small amounts are usually sent immediately without * queuing, and thus won't trigger the callback).  A connection can be * registered with only one FDSet at a time.  Return -1 if it was * already registered with a different FDSet, otherwise return 0. * A connection can be re-registered with the same FDSet.  This will * change only the callback information, and is much more efficient * than calling conn_unregister first. * NOTE: Using conn_register will always mean that the Connection will be * used by more than one thread, so don't also call conn_claim. */int conn_register(Connection *conn, FDSet *fdset,                  conn_callback_t callback, void *data);/* Remove the current registration. */void conn_unregister(Connection *conn);/* Block the thread until one of the following is true: *   - The timeout expires *   - New data is available for reading *   - Some data queued for output is sent (if there was any) *   - The thread is woken up via the wakeup interface (in gwthread.h) * Return 1 if the timeout expired.  Return 0 otherwise, if the * connection is okay.  Return -1 if the connection is broken. * If the timeout is 0 seconds, check for the conditions above without * actually blocking.  If it is negative, block indefinitely. */int conn_wait(Connection *conn, double seconds);/* Try to send all data currently queued for output.  Block until this * is done, or until the thread is interrupted or woken up.  Return 0 * if it worked, 1 if there was an interruption, or -1 if the connection * is broken. */int conn_flush(Connection *conn);/* Output functions.  Each of these takes an open connection and some * data, formats the data and queues it for sending.  It may also * try to send the data immediately.  The current implementation always * does so. * Return 0 if the data was sent, 1 if it was queued for sending, * and -1 if the connection is broken. */int conn_write(Connection *conn, Octstr *data);int conn_write_data(Connection *conn, unsigned char *data, long length);/* Write the length of the octstr as a standard network long, then * write the octstr itself. */int conn_write_withlen(Connection *conn, Octstr *data);/* Input functions.  Each of these takes an open connection and * returns data if it's available, or NULL if it's not.  They will * not block.  They will try to read in more data if there's not * enough in the buffer to fill the request. *//* Return whatever data is available. */Octstr *conn_read_everything(Connection *conn);/* Return exactly "length" octets of data, if at least that many * are available.  Otherwise return NULL. */Octstr *conn_read_fixed(Connection *conn, long length);/* If the input buffer starts with a full line of data (terminated by * LF or CR LF), then return that line as an Octstr and remove it * from the input buffer.  Otherwise return NULL. */Octstr *conn_read_line(Connection *conn);/* Read a standard network long giving the length of the following * data, then read the data itself, and pack it into an Octstr and * remove it from the input buffer.  Otherwise return NULL. */Octstr *conn_read_withlen(Connection *conn);/* If the input buffer contains a packet delimited by the "startmark" * and "endmark" characters, then return that packet (including the marks) * and delete everything up to the end of that packet from the input buffer. * Otherwise return NULL. * Everything up to the first startmark is discarded.  */Octstr *conn_read_packet(Connection *conn, int startmark, int endmark);#ifdef HAVE_LIBSSL#include <openssl/x509.h>#include <openssl/ssl.h>/* Returns the SSL peer certificate for the given Connection or NULL * if none.  */X509 *get_peer_certificate(Connection *conn);/* These are called to initialize and shutdown the OpenSSL mutex locks. * They should be called before the _init_ssl, _shutdown_ssl functions. */void openssl_init_locks(void);void openssl_shutdown_locks(void); /* These must be called if SSL is used. Currently http.c calls  * conn_init_ssl and server_init_ssl from http_init and  * conn_shutdown_ssl and server_shutdown_ssl from http_shutdown.  */void conn_init_ssl(void);void conn_shutdown_ssl(void);void server_init_ssl(void);void server_shutdown_ssl(void);/* Specifies a global PEM-encoded certificate and a private key file  * to be used with SSL client connections (outgoing HTTP requests).  * conn_init_ssl() must be called first. This checks that the private  * key matches with the certificate and will panic if it doesn't. */void use_global_client_certkey_file(Octstr *certkeyfile);/* Specifies a global PEM-encoded certificate and a private key file  * to be used with SSL server connections (incoming HTTP requests).  * conn_init_ssl() must be called first. This checks that the private  * key matches with the certificate and will panic if it doesn't. */void use_global_server_certkey_file(Octstr *certfile, Octstr *keyfile); /* Configures all global variables for client and server SSL mode  * from the values specified within the configuration file. */void conn_config_ssl(CfgGroup *grp);/* Returns the pointer to the SSL structure of the Connection given. * This should be used for determining if certain connections are  * SSL enabled outside of the scope of conn.c. */SSL *conn_get_ssl(Connection *conn);X509 *conn_get_peer_certificate(Connection *conn);#endif /* HAVE_LIBSSL */int conn_get_id(Connection *conn);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -