From 6bb962df9dae126072dbb6564754b6184f1b439e Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 13 Jan 2004 21:50:56 +0000 Subject: assorted changes git-svn-id: file:///home/lennart/svn/public/ivam2/trunk@37 dbf6933d-3bce-0310-9bcc-ed052ba35b35 --- configure.ac | 2 +- src/modem.c | 11 +++++++---- src/modem.h | 4 +++- src/modemman.c | 49 ++++++++++++++++++++++++++++++++++++++++++++--- src/msntab.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++- ulaw/authok.ulaw.gz | Bin 26541 -> 20575 bytes ulaw/welcome.ulaw.gz | Bin 39514 -> 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 #include #include +#include #include #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 #include #include +#include #include @@ -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 Binary files a/ulaw/authok.ulaw.gz and b/ulaw/authok.ulaw.gz differ diff --git a/ulaw/welcome.ulaw.gz b/ulaw/welcome.ulaw.gz index 5b90e30..ee09d0c 100644 Binary files a/ulaw/welcome.ulaw.gz and b/ulaw/welcome.ulaw.gz differ -- cgit