* Copyright (c) 1990 The Regents of the University of California.
* %sccs.include.redist.c%
* Configure X.25 interface
* Copyright (c) 1986 University of British Columbia
#include <netccitt/x25.h>
"\020\1UP\2BROADCAST\3DEBUG\4ROUTE\5POINTOPOINT\6NOTRAILERS\7RUNNING\10NOARP"
int setifflags (), setdefault (), setnet (), setntn (), setprepnd0 ();
int setlproto (), sethdlc (), setlwsize (), setltrace (), setnodnic ();
int setyear (), setpwsize (), setpacketsize (), setmaxlcn (), setptrace ();
"up", IFF_UP
, setifflags
,
"-up", -IFF_UP
, setifflags
,
"down", -IFF_UP
, setifflags
,
"debug", IFF_DEBUG
, setifflags
,
"-debug", -IFF_DEBUG
, setifflags
,
"default", 0, setdefault
,
"hdlc", CCITTPROTO_HDLC
, setlproto
,
"ieee802llc", IEEEPROTO_802LLC
, setlproto
,
"lap", HDLCPROTO_LAP
, sethdlc
,
"lapb", HDLCPROTO_LAPB
, sethdlc
,
"lapd", HDLCPROTO_LAPD
, sethdlc
,
"unset", HDLCPROTO_UNSET
, sethdlc
,
"-prepnd0", 0, setprepnd0
,
"prepnd0", 1, setprepnd0
,
"1976", X25_1976
, setyear
,
"1980", X25_1980
, setyear
,
"1984", X25_1984
, setyear
,
"-psize", 0, setpacketsize
,
#define x25conf ifrx25.ifr_xc
char *ifname
; /* interface name */
short ifflags
; /* local copy of interface flags */
abort ("usage: x25ifconfig interface [default] [-net net] [-ntn ntn] [-maxlcn maxlcn] [up] [down] [zillions of other options]");
if ((s
= socket (AF_CCITT
, SOCK_STREAM
, 0)) < 0)
strcpy (ifr
.ifr_name
, ifname
);
if (ioctl (s
, SIOCGIFFLAGS
, (char *)&ifr
) < 0)
syserr ("ioctl (SIOCGIFFLAGS)");
strcpy (ifrx25
.ifr_name
, ifname
);
if (ioctl (s
, SIOCGIFCONF_X25
, (char *)&ifrx25
) < 0) {
x25conf
.xc_addr
.x25_len
= sizeof(x25conf
);
x25conf
.xc_addr
.x25_family
= AF_CCITT
;
for (cp
= cmds
; ; cp
++) {
abort ("invalid argument: %s", *argv
);
if (cp
->c_func
== setnet
)
if (strcmp (cp
->c_name
, *argv
) == 0) {
abort ("argument expect after %s", *argv
);
(*cp
->c_func
) (cp
->c_arg
);
strcpy (ifr
.ifr_name
, ifname
);
if (ioctl (s
, SIOCSIFFLAGS
, (char *)&ifr
) < 0)
syserr ("ioctl (SIOCSIFFLAGS)");
strcpy (ifrx25
.ifr_name
, ifname
);
if (ioctl (s
, SIOCSIFCONF_X25
, (char *)&ifrx25
) < 0)
syserr ("ioctl (SIOCSIFCONF_X25)");
abort (fmt
, a1
, a2
, a3
, a4
, a5
)
sprintf (buf
, "%s: %s\n", myname
, fmt
);
fprintf (stderr
, buf
, a1
, a2
, a3
, a4
, a5
);
syserr (fmt
, a1
, a2
, a3
, a4
, a5
)
extern char *sys_errlist
[];
sprintf (buf
, "%s: %s: %s\n", myname
, fmt
, sys_errlist
[errno
]);
fprintf (stderr
, buf
, a1
, a2
, a3
, a4
, a5
);
char *addr
= x25conf
.xc_addr
.x25_addr
;
printb ("interface flags", ifflags
, IFFBITS
);
printf ("link level:\n");
printf ("\twindow size: %d\n", x25conf
.xc_lwsize
);
printf ("\ttracing: on\n");
printf ("\npacket level:\n");
printf ("\taddress: %04d %s\n", x25conf
.xc_addr
.x25_net
, addr
);
printf ("\twindow size: %d\n", x25conf
.xc_pwsize
);
printf ("\tpacket size: %d\n", 1 << x25conf
.xc_psize
);
printf ("\tmax lcn: %d\n", x25conf
.xc_maxlcn
);
printf ("\ttracing: on\n");
x25conf
.xc_addr
.x25_family
= AF_CCITT
;
x25conf
.xc_lproto
= CCITTPROTO_HDLC
;
x25conf
.xc_lptype
= HDLCPROTO_LAPB
;
x25conf
.xc_psize
= X25_PS128
;
x25conf
.xc_type
= X25_1976
;
register struct netent
*np
;
if (*arg
< '0' || *arg
> '9') { /* lookup name in /etc/networks */
if ((np
= getnetbyname (arg
)) == 0)
abort ("unknown network (%s)", arg
);
x25conf
.xc_addr
.x25_net
= net
;
register struct hostent
*hp
;
struct hostent
*getx25hostbyname ();
if (*arg
< '0' || *arg
> '9') { /* lookup in /etc/x25hosts */
if ((hp
= getx25hostbyname (arg
)) == 0)
abort ("can't find '%s' in /etc/x25hosts", arg
);
arg
= ((struct sockaddr_x25
*)hp
->h_addr
)->x25_addr
;
for (l
= 1, p
= arg
; *p
; p
++) {
if (*p
< '0' || *p
> '9')
abort ("invalid character in ntn address");
if (l
> sizeof (x25conf
.xc_addr
.x25_addr
))
abort ("invalid ntn address");
bcopy(arg
, x25conf
.xc_addr
.x25_addr
, l
);
register char *src
, *dest
;
*dest
++ |= *src
++ & 0x0F;
from_bcd (src
, dest
, len
)
for (i
= 0; i
< len
/2; i
++) {
*dest
++ = ((*src
& 0xf0) >> 4) + '0';
*dest
++ = (*src
++ & 0xf) + '0';
if ((ws
= atoi (arg
)) <= 0 || ws
> 31)
abort ("invalid link level window size");
x25conf
.xc_prepnd0
= arg
;
x25conf
.xc_psize
= 12; /* 4096 bytes */
if ((ws
= atoi (arg
)) <= 0 || ws
> 7)
abort ("invalid packet level window size");
register int psize
, logpsize
= 0;
if ((psize
= atoi (arg
)) < 64 || psize
> 4096)
abort ("invalid packet size");
x25conf
.xc_psize
= logpsize
;
if ((lcn
= atoi (arg
)) <= 0)
abort ("invalid maximum lcn");
* Print a value a la the %b format of the kernel's printf
register unsigned short v
;
for (; (c
= *bits
) > 32; bits
++)
for (; *bits
> 32; bits
++)