[asterisk-commits] rizzo: trunk r48324 - in /trunk: include/asterisk/http.h main/http.c

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Wed Dec 6 09:17:57 MST 2006


Author: rizzo
Date: Wed Dec  6 10:17:57 2006
New Revision: 48324

URL: http://svn.digium.com/view/asterisk?view=rev&rev=48324
Log:
Make externally visible some generic code useful to create
and implement services over tcp and/or tcp-tls.
 
This commit is nothing more than moving structure definitions
(and documentation) from main/http.c to include/asterisk/http.h
(temporary location until we find a better place), and removing the
'static' qualifier from server_root() and server_start().
 
The name change (adding the ast_ prefix as a minimum, and then
possibly a more meaningful name) is postponed to future commits.

Does not apply to other versions of asterisk.


Modified:
    trunk/include/asterisk/http.h
    trunk/main/http.c

Modified: trunk/include/asterisk/http.h
URL: http://svn.digium.com/view/asterisk/trunk/include/asterisk/http.h?view=diff&rev=48324&r1=48323&r2=48324
==============================================================================
--- trunk/include/asterisk/http.h (original)
+++ trunk/include/asterisk/http.h Wed Dec  6 10:17:57 2006
@@ -28,6 +28,102 @@
         only support the "GET" method.
   \author Mark Spencer <markster at digium.com>
 */
+
+/*!
+ * In order to have TLS/SSL support, we need the openssl libraries.
+ * Still we can decide whether or not to use them by commenting
+ * in or out the DO_SSL macro.
+ * TLS/SSL support is basically implemented by reading from a config file
+ * (currently http.conf) the names of the certificate and cipher to use,
+ * and then run ssl_setup() to create an appropriate SSL_CTX (ssl_ctx)
+ * If we support multiple domains, presumably we need to read multiple
+ * certificates.
+ * When we are requested to open a TLS socket, we run make_file_from_fd()
+ * on the socket, to do the necessary setup. At the moment the context's name
+ * is hardwired in the function, but we can certainly make it into an extra
+ * parameter to the function.
+ *
+ * We declare most of ssl support variables unconditionally,
+ * because their number is small and this simplifies the code.
+ *
+ * NOTE: the ssl-support variables (ssl_ctx, do_ssl, certfile, cipher)
+ * and their setup should be moved to a more central place, e.g. asterisk.conf
+ * and the source files that processes it. Similarly, ssl_setup() should
+ * be run earlier in the startup process so modules have it available.
+ */
+
+#if defined(HAVE_OPENSSL) && (defined(HAVE_FUNOPEN) || defined(HAVE_FOPENCOOKIE))
+#define	DO_SSL	/* comment in/out if you want to support ssl */
+#endif
+
+#ifdef DO_SSL
+#include <openssl/ssl.h>
+#include <openssl/err.h>
+#else
+typedef struct {} SSL;	/* so we can define a pointer to it */
+#endif /* DO_SSL */
+
+/*!
+ * The following code implements a generic mechanism for starting
+ * services on a TCP or TLS socket.
+ * The service is configured in the struct server_args, and
+ * then started by calling server_start(desc) on the descriptor.
+ * server_start() first verifies if an instance of the service is active,
+ * and in case shuts it down. Then, if the service must be started, creates
+ * a socket and a thread in charge of doing the accept().
+ *
+ * The body of the thread is desc->accept_fn(desc), which the user can define
+ * freely. We supply a sample implementation, server_root(), structured as an
+ * infinite loop. At the beginning of each iteration it runs periodic_fn()
+ * if defined (e.g. to perform some cleanup etc.) then issues a poll()
+ * or equivalent with a timeout of 'poll_timeout' milliseconds, and if the
+ * following accept() is successful it creates a thread in charge of
+ * running the session, whose body is desc->worker_fn(). The argument of
+ * worker_fn() is a struct server_instance, which contains the address
+ * of the other party, a pointer to desc, the file descriptors (fd) on which
+ * we can do a select/poll (but NOT IO/, and a FILE * on which we can do I/O.
+ * We have both because we want to support plain and SSL sockets, and
+ * going through a FILE * lets us provide the encryption/decryption
+ * on the stream without using an auxiliary thread.
+ *
+ * NOTE: in order to let other parts of asterisk use these services,
+ * we need to do the following:
+ *    + move struct server_instance and struct server_args to
+ *	a common header file, together with prototypes for
+ *	server_start() and server_root().
+ *    +
+ */
+ 
+/*!
+ * describes a server instance
+ */
+struct server_instance {
+	FILE *f;	/* fopen/funopen result */
+	int fd;		/* the socket returned by accept() */
+	SSL *ssl;	/* ssl state */
+	struct sockaddr_in requestor;
+	struct server_args *parent;
+};
+
+/*!
+ * arguments for the accepting thread
+ */
+struct server_args {
+	struct sockaddr_in sin;
+	struct sockaddr_in oldsin;
+	int is_ssl;		/* is this an SSL accept ? */
+	int accept_fd;
+	int poll_timeout;
+	pthread_t master;
+	void *(*accept_fn)(void *);	/* the function in charge of doing the accept */
+	void (*periodic_fn)(void *);	/* something we may want to run before after select on the accept socket */
+	void *(*worker_fn)(void *);	/* the function in charge of doing the actual work */
+	const char *name;
+};
+
+void *server_root(void *);
+void server_start(struct server_args *desc);
+int ssl_setup(void);
 
 /*! \brief HTTP Callbacks take the socket, the method and the path as arguments and should
    return the content, allocated with malloc().  Status should be changed to reflect

Modified: trunk/main/http.c
URL: http://svn.digium.com/view/asterisk/trunk/main/http.c?view=diff&rev=48324&r1=48323&r2=48324
==============================================================================
--- trunk/main/http.c (original)
+++ trunk/main/http.c Wed Dec  6 10:17:57 2006
@@ -85,11 +85,7 @@
 #endif
 
 #ifdef DO_SSL
-#include <openssl/ssl.h>
-#include <openssl/err.h>
 static SSL_CTX* ssl_ctx;
-#else
-typedef struct {} SSL;	/* so we can define a pointer to it */
 #endif /* DO_SSL */
 
 /* SSL support */
