diff options
author | jkh <jkh@FreeBSD.org> | 1995-02-15 00:46:26 +0000 |
---|---|---|
committer | jkh <jkh@FreeBSD.org> | 1995-02-15 00:46:26 +0000 |
commit | 0cb129cc755064f31fb42abf2c721a8605381511 (patch) | |
tree | 87521af8f33d69817699aec072374bf2d3734e3e /gnu/usr.sbin/isdn/ittd | |
download | FreeBSD-src-0cb129cc755064f31fb42abf2c721a8605381511.zip FreeBSD-src-0cb129cc755064f31fb42abf2c721a8605381511.tar.gz |
Import the ISDN userland utilities. Just about ready to start shaking
this baby out in earnest..
Diffstat (limited to 'gnu/usr.sbin/isdn/ittd')
-rw-r--r-- | gnu/usr.sbin/isdn/ittd/Makefile | 18 | ||||
-rw-r--r-- | gnu/usr.sbin/isdn/ittd/ittd.1 | 39 | ||||
-rw-r--r-- | gnu/usr.sbin/isdn/ittd/ittd.c | 526 |
3 files changed, 583 insertions, 0 deletions
diff --git a/gnu/usr.sbin/isdn/ittd/Makefile b/gnu/usr.sbin/isdn/ittd/Makefile new file mode 100644 index 0000000..1e84b28 --- /dev/null +++ b/gnu/usr.sbin/isdn/ittd/Makefile @@ -0,0 +1,18 @@ +I =/isdn/bin + +OPTIONS =-DBSD -O + +OBJS = ittd + +all: $(OBJS) + +ittd: ittd.c + cc $(OPTIONS) -o ittd ittd.c + +install: all + strip ittd + install ittd $I + +clean: + @rm -f $(OBJS) a.out core.* + diff --git a/gnu/usr.sbin/isdn/ittd/ittd.1 b/gnu/usr.sbin/isdn/ittd/ittd.1 new file mode 100644 index 0000000..431808e --- /dev/null +++ b/gnu/usr.sbin/isdn/ittd/ittd.1 @@ -0,0 +1,39 @@ +.\" Copyright (c) 1994 Dietmar Friede +.Dd September 15, 1994 +.Os BSD +.Dt "ISDN ittd" 1 +.Sh NAME +.Nm ittd +.Nd ISDN tty daemon +.Sh SYNOPSIS +.Nm ittd +[ -F ] [ -c file ] [ -l file ] + +-F do not fork + +-c file use file as source of the configuration (default /etc/isdn.itt) + +-l file use file as logfile (default /var/log/isdn.itt) + +.Sh DESCRIPTION +Die Form der Konfigurationdatei /etc/isdn.itt wird, +bis ich das mit dem Euro ISDN verstanden hab: + +Der File besteht aus einer Zeile: + +A1:pr:w100: + +An Bedeutet Subadresse n ("EAZ" n). + +px protocoll x siehe oben. + +wn wait n Haeng auf wenn n Sekunden nichts uebertragen wurde, n = 0 haeng nicht auf. + +mn mtu n die maximale IP Uebertagungslaenge wird n + +sm size m Pufferlaenge der ISDN-Karte sm >= mn bei UI sm >= mn+2 + +Wobei das Maximum 2048 ist. + +Als Protokoll wird HDLC mit UI-frames (u), HDLC roh (r), X75 (X) und BTX-X75 (C) +unterstuetzt. diff --git a/gnu/usr.sbin/isdn/ittd/ittd.c b/gnu/usr.sbin/isdn/ittd/ittd.c new file mode 100644 index 0000000..efb152a7 --- /dev/null +++ b/gnu/usr.sbin/isdn/ittd/ittd.c @@ -0,0 +1,526 @@ +static char rcsid[] = "@(#)$Id: ittd.c,v 1.2 1995/01/25 14:01:28 jkr Exp jkr $"; +/******************************************************************************* + * II Version 0.1 - $Revision: 1.2 $ $State: Exp $ + * + * Copyright 1994 Dietmar Friede + ******************************************************************************* + * Bug reports, patches, comments, suggestions should be sent to: + * + * jkr@saarlink.de or jkrause@guug.de + * + ******************************************************************************* + * $Log: ittd.c,v $ + * + ******************************************************************************/ + +/* This is a ISDN-Daemon for tty dialin */ + +#include <sys/types.h> +#include <stdio.h> +#include <signal.h> +#include <errno.h> +#include <setjmp.h> +#include <string.h> +#include <stdlib.h> +#include <ctype.h> +#include <unistd.h> +#include <sys/ioctl.h> +#include <sys/file.h> +#include "../../../../sys/gnu/isdn/isdn_ioctl.h" +#define min(a,b) ((a)<(b)?(a):(b)) + +#define NITTY 2 +#define NOTTY 2 +#define NTTY (NITTY + NOTTY) + +listen_t listen; +isdn_param ip[NTTY]; +dial_t dial[NOTTY]; + +struct iline +{ + char occupied; + u_char an, cn; + char no[15]; +} iline[NTTY]; + +int dofork = 1; +int quit = 0, rescan = 0; +jmp_buf context; +char *logfile = "/var/log/isdn.itt"; +char *configfile = "/etc/isdn.itt"; + +int subadr, prot, bsize, timeout, spv, ui, serv; +int def_subadr = 3; +int ind, rind; +char rbuf[2048]; +unsigned short si_mask; + +void +catchsig() +{ + quit++; + longjmp(context, 1); +} + +void +catchsighup() +{ + rescan++; + (void) signal(SIGHUP, catchsighup); + longjmp(context, 1); +} + +setdefault() +{ + subadr = -1; + prot = 2; + ui = 1; + serv = 7; + timeout = 0; + bsize = 2048; + spv = 0; +} + +char * +gettoc() +{ + if (rind == -1) + { + rind = 0; + return (rbuf); + } + while (rbuf[++rind]); + rind++; + + if (rind >= ind) + return (NULL); + + return (&rbuf[rind]); +} + +filline(FILE * f) +{ + int c; + + ind = 1; + rbuf[0] = 'H'; + + while ((c = fgetc(f)) != EOF) + { + if (isalnum(c)) + { + rbuf[ind++] = c; + } else + switch (c) + { + case '#': + fgets(rbuf + ind, 2048 - ind, f); + if (ind == 1) + break; + /* Fall through */ + case '\n': + rbuf[ind] = 0; + rind = -1; + return (0); + case ':': + rbuf[ind++] = 0; + break; + } + } + if (ind > 1) + return (0); + return (EOF); +} + +process(FILE * f, int n) +{ + char *p; + int ap = 0; + + setdefault(); + + if (filline(f) != EOF) + { + while ((p = gettoc()) != NULL) + switch (p[0]) + { + case 'A': + def_subadr = p[1] - '0'; + listen.subadr_mask |= 1 << def_subadr; + break; + case 'p': + switch (p[1]) + { + case 'r': + serv = 7; + prot = 2; + ui = 0; + break; + case 'u': + serv = 7; + prot = 2; + ui = 1; + break; + case 'X': + serv = 7; + prot = 1; + ui = 0; + break; + case 'C': + serv = 15; + prot = 5; + ui = 0; + break; + default: + fprintf(stderr, "Protocoll not supported\n"); + exit(1); + } + break; + case 'w': + timeout = atoi(p + 1); + break; + case 's': + bsize = atoi(p + 1); + break; + case 'S': + spv++; + break; + default: + } + } + for (ap = 0; ap < NTTY; ap++) + { + fillparam(ap, &ip[ap]); + if (ioctl(n, ISDN_SET_PARAM, &ip[ap]) < 0) + { + perror("ioctl: Set Param"); + exit(3); + } + } + + listen.si_mask = si_mask; + if (listen.subadr_mask == 0) + listen.subadr_mask |= 1 << def_subadr; + listen.inf_mask = 3; + listen.ctrl = 0; + + if (ioctl(n, ISDN_LISTEN, &listen) < 0) + { + perror("ioctl: Listen"); + exit(4); + } +} + +fillparam(int ap, isdn_param * ip) +{ + if (subadr == -1) + subadr = def_subadr; + si_mask |= (u_short) (1 << serv); + /* + * spv = 0; + */ + bzero(ip, sizeof(isdn_param)); + ip->appl = ap; + ip->dlpd.protokoll = prot; + ip->dlpd.length = 7; + ip->dlpd.data_length = bsize; + ip->timeout = timeout; + ip->prot = ui; + ip->ncpd.protokoll = 4; +} + +realine(char *b) +{ + int c; + + ind = 0; + + while (c = *b & 0x7f) + { + b++; + if (isalnum(c)) + { + rbuf[ind++] = c; + } else if (c == '.') + rbuf[ind++] = 0; + } + if (ind > 1) + return (0); + return (EOF); +} + +process_dial(int n, int ap, char *b) +{ + char *p; + telno_t *t; + + setdefault(); + + if (realine(b) == EOF) + return; + + rind = -1; + + while ((p = gettoc()) != NULL) + { + switch (p[0]) + { + case 'a': + subadr = p[1] - '0'; + break; + case 'd': + t = &dial[ap - NITTY].telno; + t->length = strlen(p + 1) + 1; + if (t->length > 123) + { + fprintf(stderr, "ISDN number too long\n"); + exit(1); + } + t->no[0] = 0x81; + strncpy(&t->no[1], p + 1, t->length); + break; + case 'p': + switch (p[1]) + { + case 'r': + serv = 7; + prot = 2; + ui = 0; + break; + case 'u': + serv = 7; + prot = 2; + ui = 1; + break; + case 'X': + serv = 7; + prot = 1; + ui = 0; + break; + case 'C': + serv = 15; + prot = 5; + ui = 0; + break; + default: + fprintf(stderr, "Protocoll not supported\n"); + exit(1); + } + break; + case 'w': + timeout = atoi(p + 1); + break; + case 's': + bsize = atoi(p + 1); + break; + case 'S': + spv++; + break; + default: + } + } + filldial(ap, &ip[ap], &dial[ap - NITTY]); + if (ioctl(n, ISDN_SET_PARAM, &ip[ap]) < 0) + { + perror("ioctl: Set Param"); + exit(3); + } +} + +filldial(int ap, isdn_param * ip, dial_t * d) +{ + if (subadr == -1) + subadr = def_subadr; + /* + * spv = 0; + */ + bzero(ip, sizeof(isdn_param)); + d->appl = ip->appl = ap; + d->b_channel = 0x83; + d->inf_mask = 3; + d->out_serv = serv; + d->src_subadr = '0' + subadr; + ip->dlpd.protokoll = prot; + ip->dlpd.length = 7; + ip->dlpd.data_length = bsize; + ip->timeout = timeout; + ip->prot = ui; + ip->ncpd.protokoll = 4; +} + +void +main(int argc, char **argv) +{ + FILE *f; + int a, n, i; + u_char buf[4]; + + dofork = 1; + + while ((i = getopt(argc, argv, "c:l:F")) != EOF) + switch (i) + { + default: + fprintf(stderr, "Usage: ittd [ -F ] [ -c configfile ] [ -l logfile ]\n"); + exit(1); + case 'c': + configfile = optarg; + break; + case 'l': + logfile = optarg; + break; + case 'F': + dofork = 0; + break; + } + + if (dofork) + { + if ((i = fork()) < 0) + { + fprintf(stderr, "Can't fork, %m"); + exit(1); + } + if (i > 0) + exit(0); + } /* running as daemon now */ + if (freopen(logfile, "a", stderr) == NULL) + { + perror(logfile); + exit(1); + } + if ((n = open("/dev/isdn1", O_RDWR)) < 0) + { + perror("open: /dev/isdn1"); + exit(1); + } + if ((f = fopen(configfile, "r")) == NULL) + { + perror(configfile); + exit(1); + } + process(f, n); + fclose(f); + + (void) signal(SIGHUP, catchsighup); + + (void) signal(SIGTERM, catchsig); + (void) signal(SIGKILL, catchsig); + (void) signal(SIGINT, catchsig); + (void) signal(SIGQUIT, catchsig); + + rescan = quit = 0; + fprintf(stderr, "s:ittd started\n"); + fflush(stderr); + while (1) + { + int l; + int an, cn, serv, serv_add, subadr; + int typ, nl, dl; + char *tn; + + (void) setjmp(context); + if ((l = read(n, rbuf, 1024)) > 0) + { + switch (rbuf[0]) + { + case 'a': + sscanf(rbuf + 2, "%d %d %d %d %d %d %d %n", + &an, &cn, &serv, &serv_add, &subadr, &typ, &nl, &l); + l += 2; + buf[0] = cn; + buf[1] = find_appl(); + buf[2] = buf[3] = 0; + if (buf[1] == 0xff) + { + buf[2] = 0x3e; /* call reject */ + } + if (ioctl(n, ISDN_ACCEPT, &buf) < 0) + { + perror("ioctl: Accept"); + } + if (buf[1] == 0xff) + fprintf(stderr, "r:%d:%s\n", an, rbuf + l); + else + fprintf(stderr, "a:%d:%s\n", an, rbuf + l); + break; + case 'i': + sscanf(rbuf + 2, "%d %d %d %n", &an, &typ, &nl, &l); + fprintf(stderr, "i:%d:%x:%s\n", an, typ, rbuf + l + 2); + switch (typ) + { + case 2: + break; + } + break; + case 'C': + sscanf(rbuf + 2, "%d %d %d", &an, &cn, &dl); + if (dl) + { + buf[0] = cn; + buf[1] = an; + buf[2] = 0; + if (ioctl(n, ISDN_ACCEPT, buf) < 0) + { + perror("ioctl: Accept"); + } + } + fprintf(stderr, "C:%d:%d\n", an, cn); + break; + case 'D': + sscanf(rbuf + 2, "%d %d", &an, &cn); + iline[an].occupied = 0; + fprintf(stderr, "D:%d:%d\n", an, cn); + break; + case 'M': + sscanf(rbuf + 2, "%d %n", &an, &l); + process_dial(n, an, rbuf + l + 2); + if (ioctl(n, ISDN_DIAL, &dial[an - NITTY]) < 0) + { + perror("ioctl: Dial"); + } + fprintf(stderr, "d:%d:%s\n", an, &dial[an - NITTY].telno.no[1]); + break; + default: + break; + } + } + if (quit) + { + fprintf(stderr, "s:Quit\n"); + exit(0); + } + if (rescan) + { + fprintf(stderr, "s:rescan\n"); + rescan = 0; + if ((f = fopen(configfile, "r")) == NULL) + perror(configfile); + else + { + process(f, n); + fclose(f); + } + } + fflush(stderr); + } +} + +int +find_appl() +{ + int i; + struct iline *a; + + for (i = 0; i < NITTY; i++) + { + a = &iline[i]; + if (a->occupied == 0) + { + a->occupied = 1; + return (i); + } + } + return (-1); +} |