Add the i4brunppp utility to the example section. This utility is one way

of taking incoming calls with i4b in conjunction with userland ppp(8).
This commit is contained in:
Hellmuth Michaelis 2001-07-21 11:49:28 +00:00
parent 4d02f92dd2
commit 868080172d
5 changed files with 373 additions and 0 deletions

View File

@ -0,0 +1,19 @@
# $FreeBSD$
PROG = i4brunppp
SRCS = i4brunppp.c
MAN8 = i4brunppp.8
RUNPPPDEST= /etc/isdn
INSTALL ?= install
install:
@echo i4brunppp is not installed automatically. In case you want to run
@echo user-ppp in dial-in server under i4b, please copy it into /etc/isdn.
installetc: i4brunppp
${INSTALL} -c -m ${BINMODE} -o ${BINOWN} -g ${BINGRP} \
${.CURDIR}/i4brunppp ${RUNPPPDEST}
.include <bsd.prog.mk>

View File

@ -0,0 +1,19 @@
$FreeBSD$
BEWARE: HIGHLY EXPERIMENTAL!
---------------------------
This program is used in conjunction with a isdnd.rc entry similar to
regexpr = "ULPPP.*call active" # look for matches in log messages
regprog = i4brunppp # execute program when match is found
this one (see also i4brunppp-isdnd.rc).
i4brunppp _must_ be put into /etc/isdn!
When an active call is detected, isdnd fires off i4brunppp, which attaches
the rbch device used to stdin/stdout and then runs ppp which is given the
"-direct" command and the string "inc_rbchX" (where X is the i4brbch unit
number) as arguments.

View File

@ -0,0 +1,65 @@
#------------------------------------------------------------------------------
#
# sample isdnd.rc for taking incoming calls with userland ppp
# -----------------------------------------------------------
#
# $FreeBSD$
#
# last edit-date: [Sat Jul 21 13:40:50 2001]
#
#------------------------------------------------------------------------------
#==============================================================================
# SYSTEM section: global configuration parameters
#==============================================================================
system
ratesfile = /etc/isdn/isdnd.rates # name & location of rates file
useacctfile = yes # generate accouting info to file
acctall = on # generate info for everything
acctfile = /var/log/isdnd.acct # name & location of accounting file
rtprio = 25 # modify isdnd's priority
regexpr = "ULPPP.*call active" # look for matches in log messages
regprog = i4brunppp # execute program when match is found
#==============================================================================
# ENTRY: Userland PPP over ISDN
#==============================================================================
entry
name = ULPPP # name for reference
usrdevicename = rbch # ipr, tel, rbch
usrdeviceunit = 0 # unit number
isdncontroller = 0 # contoller to use or -1 to use any
isdnchannel = -1 # channel (1/2) to use or 0 or -1 for any
# numbers used to verify at DIAL IN
local-phone-incoming = 567 # this is my number
remote-phone-incoming = 123 # this one can call in
# numbers used to DIAL OUT
local-phone-dialout = 567 # this is my number
remote-phone-dialout = 123 # i call this number
remdial-handling = first # first, last or next
dialin-reaction = accept # accept, reject, ignore, answer
dialout-type = normal # normal / calledback
b1protocol = hdlc # hdlc, raw
idletime-incoming = 30 # 3 seconds idle timeout
idletime-outgoing = 30 # 3 seconds idle timeout
ratetype = 0 # ratesfile entry to use
unitlength = 60 # unitlength to assume
dialretries = 2 # # of dial retries
recoverytime = 5 # time to wait between 2 dial tries
# EOF #########################################################################

View File

@ -0,0 +1,47 @@
.\"
.\" Copyright (c) 1999, 2001 Hellmuth Michaelis. All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\" notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\" notice, this list of conditions and the following disclaimer in the
.\" documentation and/or other materials provided with the distribution.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\" $FreeBSD$
.\"
.\" last edit-date: [Sat Jul 21 13:37:00 2001]
.\"
.Dd July 28, 1999
.Dt i4brunppp 8
.Sh NAME
.Nm i4brunppp
.Nd is used to interface i4b to userland ppp in server mode
.Sh DESCRIPTION
.Nm i4brunppp
is part of the isdn4bsd package and is used to interface i4b to the so-called
userland
.Xr ppp 8
when dialling into an i4b machine.
.Pp
.Sh FILES
/dev/i4brbchX
.Sh AUTHOR
The
.Nm
utility and this manpage were written by Hellmuth Michaelis. He can be
contacted at hm@freebsd.org.

View File