@@ -98,65 +94,6 @@
 static char *certfile;
 static char *cipher;
 
-/*!
- * The following code implements a generic mechanism for starting
- * services on a TCP or TLS socket.
- * The service is configured in the struct server_args, and
- * then started by calling server_start(desc) on the descriptor.
- * server_start() first verifies if an instance of the service is active,
- * and in case shuts it down. Then, if the service must be started, creates
- * a socket and a thread in charge of doing the accept().
- *
- * The body of the thread is desc->accept_fn(desc), which the user can define
- * freely. We supply a sample implementation, server_root(), structured as an
- * infinite loop. At the beginning of each iteration it runs periodic_fn()
- * if defined (e.g. to perform some cleanup etc.) then issues a poll()
- * or equivalent with a timeout of 'poll_timeout' milliseconds, and if the
- * following accept() is successful it creates a thread in charge of
- * running the session, whose body is desc->worker_fn(). The argument of
- * worker_fn() is a struct server_instance, which contains the address
- * of the other party, a pointer to desc, the file descriptors (fd) on which
- * we can do a select/poll (but NOT IO/, and a FILE * on which we can do I/O.
- * We have both because we want to support plain and SSL sockets, and
- * going through a FILE * lets us provide the encryption/decryption
- * on the stream without using an auxiliary thread.
- *
- * NOTE: in order to let other parts of asterisk use these services,
- * we need to do the following:
- *    + move struct server_instance and struct server_args to
- *	a common header file, together with prototypes for
- *	server_start() and server_root().
- *    +
- */
- 
-/*!
- * describes a server instance
- */
-struct server_instance {
-	FILE *f;	/* fopen/funopen result */
-	int fd;		/* the socket returned by accept() */
-	SSL *ssl;	/* ssl state */
-	struct sockaddr_in requestor;
-	struct server_args *parent;
-};
-
-/*!
- * arguments for the accepting thread
- */
-struct server_args {
-	struct sockaddr_in sin;
-	struct sockaddr_in oldsin;
-	int is_ssl;		/* is this an SSL accept ? */
-	int accept_fd;
-	int poll_timeout;
-	pthread_t master;
-	void *(*accept_fn)(void *);	/* the function in charge of doing the accept */
-	void (*periodic_fn)(void *);	/* something we may want to run before after select on the accept socket */
-	void *(*worker_fn)(void *);	/* the function in charge of doing the actual work */
-	const char *name;
-};
-
-static void *server_root(void *arg);
 static void *httpd_helper_thread(void *arg);
 
 /*!
@@ -705,7 +642,7 @@
 	return NULL;
 }
 
-static void *server_root(void *data)
+void *server_root(void *data)
 {
 	struct server_args *desc = data;
 	int fd;
@@ -765,7 +702,7 @@
 	return buf;
 }
 
-static int ssl_setup(void)
+int ssl_setup(void)
 {
 #ifndef DO_SSL
 	do_ssl = 0;
@@ -804,7 +741,7 @@
  * which does the socket/bind/listen and starts a thread for handling
  * accept().
  */
-static void server_start(struct server_args *desc)
+void server_start(struct server_args *desc)
 {
 	int flags;
 	int x = 1;



More information about the asterisk-commits mailing list