summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2004-01-14 18:09:07 +0000
committerLennart Poettering <lennart@poettering.net>2004-01-14 18:09:07 +0000
commita232b80501f2d403322b9f3d215ebbef0b40af54 (patch)
tree07a5e5016fa52f1315c3dd8465a1767532c25733
parentde500fc2c9a21e3c97176f8f090e149b5f3771d2 (diff)
add device spec command line option
git-svn-id: file:///home/lennart/svn/public/ivam2/trunk@39 dbf6933d-3bce-0310-9bcc-ed052ba35b35
-rw-r--r--src/ivamd.ggo1
-rw-r--r--src/modem.c15
-rw-r--r--src/modemman.c27
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 <stdio.h>
#include <sys/wait.h>
#include <stdlib.h>
+#include <limits.h>
#include <oop.h>
@@ -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];