aboutsummaryrefslogtreecommitdiffstats
path: root/acl.c
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2002-05-30 01:40:29 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2002-05-30 01:40:29 +0000
commit1894676b424803dd8dee2df9c0b76beeeb695fac (patch)
tree643b78509cf00b053cdb487804b4499a1b2f0db4 /acl.c
parentadd416e064b0ba02f5efd6a1a6dcfdc8a353bdb8 (diff)
Version 0.1.12 from FTP
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@454 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'acl.c')
-rwxr-xr-xacl.c116
1 files changed, 116 insertions, 0 deletions
diff --git a/acl.c b/acl.c
new file mode 100755
index 000000000..07579dc1d
--- /dev/null
+++ b/acl.c
@@ -0,0 +1,116 @@
+/*
+ * Asterisk -- A telephony toolkit for Linux.
+ *
+ * Various sorts of access control
+ *
+ * Copyright (C) 1999, Mark Spencer
+ *
+ * Mark Spencer <markster@linux-support.net>
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include <string.h>
+#include <sys/time.h>
+#include <signal.h>
+#include <errno.h>
+#include <unistd.h>
+#include <asterisk/acl.h>
+#include <asterisk/logger.h>
+#include <arpa/inet.h>
+#include <sys/socket.h>
+#include <netdb.h>
+
+#define AST_SENSE_DENY 0
+#define AST_SENSE_ALLOW 1
+
+struct ast_ha {
+ /* Host access rule */
+ struct in_addr netaddr;
+ struct in_addr netmask;
+ int sense;
+ struct ast_ha *next;
+};
+
+void ast_free_ha(struct ast_ha *ha)
+{
+ struct ast_ha *hal;
+ while(ha) {
+ hal = ha;
+ ha = ha->next;
+ free(hal);
+ }
+}
+
+struct ast_ha *ast_append_ha(char *sense, char *stuff, struct ast_ha *path)
+{
+ struct ast_ha *ha = malloc(sizeof(struct ast_ha));
+ char *nm;
+ struct ast_ha *prev = NULL;
+ struct ast_ha *ret;
+ ret = path;
+ while(path) {
+ prev = path;
+ path = path->next;
+ }
+ if (ha) {
+ strtok(stuff, "/");
+ nm = strtok(NULL, "/");
+ if (!nm)
+ nm = "255.255.255.255";
+ if (!inet_aton(stuff, &ha->netaddr)) {
+ ast_log(LOG_WARNING, "%s not a valid IP\n", stuff);
+ free(ha);
+ return NULL;
+ }
+ if (!inet_aton(nm, &ha->netmask)) {
+ ast_log(LOG_WARNING, "%s not a valid netmask\n", nm);
+ free(ha);
+ return NULL;
+ }
+ ha->netaddr.s_addr &= ha->netmask.s_addr;
+ if (!strncasecmp(sense, "p", 1)) {
+ ha->sense = AST_SENSE_ALLOW;
+ } else {
+ ha->sense = AST_SENSE_DENY;
+ }
+ ha->next = NULL;
+ if (prev)
+ prev->next = ha;
+ else
+ ret = ha;
+ }
+ return NULL;
+}
+
+int ast_apply_ha(struct ast_ha *ha, struct sockaddr_in *sin)
+{
+ /* Start optimistic */
+ int res = AST_SENSE_ALLOW;
+ while(ha) {
+ /* 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))
+ res = ha->sense;
+ ha = ha->next;
+ }
+ return res;
+}
+
+int ast_get_ip(struct sockaddr_in *sin, char *value)
+{
+ struct hostent *hp;
+ hp = gethostbyname(value);
+ if (hp) {
+ memcpy(&sin->sin_addr, hp->h_addr, sizeof(sin->sin_addr));
+ } else {
+ ast_log(LOG_WARNING, "Unable to lookup '%s'\n", value);
+ return -1;
+ }
+ return 0;
+}
+