aboutsummaryrefslogtreecommitdiffstats
path: root/acl.c
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2004-05-27 20:53:02 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2004-05-27 20:53:02 +0000
commit3321b562114ae022156360b7bdf032b71029e2be (patch)
tree052c0d04e3a00d64eb2932132685060236b8d869 /acl.c
parent4a66d3fb26970b7cad8268de548ff5eccf9929ea (diff)
Add ACL copy routines (bug #1733)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@3095 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'acl.c')
-rwxr-xr-xacl.c50
1 files changed, 48 insertions, 2 deletions
diff --git a/acl.c b/acl.c
index 32cac85db..1b293decd 100755
--- a/acl.c
+++ b/acl.c
@@ -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 my_ifreq {
struct sockaddr_in ifru_addr;
};
+/* Free HA structure */
void ast_free_ha(struct ast_ha *ha)
{
struct ast_ha *hal;
@@ -66,6 +65,50 @@ void ast_free_ha(struct ast_ha *ha)
}
}
+/* 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 @@ struct ast_ha *ast_append_ha(char *sense, char *stuff, struct ast_ha *path)
else
ret = ha;
}
+ ast_log(LOG_DEBUG, "%s/%s appended to acl for peer\n",stuff, nm);
return ret;
}
@@ -128,6 +172,8 @@ int ast_apply_ha(struct ast_ha *ha, struct sockaddr_in *sin)
/* 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))