@ -0,0 +1,223 @@
/*
* Copyright (c) 1999, 2001 Hellmuth Michaelis. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
*---------------------------------------------------------------------------
*
* i4brunppp - run userland ppp for incoming call from rbch i/f
* ------------------------------------------------------------
*
* $FreeBSD$
*
* last edit-date: [Sat Jul 21 13:38:10 2001]
*
*---------------------------------------------------------------------------
*
* BEWARE: HIGHLY EXPERIMENTAL!
* ---------------------------
*
* This program is used in conjunction with a isdnd.rc entry similar to
*
* regexpr = "ULPPP.*call active" # look for matches in log messages
* regprog = i4brunppp # execute program when match is found
*
* this one. It _must_ be put into /etc/isdn!
* When an active call is detected, isdnd fires off i4brunppp, which attaches
* the rbch device used to stdin/stdout and then runs ppp which is given the
* "-direct" command and the string "inc_rbchX" (where X is the i4brbch unit
* number) as arguments.
*
*---------------------------------------------------------------------------*/
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <syslog.h>
#include <errno.h>
#include <string.h>
#include <time.h>
#include <ctype.h>
#include <machine/i4b_ioctl.h>
#include <machine/i4b_rbch_ioctl.h>
#define I4BDEVICE "/dev/i4b"
#define PPPPROG "/usr/sbin/ppp"
#define PPPNAME "ppp"
#define PPPARG1 "-direct"
#define PPPLABEL "inc_"
#define VERIFYSTRING "call active"
#define DEVSTRING "rbch"
#define PPPDEBUG
/*---------------------------------------------------------------------------*
* program entry
*---------------------------------------------------------------------------*/
int
main(int argc, char **argv)
{
char buffer[256];
int rbch_fd;
char *p = "DeadPointer";
int found;
int i;
#ifdef PPPDEBUG
FILE *dfp;
time_t tim;
register struct tm *tp;
#endif
/* open syslog */
(void)openlog("i4brunppp", LOG_PID|LOG_CONS|LOG_NDELAY, LOG_USER);
#ifdef PPPDEBUG
/* open debug log */
if((dfp = fopen("/tmp/i4brunppp-debug.log", "a")) == NULL)
{
syslog(LOG_INFO, "cannot open logfile: %s", strerror(errno));
exit(1);
}
tim = time(NULL);
tp = localtime(&tim);
strftime(buffer, 40, I4B_TIME_FORMAT, tp);
fprintf(dfp, "\n=================== %s ===================\n", buffer);
for(i=0; i < argc; i++)
fprintf(dfp, "\t%s\n", argv[i]);
#endif
/* check if this is the right message */
found = 0;
for(i=0; i < argc; i++)
{
if((strstr(argv[i], VERIFYSTRING)) != NULL)
{
found = 1;
break;
}
}
if(found == 0)
{
#ifdef PPPDEBUG
fprintf(dfp, "did not found [%s], exit\n", VERIFYSTRING);
#endif
exit(0);
}
found = 0;
/* check if we got a good device name */
for(; i < argc; i++)
{
if((p = strstr(argv[i], DEVSTRING)) != NULL)
{
found = 1;
break;
}
}
if(found == 0)
{
#ifdef PPPDEBUG
fprintf(dfp, "did not found [%s], exit\n", DEVSTRING);
#endif
exit(0);
}
/* everything ok, now prepare for running ppp */
/* close all file descriptors */
i = getdtablesize();
for(;i >= 0; i--)
close(i);
/* fiddle a terminating zero after the rbch unit number */
p += strlen(DEVSTRING);
if(isdigit(*p) && isdigit(*(p+1)))
*(p+2) = '\0';
else
*(p+1) = '\0';
/* construct /dev/i4brbchX device name */
sprintf(buffer, "%s%s%s", I4BDEVICE, DEVSTRING, p);
/* open the rbch device as fd 0 = stdin */
rbch_fd = open(buffer, O_RDWR);
if(rbch_fd != 0)
{
if(rbch_fd < 0)
syslog(LOG_INFO, "cannot open %s: %s", buffer, strerror(errno));
else
syslog(LOG_INFO, "cannot open %s as fd 0 (is %d): %s", buffer, rbch_fd, strerror(errno));
exit(1);
}
/* dup rbch device fd as fd 1 = stdout */
if((i = dup(rbch_fd)) != 1)
{
if(i < 0)
syslog(LOG_INFO, "cannot dup rbch_fd: %s", strerror(errno));
else
syslog(LOG_INFO, "cannot dup rbch as fd 1 (is %d): %s", i, strerror(errno));
exit(1);
}
/* construct the label for ppp's ppp.conf file */
sprintf(buffer, "%s%s%s", PPPLABEL, DEVSTRING, p);
syslog(LOG_INFO, "executing: %s %s %s %s", PPPPROG, PPPNAME, PPPARG1, buffer);
/* execute ppp */
if((execl(PPPPROG, PPPNAME, PPPARG1, buffer, NULL)) == -1)
{
syslog(LOG_INFO, "cannot exec: %s", strerror(errno));
exit(1);
}
syslog(LOG_INFO, "finished: %s %s %s %s", PPPPROG, PPPNAME, PPPARG1, buffer);
return(0);
}
/* EOF */