#include #include #include #include #include #include #include "modemman.h" #include "modem.h" #define MAX_CHANNELS 10 #define TTY_START 12 struct llist { struct modem *modem; struct llist *next; }; static struct llist *llist = NULL; static int n_llist = 0; static void modem_try_open(const char *dev) { struct modem *m; if ((m = modem_open(dev))) { struct llist *l = malloc(sizeof(struct llist)); assert(l); l->modem = m; l->next = llist; llist = l; n_llist++; } } int modem_manager_init(int channels) { int i; assert(channels <= MAX_CHANNELS && channels > 0); assert(n_llist == 0); 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); } if (n_llist < channels) { daemon_log(LOG_ERR, "Failed to allocate the requested channels. Got %i of %i.", n_llist, channels); modem_manager_done(); return -1; } return 0; } void modem_manager_done(void) { while (llist) { struct llist *l; modem_close(llist->modem); l = llist; llist = llist->next; free(l); n_llist--; } assert(!n_llist && !llist); }