Make ACL be what SIP is going to need (bug #2358, just first part)
authorMark Spencer <markster@digium.com>
Wed, 9 Mar 2005 05:48:11 +0000 (05:48 +0000)
committerMark Spencer <markster@digium.com>
Wed, 9 Mar 2005 05:48:11 +0000 (05:48 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@5155 65c4cc65-6c06-0410-ace0-fbb531ad65f3

acl.c
include/asterisk/acl.h

diff --git a/acl.c b/acl.c
index 7f2f9c7..dde791a 100755 (executable)
--- a/acl.c
+++ b/acl.c
@@ -49,6 +49,7 @@ struct ast_netsock {
        int sockfd;
        int *ioref;
        struct io_context *ioc;
+       void *data;
 };
 
 
@@ -317,25 +318,25 @@ struct ast_netsock *ast_netsock_bindaddr(struct ast_netsock_list *list, struct i
        if (setsockopt(netsocket, IPPROTO_IP, IP_TOS, &tos, sizeof(tos))) 
                ast_log(LOG_WARNING, "Unable to set TOS to %d\n", tos);
 
-       /* Establish I/O callback for socket read */
-       ioref = ast_io_add(ioc, netsocket, callback, AST_IO_IN, data);
-       if (!ioref) {
-               ast_log(LOG_WARNING, "Out of memory!\n");
-               close(netsocket);
-               return NULL;
-       }
-       
        ns = malloc(sizeof(struct ast_netsock));
        if (ns) {
+               /* Establish I/O callback for socket read */
+               ioref = ast_io_add(ioc, netsocket, callback, AST_IO_IN, ns);
+               if (!ioref) {
+                       ast_log(LOG_WARNING, "Out of memory!\n");
+                       close(netsocket);
+                       free(ns);
+                       return NULL;
+               }       
                ASTOBJ_INIT(ns);
                ns->ioref = ioref;
                ns->ioc = ioc;
                ns->sockfd = netsocket;
+               ns->data = data;
                memcpy(&ns->bindaddr, bindaddr, sizeof(ns->bindaddr));
                ASTOBJ_CONTAINER_LINK(list, ns);
        } else {
                ast_log(LOG_WARNING, "Out of memory!\n");
-               ast_io_remove(ioc, ioref);
                close(netsocket);
        }
        return ns;
@@ -362,6 +363,16 @@ int ast_netsock_release(struct ast_netsock_list *list)
        return 0;
 }
 
+const struct sockaddr_in *ast_netsock_boundaddr(struct ast_netsock *ns)
+{
+       return &(ns->bindaddr);
+}
+
+void *ast_netsock_data(struct ast_netsock *ns)
+{
+       return ns->data;
+}
+
 struct ast_netsock *ast_netsock_bind(struct ast_netsock_list *list, struct io_context *ioc, const char *bindinfo, int defaultport, int tos, ast_io_cb callback, void *data)
 {
        struct sockaddr_in sin;
index 3aa7777..6454b1e 100755 (executable)
@@ -50,6 +50,8 @@ extern struct ast_netsock *ast_netsock_bindaddr(struct ast_netsock_list *list, s
 extern int ast_netsock_free(struct ast_netsock_list *list, struct ast_netsock *netsock);
 extern int ast_netsock_release(struct ast_netsock_list *list);
 extern int ast_netsock_sockfd(struct ast_netsock *ns);
+extern const struct sockaddr_in *ast_netsock_boundaddr(struct ast_netsock *ns);
+extern void *ast_netsock_data(struct ast_netsock *ns);
 extern int ast_find_ourip(struct in_addr *ourip, struct sockaddr_in bindaddr);
 
 /*! Compares the source address and port of two sockaddr_in */