summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2004-01-13 21:50:56 +0000
committerLennart Poettering <lennart@poettering.net>2004-01-13 21:50:56 +0000
commit6bb962df9dae126072dbb6564754b6184f1b439e (patch)
tree0de4cad538993326b45a8c2f1e71e48a89822aa3
parent1da70637a5d6992e33c4a6e0c17dd18ba6476b2a (diff)
assorted changes
git-svn-id: file:///home/lennart/svn/public/ivam2/trunk@37 dbf6933d-3bce-0310-9bcc-ed052ba35b35
-rw-r--r--configure.ac2
-rw-r--r--src/modem.c11
-rw-r--r--src/modem.h4
-rw-r--r--src/modemman.c49
-rw-r--r--src/msntab.c53
-rw-r--r--ulaw/authok.ulaw.gzbin26541 -> 20575 bytes
-rw-r--r--ulaw/welcome.ulaw.gzbin39514 -> 46575 bytes
7 files changed, 109 insertions, 10 deletions
diff --git a/configure.ac b/configure.ac
index 28e5a59..e86a016 100644
--- a/configure.ac
+++ b/configure.ac
@@ -63,7 +63,7 @@ AC_FUNC_FORK
AC_FUNC_MALLOC
AC_TYPE_SIGNAL
AC_FUNC_STAT
-AC_CHECK_FUNCS([dup2 gettimeofday memset mkfifo rmdir setenv strchr strcspn strdup strerror strrchr strspn strtol])
+AC_CHECK_FUNCS([regcomp dup2 gettimeofday memset mkfifo rmdir setenv strchr strcspn strdup strerror strrchr strspn strtol])
PKG_CHECK_MODULES(LIBDAEMON, [ libdaemon >= 0.4 ])
AC_SUBST(LIBDAEMON_CFLAGS)
diff --git a/src/modem.c b/src/modem.c
index 0336af2..9cc3013 100644
--- a/src/modem.c
+++ b/src/modem.c
@@ -139,7 +139,7 @@ static void copy_modem_to_child(struct modem *m);
static int modem_reopen(struct modem *m);
void modem_close(struct modem *m);
-struct modem *modem_open(const char *dev) {
+struct modem *modem_open(const char *dev, const char*msn) {
struct modem *m = NULL;
assert(dev);
@@ -163,6 +163,8 @@ struct modem *modem_open(const char *dev) {
m->child_buffio = NULL;
m->tabentry = NULL;
+ m->listen_msn = msn ? strdup(msn) : NULL;
+
if (modem_reopen(m) < 0)
goto fail;
@@ -205,6 +207,7 @@ void modem_close(struct modem *m) {
free(m->dev);
free(m->caller_number);
free(m->ring_number);
+ free(m->listen_msn);
free(m);
}
@@ -242,7 +245,7 @@ static void modem_next_command(struct modem *m) {
if (m->command_index == 0)
buffio_command(m->buffio, hup_sequence);
else if (m->command_index == 15) {
- char *l = args.listen_arg ? args.listen_arg : "*";
+ char *l = m->listen_msn ? m->listen_msn : "*";
daemon_log(LOG_INFO, "[%s] Listening on '%s'.", m->name, l);
snprintf(tmp, sizeof(tmp), p, l);
p = tmp;
@@ -479,8 +482,8 @@ static int modem_start_child(struct modem *m) {
setenv("CALLERMSN", m->caller_number ? m->caller_number : "", 1);
assert(m->dtmf_fifo->fname);
setenv("DTMFFIFO", m->dtmf_fifo->fname, 1);
- if (args.listen_arg)
- setenv("LISTENMSN", args.listen_arg, 1);
+ if (m->listen_msn)
+ setenv("LISTENMSN", m->listen_msn, 1);
else
unsetenv("LISTENMSN");
diff --git a/src/modem.h b/src/modem.h
index d6c71fc..43c930c 100644
--- a/src/modem.h
+++ b/src/modem.h
@@ -65,13 +65,15 @@ struct modem {
char *ring_number;
char *caller_number;
+ char *listen_msn;
+
struct tabentry *tabentry;
int dle_flag;
int flush_msg;
};
-struct modem *modem_open(const char *dev);
+struct modem *modem_open(const char *dev, const char *msn);
void modem_close(struct modem *m);
#endif
diff --git a/src/modemman.c b/src/modemman.c
index a2fbf12..8fefbfa 100644
--- a/src/modemman.c
+++ b/src/modemman.c
@@ -27,11 +27,13 @@
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include <libdaemon/dlog.h>
#include "modemman.h"
#include "modem.h"
+#include "main.h"
#define MAX_CHANNELS 10
#define TTY_START 12
@@ -44,10 +46,10 @@ struct llist {
static struct llist *llist = NULL;
static int n_llist = 0;
-static void modem_try_open(const char *dev) {
+static void modem_try_open(const char *dev, const char *msn) {
struct modem *m;
- if ((m = modem_open(dev))) {
+ if ((m = modem_open(dev, msn))) {
struct llist *l = malloc(sizeof(struct llist));
assert(l);
@@ -58,6 +60,47 @@ static void modem_try_open(const char *dev) {
}
}
+const char *get_listen_msn(int i) {
+ static int buf_valid = 0;
+ static char buf[256];
+ static char *buf_ptr[MAX_CHANNELS];
+ static int n_buf_ptr;
+
+ if (!args.listen_arg)
+ return "*";
+
+ if (!buf_valid) {
+ char *p;
+
+ strncpy(buf, args.listen_arg, sizeof(buf)-1);
+ buf[sizeof(buf)-1] = 0;
+
+ for (p = buf; *p; p++)
+ if (*p == ',')
+ *p = ';';
+
+ for (p = buf, n_buf_ptr = 0; n_buf_ptr < MAX_CHANNELS;) {
+ int l;
+ buf_ptr[n_buf_ptr++] = p;
+ l = strcspn(p, ":");
+ if (p[l] == 0)
+ break;
+
+ p[l] = 0;
+ p+=l+1;
+ }
+
+ buf_valid = 1;
+ }
+
+ assert(n_buf_ptr > 0);
+
+ if (i >= n_buf_ptr)
+ i = n_buf_ptr -1;
+
+ return buf_ptr[i];
+}
+
int modem_manager_init(int channels) {
int i;
@@ -69,7 +112,7 @@ int modem_manager_init(int channels) {
for (i = TTY_START; i < TTY_START+MAX_CHANNELS && n_llist < channels; i++) {
char d[PATH_MAX];
snprintf(d, sizeof(d), "/dev/ttyI%i", i);
- modem_try_open(d);
+ modem_try_open(d, get_listen_msn(n_llist));
}
if (n_llist < channels) {
diff --git a/src/msntab.c b/src/msntab.c
index 6bdd17c..12002d5 100644
--- a/src/msntab.c
+++ b/src/msntab.c
@@ -29,6 +29,7 @@
#include <fnmatch.h>
#include <stdio.h>
#include <unistd.h>
+#include <regex.h>
#include <libdaemon/dlog.h>
@@ -43,13 +44,63 @@ static int n_entries = 0;
static int n_includes = 0;
+int regex_match(const char *re, const char *s) {
+ regex_t r;
+ int ret;
+ char e[256];
+
+ if ((ret = regcomp(&r, re, REG_EXTENDED|REG_NOSUB)) != 0) {
+ regerror(ret, &r, e, sizeof(e));
+ daemon_log(LOG_WARNING, "Failed to compile regular expression '%s', will never match: %s", re, e);
+ return -1;
+ }
+
+ ret = regexec(&r, s, 0, NULL, 0) == 0 ? 0 : -1;
+ regfree(&r);
+
+ return ret;
+}
+
+int glob_match(const char *e, const char *s) {
+ char p[256];
+ const char *n = e;
+
+ for (;;) {
+ size_t m, i = strcspn(n, ";,");
+
+ m = sizeof(p)-1 < i ? sizeof(p)-1 : i;
+ strncpy(p, n, m);
+ p[m] = 0;
+
+ if (!fnmatch(p, s, 0))
+ return 0;
+
+ if (*(n+i) == 0)
+ return -1;
+
+ n += i+1;
+ }
+}
+
struct tabentry* msntab_check_call(const char *callee, const char *caller) {
struct tabentry *l = first;
while (l) {
+ int a, b;
assert(l->local && l->remote);
+
+ if (l->local[0] == '~')
+ a = !regex_match(l->local+1, callee);
+ else
+ a = !glob_match(l->local, callee);
+
+
+ if (l->remote[0] == '~')
+ b = !regex_match(l->remote+1, caller);
+ else
+ b = !glob_match(l->remote, caller);
- if (!fnmatch(l->local, callee, 0) && !fnmatch(l->remote, caller, 0)) {
+ if (a && b) {
daemon_log(LOG_INFO, "MSN table entry from '%s:%u' matched.", l->filename, l->line);
return msntab_ref(l);
}
diff --git a/ulaw/authok.ulaw.gz b/ulaw/authok.ulaw.gz
index fa6d389..44c704f 100644
--- a/ulaw/authok.ulaw.gz
+++ b/ulaw/authok.ulaw.gz
Binary files differ
diff --git a/ulaw/welcome.ulaw.gz b/ulaw/welcome.ulaw.gz
index 5b90e30..ee09d0c 100644
--- a/ulaw/welcome.ulaw.gz
+++ b/ulaw/welcome.ulaw.gz
Binary files differ