From a232b80501f2d403322b9f3d215ebbef0b40af54 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 14 Jan 2004 18:09:07 +0000 Subject: add device spec command line option git-svn-id: file:///home/lennart/svn/public/ivam2/trunk@39 dbf6933d-3bce-0310-9bcc-ed052ba35b35 --- src/ivamd.ggo | 1 + src/modem.c | 15 +++++++++------ src/modemman.c | 27 ++++++++++++++++++++++++++- 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/src/ivamd.ggo b/src/ivamd.ggo index b975c51..151c986 100644 --- a/src/ivamd.ggo +++ b/src/ivamd.ggo @@ -25,6 +25,7 @@ option "check" c "Check if the daemon is currently running" flag off option "channels" C "Specify how many channels to allocate, defaults to 2" int default="2" no option "msntab" - "Specify non standard msntab file" string no option "listen" L "Specify a glob pattern matching the MSNs to listen on" string no +option "device" d "Specify the devices to use" string no option "no-drop-root" - "Do not drop root priviliges" flag off option "reload" - "Tell a running instance to reload the MSN table" flag off option "info" - "Tell a running ivamd to dump its MSN table to syslog" flag off diff --git a/src/modem.c b/src/modem.c index 9cc3013..e8bab71 100644 --- a/src/modem.c +++ b/src/modem.c @@ -35,6 +35,7 @@ #include #include #include +#include #include @@ -141,6 +142,7 @@ void modem_close(struct modem *m); struct modem *modem_open(const char *dev, const char*msn) { struct modem *m = NULL; + char res_dev[PATH_MAX]; assert(dev); @@ -150,15 +152,16 @@ struct modem *modem_open(const char *dev, const char*msn) { m = malloc(sizeof(struct modem)); assert(m); memset(m, 0, sizeof(struct modem)); - - m->dev = strdup(dev); + + realpath(dev, res_dev); + m->dev = strdup(res_dev); assert(m->dev); - if ((m->name = strrchr(m->dev, '/'))) - m->name++; + if (!strncmp(m->dev, "/dev/", 5)) + m->name = m->dev+5; else m->name = m->dev; - + m->child_pid = -1; m->child_buffio = NULL; m->tabentry = NULL; @@ -900,7 +903,7 @@ static int modem_reopen(struct modem *m) { daemon_log(LOG_INFO, "[%s] Trying to open modem on TTY device ...", m->name); - if ((fd = open(m->dev, O_RDWR|O_NDELAY)) < 0) { + if ((fd = open(m->dev, O_RDWR|O_NDELAY|O_NOCTTY)) < 0) { daemon_log(LOG_ERR, "[%s] Failed to open device: %s", m->name, strerror(errno)); goto fail; } diff --git a/src/modemman.c b/src/modemman.c index 8fefbfa..5cf13ed 100644 --- a/src/modemman.c +++ b/src/modemman.c @@ -103,11 +103,36 @@ const char *get_listen_msn(int i) { int modem_manager_init(int channels) { int i; - + assert(channels <= MAX_CHANNELS && channels > 0); assert(n_llist == 0); daemon_log(LOG_INFO, "Allocating %i channels.", channels); + + if (args.device_arg) { + char *p = args.device_arg; + + for (;;) { + char dev[PATH_MAX]; + size_t l, n = strcspn(p, ":"); + + l = n; + if (sizeof(dev)-1 < l) + l = sizeof(dev)-1; + + strncpy(dev, p, l); + dev[l] = 0; + + modem_try_open(dev, get_listen_msn(n_llist)); + + if (p[n] == 0) + break; + + p[n] = 0; + p+=n+1; + } + } + for (i = TTY_START; i < TTY_START+MAX_CHANNELS && n_llist < channels; i++) { char d[PATH_MAX]; -- cgit