]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
add more code for listener
authorAnthony Minessale <anthony.minessale@gmail.com>
Sat, 20 Dec 2008 15:40:33 +0000 (15:40 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Sat, 20 Dec 2008 15:40:33 +0000 (15:40 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@10895 d0543943-73ff-0310-b7d9-9358b9ac24b2

libs/esl/Makefile
libs/esl/src/esl.c
libs/esl/src/include/esl.h

index ea4d9e2877666bb0857c4a5797a80958ddf989ce..01065f358c1951caf3475095979f45ac3cb1ba83 100644 (file)
@@ -3,24 +3,28 @@ INCS=-I$(PWD)/src/include
 LIBEDIT_DIR=../../libs/libedit
 CFLAGS=$(INCS) -g -ggdb -I$(LIBEDIT_DIR)/src/
 MYLIB=libesl.a
-
+LIBS=-lesl -lncurses -lpthread
+LDFLAGS=-L.
 OBJS=src/esl.o src/esl_event.o src/esl_threadmutex.o src/esl_config.o
 
-all: $(MYLIB) fs_cli
+all: $(MYLIB) fs_cli testclient testserver
 
 $(MYLIB): $(OBJS) $(HEADERS)
        ar rcs $(MYLIB) $(OBJS)
        ranlib $(MYLIB)
 
-%.o: %.c
-       $(CC) $(CC_CFLAGS) $(CFLAGS) -c $< -o $@
+testserver: $(MYLIB) testserver.c
+       $(CC) $(CC_CFLAGS) $(CFLAGS) testserver.c -o testserver $(LDFLAGS) $(LIBS)
 
-test: $(MYLIB)
-       $(CC) $(CC_CFLAGS) $(CFLAGS) testclient.c -o testclient -L. -lesl
+testclient: $(MYLIB) testclient.c
+       $(CC) $(CC_CFLAGS) $(CFLAGS) testclient.c -o testclient $(LDFLAGS) $(LIBS)
 
 fs_cli: $(MYLIB) fs_cli.c
-       $(CC) $(CC_CFLAGS) $(CFLAGS) fs_cli.c -o fs_cli -L. -L$(LIBEDIT_DIR)/src/.libs -lesl -ledit -lncurses -lpthread
+       $(CC) $(CC_CFLAGS) $(CFLAGS) fs_cli.c -o fs_cli $(LDFLAGS) -L$(LIBEDIT_DIR)/src/.libs $(LIBS) -ledit
+
+%.o: %.c
+       $(CC) $(CC_CFLAGS) $(CFLAGS) -c $< -o $@
 
 clean:
-       rm -f *.o src/*.o testclient fs_cli libesl.a *~ src/*~ src/include/*~
+       rm -f *.o src/*.o testclient testserver fs_cli libesl.a *~ src/*~ src/include/*~
 
index 0f7ea83b28ef991fabb60dfb3a43becaceb1456f..b5b8f04e11608436353e594cedd556a9a8ba048c 100644 (file)
@@ -323,6 +323,59 @@ char *esl_url_decode(char *s)
 }
 
 
+esl_status_t esl_listen(const char *host, esl_port_t port, esl_listen_callback_t callback)
+{
+       esl_socket_t server_sock = ESL_SOCK_INVALID;
+       int reuse_addr = 1;
+       struct sockaddr_in addr;
+       esl_status_t status = ESL_SUCCESS;
+       
+       if ((server_sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
+               return ESL_FAIL;
+       }
+
+       setsockopt(server_sock, SOL_SOCKET, SO_REUSEADDR, &reuse_addr, sizeof(reuse_addr));
+                          
+       memset(&addr, 0, sizeof(addr));
+       addr.sin_family = AF_INET;
+    addr.sin_addr.s_addr = htonl(INADDR_ANY);
+    addr.sin_port = htons(port);
+       
+    if (bind(server_sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
+               status = ESL_FAIL;
+               goto end;
+       }
+
+    if (listen(server_sock, 10000) < 0) {
+               status = ESL_FAIL;
+               goto end;
+       }
+
+       for (;;) {
+               int client_sock;                    
+               struct sockaddr_in echoClntAddr; 
+               unsigned int clntLen;            
+
+               clntLen = sizeof(echoClntAddr);
+    
+               if ((client_sock = accept(server_sock, (struct sockaddr *) &echoClntAddr, &clntLen)) == ESL_SOCK_INVALID) {
+                       status = ESL_FAIL;
+                       goto end;
+               }
+
+               callback(server_sock, client_sock, echoClntAddr);
+       }
+
+ end:
+
+       if (server_sock != ESL_SOCK_INVALID) {
+               close(server_sock);
+               server_sock = ESL_SOCK_INVALID;
+       }
+
+       return status;
+
+}
 
 esl_status_t esl_connect(esl_handle_t *handle, const char *host, esl_port_t port, const char *password)
 {
index 412c4c322c72abc7b42fb5751f00470255f137cc..4aec7e0d40c1a82599fd7901bef1f2039c716baa 100644 (file)
@@ -256,6 +256,9 @@ char *esl_url_decode(char *s);
 int esl_toupper(int c);
 int esl_tolower(int c);
 
+typedef void (*esl_listen_callback_t)(esl_socket_t server_sock, esl_socket_t client_sock, struct sockaddr_in addr);
+
+esl_status_t esl_listen(const char *host, esl_port_t port, esl_listen_callback_t callback);
 
 esl_status_t esl_connect(esl_handle_t *handle, const char *host, esl_port_t port, const char *password);
 esl_status_t esl_disconnect(esl_handle_t *handle);