Changes for eftp supervisor based call control
This commit is contained in:
parent
b55ea60dd1
commit
ba28ec7ad9
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: CHANGES,v 1.3 1999/06/30 22:00:27 he Exp $
|
/* $Id: CHANGES,v 1.4 1999/07/25 21:55:25 he Exp $
|
||||||
# Change log for eftp4Linux
|
# Change log for eftp4Linux
|
||||||
#
|
#
|
||||||
# [new] means 'new feature added'
|
# [new] means 'new feature added'
|
||||||
|
@ -18,7 +18,23 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
$Log: CHANGES,v $
|
$Log: CHANGES,v $
|
||||||
|
Revision 1.4 1999/07/25 21:55:25 he
|
||||||
|
Changes for eftp supervisor based call control
|
||||||
|
|
||||||
|
- [chg] eft_i4l.c: Replaced calls to external programmes (isdnctrl,x25_route,
|
||||||
|
ifconfig, scripts) by directly calling ioctl()'s.
|
||||||
|
- [new] eft_i4l.c: Support for supervisor based isdn call control.
|
||||||
|
- [chg] eftp.c: Supporting above supervisor based isdn call control.
|
||||||
|
(prepares eftp for use by non-root users).
|
||||||
|
- [chg] eftp_setup: Removed, no longer needed with above changes.
|
||||||
|
- [fix] eftd.sh: Moved isdnloop setup before iface setup such that script
|
||||||
|
will also work if no other HL drivers are present.
|
||||||
|
- [chg] Makefile: Dummy "install" target to keep isdn4k-utils root makefile
|
||||||
|
happy.
|
||||||
|
|
||||||
|
|
||||||
Revision 1.3 1999/06/30 22:00:27 he
|
Revision 1.3 1999/06/30 22:00:27 he
|
||||||
|
|
||||||
Version 0.0.11
|
Version 0.0.11
|
||||||
|
|
||||||
===============
|
===============
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
# $Id: Makefile,v 1.8 1999/07/12 10:35:29 keil Exp $
|
# $Id: Makefile,v 1.9 1999/07/25 21:55:27 he Exp $
|
||||||
|
|
||||||
SHELL = /bin/sh
|
SHELL = /bin/sh
|
||||||
|
|
||||||
CVS = cvs -z 4
|
CVS = cvs -z 4
|
||||||
|
|
||||||
SCRIPTS = scripts/eftd.sh scripts/eftp.sh scripts/eftp_setup
|
SCRIPTS = scripts/eftd.sh scripts/eftp.sh
|
||||||
|
|
||||||
#
|
#
|
||||||
#additions to the CHANGES file shall automatically increase the compiled-in
|
#additions to the CHANGES file shall automatically increase the compiled-in
|
||||||
|
@ -13,9 +13,9 @@ SCRIPTS = scripts/eftd.sh scripts/eftp.sh scripts/eftp_setup
|
||||||
E4L_EXTRA_VERSION_DEP := $(shell pwd)/CHANGES
|
E4L_EXTRA_VERSION_DEP := $(shell pwd)/CHANGES
|
||||||
export E4L_EXTRA_VERSION_DEP
|
export E4L_EXTRA_VERSION_DEP
|
||||||
|
|
||||||
CONF_DEPS = ./configure scripts/eftd.sh scripts/eftp.sh scripts/eftp_setup src/config.h Rules.make
|
CONF_DEPS = ./configure scripts/eftd.sh scripts/eftp.sh src/config.h Rules.make
|
||||||
|
|
||||||
#this target is requested from isdn4k-utils default target
|
#this target is required by the isdn4k-utils root makefile's default target
|
||||||
all: $(CONF_DEPS)
|
all: $(CONF_DEPS)
|
||||||
make -C src
|
make -C src
|
||||||
|
|
||||||
|
@ -24,14 +24,12 @@ really_all: $(CONF_DEPS)
|
||||||
|
|
||||||
config src/config.h Rules.make $(SCRIPTS): configure
|
config src/config.h Rules.make $(SCRIPTS): configure
|
||||||
./configure
|
./configure
|
||||||
chmod a+x scripts/eftd.sh scripts/eftp.sh scripts/eftp_setup
|
chmod a+x scripts/eftd.sh scripts/eftp.sh
|
||||||
|
|
||||||
configure: configure.in
|
configure: configure.in
|
||||||
autoconf
|
autoconf
|
||||||
|
|
||||||
permissions: scripts/eftd.sh scripts/eftp.sh scripts/eftp_setup
|
permissions: scripts/eftd.sh scripts/eftp.sh
|
||||||
chown root scripts/eftp_setup
|
|
||||||
chmod u+s scripts/eftp_setup
|
|
||||||
chmod a+x $(SCRIPTS)
|
chmod a+x $(SCRIPTS)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
@ -48,9 +46,12 @@ distclean: clean
|
||||||
|
|
||||||
configureclean: distclean
|
configureclean: distclean
|
||||||
rm -f configure
|
rm -f configure
|
||||||
|
#
|
||||||
|
# This (dummy) target is required by the isdn4k-utils
|
||||||
|
# root makefile but not implemented yet.
|
||||||
|
#
|
||||||
install:
|
install:
|
||||||
echo "dummy install"
|
@echo "NOTE: eurofile install not yet implemented. Install by hand for now!"
|
||||||
|
|
||||||
commit: distclean
|
commit: distclean
|
||||||
$(CVS) commit .
|
$(CVS) commit .
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
$Id: TODO,v 1.2 1999/06/29 18:37:14 he Exp $
|
$Id: TODO,v 1.3 1999/07/25 21:55:28 he Exp $
|
||||||
|
|
||||||
|
|
||||||
Important:
|
Important:
|
||||||
|
@ -11,20 +11,21 @@ Important:
|
||||||
X.25 routes are needed to be set up before the isdn connection
|
X.25 routes are needed to be set up before the isdn connection
|
||||||
can be set up, which is currently done by the eftp.sh shell script
|
can be set up, which is currently done by the eftp.sh shell script
|
||||||
which needs to be run from root. The latter is not acceptable for a
|
which needs to be run from root. The latter is not acceptable for a
|
||||||
general purpose release.
|
general purpose release. (in progress)
|
||||||
|
|
||||||
|
|
||||||
Not showstoppers, but should be done before a possible stable release:
|
Not showstoppers, but should be done before a possible stable release:
|
||||||
|
|
||||||
|
- remove old execve()/script rleated stuff from setup/autoconf
|
||||||
- more casefix testing with new mangeling method
|
- more casefix testing with new mangeling method
|
||||||
- selectivly and automatically (for filesystems not supporting
|
- selectivly and automatically (for filesystems not supporting
|
||||||
symlinks) disallow symlink-based transfer name database
|
symlinks) disallow symlink-based transfer name database
|
||||||
lookup
|
lookup
|
||||||
- certain disconnect scenarios result in error/warning
|
- certain disconnect scenarios result in error/warning
|
||||||
messages which are harmless, but might confuse novice users.
|
messages which are harmless, but might confuse novice users.
|
||||||
|
(in particualar, release/wait for release seems to be buggy)
|
||||||
- improve autoconf readline support (support non-default
|
- improve autoconf readline support (support non-default
|
||||||
locations of libreadline and lib[n]curses).
|
locations of libreadline and lib[n]curses).
|
||||||
- integrate source tree to isdn4k-utils CVS repository.
|
|
||||||
- 'make install', with reasonable default config files.
|
- 'make install', with reasonable default config files.
|
||||||
- make eftp command input working when stdin is a pipe.
|
- make eftp command input working when stdin is a pipe.
|
||||||
- autoconf is somewhat ugly as several configuration variable
|
- autoconf is somewhat ugly as several configuration variable
|
||||||
|
|
|
@ -1552,7 +1552,7 @@ done
|
||||||
ac_given_srcdir=$srcdir
|
ac_given_srcdir=$srcdir
|
||||||
ac_given_INSTALL="$INSTALL"
|
ac_given_INSTALL="$INSTALL"
|
||||||
|
|
||||||
trap 'rm -fr `echo "scripts/eftp_setup scripts/eftp.sh scripts/eftd.sh
|
trap 'rm -fr `echo "scripts/eftp.sh scripts/eftd.sh
|
||||||
src/config.h Rules.make" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
|
src/config.h Rules.make" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
|
||||||
EOF
|
EOF
|
||||||
cat >> $CONFIG_STATUS <<EOF
|
cat >> $CONFIG_STATUS <<EOF
|
||||||
|
@ -1650,7 +1650,7 @@ EOF
|
||||||
|
|
||||||
cat >> $CONFIG_STATUS <<EOF
|
cat >> $CONFIG_STATUS <<EOF
|
||||||
|
|
||||||
CONFIG_FILES=\${CONFIG_FILES-"scripts/eftp_setup scripts/eftp.sh scripts/eftd.sh
|
CONFIG_FILES=\${CONFIG_FILES-"scripts/eftp.sh scripts/eftd.sh
|
||||||
src/config.h Rules.make"}
|
src/config.h Rules.make"}
|
||||||
EOF
|
EOF
|
||||||
cat >> $CONFIG_STATUS <<\EOF
|
cat >> $CONFIG_STATUS <<\EOF
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
dnl Process this file with autoconf to produce a configure script.
|
dnl Process this file with autoconf to produce a configure script.
|
||||||
dnl $Id: configure.in,v 1.4 1999/06/30 22:56:20 he Exp $
|
dnl $Id: configure.in,v 1.5 1999/07/25 21:55:30 he Exp $
|
||||||
|
|
||||||
AC_INIT(COPYING.authlib)
|
AC_INIT(COPYING.authlib)
|
||||||
|
|
||||||
|
@ -86,5 +86,5 @@ AC_SUBST(CONFIG_EFTD)
|
||||||
AC_SUBST(CONFIG_EFTP_READLINE)
|
AC_SUBST(CONFIG_EFTP_READLINE)
|
||||||
AC_SUBST(CONFIG_EFTD_WUAUTH)
|
AC_SUBST(CONFIG_EFTD_WUAUTH)
|
||||||
AC_SUBST(HAVE_GETDELIM)
|
AC_SUBST(HAVE_GETDELIM)
|
||||||
AC_OUTPUT(scripts/eftp_setup scripts/eftp.sh scripts/eftd.sh
|
AC_OUTPUT(scripts/eftp.sh scripts/eftd.sh
|
||||||
src/config.h Rules.make)
|
src/config.h Rules.make)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
@EFT_AUTOCONF_WARNING@
|
@EFT_AUTOCONF_WARNING@
|
||||||
#
|
#
|
||||||
# generated from $Id: eftd.sh.in,v 1.1 1999/06/30 17:02:14 he Exp $
|
# generated from $Id: eftd.sh.in,v 1.2 1999/07/25 21:55:35 he Exp $
|
||||||
#
|
#
|
||||||
# Henner Eisen 1998
|
# Henner Eisen 1998
|
||||||
#
|
#
|
||||||
|
@ -162,6 +162,31 @@ case "$1" in
|
||||||
|
|
||||||
set -- $EFT_SERVER_MSN
|
set -- $EFT_SERVER_MSN
|
||||||
|
|
||||||
|
if [ x$EFTD_WITH_LOOP != x ]; then
|
||||||
|
# for local testing of x.25 connections we load the isdnloop driver
|
||||||
|
$INSMOD -m isdnloop isdnloop_id=eft_loop -o eft_loop> /var/modules/isdnloop.map
|
||||||
|
$LOOPCTRL -d eft_loop start dss1 00000 $EFT_CLIENT_MSN $EFT_SERVER_MSN
|
||||||
|
sleep 1
|
||||||
|
# A local outgoing interface operating on top of (bound to) the
|
||||||
|
# isdnloop driver. X.25 call requests the X.25 address "1"
|
||||||
|
# will be routed through the outgoing interface eft_lout. That call
|
||||||
|
# request will be looped back to our own machine (and received at the
|
||||||
|
# incoming interface created for the eft daemon).
|
||||||
|
|
||||||
|
$ISDNCTRL addif eft_lout
|
||||||
|
$ISDNCTRL eaz eft_lout $EFT_CLIENT_MSN
|
||||||
|
$ISDNCTRL addphone eft_lout out $1
|
||||||
|
$ISDNCTRL l2_prot eft_lout x75i
|
||||||
|
$ISDNCTRL encap eft_lout x25iface
|
||||||
|
$ISDNCTRL huptimeout eft_lout 200
|
||||||
|
# $ISDNCTRL huptimeout eft_lout 30
|
||||||
|
$ISDNCTRL dialmode eft_lout auto
|
||||||
|
$ISDNCTRL bind eft_lout eft_loop,0
|
||||||
|
|
||||||
|
ifconfig eft_lout up
|
||||||
|
$X25ROUTE add 1/1 eft_lout
|
||||||
|
fi
|
||||||
|
|
||||||
for i in $ISDNIF_IN; do
|
for i in $ISDNIF_IN; do
|
||||||
# interface alreay defined?
|
# interface alreay defined?
|
||||||
if { cat /proc/net/dev | grep $i > /dev/null; } ; then
|
if { cat /proc/net/dev | grep $i > /dev/null; } ; then
|
||||||
|
@ -227,31 +252,6 @@ case "$1" in
|
||||||
EFTD_OPTIONS="$EFTD_OPTIONS -b $EFTD_LOG_FILENAME"
|
EFTD_OPTIONS="$EFTD_OPTIONS -b $EFTD_LOG_FILENAME"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ x$EFTD_WITH_LOOP != x ]; then
|
|
||||||
# for local testing of x.25 connections we load the isdnloop driver
|
|
||||||
$INSMOD -m isdnloop isdnloop_id=eft_loop -o eft_loop> /var/modules/isdnloop.map
|
|
||||||
$LOOPCTRL -d eft_loop start dss1 00000 $EFT_CLIENT_MSN $EFT_SERVER_MSN
|
|
||||||
sleep 1
|
|
||||||
# A local outgoing interface operating on top of (bound to) the
|
|
||||||
# isdnloop driver. X.25 call requests the X.25 address "1"
|
|
||||||
# will be routed through the outgoing interface eft_lout. That call
|
|
||||||
# request will be looped back to our own machine (and received at the
|
|
||||||
# incoming interface created for the eft daemon).
|
|
||||||
|
|
||||||
$ISDNCTRL addif eft_lout
|
|
||||||
$ISDNCTRL eaz eft_lout $EFT_CLIENT_MSN
|
|
||||||
$ISDNCTRL addphone eft_lout out $EFT_SERVER_MSN
|
|
||||||
$ISDNCTRL l2_prot eft_lout x75i
|
|
||||||
$ISDNCTRL encap eft_lout x25iface
|
|
||||||
$ISDNCTRL huptimeout eft_lout 200
|
|
||||||
# $ISDNCTRL huptimeout eft_lout 30
|
|
||||||
$ISDNCTRL dialmode eft_lout auto
|
|
||||||
$ISDNCTRL bind eft_lout eft_loop,0
|
|
||||||
|
|
||||||
ifconfig eft_lout up
|
|
||||||
$X25ROUTE add 1/1 eft_lout
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ x"$EFTD_DEBUG" = "x1" ] ; then
|
if [ x"$EFTD_DEBUG" = "x1" ] ; then
|
||||||
echo "Starting EUROFile daemon under gdb."
|
echo "Starting EUROFile daemon under gdb."
|
||||||
# remove a possibly present '-m' option
|
# remove a possibly present '-m' option
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
@EFT_AUTOCONF_WARNING@
|
@EFT_AUTOCONF_WARNING@
|
||||||
#
|
#
|
||||||
# generated from $Id: eftp.sh.in,v 1.1 1999/06/30 17:02:15 he Exp $
|
# generated from $Id: eftp.sh.in,v 1.2 1999/07/25 21:55:37 he Exp $
|
||||||
#
|
#
|
||||||
# This opens an eurofile session to a remote eurofile server
|
# This opens an eurofile session to a remote eurofile server
|
||||||
#
|
#
|
||||||
|
@ -153,7 +153,7 @@ $X25ROUTE add 0/0 isdnxout
|
||||||
|
|
||||||
cd /tmp
|
cd /tmp
|
||||||
eftpbin=@EFT_TOPDIR@/src/eftp/eftp
|
eftpbin=@EFT_TOPDIR@/src/eftp/eftp
|
||||||
su $EFT_CLIENT_USERID -c "$eftpbin -u $2"
|
su $EFT_CLIENT_USERID -c "$eftpbin -x '' -u $2"
|
||||||
|
|
||||||
$ISDNCTRL hangup isdnxout
|
$ISDNCTRL hangup isdnxout
|
||||||
$X25ROUTE del 0/0 isdnxout
|
$X25ROUTE del 0/0 isdnxout
|
||||||
|
@ -166,3 +166,6 @@ if [ $DIALOUT = localhost ]; then
|
||||||
@RMMOD@ isdnloop
|
@RMMOD@ isdnloop
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,161 +0,0 @@
|
||||||
#! @PERL@
|
|
||||||
#
|
|
||||||
@EFT_AUTOCONF_WARNING@
|
|
||||||
#
|
|
||||||
# generated from $Id: eftp_setup.in,v 1.1 1999/06/30 17:02:16 he Exp $
|
|
||||||
#
|
|
||||||
# Helper script for eftp that sets up x.25 network interfaces connectable
|
|
||||||
# to a dedicated remote isdn number.
|
|
||||||
#
|
|
||||||
# (derived fron eftp.sh. Not yet finished and therefor neither usable
|
|
||||||
# nor used yet)
|
|
||||||
#
|
|
||||||
# This must run suid root, thus it is written in perl for security reasons.
|
|
||||||
# You might want to restrict usage of this script to a selected group
|
|
||||||
# of people by setting appropriate group execute permissions when installing
|
|
||||||
# this file.
|
|
||||||
#
|
|
||||||
# External programmes are referenced by absolute pathnames for
|
|
||||||
# security reasons.
|
|
||||||
#
|
|
||||||
# Usage: eftp_setup PHONE_NUMBER FILE_DESCRIPTOR
|
|
||||||
#
|
|
||||||
# PHONE_NUMBER can also be "localhost" in which case a local loopback
|
|
||||||
# connection on top of the isdnloop driver will be used.
|
|
||||||
#
|
|
||||||
# FILE_DESCRIPTOR should be associated with a bidirectional pipe which
|
|
||||||
# will be used to syncronize this script with its parent process.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# There must be no x25 route set up before this script is called.
|
|
||||||
#
|
|
||||||
# For this script to work, the basic setup for the isdn and x25
|
|
||||||
# drivers must be done. The following three modules must be loaded
|
|
||||||
# (or compiled into the kernel) before calling this script:
|
|
||||||
#
|
|
||||||
# "x25" (insmod x25)
|
|
||||||
# "isdn" (insmod isdn)
|
|
||||||
# An isdn HL driver which supports l2_prot x75i (i.e. insmod hisax ...)
|
|
||||||
#
|
|
||||||
#******************************
|
|
||||||
#
|
|
||||||
# Security Consideration:
|
|
||||||
# perl does its best to detect any hidden gotchas that might compromise
|
|
||||||
# security. However, as perl does not know about the security of external
|
|
||||||
# programmes, it cannot protect from security traps hidden inside external
|
|
||||||
# programmes. We kill the whole environment (killing MODPATH is essential).
|
|
||||||
#
|
|
||||||
foreach $key (keys %ENV) {
|
|
||||||
delete $ENV{$key};
|
|
||||||
}
|
|
||||||
#system "printenv";
|
|
||||||
|
|
||||||
#
|
|
||||||
#Scan configuration file for own msn (used for outgoing eft
|
|
||||||
# connection and MSN of local server (used as destination when the
|
|
||||||
# symolic remote address "localhost" is specified).
|
|
||||||
sub my_system {
|
|
||||||
# print @_,"\n";
|
|
||||||
system @_;
|
|
||||||
}
|
|
||||||
|
|
||||||
setpgrp 0, 0;
|
|
||||||
|
|
||||||
open MSN, "@I4LCONFDIR@/eft.conf"
|
|
||||||
or die "Can't open: $!\n";
|
|
||||||
while(<MSN>){
|
|
||||||
SWITCH: {
|
|
||||||
if (/^EFT_CLIENT_MSN=([0-9]*)/) { $EFT_CLIENT_MSN = $1;
|
|
||||||
last SWITCH; }
|
|
||||||
if (/^EFT_SERVER_MSN=([0-9]*)/) { $EFT_SERVER_MSN = $1;
|
|
||||||
last SWITCH; }
|
|
||||||
};
|
|
||||||
};
|
|
||||||
$DIALOUT=$ARGV[0];
|
|
||||||
$sfd=$ARGV[1];
|
|
||||||
$sfdw=$ARGV[2];
|
|
||||||
print "client=", $EFT_CLIENT_MSN, "\n";
|
|
||||||
print "server=", $EFT_SERVER_MSN, "\n";
|
|
||||||
print "dial=", $DIALOUT, "\n";
|
|
||||||
print "pipe=", $sfd, "\n";
|
|
||||||
print "wpipe=", $sfdw, "\n";
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# pipe used to syncronize this helper script with the calling process
|
|
||||||
#
|
|
||||||
open syncpipe, "<&=$sfd";
|
|
||||||
open wsyncpipe, ">&=$sfdw";
|
|
||||||
|
|
||||||
$_=$DIALOUT;
|
|
||||||
|
|
||||||
if(/^localhost$/){
|
|
||||||
# for local testing of x.25 connections we load the isdnloop driver
|
|
||||||
# beware: User settable MODPATH compromises security
|
|
||||||
my_system "@INSMOD@ isdnloop isdnloop_id=isdnfake";
|
|
||||||
# my_system "@INSMOD@ -m isdnloop isdnloop_id=isdnfake > /var/modules/isdnloop.map";
|
|
||||||
my_system "@LOOPCTRL@ -d isdnfake start dss1 00000 $EFT_CLIENT_MSN $EFT_SERVER_MSN";
|
|
||||||
sleep 1;
|
|
||||||
# A local outgoing interface operating on top of (and bound to) the
|
|
||||||
# isdnloop driver. X.25 call requests to arbitray X.25 addresses will be
|
|
||||||
# routet to the outgoing interface isdnxlo1. That call request will be
|
|
||||||
# looped back to our own machine (and received at the incoming
|
|
||||||
# interface created for the eft daemon).
|
|
||||||
|
|
||||||
my_system "@ISDNCTRL@ addif isdnxout";
|
|
||||||
my_system "@ISDNCTRL@", "eaz", "isdnxout", $EFT_CLIENT_MSN;
|
|
||||||
my_system "@ISDNCTRL@", "addphone", "isdnxout", "out", $EFT_SERVER_MSN;
|
|
||||||
my_system "@ISDNCTRL@ l2_prot isdnxout x75i";
|
|
||||||
my_system "@ISDNCTRL@ encap isdnxout x25iface";
|
|
||||||
my_system "@ISDNCTRL@ huptimeout isdnxout 1800";
|
|
||||||
my_system "@ISDNCTRL@ status isdnxout on";
|
|
||||||
my_system "@ISDNCTRL@ bind isdnxout isdnfake,0";
|
|
||||||
} elsif(/[0-9]/) {
|
|
||||||
# outgoing interface operating on top of real HL driver (i.e. HiSax).
|
|
||||||
# A HL driver must already be loaded and support l2_prot x75i.
|
|
||||||
# This will set up a real isdn connection and therefore might leave
|
|
||||||
# traces on your phone bill.
|
|
||||||
|
|
||||||
# Outgoing Interface on top of HiSax to remote server
|
|
||||||
|
|
||||||
my_system "@ISDNCTRL@ addif isdnxout";
|
|
||||||
my_system "@ISDNCTRL@ eaz isdnxout", $EFT_CLIENT_MSN;
|
|
||||||
my_system "@ISDNCTRL@ addphone isdnxout out ", $DIALOUT;
|
|
||||||
my_system "@ISDNCTRL@ l2_prot isdnxout x75i";
|
|
||||||
my_system "@ISDNCTRL@ encap isdnxout x25iface";
|
|
||||||
my_system "@ISDNCTRL@ huptimeout isdnxout 110";
|
|
||||||
my_system "@ISDNCTRL@ secure isdnxout on";
|
|
||||||
my_system "@ISDNCTRL@ status isdnxout on";
|
|
||||||
} else {
|
|
||||||
print "incorrect remote number: \"$DIALOUT\"\n";
|
|
||||||
exit 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#~kernel/eftp4linux-work/scripts/oops.sh
|
|
||||||
my_system "@IFCONFIG@ isdnxout up";
|
|
||||||
|
|
||||||
my_system "@X25ROUTE@ add 0/0 isdnxout";
|
|
||||||
|
|
||||||
#tell parent process that we are ready by writing an x25_addr
|
|
||||||
# (currently the empty address/empty string) to the pipe
|
|
||||||
|
|
||||||
syswrite wsyncpipe, "\0", 1;
|
|
||||||
close wsyncpipe;
|
|
||||||
|
|
||||||
#wait for parent process to finish or to close the connection
|
|
||||||
#(block by reading from the pipe until parent process closes it).
|
|
||||||
|
|
||||||
sysread syncpipe, $dummy, 1;
|
|
||||||
|
|
||||||
print "parent sent ", $dummy, "\n";
|
|
||||||
|
|
||||||
my_system "@ISDNCTRL@ hangup isdnxout";
|
|
||||||
my_system "@X25ROUTE@ del 0/0 isdnxout";
|
|
||||||
my_system "@IFCONFIG@ isdnxout down";
|
|
||||||
my_system "@ISDNCTRL@ delif isdnxout";
|
|
||||||
|
|
||||||
$_=$DIALOUT;
|
|
||||||
if(/^localhost$/){
|
|
||||||
sleep 2;
|
|
||||||
my_system "@RMMOD@ isdnloop";
|
|
||||||
}
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: access.c,v 1.1 1999/06/30 17:18:08 he Exp $ */
|
/* $Id: access.c,v 1.2 1999/07/25 21:55:43 he Exp $ */
|
||||||
/* Copyright 1997 by Henner Eisen
|
/* Copyright 1997 by Henner Eisen
|
||||||
|
|
||||||
This code is free software; you can redistribute it and/or
|
This code is free software; you can redistribute it and/or
|
||||||
|
@ -424,7 +424,9 @@ int tdu_wait_for_end_access(struct tdu_fsm * fsm, struct timeval * timeout)
|
||||||
int tdu_end_access_received(struct tdu_fsm *fsm)
|
int tdu_end_access_received(struct tdu_fsm *fsm)
|
||||||
{
|
{
|
||||||
tdu_printf(TDU_LOG_TRC, "tdu_end_access_received()\n");
|
tdu_printf(TDU_LOG_TRC, "tdu_end_access_received()\n");
|
||||||
|
#if 0
|
||||||
|
tdu_printf(TDU_LOG_AP3, "tdu_end_access_received()\n");
|
||||||
|
#endif
|
||||||
if( fsm->assoc.slave_handler ){
|
if( fsm->assoc.slave_handler ){
|
||||||
tdu_send_response_pos(fsm,TDU_CI_T_END_ACCESS);
|
tdu_send_response_pos(fsm,TDU_CI_T_END_ACCESS);
|
||||||
fsm->assoc.handler = fsm->assoc.slave_handler;
|
fsm->assoc.handler = fsm->assoc.slave_handler;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: assoc.c,v 1.1 1999/06/30 17:18:09 he Exp $ */
|
/* $Id: assoc.c,v 1.2 1999/07/25 21:55:47 he Exp $ */
|
||||||
/*
|
/*
|
||||||
Copyright 1997 by Henner Eisen
|
Copyright 1997 by Henner Eisen
|
||||||
|
|
||||||
|
@ -345,7 +345,9 @@ void tdu_assoc_set_idle(struct tdu_fsm * fsm)
|
||||||
static void tdu_release_received(struct tdu_fsm * fsm)
|
static void tdu_release_received(struct tdu_fsm * fsm)
|
||||||
{
|
{
|
||||||
tdu_printf(TDU_LOG_TRC, "tdu_release_received()\n");
|
tdu_printf(TDU_LOG_TRC, "tdu_release_received()\n");
|
||||||
|
#if 0
|
||||||
|
tdu_printf(TDU_LOG_AP3, "tdu_release_received()\n");
|
||||||
|
#endif
|
||||||
if( fsm->regime_handler == & fsm->assoc.handler ){
|
if( fsm->regime_handler == & fsm->assoc.handler ){
|
||||||
tdu_send_response_pos(fsm, TDU_CI_T_RELEASE);
|
tdu_send_response_pos(fsm, TDU_CI_T_RELEASE);
|
||||||
fsm->idle.handler = tdu_released;
|
fsm->idle.handler = tdu_released;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* $Id: eft_i4l.c,v 1.1 1999/06/30 17:18:16 he Exp $ */
|
/* $Id: eft_i4l.c,v 1.2 1999/07/25 21:55:48 he Exp $ */
|
||||||
/*
|
/*
|
||||||
* isdn4linux implementation specific functions
|
* isdn4linux implementation dependent functions
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
@ -12,14 +12,16 @@
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
|
#include <net/if.h>
|
||||||
#include <linux/x25.h>
|
#include <linux/x25.h>
|
||||||
#include <linux/isdn.h>
|
#include <linux/isdn.h>
|
||||||
|
#include <linux/isdnif.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include "../config.h"
|
#include "../config.h"
|
||||||
#include <eft.h>
|
#include <eft.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* get the remote phone number corresponding to the connected socket.
|
* Get the remote phone number corresponding to the connected socket.
|
||||||
* isdn_no must be an array of at least 21 chacters
|
* isdn_no must be an array of at least 21 chacters
|
||||||
*/
|
*/
|
||||||
int eft_get_peer_phone(unsigned char * isdn_no, int sk)
|
int eft_get_peer_phone(unsigned char * isdn_no, int sk)
|
||||||
|
@ -32,17 +34,17 @@ int eft_get_peer_phone(unsigned char * isdn_no, int sk)
|
||||||
|
|
||||||
isdn_no[0] = 0;
|
isdn_no[0] = 0;
|
||||||
|
|
||||||
#ifdef IIOCNETGPN
|
|
||||||
/*
|
|
||||||
* If this experimental IOCTL is supported, the peer number is really
|
|
||||||
* determined
|
|
||||||
* from the network interface
|
|
||||||
*/
|
|
||||||
fd = open("/dev/isdninfo",O_RDONLY);
|
fd = open("/dev/isdninfo",O_RDONLY);
|
||||||
if ( fd < 0 ){
|
if ( fd < 0 ){
|
||||||
perror("eft_get_peer_phone:open(/dev/isdninfo)");
|
perror("eft_get_peer_phone:open(/dev/isdninfo)");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef IIOCNETGPN
|
||||||
|
/*
|
||||||
|
* This IOCTL is supported in recent i4l-cvs version and in kernel 2.3.6.
|
||||||
|
* The peer number is really determined from the network interface
|
||||||
|
*/
|
||||||
d = eft_get_device(dev, EFT_DEV_NAME_LEN, sk);
|
d = eft_get_device(dev, EFT_DEV_NAME_LEN, sk);
|
||||||
if ( ! d ){
|
if ( ! d ){
|
||||||
fprintf(stderr,"eft_get_peer_phone: unable to figure out "
|
fprintf(stderr,"eft_get_peer_phone: unable to figure out "
|
||||||
|
@ -111,119 +113,254 @@ if( ! try_first_channel ) return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* configure isdn network devices for outgoing eft connection
|
* Configure isdn network devices for outgoing eft connection
|
||||||
*/
|
*/
|
||||||
static int sync_pipe_r=-1;
|
static int sync_pipe_r=-1;
|
||||||
static int sync_pipe_w=-1;
|
static int sync_pipe_w=-1;
|
||||||
|
int eft_get_x25route(struct sockaddr_x25 * x25addr,
|
||||||
int eft_get_x25route(struct sockaddr_x25 * x25addr, char * isdn_no)
|
struct x25_route_struct *x25_route, char * isdn_no)
|
||||||
{
|
{
|
||||||
int filedes_r[2], filedes_w[2], err;
|
int s=-1, ifd=-1, filedes[2], err;
|
||||||
#define FD_STR_SIZE 25
|
char * addr = "", if_name[255]="eftpout0";
|
||||||
char *args[5], fd_str_r[FD_STR_SIZE],
|
|
||||||
fd_str_w[FD_STR_SIZE], *env[1];
|
isdn_net_ioctl_phone phone;
|
||||||
pid_t pid;
|
isdn_net_ioctl_cfg cfg;
|
||||||
|
struct ifreq ifr;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* By convention, the symbolic isdn address "localhost" is
|
* By convention, the symbolic isdn address "localhost" is
|
||||||
* mapped to x25 address "1" and the eftd.sh setup script
|
* mapped to x25 address "1" and we assume that an external setup
|
||||||
* may already have configured a corresponding interface and an
|
* script has already configured a corresponding interface and an
|
||||||
* x25 route.
|
* x25 route.
|
||||||
*/
|
*/
|
||||||
if( strcmp(isdn_no, "localhost") == 0 ) {
|
if( strcmp(isdn_no, "localhost") == 0 ) {
|
||||||
strcpy(x25addr->sx25_addr.x25_addr, "1");
|
strcpy(x25addr->sx25_addr.x25_addr, "1");
|
||||||
|
/* don't set proper device name such that this magic route is
|
||||||
|
not accessible from caller */
|
||||||
|
x25_route->device[0] = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* pipe for later telling the waiting parent to release the route */
|
||||||
|
if(pipe(filedes)){
|
||||||
|
perror("eft_get_x25route():pipe()");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
sync_pipe_r=filedes[0];
|
||||||
|
sync_pipe_w=filedes[1];
|
||||||
|
|
||||||
if(pipe(filedes_r)){
|
if ((s = socket(PF_X25, SOCK_SEQPACKET, 0)) < 0 ) {
|
||||||
perror("eft_setup_route():pipe()");
|
perror("eft_get_x25route: socket");
|
||||||
return -1;
|
return 1;
|
||||||
}
|
}
|
||||||
sync_pipe_r=filedes_r[0];
|
|
||||||
if(pipe(filedes_w)){
|
memset(&cfg,0,sizeof(cfg));
|
||||||
perror("eft_setup_route():pipe()");
|
strcpy(cfg.name, if_name);
|
||||||
return -1;
|
|
||||||
}
|
if( (ifd=open("/dev/isdnctrl",O_RDWR)) < 0){
|
||||||
sync_pipe_w=filedes_w[1];
|
perror("open isdnctrl");
|
||||||
pid = fork();
|
err = -1;
|
||||||
if( pid<0 ){
|
goto error;
|
||||||
perror("eft_setup_route():fork()");
|
};
|
||||||
return -1;
|
|
||||||
} else if( pid > 0 ) {
|
if( ioctl(ifd, IIOCNETAIF, if_name) ){
|
||||||
/* parent process */
|
perror("addif");
|
||||||
printf("waiting for set up\n");
|
err = -1;
|
||||||
close(filedes_w[0]);
|
|
||||||
close(filedes_r[1]);
|
|
||||||
err=read(sync_pipe_r,x25addr->sx25_addr.x25_addr,
|
|
||||||
sizeof(x25_address));
|
|
||||||
if( err < 1 ){
|
|
||||||
perror("eft_setup_route():parent read sync_pipe");
|
|
||||||
return -1;
|
|
||||||
} else {
|
|
||||||
x25addr->sx25_addr.x25_addr[err-1]=0;
|
|
||||||
printf("set up successful, address \"%s\", len=%d\n",
|
|
||||||
x25addr->sx25_addr.x25_addr, err-1);
|
|
||||||
/*FIXME: we should read the x25address from the pipe*/
|
|
||||||
strcpy(x25addr->sx25_addr.x25_addr, "");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
/* child process */
|
if ( ioctl(ifd, IIOCNETGCF, &cfg) ){
|
||||||
/* FIXME: locate this script outside of eftp4linux source tree */
|
perror("get_cfg");
|
||||||
args[0] = CONFIG_EFT_TOPDIR "/scripts/eftp_setup";
|
err = -1;
|
||||||
args[1] = isdn_no;
|
goto error_delif;
|
||||||
err = snprintf(fd_str_w,FD_STR_SIZE,"%d",filedes_w[0]);
|
}
|
||||||
args[2] = fd_str_w;
|
/* FIXME: hard coded MSN, should be read from config file */
|
||||||
err = snprintf(fd_str_r,FD_STR_SIZE,"%d",filedes_r[1]);
|
strncpy(cfg.eaz, "3904300", sizeof(cfg.eaz));
|
||||||
args[3] = fd_str_r;
|
cfg.eaz[sizeof(cfg.eaz)-1] = 0;
|
||||||
args[4] = NULL;
|
cfg.l2_proto = ISDN_PROTO_L2_X75I;
|
||||||
env[0] = NULL;
|
cfg.dialmax = 1;
|
||||||
close(filedes_w[1]);
|
cfg.secure = 1;
|
||||||
close(filedes_r[0]);
|
cfg.onhtime = 200;
|
||||||
execve(args[0],args,env);
|
cfg.p_encap = ISDN_NET_ENCAP_X25IFACE;
|
||||||
perror("execve");
|
#ifdef ISDN_NET_DM_AUTO
|
||||||
exit(1);
|
cfg.dialmode = ISDN_NET_DM_AUTO;
|
||||||
|
#endif
|
||||||
|
if ( ioctl(ifd, IIOCNETSCF, &cfg) ){
|
||||||
|
perror("set_cfg");
|
||||||
|
err = -1;
|
||||||
|
ioctl(ifd, IIOCNETDIF, if_name);
|
||||||
|
goto error_delif;
|
||||||
|
}
|
||||||
|
|
||||||
|
strcpy(phone.name, if_name);
|
||||||
|
phone.outgoing = 1;
|
||||||
|
strncpy(phone.phone, isdn_no, ISDN_MSNLEN);
|
||||||
|
phone.phone[ISDN_MSNLEN-1] = 0;
|
||||||
|
if( ioctl(ifd, IIOCNETANM, &phone) ){
|
||||||
|
perror("add_phone");
|
||||||
|
err = -1;
|
||||||
|
goto error_delif;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ifconfig up */
|
||||||
|
strcpy(ifr.ifr_name, if_name);
|
||||||
|
if (ioctl(s, SIOCGIFFLAGS, &ifr) ) {
|
||||||
|
perror("SIOCAGIFFLAGS");
|
||||||
|
err = -1;
|
||||||
|
goto error_delif;
|
||||||
|
}
|
||||||
|
ifr.ifr_flags |= IFF_UP;
|
||||||
|
if (ioctl(s, SIOCGIFFLAGS, &ifr) ) {
|
||||||
|
perror("SIOCAGIFFLAGS");
|
||||||
|
err = -1;
|
||||||
|
goto error_delif;
|
||||||
|
} else {
|
||||||
|
ifr.ifr_flags |= IFF_UP;
|
||||||
|
if (ioctl(s, SIOCSIFFLAGS, &ifr) ) {
|
||||||
|
perror("SIOCASIFFLAGS");
|
||||||
|
err = -1;
|
||||||
|
goto error_ifdown;
|
||||||
|
}
|
||||||
|
strcpy(x25_route->address.x25_addr, addr);
|
||||||
|
x25_route->sigdigits = strlen(addr);
|
||||||
|
strcpy(x25_route->device, if_name);
|
||||||
|
printf( "adding route %s, sig=%d\n",addr,x25_route->sigdigits);
|
||||||
|
if (ioctl(s, SIOCADDRT, x25_route) ) {
|
||||||
|
perror("SIOCADDRT");
|
||||||
|
err = -1;
|
||||||
|
goto error_ifdown;
|
||||||
|
}
|
||||||
|
strcpy(x25addr->sx25_addr.x25_addr, addr);
|
||||||
|
err = 0;
|
||||||
|
error_ifdown:
|
||||||
|
if( err ) {
|
||||||
|
ifr.ifr_flags &= ~IFF_UP;
|
||||||
|
ioctl(s, SIOCSIFFLAGS, &ifr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
error_delif:
|
||||||
|
if(err) ioctl(ifd, IIOCNETDIF, if_name);
|
||||||
}
|
}
|
||||||
return -1;
|
error:
|
||||||
|
close(ifd);
|
||||||
|
close(s);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* wait for request from child to release x25 route
|
||||||
|
*/
|
||||||
|
int eft_wait_release_route()
|
||||||
|
{
|
||||||
|
char dummy[1];
|
||||||
|
|
||||||
|
close(sync_pipe_w);
|
||||||
|
sync_pipe_w = -1;
|
||||||
|
/* printf("waiting for release route\n"); */
|
||||||
|
read(sync_pipe_r,dummy,1);
|
||||||
|
/* printf("end waiting\n"); */
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* release isdn network devices
|
* release isdn network devices
|
||||||
*/
|
*/
|
||||||
int eft_release_route(struct sockaddr_x25 * x25addr, char * isdn_no)
|
int eft_signal_release_route()
|
||||||
{
|
{
|
||||||
|
/* signal release route request to possible parent process */
|
||||||
|
/* printf("signalling release route\n"); */
|
||||||
|
close(sync_pipe_r);
|
||||||
|
sync_pipe_r = -1;
|
||||||
close(sync_pipe_w);
|
close(sync_pipe_w);
|
||||||
|
sync_pipe_w = -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int eft_release_route(struct x25_route_struct * x25_route)
|
||||||
|
{
|
||||||
|
int s;
|
||||||
|
|
||||||
|
/* try closing the route ourselves */
|
||||||
|
if ((s = socket(PF_X25, SOCK_SEQPACKET, 0)) < 0) {
|
||||||
|
perror("eft_release_route: socket");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* printf("releasing route\n"); */
|
||||||
|
if (ioctl(s, SIOCDELRT, x25_route) == -1) {
|
||||||
|
perror("SIOCDELRT");
|
||||||
|
close(s);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
/* printf("route released\n"); */
|
||||||
|
close(s);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* hangup physical connection of isdn network interface.
|
* hang up physical connection of isdn network interface.
|
||||||
*/
|
*/
|
||||||
void eft_dl_disconnect(unsigned char * iif)
|
void eft_dl_disconnect(unsigned char * if_name)
|
||||||
{
|
{
|
||||||
pid_t pid;
|
int ifd;
|
||||||
char buf[80];
|
|
||||||
sprintf(buf,EFT_ISDNCTRL_PATH " hangup %s",iif);
|
if( (ifd=open("/dev/isdnctrl",O_RDWR)) < 0){
|
||||||
/* printf(buf);printf("\n"); */
|
perror("open isdnctrl");
|
||||||
/* system(buf) */
|
goto error;
|
||||||
pid=fork();
|
};
|
||||||
if(pid==0){
|
if( ioctl(ifd, IIOCNETHUP, if_name) < 0 ){
|
||||||
/* FIXME: isdnctrl path should not be hardcoded here */
|
perror("hangup");
|
||||||
printf("%s %s %s %s\n",EFT_ISDNCTRL_PATH,"isdnctrl", "hangup", iif);
|
goto error;
|
||||||
execl(EFT_ISDNCTRL_PATH,"isdnctrl", "hangup", iif, NULL);
|
|
||||||
perror("execl()");
|
|
||||||
} else if(pid>0) {
|
|
||||||
int status;
|
|
||||||
if( wait(&status) != pid ){
|
|
||||||
perror("eft_dl_disconnect: wait failed");
|
|
||||||
}
|
|
||||||
wait(&status);
|
|
||||||
}
|
}
|
||||||
|
error:
|
||||||
|
close(ifd);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* release (possibly remove) isdn network interface.
|
||||||
|
*/
|
||||||
|
int eft_release_device(unsigned char * if_name)
|
||||||
|
{
|
||||||
|
int err=0, s=-1, ifd=-1;
|
||||||
|
struct ifreq ifr;
|
||||||
|
|
||||||
|
if ((s = socket(PF_X25, SOCK_SEQPACKET, 0)) < 0) {
|
||||||
|
perror("eft_release_device: socket");
|
||||||
|
goto error_delif;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ifconfig down */
|
||||||
|
ifr.ifr_flags = 0;
|
||||||
|
strcpy(ifr.ifr_name, if_name);
|
||||||
|
if (ioctl(s, SIOCGIFFLAGS, &ifr) ) {
|
||||||
|
perror("SIOCGIFFLAGS");
|
||||||
|
err = -1;
|
||||||
|
goto error_delif;
|
||||||
|
}
|
||||||
|
ifr.ifr_flags &= ~IFF_UP;
|
||||||
|
if (ioctl(s, SIOCSIFFLAGS, &ifr) ) {
|
||||||
|
perror("SIOCSIFFLAGS");
|
||||||
|
err = -1;
|
||||||
|
goto error_delif;
|
||||||
|
}
|
||||||
|
|
||||||
|
error_delif:
|
||||||
|
if( (ifd=open("/dev/isdnctrl",O_RDWR)) < 0){
|
||||||
|
perror("open isdnctrl");
|
||||||
|
err = -1;
|
||||||
|
goto error;
|
||||||
|
};
|
||||||
|
if( ioctl(ifd, IIOCNETDIF, if_name) ){
|
||||||
|
perror("delif");
|
||||||
|
err = -1;
|
||||||
|
}
|
||||||
|
ioctl(ifd, IIOCNETDIF, if_name);
|
||||||
|
|
||||||
|
error:
|
||||||
|
close(ifd);
|
||||||
|
close(s);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* return the name of the network interface which is used by
|
* Return the name of the network interface which is used by
|
||||||
* a connected X.25 socket.
|
* a connected X.25 socket.
|
||||||
*
|
*
|
||||||
* This is a hack as it uses /proc file system contents like kernel internal
|
* This is a hack as it uses /proc file system contents like kernel internal
|
||||||
|
@ -239,7 +376,7 @@ char * eft_get_device(char * dev, int len, int sock_fd)
|
||||||
static char dummy[]="dummy";
|
static char dummy[]="dummy";
|
||||||
int i, inod_col, dev_col;
|
int i, inod_col, dev_col;
|
||||||
|
|
||||||
/* first, the socket's inode number is exctracted from the
|
/* first, the socket's inode number is extracted from the
|
||||||
* socket file descriptors /proc/self/fd/# symbolic link contents
|
* socket file descriptors /proc/self/fd/# symbolic link contents
|
||||||
*/
|
*/
|
||||||
snprintf(path_buf,MAXPATHLEN+1,"/proc/self/fd/%d",sock_fd);
|
snprintf(path_buf,MAXPATHLEN+1,"/proc/self/fd/%d",sock_fd);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: eft.h,v 1.1 1999/06/30 17:28:39 he Exp $ */
|
/* $Id: eft.h,v 1.2 1999/07/25 21:55:53 he Exp $ */
|
||||||
/*
|
/*
|
||||||
* Interface for accessing eurofile service primitives.
|
* Interface for accessing eurofile service primitives.
|
||||||
* Eurofile for Linux is implemented as a library. Programmers
|
* Eurofile for Linux is implemented as a library. Programmers
|
||||||
|
@ -73,9 +73,13 @@ extern void eft_fix_cases(unsigned char *);
|
||||||
/* extern void eft_set_slash_fix(struct eft *, int);
|
/* extern void eft_set_slash_fix(struct eft *, int);
|
||||||
extern int eft_need_slash_fix(struct eft *); */
|
extern int eft_need_slash_fix(struct eft *); */
|
||||||
struct sockaddr_x25;
|
struct sockaddr_x25;
|
||||||
extern int eft_get_x25route(struct sockaddr_x25 *, char *isdn_no);
|
struct x25_route_struct;
|
||||||
extern int eft_release_route(struct sockaddr_x25 *, char * isdn_no);
|
extern int eft_get_x25route(struct sockaddr_x25 *, struct x25_route_struct *, char *isdn_no);
|
||||||
|
extern int eft_release_route(struct x25_route_struct *);
|
||||||
|
extern int eft_signal_release_route();
|
||||||
|
extern int eft_wait_release_route();
|
||||||
extern void eft_dl_disconnect(unsigned char *);
|
extern void eft_dl_disconnect(unsigned char *);
|
||||||
|
extern int eft_release_device(unsigned char *);
|
||||||
|
|
||||||
extern long eft_get_flags(struct eft *);
|
extern long eft_get_flags(struct eft *);
|
||||||
extern void eft_set_flags(struct eft *, long);
|
extern void eft_set_flags(struct eft *, long);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: eftd.c,v 1.1 1999/06/30 17:19:02 he Exp $ */
|
/* $Id: eftd.c,v 1.2 1999/07/25 21:55:58 he Exp $ */
|
||||||
/*
|
/*
|
||||||
Copyright 1998 by Henner Eisen
|
Copyright 1998 by Henner Eisen
|
||||||
|
|
||||||
|
@ -737,8 +737,9 @@ int main(int argc, char** argv)
|
||||||
*/
|
*/
|
||||||
if( sigprocmask(SIG_BLOCK, &sig_pipe, NULL) )
|
if( sigprocmask(SIG_BLOCK, &sig_pipe, NULL) )
|
||||||
perror("sigprocmask()");
|
perror("sigprocmask()");
|
||||||
|
#if 1
|
||||||
setsockopt(ns,SOL_SOCKET,SO_LINGER,&ling,sizeof(ling));
|
setsockopt(ns,SOL_SOCKET,SO_LINGER,&ling,sizeof(ling));
|
||||||
|
#endif
|
||||||
/*
|
/*
|
||||||
* attach authentication methods to the protocol state machine
|
* attach authentication methods to the protocol state machine
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: eftp.c,v 1.1 1999/06/30 17:19:08 he Exp $ */
|
/* $Id: eftp.c,v 1.2 1999/07/25 21:56:04 he Exp $ */
|
||||||
/*
|
/*
|
||||||
Copyright 1997 by Henner Eisen
|
Copyright 1997 by Henner Eisen
|
||||||
|
|
||||||
|
@ -117,6 +117,7 @@
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
#include <linux/x25.h>
|
#include <linux/x25.h>
|
||||||
/* for error mask setting */
|
/* for error mask setting */
|
||||||
#include <tdu_user.h>
|
#include <tdu_user.h>
|
||||||
|
@ -469,6 +470,7 @@ static void show_help(char *cmd)
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
struct sockaddr_x25 x25bind, x25connect;
|
struct sockaddr_x25 x25bind, x25connect;
|
||||||
|
struct x25_route_struct x25_route;
|
||||||
int s, count, on=1, selval, prompt_for_pw = 1;
|
int s, count, on=1, selval, prompt_for_pw = 1;
|
||||||
unsigned char called[TDU_PLEN_ADDR+1], udata[TDU_PLEN_UDATA+1];
|
unsigned char called[TDU_PLEN_ADDR+1], udata[TDU_PLEN_UDATA+1];
|
||||||
|
|
||||||
|
@ -523,6 +525,83 @@ int main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( isdn_no ){
|
||||||
|
/*
|
||||||
|
* If the destinatioin is given by means of an isdn number,
|
||||||
|
* we will try to dynamically create an isdn X.25 network
|
||||||
|
* interface and an x.25 route through it. In order to
|
||||||
|
* reliably hang up the connection later -- even if this
|
||||||
|
* programm crashes -- we will fork a child process in charge
|
||||||
|
* of the real work and ourselves will only wait for that
|
||||||
|
* child to exit such that we can clean up the low layer
|
||||||
|
* connection afterwards.
|
||||||
|
*
|
||||||
|
* In order to dynamically create isdn network interfaces
|
||||||
|
* and to set them up, we need certain priviliges (write
|
||||||
|
* access to /dev/isdnctrl and netadmin capability). However,
|
||||||
|
* we don't want to grant those priviliges to the executing
|
||||||
|
* eftp program. Forking also allows us to run the child
|
||||||
|
* process with fewer priviliges than ourselves.
|
||||||
|
*/
|
||||||
|
pid_t pid;
|
||||||
|
|
||||||
|
fprintf(stderr, "Setting up isdn x25 network interface\n");
|
||||||
|
if( eft_get_x25route(&x25connect,&x25_route,isdn_no) ){
|
||||||
|
perror("eftp: unable to get an X.25 route for isdn number");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
pid = fork();
|
||||||
|
if( pid<0 ){
|
||||||
|
perror("eftp: fork()");
|
||||||
|
exit(1);
|
||||||
|
} else if( pid > 0 ) {
|
||||||
|
/*
|
||||||
|
* parent process
|
||||||
|
*
|
||||||
|
* We first wait until the child no longer needs the
|
||||||
|
* x25 route and clear the route (needs netadmin
|
||||||
|
* capability)
|
||||||
|
*/
|
||||||
|
int status, err=0;
|
||||||
|
|
||||||
|
close(s);
|
||||||
|
eft_wait_release_route();
|
||||||
|
eft_release_route(&x25_route);
|
||||||
|
/*
|
||||||
|
* Finally, wait for the child to exit and clear
|
||||||
|
* the low layer isdn connection and remove
|
||||||
|
* dynamically created interfaces (needs netadmin
|
||||||
|
* capability and write access to /dev/isdnctrl)
|
||||||
|
*/
|
||||||
|
if( wait(&status) != pid ){
|
||||||
|
perror("eftp supervisor: wait failed");
|
||||||
|
err = 1;
|
||||||
|
} else {
|
||||||
|
if(WIFSIGNALED(status)){
|
||||||
|
tdu_printf(TDU_LOG_ERR,
|
||||||
|
"internal error in eftp[%d]: %s\n\tyou might try to debug eftp using gdb\n",
|
||||||
|
pid, strsignal(WTERMSIG(status)));
|
||||||
|
err = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
eft_dl_disconnect( x25_route.device );
|
||||||
|
eft_release_device( x25_route.device );
|
||||||
|
exit(err);
|
||||||
|
} else {
|
||||||
|
/* Child process
|
||||||
|
*
|
||||||
|
* Just contiunue processing the protocol
|
||||||
|
*/
|
||||||
|
;
|
||||||
|
}
|
||||||
|
} else if( x25_no ){
|
||||||
|
strncpy(x25connect.sx25_addr.x25_addr, x25_no, 15);
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "Neither isdn nor X.25 address specified.\n"
|
||||||
|
" Assuming route to empty X.25 address\n");
|
||||||
|
strcpy(x25connect.sx25_addr.x25_addr, "");
|
||||||
|
}
|
||||||
|
|
||||||
/* build ident string [uid/password] from various input sources */
|
/* build ident string [uid/password] from various input sources */
|
||||||
ident = NULL;
|
ident = NULL;
|
||||||
if( user ) {
|
if( user ) {
|
||||||
|
@ -565,7 +644,6 @@ int main(int argc, char **argv)
|
||||||
strcpy(x25bind.sx25_addr.x25_addr, "" );
|
strcpy(x25bind.sx25_addr.x25_addr, "" );
|
||||||
|
|
||||||
x25connect.sx25_family = AF_X25;
|
x25connect.sx25_family = AF_X25;
|
||||||
strcpy(x25connect.sx25_addr.x25_addr, "");
|
|
||||||
|
|
||||||
s = socket(AF_X25, SOCK_SEQPACKET, 0);
|
s = socket(AF_X25, SOCK_SEQPACKET, 0);
|
||||||
if (s < 0) {
|
if (s < 0) {
|
||||||
|
@ -648,16 +726,6 @@ int main(int argc, char **argv)
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if( isdn_no ){
|
|
||||||
fprintf(stderr, "Setting up isdn x25 network interface\n");
|
|
||||||
if( eft_get_x25route(&x25connect,isdn_no) ){
|
|
||||||
perror("eftp: unable get an x25route for isdn number");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
} else if( x25_no ){
|
|
||||||
strncpy(x25connect.sx25_addr.x25_addr, x25_no, 15);
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(stderr, "Trying to establish X.25 DTE-DTE connection to "
|
fprintf(stderr, "Trying to establish X.25 DTE-DTE connection to "
|
||||||
"x25 address \"%s\" ...\n", x25connect.sx25_addr.x25_addr);
|
"x25 address \"%s\" ...\n", x25connect.sx25_addr.x25_addr);
|
||||||
if (connect(s, (struct sockaddr *)&x25connect, sizeof (x25connect)) < 0) {
|
if (connect(s, (struct sockaddr *)&x25connect, sizeof (x25connect)) < 0) {
|
||||||
|
@ -665,6 +733,18 @@ int main(int argc, char **argv)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
fprintf(stderr,"eftp: X.25 connection established.\n");
|
fprintf(stderr,"eftp: X.25 connection established.\n");
|
||||||
|
|
||||||
|
if(isdn_no){
|
||||||
|
/* Now we are connected and don't need the X.25 route
|
||||||
|
* any longer. We tell our parent to release it. Thus,
|
||||||
|
* the route is free for re-use by other eftp clients.
|
||||||
|
* Relasing it also disables other users to play dirty
|
||||||
|
* tricks on us by piggybacking other X.25 connection
|
||||||
|
* throug our isdn connection.
|
||||||
|
*/
|
||||||
|
eft_signal_release_route(&x25_route);
|
||||||
|
}
|
||||||
|
|
||||||
if( ioctl( s, SIOCX25GFACILITIES, &facilities ) != 0 ){
|
if( ioctl( s, SIOCX25GFACILITIES, &facilities ) != 0 ){
|
||||||
perror("eftp: SIOCX25GFACILITIES failed");
|
perror("eftp: SIOCX25GFACILITIES failed");
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -686,8 +766,8 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
/* This specifies the amount of (debugging) output printed to stderr*/
|
/* This specifies the amount of (debugging) output printed to stderr*/
|
||||||
/* tdu_stderr_mask = TDU_LOG_FH | TDU_LOG_REW | TDU_LOG_ERR; */
|
/* tdu_stderr_mask = TDU_LOG_FH | TDU_LOG_REW | TDU_LOG_ERR; */
|
||||||
tdu_stderr_mask = TDU_LOG_ERR | TDU_LOG_IER | TDU_LOG_OER /*| TDU_LOG_DBG
|
tdu_stderr_mask = TDU_LOG_ERR | TDU_LOG_IER | TDU_LOG_OER /* | TDU_LOG_DBG
|
||||||
| TDU_LOG_HASH | TDU_LOG_TMP */ ;
|
| TDU_LOG_HASH | TDU_LOG_TMP */ ;
|
||||||
#if 0
|
#if 0
|
||||||
/* for maximum amount of debugging output use */
|
/* for maximum amount of debugging output use */
|
||||||
tdu_stderr_mask = -1 /* ^ TDU_LOG_TMP ^ TDU_LOG_TRC */;
|
tdu_stderr_mask = -1 /* ^ TDU_LOG_TMP ^ TDU_LOG_TRC */;
|
||||||
|
@ -702,8 +782,9 @@ int main(int argc, char **argv)
|
||||||
*/
|
*/
|
||||||
if( sigprocmask(SIG_BLOCK, &sig_pipe, NULL) )
|
if( sigprocmask(SIG_BLOCK, &sig_pipe, NULL) )
|
||||||
perror("sigprocmask()");
|
perror("sigprocmask()");
|
||||||
|
#if 1
|
||||||
setsockopt(s,SOL_SOCKET,SO_LINGER,&ling,sizeof(ling));
|
setsockopt(s,SOL_SOCKET,SO_LINGER,&ling,sizeof(ling));
|
||||||
|
#endif
|
||||||
/* and finally establish logical eft connection */
|
/* and finally establish logical eft connection */
|
||||||
if( eft_connect( eft, ident) < 0 ) {
|
if( eft_connect( eft, ident) < 0 ) {
|
||||||
fprintf(stderr, "eftp: connection failed\n");
|
fprintf(stderr, "eftp: connection failed\n");
|
||||||
|
@ -777,8 +858,13 @@ int main(int argc, char **argv)
|
||||||
disconnect:
|
disconnect:
|
||||||
printf("eftp: requesting eft_disconnect()\n");
|
printf("eftp: requesting eft_disconnect()\n");
|
||||||
eft_disconnect( eft );
|
eft_disconnect( eft );
|
||||||
|
/* XXX why this? Without sleep, disconnect processing does not
|
||||||
|
* complete properly on the server side.
|
||||||
|
* this is probably caused by unclean termination of association regime
|
||||||
|
* (wait criteron for end of association falsly claimed to early)
|
||||||
|
*/
|
||||||
|
sleep(1);
|
||||||
close(s);
|
close(s);
|
||||||
if( isdn_no ) eft_release_route( &x25connect, isdn_no );
|
|
||||||
|
|
||||||
Ende: pid = getpid();
|
Ende: pid = getpid();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue