Index: acl.c =================================================================== RCS file: /usr/cvsroot/asterisk/acl.c,v retrieving revision 1.19 diff -u -r1.19 acl.c --- acl.c 9 May 2004 08:22:15 -0000 1.19 +++ acl.c 27 May 2004 16:19:23 -0000 @@ -37,8 +37,6 @@ static ast_mutex_t routeseq_lock = AST_MUTEX_INITIALIZER; #endif -#define AST_SENSE_DENY 0 -#define AST_SENSE_ALLOW 1 struct ast_ha { /* Host access rule */ @@ -56,6 +54,7 @@ struct sockaddr_in ifru_addr; }; +/* Free HA structure */ void ast_free_ha(struct ast_ha *ha) { struct ast_ha *hal; @@ -66,6 +65,50 @@ } } +/* Copy HA structure */ +static void ast_copy_ha(struct ast_ha *from, struct ast_ha *to) + { + + memcpy(&to->netaddr, &from->netaddr, sizeof(from->netaddr)); + memcpy(&to->netmask, &from->netmask, sizeof(from->netmask)); + to->sense = from->sense; + + } + +/* Create duplicate of ha structure */ +static struct ast_ha *ast_duplicate_ha(struct ast_ha *original) +{ + struct ast_ha *new_ha = malloc(sizeof(struct ast_ha)); + + /* Copy from original to new object */ + ast_copy_ha(original, new_ha); + + return(new_ha); + +} + +/* Create duplicate HA link list */ +/* Used in chan_sip2 templates */ +struct ast_ha *ast_duplicate_ha_list(struct ast_ha *original) +{ + struct ast_ha *start=original; + struct ast_ha *ret = NULL; + struct ast_ha *link,*prev; + + while(start) { + link = ast_duplicate_ha(start); /* Create copy of this object */ + prev->next = link; /* Link previous to this object */ + + if (!ret) + ret = link; /* Save starting point */ + + start = start->next; /* Go to next object */ + prev = link; /* Save pointer to this object */ + } + return (ret); /* Return start of list */ +} + + struct ast_ha *ast_append_ha(char *sense, char *stuff, struct ast_ha *path) { struct ast_ha *ha = malloc(sizeof(struct ast_ha)); @@ -120,6 +163,7 @@ else ret = ha; } + ast_log(LOG_DEBUG, "%s/%s appended to acl for peer\n",stuff, nm); return ret; } @@ -128,6 +172,8 @@ /* Start optimistic */ int res = AST_SENSE_ALLOW; while(ha) { + /* DEBUG */ + ast_log(LOG_DEBUG, "##### Testing %s with %s\n",inet_ntoa(sin->sin_addr), inet_ntoa(ha->netaddr) ); /* For each rule, if this address and the netmask = the net address apply the current rule */ if ((sin->sin_addr.s_addr & ha->netmask.s_addr) == (ha->netaddr.s_addr)) Index: include/asterisk/acl.h =================================================================== RCS file: /usr/cvsroot/asterisk/include/asterisk/acl.h,v retrieving revision 1.5 diff -u -r1.5 acl.h --- include/asterisk/acl.h 28 Apr 2004 17:28:35 -0000 1.5 +++ include/asterisk/acl.h 27 May 2004 16:19:23 -0000 @@ -14,6 +14,10 @@ #ifndef _ASTERISK_ACL_H #define _ASTERISK_ACL_H +#define AST_SENSE_DENY 0 +#define AST_SENSE_ALLOW 1 + + #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif @@ -30,6 +34,7 @@ extern int ast_get_ip(struct sockaddr_in *sin, char *value); extern int ast_ouraddrfor(struct in_addr *them, struct in_addr *us); extern int ast_lookup_iface(char *iface, struct in_addr *address); +extern struct ast_ha *ast_duplicate_ha_list(struct ast_ha *original); //! Compares the source address and port of two sockaddr_in static inline int inaddrcmp(struct sockaddr_in *sin1, struct sockaddr_in *sin2)