New version of control utility.
Added activate-function for isdnlog trace information.
This commit is contained in:
parent
ea2d6d8f84
commit
8d30ca7e32
|
@ -25,6 +25,14 @@ in a specified directory.
|
|||
|
||||
In addition, this utility provides some trace and debug features.
|
||||
|
||||
If you want to use isdnlog with your active Eicon card, the good
|
||||
news are, you can activate this with the command
|
||||
|
||||
eiconctrl isdnlog on
|
||||
|
||||
(off course, you can deactivate this using "eiconctrl isdnlog off").
|
||||
The bad news are, this is only possible with the
|
||||
DIVA Server BRI card.
|
||||
|
||||
NOTICE :
|
||||
This package is also part of isdn4k-utils package for isdn4linux
|
||||
|
|
|
@ -20,6 +20,26 @@ AC_DEFUN(AC_CHECK_XLOG, [
|
|||
])
|
||||
|
||||
|
||||
dnl
|
||||
dnl Check for TRACE
|
||||
dnl
|
||||
|
||||
AC_DEFUN(AC_CHECK_TRACE, [
|
||||
OLD_CPPFLAGS="$CPPFLAGS"
|
||||
CPPFLAGS="-nostdinc -I${CONFIG_KERNELDIR} -I/usr/include"
|
||||
have_trace="no"
|
||||
AC_MSG_CHECKING([for TRACE in ${CONFIG_KERNELDIR}/drivers/isdn/eicon/eicon.h])
|
||||
AC_TRY_COMPILE([#include <linux/types.h>
|
||||
#include <drivers/isdn/eicon/eicon.h>],int x = TRACE_OK;,have_trace="yes",)
|
||||
AC_MSG_RESULT("${have_trace}")
|
||||
CPPFLAGS="$OLD_CPPFLAGS"
|
||||
if test "$have_trace" != "no" ; then
|
||||
AC_DEFINE(HAVE_TRACE)
|
||||
fi
|
||||
AC_SUBST(HAVE_TRACE)
|
||||
])
|
||||
|
||||
|
||||
dnl
|
||||
dnl Check for PCI in native driver
|
||||
dnl
|
||||
|
|
|
@ -1,6 +1,9 @@
|
|||
/* define if we have XLOG capability */
|
||||
#undef HAVE_XLOG
|
||||
|
||||
/* define if we have TRACE capability */
|
||||
#undef HAVE_TRACE
|
||||
|
||||
/* define if we have PCI code in native driver */
|
||||
#undef HAVE_NPCI
|
||||
|
||||
|
|
|
@ -1565,15 +1565,48 @@ EOF
|
|||
|
||||
|
||||
|
||||
OLD_CPPFLAGS="$CPPFLAGS"
|
||||
CPPFLAGS="-nostdinc -I${CONFIG_KERNELDIR} -I/usr/include"
|
||||
have_trace="no"
|
||||
echo $ac_n "checking for TRACE in ${CONFIG_KERNELDIR}/drivers/isdn/eicon/eicon.h""... $ac_c" 1>&6
|
||||
echo "configure:1573: checking for TRACE in ${CONFIG_KERNELDIR}/drivers/isdn/eicon/eicon.h" >&5
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1575 "configure"
|
||||
#include "confdefs.h"
|
||||
#include <linux/types.h>
|
||||
#include <drivers/isdn/eicon/eicon.h>
|
||||
int main() {
|
||||
int x = TRACE_OK;
|
||||
; return 0; }
|
||||
EOF
|
||||
if { (eval echo configure:1583: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
||||
rm -rf conftest*
|
||||
have_trace="yes"
|
||||
else
|
||||
echo "configure: failed program was:" >&5
|
||||
cat conftest.$ac_ext >&5
|
||||
fi
|
||||
rm -f conftest*
|
||||
echo "$ac_t"""${have_trace}"" 1>&6
|
||||
CPPFLAGS="$OLD_CPPFLAGS"
|
||||
if test "$have_trace" != "no" ; then
|
||||
cat >> confdefs.h <<\EOF
|
||||
#define HAVE_TRACE 1
|
||||
EOF
|
||||
|
||||
fi
|
||||
|
||||
|
||||
|
||||
if test $ac_cv_prog_gcc = yes; then
|
||||
echo $ac_n "checking whether ${CC-cc} needs -traditional""... $ac_c" 1>&6
|
||||
echo "configure:1571: checking whether ${CC-cc} needs -traditional" >&5
|
||||
echo "configure:1604: checking whether ${CC-cc} needs -traditional" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_gcc_traditional'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
ac_pattern="Autoconf.*'x'"
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1577 "configure"
|
||||
#line 1610 "configure"
|
||||
#include "confdefs.h"
|
||||
#include <sgtty.h>
|
||||
Autoconf TIOCGETP
|
||||
|
@ -1591,7 +1624,7 @@ rm -f conftest*
|
|||
|
||||
if test $ac_cv_prog_gcc_traditional = no; then
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1595 "configure"
|
||||
#line 1628 "configure"
|
||||
#include "confdefs.h"
|
||||
#include <termio.h>
|
||||
Autoconf TCGETA
|
||||
|
@ -1616,17 +1649,17 @@ for ac_hdr in unistd.h
|
|||
do
|
||||
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
|
||||
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
|
||||
echo "configure:1620: checking for $ac_hdr" >&5
|
||||
echo "configure:1653: checking for $ac_hdr" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1625 "configure"
|
||||
#line 1658 "configure"
|
||||
#include "confdefs.h"
|
||||
#include <$ac_hdr>
|
||||
EOF
|
||||
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
|
||||
{ (eval echo configure:1630: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
||||
{ (eval echo configure:1663: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
||||
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
|
||||
if test -z "$ac_err"; then
|
||||
rm -rf conftest*
|
||||
|
@ -1655,12 +1688,12 @@ done
|
|||
for ac_func in getpagesize
|
||||
do
|
||||
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
|
||||
echo "configure:1659: checking for $ac_func" >&5
|
||||
echo "configure:1692: checking for $ac_func" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1664 "configure"
|
||||
#line 1697 "configure"
|
||||
#include "confdefs.h"
|
||||
/* System header to define __stub macros and hopefully few prototypes,
|
||||
which can conflict with char $ac_func(); below. */
|
||||
|
@ -1683,7 +1716,7 @@ $ac_func();
|
|||
|
||||
; return 0; }
|
||||
EOF
|
||||
if { (eval echo configure:1687: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
||||
if { (eval echo configure:1720: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
||||
rm -rf conftest*
|
||||
eval "ac_cv_func_$ac_func=yes"
|
||||
else
|
||||
|
@ -1708,7 +1741,7 @@ fi
|
|||
done
|
||||
|
||||
echo $ac_n "checking for working mmap""... $ac_c" 1>&6
|
||||
echo "configure:1712: checking for working mmap" >&5
|
||||
echo "configure:1745: checking for working mmap" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
|
@ -1716,7 +1749,7 @@ else
|
|||
ac_cv_func_mmap_fixed_mapped=no
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1720 "configure"
|
||||
#line 1753 "configure"
|
||||
#include "confdefs.h"
|
||||
|
||||
/* Thanks to Mike Haertel and Jim Avera for this test.
|
||||
|
@ -1856,7 +1889,7 @@ main()
|
|||
}
|
||||
|
||||
EOF
|
||||
if { (eval echo configure:1860: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
|
||||
if { (eval echo configure:1893: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
|
||||
then
|
||||
ac_cv_func_mmap_fixed_mapped=yes
|
||||
else
|
||||
|
@ -2081,6 +2114,7 @@ s%@CPP@%$CPP%g
|
|||
s%@CONFIG_KERNELDIR@%$CONFIG_KERNELDIR%g
|
||||
s%@HAVE_XLOG@%$HAVE_XLOG%g
|
||||
s%@HAVE_NPCI@%$HAVE_NPCI%g
|
||||
s%@HAVE_TRACE@%$HAVE_TRACE%g
|
||||
s%@INSTALL@%$INSTALL%g
|
||||
s%@MANDATE@%$MANDATE%g
|
||||
s%@CONFIG_EICONCTRL_DEBUG@%$CONFIG_EICONCTRL_DEBUG%g
|
||||
|
|
|
@ -40,6 +40,7 @@ AC_CHECK_HEADER($CONFIG_KERNELDIR/drivers/isdn/eicon/eicon.h,,
|
|||
dnl Checks for typedefs, structures, and compiler characteristics.
|
||||
AC_CHECK_XLOG
|
||||
AC_CHECK_NPCI
|
||||
AC_CHECK_TRACE
|
||||
|
||||
dnl Checks for library functions.
|
||||
AC_PROG_GCC_TRADITIONAL
|
||||
|
|
|
@ -21,6 +21,10 @@
|
|||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*
|
||||
* $Log$
|
||||
* Revision 1.11 2000/01/24 19:57:37 armin
|
||||
* Added INSTALL and README file.
|
||||
* Some updates and new option for configure script.
|
||||
*
|
||||
* Revision 1.10 2000/01/12 07:05:09 armin
|
||||
* Fixed error on loading old S card.
|
||||
*
|
||||
|
@ -146,8 +150,7 @@ char *spid_state[] =
|
|||
};
|
||||
|
||||
|
||||
#ifdef HAVE_NPCI
|
||||
#ifdef HAVE_XLOG
|
||||
#if HAVE_XLOG || HAVE_TRACE
|
||||
/*********** XLOG stuff **********/
|
||||
|
||||
#define byte __u8
|
||||
|
@ -1174,7 +1177,6 @@ void spid_event(FILE * stream, struct msg_s * message, word code)
|
|||
|
||||
/*********** XLOG stuff end **********/
|
||||
#endif /* XLOG */
|
||||
#endif /* NPCI */
|
||||
|
||||
void usage() {
|
||||
fprintf(stderr,"usage: %s add <DriverID> <membase> <irq> (add card)\n",cmd);
|
||||
|
@ -1183,7 +1185,10 @@ void usage() {
|
|||
fprintf(stderr," or: %s [-d <DriverID>] [-v] load <protocol> [options]\n",cmd);
|
||||
fprintf(stderr," or: %s [-d <DriverID>] debug [<debug value>]\n",cmd);
|
||||
fprintf(stderr," or: %s [-d <DriverID>] manage [read|exec <path>] (management-tool)\n",cmd);
|
||||
#ifdef HAVE_NPCI
|
||||
#ifdef HAVE_TRACE
|
||||
fprintf(stderr," or: %s [-d <DriverID>] xlog [cont|<filename>] (retrieve XLOG)\n",cmd);
|
||||
fprintf(stderr," or: %s [-d <DriverID>] isdnlog [on|off] (D-Channel log)\n",cmd);
|
||||
#else
|
||||
#ifdef HAVE_XLOG
|
||||
fprintf(stderr," or: %s [-d <DriverID>] xlog [cont] (request XLOG)\n",cmd);
|
||||
#endif
|
||||
|
@ -2028,6 +2033,31 @@ void eicon_management(void)
|
|||
goto redraw1;
|
||||
|
||||
}
|
||||
if (man_ent[h_line].type == 0x06) { /* Trace Event */
|
||||
int tcmd = 0x05;
|
||||
i = strlen(Man_Path);
|
||||
if (Man_Path[strlen(Man_Path)-1] != '\\') strcat(Man_Path, "\\");
|
||||
strcat(Man_Path, man_ent[h_line].Name);
|
||||
if (man_ent[h_line].status & 0x02) tcmd = 0x06;
|
||||
if (get_manage_element(Man_Path, tcmd) < 0) {
|
||||
clear();
|
||||
mvaddstr(0,0, "Error ioctl Management-interface");
|
||||
refresh();
|
||||
return;
|
||||
}
|
||||
sleep(1);
|
||||
Man_Path[i] = 0;
|
||||
if (get_manage_element(Man_Path, 0x02) < 0) {
|
||||
clear();
|
||||
mvaddstr(0,0, "Error ioctl Management-interface");
|
||||
refresh();
|
||||
return;
|
||||
}
|
||||
h_line = 0;
|
||||
stat_y = 0;
|
||||
goto redraw1;
|
||||
|
||||
}
|
||||
beep2();
|
||||
goto Keyboard;
|
||||
case 'r':
|
||||
|
@ -2123,7 +2153,11 @@ int main(int argc, char **argv) {
|
|||
if (argc > 1) {
|
||||
if (!strcmp(argv[arg_ofs], "-d")) {
|
||||
arg_ofs++;
|
||||
if (arg_ofs >= argc)
|
||||
usage();
|
||||
strcpy(ioctl_s.drvid, argv[arg_ofs++]);
|
||||
if (arg_ofs >= argc)
|
||||
usage();
|
||||
if (!strcmp(argv[arg_ofs], "-v")) {
|
||||
arg_ofs++;
|
||||
verbose = 1;
|
||||
|
@ -2138,9 +2172,9 @@ int main(int argc, char **argv) {
|
|||
} else
|
||||
usage();
|
||||
ac = argc - (arg_ofs - 1);
|
||||
if (ac < 2)
|
||||
if (arg_ofs >= argc)
|
||||
usage();
|
||||
fd = open("/dev/isdnctrl",O_RDWR);
|
||||
fd = open("/dev/isdnctrl",O_RDWR | O_NONBLOCK);
|
||||
if (fd < 0) {
|
||||
perror("/dev/isdnctrl");
|
||||
exit(-1);
|
||||
|
@ -2544,9 +2578,84 @@ int main(int argc, char **argv) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef HAVE_NPCI
|
||||
#ifdef HAVE_TRACE
|
||||
if (!strcmp(argv[arg_ofs], "xlog")) {
|
||||
int dfd = fd;
|
||||
int cont = 0;
|
||||
char file[300];
|
||||
unsigned char buffer[1000];
|
||||
unsigned char inbuffer[1000];
|
||||
int pos = 0, ret = 1;
|
||||
unsigned char byte = 0;
|
||||
char *p, *q;
|
||||
unsigned long val, sec;
|
||||
|
||||
if (argc > (++arg_ofs)) {
|
||||
if (!strcmp(argv[arg_ofs], "cont"))
|
||||
cont = 1;
|
||||
else {
|
||||
strcpy(file, argv[arg_ofs]);
|
||||
cont = 2;
|
||||
dfd = open(file, O_RDWR);
|
||||
if (dfd < 0) {
|
||||
fprintf(stderr, "File not found.\n");
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
}
|
||||
mb = malloc(sizeof(eicon_manifbuf));
|
||||
strcpy (Man_Path, "\\Trace\\Log Buffer");
|
||||
if (cont < 2)
|
||||
get_manage_element(Man_Path, 0x05);
|
||||
while(1) {
|
||||
memset(buffer, 0, sizeof(buffer));
|
||||
memset(inbuffer, 0, sizeof(inbuffer));
|
||||
fflush(stdout);
|
||||
while((byte != 13) && (byte != 10) && (pos < 998) && (ret > 0)) {
|
||||
if ((ret = read(dfd, &byte, 1)) == 1) {
|
||||
inbuffer[pos++] = byte;
|
||||
}
|
||||
}
|
||||
byte = 0;
|
||||
pos = 0;
|
||||
if ((strlen(inbuffer) > 10) && (strncmp(inbuffer, "XLOG: ", 6) == 0)) {
|
||||
p = inbuffer + 6;
|
||||
val = strtol(p, &q, 16);
|
||||
sec=val/1000;
|
||||
printf("%5ld:%04ld:%03ld - ",
|
||||
(long)sec/3600,
|
||||
(long)sec%3600,
|
||||
(long)val%1000 );
|
||||
p = q;
|
||||
val = strtol(p, &q, 16);
|
||||
p = q;
|
||||
val = strtol(p, &q, 16);
|
||||
(unsigned short) *buffer = (unsigned short) val;
|
||||
pos = 2;
|
||||
while ((p != q) && (*q != 0)) {
|
||||
p = q;
|
||||
val = strtol(p, &q, 16);
|
||||
buffer[pos++] = val;
|
||||
}
|
||||
pos = 0;
|
||||
xlog(stdout, buffer);
|
||||
}
|
||||
if ((ret == 0) && (cont == 2))
|
||||
break;
|
||||
if ((ret < 0) && (cont != 1))
|
||||
break;
|
||||
if ((ret < 0) && (cont == 1))
|
||||
usleep(10000);
|
||||
ret = 1;
|
||||
}
|
||||
if (cont < 2)
|
||||
get_manage_element(Man_Path, 0x06);
|
||||
close(fd);
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
#ifdef HAVE_XLOG
|
||||
if (!strcmp(argv[arg_ofs], "xlog")) {
|
||||
if (!strcmp(argv[arg_ofs], "xlog")) {
|
||||
int cont = 0;
|
||||
int ii;
|
||||
int ret_val;
|
||||
|
@ -2666,7 +2775,48 @@ int main(int argc, char **argv) {
|
|||
return 0;
|
||||
}
|
||||
#endif /* XLOG */
|
||||
#endif /* NPCI */
|
||||
#endif /* TRACE */
|
||||
|
||||
#ifdef HAVE_TRACE
|
||||
if (!strcmp(argv[arg_ofs], "isdnlog")) {
|
||||
int tcmd = 0x05;
|
||||
int dval = 513;
|
||||
int ctype = -1;
|
||||
|
||||
if ((ctype = ioctl(fd, EICON_IOCTL_GETTYPE + IIOCDRVCTL, &ioctl_s)) < 1) {
|
||||
perror("ioctl GETTYPE");
|
||||
exit(-1);
|
||||
}
|
||||
switch (ctype) {
|
||||
case EICON_CTYPE_MAESTRAP:
|
||||
case EICON_CTYPE_MAESTRA:
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "Adapter type %d does not supported this.\n", ctype);
|
||||
exit(-1);
|
||||
}
|
||||
mb = malloc(sizeof(eicon_manifbuf));
|
||||
|
||||
if (argc > (++arg_ofs)) {
|
||||
if (!strcmp(argv[arg_ofs++], "off")) {
|
||||
tcmd = 0x06;
|
||||
dval = 1;
|
||||
}
|
||||
}
|
||||
ioctl_s.arg = dval;
|
||||
if (ioctl(fd, EICON_IOCTL_DEBUGVAR + IIOCDRVCTL, &ioctl_s) < 0) {
|
||||
perror("Error changing debug value.");
|
||||
exit(-1);
|
||||
}
|
||||
strcpy (Man_Path, "\\Trace\\Log Buffer");
|
||||
if (get_manage_element(Man_Path, tcmd) < 0) {
|
||||
fprintf(stderr, "Error or already in that state.\n");
|
||||
exit(-1);
|
||||
}
|
||||
close(fd);
|
||||
return 0;
|
||||
}
|
||||
#endif /* TRACE */
|
||||
|
||||
if (!strcmp(argv[arg_ofs], "manage")) {
|
||||
mb = malloc(sizeof(eicon_manifbuf));
|
||||
|
|
|
@ -6,9 +6,9 @@
|
|||
.\" groff -man -Tascii eiconctrl.1 for ASCII output, or
|
||||
.\" groff -man -Tps eiconctrl.1 for PostScript output
|
||||
.\"
|
||||
.TH EICONCTRL 8 "@MANDATE@" isdn4k-utils-@I4LVERSION@ "Linux System Administration"
|
||||
.TH EICONCTRL 8 "@MANDATE@" eiconctrl-V1.1 "Linux System Administration"
|
||||
.SH NAME
|
||||
eiconctrl \- configure Eicon.Diehl active ISDN adaptor
|
||||
eiconctrl \- configure Eicon active ISDN adaptor
|
||||
.SH SYNOPSIS
|
||||
.B eiconctrl [-v] [-d
|
||||
.IB Driver-Id ]
|
||||
|
@ -16,7 +16,7 @@ eiconctrl \- configure Eicon.Diehl active ISDN adaptor
|
|||
.B ...
|
||||
.SH DESCRIPTION
|
||||
.B eiconctrl
|
||||
is used to setup the Eicon.Diehl
|
||||
is used to setup the Eicon
|
||||
.SM ISDN
|
||||
device driver and for downloading the firmware into the
|
||||
.SM ISDN
|
||||
|
@ -24,7 +24,7 @@ card.
|
|||
.LP
|
||||
The use of
|
||||
.I eiconctrl
|
||||
makes sense, if you are using an active Eicon.Diehl ISDN card only.
|
||||
makes sense, if you are using an active Eicon ISDN card only.
|
||||
.LP
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
|
@ -79,6 +79,8 @@ Downloads the protocol- and dsp-code into the card and starts operation.
|
|||
.br
|
||||
.BR 1tr6 " German ISDN Protocol"
|
||||
.br
|
||||
.BR .... " other protocols are also possible"
|
||||
.br
|
||||
.RE
|
||||
.LP
|
||||
.RS
|
||||
|
@ -108,11 +110,16 @@ Downloads the protocol- and dsp-code into the card and starts operation.
|
|||
.BI "manage " [read | exec " " <path>]
|
||||
Starts Management-Interface.
|
||||
.TP
|
||||
.BI "xlog " [cont]
|
||||
.BI "xlog " [cont | <filename>]
|
||||
Retrieving XLOG entries of adapter.
|
||||
With option
|
||||
.I cont
|
||||
given, it will be on a continuous cycle.
|
||||
Using a driver release 1.77 or newer you can specify a
|
||||
trace-file for the xlog interpreter.
|
||||
.TP
|
||||
.BI "isdnlog " [on | off]
|
||||
Switch trace-information for isdnlog on/off.
|
||||
.LP
|
||||
.SH EXAMPLE
|
||||
.TP
|
||||
|
@ -125,7 +132,7 @@ loads and starts S2M type adapter with protocol E-DSS1.
|
|||
.SH BUGS
|
||||
No bugs so far.
|
||||
.SH AUTHOR
|
||||
\(co 1999 by Armin Schindler <mac@melware.de>
|
||||
\(co 2000 by Armin Schindler <mac@melware.de>
|
||||
.LP
|
||||
.SH SEE ALSO
|
||||
.BR isdnctrl "(8), " isdnctrl "(4), " ttyI "(4), " isdn_cause "(7), " isdninfo (4).
|
||||
|
|
Loading…
Reference in New Issue