Repo copied contents of src/sbin/i386 to src/sbin and set specific
SUBDIR lists there. Some of these are used on other platforms.
This commit is contained in:
parent
f24c53d3ef
commit
67ad5f5700
@ -1,7 +0,0 @@
|
||||
# $FreeBSD$
|
||||
|
||||
SUBDIR= cxconfig \
|
||||
fdisk \
|
||||
nextboot
|
||||
|
||||
.include <bsd.subdir.mk>
|
@ -1,3 +0,0 @@
|
||||
# $FreeBSD$
|
||||
|
||||
.include "../Makefile.inc"
|
@ -1,7 +0,0 @@
|
||||
# $FreeBSD$
|
||||
|
||||
PROG= cxconfig
|
||||
WARNS?= 2
|
||||
MAN= cxconfig.8
|
||||
|
||||
.include <bsd.prog.mk>
|
@ -1,329 +0,0 @@
|
||||
.\" $FreeBSD$
|
||||
.Dd December 2, 1994
|
||||
.Dt CXCONFIG 8
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm cxconfig
|
||||
.Nd channel options management utility for Cronyx-Sigma adapter
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Op Fl a
|
||||
.Op Ar <channel> Op Ar <option>...
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm
|
||||
utility is used for configuring the channel options of
|
||||
the Cronyx-Sigma adapter.
|
||||
.Pp
|
||||
To change channel options the channel should be free: the corresponding
|
||||
network interface in ``down'' state, the asynchronous terminal device
|
||||
.Pa /dev/tty*
|
||||
closed.
|
||||
Generally, the channel options are set up during the operating
|
||||
system startup, for example from the
|
||||
.Pa /etc/rc
|
||||
file.
|
||||
.Pp
|
||||
Note, that not all options have a sense for every particular
|
||||
case, and an attempt to set some of them can hang up the channel or
|
||||
the whole adapter.
|
||||
.Pp
|
||||
The following option is available:
|
||||
.Bl -tag -width indent
|
||||
.It Fl a
|
||||
Display full information.
|
||||
.El
|
||||
.Sh "Channel options"
|
||||
.Bl -tag -width 10n
|
||||
.It ispeed=#
|
||||
Set the receiver baud rate to the number given.
|
||||
The maximal value is 256000 bits/sec.
|
||||
In the synchronous mode the receiver baud rate is significant
|
||||
only when DPLL mode is used.
|
||||
.It ospeed=#
|
||||
Set the transmitter baud rate to the number given.
|
||||
The maximal value is 256000 bits/sec.
|
||||
In the synchronous mode the transmitter baud rate is significant
|
||||
only in the case of the internal clock source.
|
||||
If receiver and transmitter have equal data rate, then it could
|
||||
be set by specifying only the numerical argument.
|
||||
.It async
|
||||
Set the asynchronous channel mode.
|
||||
.It "hdlc, bisync, bsc, x.21, x21
|
||||
Set the synchronous channel mode: HDLC, Bisync (BSC) or X.21.
|
||||
.It ppp
|
||||
Set the link-level protocol: PpP/HDLC. The built-in simplified synchronous PPP
|
||||
implementation is used (see RFC-1548, RFC-1549).
|
||||
.It cisco
|
||||
Set the link-level protocol: Cisco/HDLC (see RFC-1547).
|
||||
This protocol is intended for compatibility with old models of Cisco routers,
|
||||
and with early versions of
|
||||
.Tn BSD/386
|
||||
drivers.
|
||||
The extensive usage of this protocol is not recommended.
|
||||
.It ext
|
||||
Use the external link-level protocol suite (for
|
||||
.Tn BSD/386
|
||||
only).
|
||||
.It "+keepalive, -keepalive"
|
||||
Enable the automatic line state control sub-protocol.
|
||||
This setting is not significant when the external link-level protocol is used.
|
||||
.It "+autorts, -autorts"
|
||||
Enable the automatic RTS signal control.
|
||||
When enabled, the RTS signal goes up only when both halves of
|
||||
the receiver ring buffer are free and ready for receive,
|
||||
and goes down when one or both buffers are busy.
|
||||
.It "port=rs232, port=rs449, port=v35
|
||||
Set the zero channel hardware interface type.
|
||||
.El
|
||||
.Sh "Common options"
|
||||
.Bl -tag -width 10n
|
||||
.It "nrz, nrzi, manchester"
|
||||
Set the data line signal encoding.
|
||||
In the case of
|
||||
.Em NRZ
|
||||
encoding the zero bit is transmitted by the zero signal
|
||||
level, the one bit - by the positive signal level.
|
||||
In the case of
|
||||
.Em NRZI
|
||||
encoding the zero bit is transmitted by the change of
|
||||
the signal level, the one bit - by the constant signal level.
|
||||
In the case of
|
||||
.Em Manchester
|
||||
encoding the zero bit is encoded as 01 value,
|
||||
the one bit - as 10 value.
|
||||
.It "+dpll, -dpll"
|
||||
Enable the digital phase locked loop mode (DPLL).
|
||||
When enabled, the receiver timing clock signal
|
||||
is derived from the received data.
|
||||
.It "+lloop, -lloop"
|
||||
Set the local loopback mode.
|
||||
.It "+extclock, -extclock"
|
||||
Set the timing clock source of synchronous channels. There are
|
||||
two possible variants:
|
||||
.Em "external clock"
|
||||
source or
|
||||
.Em "internal clock"
|
||||
generation.
|
||||
.Pp
|
||||
.Em "External clock"
|
||||
mode is the most common method for connecting
|
||||
external modem hardware. In this mode the external timing
|
||||
signal is received on TXCIN pin of the connector, and it is
|
||||
used as a synchronization clock for transmitting data (TXD).
|
||||
.Pp
|
||||
In the case of
|
||||
.Em "internal clock"
|
||||
mode the transmitted data (TXD)
|
||||
are synchronized using the internal on-board timing generator,
|
||||
the internally generated timing signal is driven on the TXCOUT
|
||||
pin, and the signal on the TXCIN pin is ignored. This mode
|
||||
is used for direct terminal-to-terminal communication,
|
||||
e.g. for connecting two computers together in a synchronous mode
|
||||
via relatively short cable. This method should also be used
|
||||
for testing channels with an external loopback connector.
|
||||
.It fifo=#
|
||||
FIFO threshold level setup for receiver and transmitter.
|
||||
.It rfifo=#
|
||||
Hardware RTS/CTS flow control FIFO threshold setup.
|
||||
.It "+ctsup, -ctsup"
|
||||
Enable/disable interrupts on CTS (Clear To Send) signal setup (0 to 1 transition).
|
||||
.It "+ctsdown, -ctsdown"
|
||||
Enable/disable interrupts on CTS (Clear To Send) signal clear (1 to 0 transition).
|
||||
.It "+cdup, -cdup"
|
||||
Enable/disable interrupts on CD (Carrier Detect) signal setup (0 to 1 transition).
|
||||
.It "+cddown, -cddown"
|
||||
Enable/disable interrupts on CD (Carrier Detect) signal clear (1 to 0 transition).
|
||||
.It "+dsrup, -dsrup"
|
||||
Enable/disable interrupts on DSR (Data Set Ready) signal setup (0 to 1 transition).
|
||||
.It "+dsrdown, -dsrdown"
|
||||
Enable/disable interrupts on DSR (Data Set Ready) signal clear (1 to 0 transition).
|
||||
.El
|
||||
.Sh "Asynchronous mode options"
|
||||
.Bl -tag -width 10n
|
||||
.It cs#
|
||||
Select character size: 5, 6, 7 or 8 bits.
|
||||
.It "parodd, pareven
|
||||
Parity mode: odd or even.
|
||||
.It "+ignpar, -ignpar
|
||||
Disable/enable parity detection.
|
||||
.It nopar
|
||||
Disable parity bit generation.
|
||||
.It forcepar
|
||||
Force parity: even - 0, odd - 1.
|
||||
.It "stopb1, stopb1.5, stopb2
|
||||
Use 1 or 1.5 or 2 stop bits per character.
|
||||
.It "+dsr, -dsr"
|
||||
Use the DSR input signal as receiver enable/disable.
|
||||
.It "+cts, -cts"
|
||||
Use the CTS input signal as transmitter enable/disable.
|
||||
.It "+rts, -rts"
|
||||
Drive the RTS output signal as transmitter ready.
|
||||
.It "+rloop, -rloop"
|
||||
Set the remote loopback mode.
|
||||
.It "+etc, -etc"
|
||||
Enable the embedded transmit commands mode.
|
||||
.It "+ixon, -ixon"
|
||||
Enable the hardware XON/XOFF flow control support.
|
||||
.It "+ixany, -ixany"
|
||||
Use the hardware IXANY mode support.
|
||||
.It "+sdt, -sdt"
|
||||
Detect the spec. characters SCHR1 and SCHR2 in the receive data.
|
||||
.It "+flowct, -flowct"
|
||||
Receive the flow control spec. characters as data.
|
||||
.It "+rdt, -rdt"
|
||||
Detect the spec. characters in range SCRL..SCRH in the receive data.
|
||||
.It "+exdt, -exdt"
|
||||
Detect the spec. characters SCHR3 and SCHR4 in the receive data.
|
||||
.It "parintr, parnull, parign, pardisc, parffnull
|
||||
Action on parity errors:
|
||||
.Pp
|
||||
.Bl -tag -width parffnullxxx -compact
|
||||
.It Mode
|
||||
Action
|
||||
.It parintr
|
||||
Generate the receiver error interrupt
|
||||
.It parnull
|
||||
Input the NUL character
|
||||
.It parign
|
||||
Ignore the error, receive as good data
|
||||
.It pardisc
|
||||
Ignore the character
|
||||
.It parffnull
|
||||
Input the sequence <0xFF, NUL, character>
|
||||
.El
|
||||
.It "brkintr, brknull, brkdisc
|
||||
Line break state action:
|
||||
.Pp
|
||||
.Bl -tag -width parffnullxxx -compact
|
||||
.It Mode
|
||||
Action
|
||||
.It brkintr
|
||||
Generate the receiver error interrupt
|
||||
.It brknull
|
||||
Input the NUL character
|
||||
.It brkdisc
|
||||
Ignore the line break state
|
||||
.El
|
||||
.It "+inlcr, -inlcr"
|
||||
Translate received NL characters to CR.
|
||||
.It "+icrnl, -icrnl"
|
||||
Translate received CR characters to NL.
|
||||
.It "+igncr, -igncr"
|
||||
Ignore received CR characters.
|
||||
.It "+ocrnl, -ocrnl"
|
||||
Translate transmitted CR characters to NL.
|
||||
.It "+onlcr, -onlcr"
|
||||
Translate transmitted NL characters to CR.
|
||||
.It "+fcerr, -fcerr"
|
||||
Process (don't process) the characters, received with errors,
|
||||
for special character/flow control matching.
|
||||
.It "+lnext, -lnext"
|
||||
Enable the LNEXT character option: the character following
|
||||
the LNEXT character is not processed for special character/flow
|
||||
control matching.
|
||||
.It "+istrip, -istrip"
|
||||
Strip input characters to seven bits.
|
||||
.It schr1=#
|
||||
The XON flow control character value.
|
||||
.It schr2=#
|
||||
The XOFF flow control character value.
|
||||
.It schr3=#
|
||||
The SCHR3 spec. character value.
|
||||
.It schr4=#
|
||||
The SCHR4 spec. character value.
|
||||
.It "scrl=#, scrh=#
|
||||
The spec. character range (inclusive).
|
||||
.It lnext=#
|
||||
The LNEXT spec. character value.
|
||||
.El
|
||||
.Sh "HDLC mode options"
|
||||
.Bl -tag -width 10n
|
||||
.It if#
|
||||
The minimum number of flags transmitted before a frame is started.
|
||||
.It noaddr
|
||||
No frame address recognition.
|
||||
.It "addrlen1, addrlen2"
|
||||
Address field length: 1 or 2 bytes.
|
||||
.It "addr1, addr2"
|
||||
Addressing mode: 4x1 bytes or 2x2 bytes.
|
||||
Registers RFAR1..RFAR4 should contain the address to be matched.
|
||||
.It "+clrdet, -clrdet"
|
||||
Enable/disable clear detect for X.21 protocol support.
|
||||
.It "+dsr, -dsr"
|
||||
Use the DSR input signal as receiver enable/disable.
|
||||
.It "+cts, -cts"
|
||||
Use the CTS input signal as transmitter enable/disable.
|
||||
.It "+rts, -rts"
|
||||
Drive the RTS output signal as transmitter ready.
|
||||
.It "+fcs, -fcs"
|
||||
Enable/disable the frame checksum generation and checking.
|
||||
.It "crc-16, crc-v.41
|
||||
Select the CRC polynomial: CRC-16 (x^16+x^15+x^2+1)
|
||||
or CRC V.41 (x^16+x^12+x^5+1).
|
||||
.It "fcs-crc-16, fcs-v.41
|
||||
Frame checksum preset: all zeros (CRC-16) or all ones (CRC V.41).
|
||||
.It "+crcinv, -crcinv"
|
||||
Invert (ie. CRC V.41) or don't invert (ie. CRC-16) the transmitted frame checksum.
|
||||
.It "+fcsapd, -fcsapd"
|
||||
Pass the received CRC to the host at the end of receiver data buffer.
|
||||
.It "idlemark, idleflag
|
||||
Idle mode: idle in mark (transmit all ones) or idle in flag (transmit flag).
|
||||
.It "+syn, -syn"
|
||||
Enable/disable sending pad characters before sending flag when coming out
|
||||
of the idle mode.
|
||||
.It pad#
|
||||
The number of synchronous characters sent (0..4).
|
||||
.It "syn=0xaa, syn=0x00
|
||||
Send sync pattern.
|
||||
.It "rfar1=#, rfar2=#, rfar3=#, rfar4=#
|
||||
Frame address registers for address recognition.
|
||||
.El
|
||||
.Sh EXAMPLES
|
||||
Set up the channel 7 of the adapter Sigma-400 under
|
||||
.Fx .
|
||||
Physical 4-wire leased line with Zelax+ M115 short-range modems.
|
||||
Synchronous mode, 128000 bits/sec, interface RS-232,
|
||||
protocol PpP/HDLC without keepalive support, NRZI encoding,
|
||||
DPLL mode, no flow control:
|
||||
.Bd -literal
|
||||
cxconfig cx7 128000 hdlc ppp -keepalive nrzi -cts +dpll -extclock
|
||||
ifconfig cx7 158.250.244.2 158.250.244.1 up
|
||||
.Ed
|
||||
.Pp
|
||||
Set up the channel 0 of the adapter Sigma-100 under
|
||||
.Fx .
|
||||
Attachment to the near computer by short cable, internal clock source.
|
||||
Synchronous mode, 256000 bits/sec, interface RS-232,
|
||||
protocol Cisco/HDLC with keepalive support:
|
||||
.Bd -literal
|
||||
cxconfig cx0 hdlc 256000 cisco +keepalive -extclock
|
||||
ifconfig cx0 200.1.1.1 200.1.1.2 up
|
||||
.Ed
|
||||
.Pp
|
||||
Set up the channel 1 of the adapter Sigma-840 under
|
||||
.Tn BSD/386 .
|
||||
Synchronous 64 kbit/sec leased line, external clock source.
|
||||
Synchronous mode, interface V.35, external protocol suite:
|
||||
.Bd -literal
|
||||
cxconfig cx1 hdlc ext
|
||||
ifconfig cx1 193.124.254.50 193.124.254.49 multicast up
|
||||
.Ed
|
||||
.Pp
|
||||
Set up the channel 0 of the adapter Sigma-840 under
|
||||
.Fx .
|
||||
Attachment to the Cisco-4000 router by null-modem cable, internal clock source.
|
||||
Synchronous mode, 64000 bits/sec, interface RS-232,
|
||||
protocol PpP/HDLC with keepalive support and flow control,
|
||||
LCP and IPCP protocols (see RFC-1548 and RFC-1332) debug tracing enabled:
|
||||
.Bd -literal
|
||||
cxconfig cx0 hdlc 64000 port=rs232 ppp +keepalive -extclock +cts
|
||||
ifconfig cx0 100.0.0.2 100.0.0.1 debug up
|
||||
.Ed
|
||||
.Sh FILES
|
||||
.Bl -tag -width /dev/cronyx -compact
|
||||
.It Pa /dev/cronyx
|
||||
the special device file for adapter options management
|
||||
.El
|
||||
.Sh SEE ALSO
|
||||
.Xr cx 4
|
@ -1,770 +0,0 @@
|
||||
/*
|
||||
* Cronyx-Sigma adapter configuration utility for Unix.
|
||||
*
|
||||
* Copyright (C) 1994 Cronyx Ltd.
|
||||
* Author: Serge Vakulenko, <vak@zebub.msk.su>
|
||||
*
|
||||
* This software is distributed with NO WARRANTIES, not even the implied
|
||||
* warranties for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* Authors grant any other persons or organisations permission to use
|
||||
* or modify this software as long as this message is kept with the software,
|
||||
* all derivative works or modified versions.
|
||||
*
|
||||
* Version 1.9, Wed Oct 4 18:58:15 MSK 1995
|
||||
*
|
||||
* Usage:
|
||||
* cxconfig [-a]
|
||||
* -- print status of all channels
|
||||
* cxconfig [-a] <channel>
|
||||
* -- print status of the channel
|
||||
* cxconfig <channel> <option>...
|
||||
* -- set channel options
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static const char rcsid[] =
|
||||
"$FreeBSD$";
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/socket.h>
|
||||
#include <net/if.h>
|
||||
#include <machine/cronyx.h>
|
||||
|
||||
#include <err.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define NBRD 3
|
||||
#define CXDEV "/dev/cronyx"
|
||||
#define atoi(a) strtol((a), (char**)0, 0)
|
||||
|
||||
cx_options_t o;
|
||||
cx_stat_t st;
|
||||
int aflag;
|
||||
int sflag;
|
||||
|
||||
static char *
|
||||
symbol(unsigned char sym)
|
||||
{
|
||||
static char buf[40];
|
||||
|
||||
if (sym < ' ')
|
||||
sprintf (buf, "^%c", sym+0100);
|
||||
else if (sym == '\\')
|
||||
strcat (buf, "\\\\");
|
||||
else if (sym < 127)
|
||||
sprintf (buf, "%c", sym);
|
||||
else
|
||||
sprintf (buf, "\\%03o", sym);
|
||||
return (buf);
|
||||
}
|
||||
|
||||
static unsigned char
|
||||
atosym(char *s)
|
||||
{
|
||||
if (*s == '^')
|
||||
return (*++s & 037);
|
||||
if (*s == '\\')
|
||||
return (strtol (++s, 0, 8));
|
||||
return (*s);
|
||||
}
|
||||
|
||||
static void
|
||||
usage(void)
|
||||
{
|
||||
fprintf (stderr,
|
||||
"Cronyx-Sigma Adapter Configuration Utility, Version 1.0\n");
|
||||
fprintf (stderr, "Copyright (C) 1994 Cronyx Ltd.\n");
|
||||
fprintf (stderr, "usage: cxconfig [-a] [<channel> [<option>...]]\n");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
static const char *
|
||||
chantype(int type)
|
||||
{
|
||||
switch (type) {
|
||||
default:
|
||||
case T_NONE: return ("none");
|
||||
case T_ASYNC: return ("RS-232");
|
||||
case T_UNIV_RS232: return ("RS-232");
|
||||
case T_UNIV_RS449: return ("RS-232/RS-449");
|
||||
case T_UNIV_V35: return ("RS-232/V.35");
|
||||
case T_SYNC_RS232: return ("RS-232");
|
||||
case T_SYNC_V35: return ("V.35");
|
||||
case T_SYNC_RS449: return ("RS-449");
|
||||
}
|
||||
}
|
||||
|
||||
static const char *
|
||||
chanmode(int mode)
|
||||
{
|
||||
switch (mode) {
|
||||
case M_ASYNC: return ("Async");
|
||||
case M_HDLC: return ("HDLC");
|
||||
case M_BISYNC: return ("Bisync");
|
||||
case M_X21: return ("X.21");
|
||||
default: return ("???");
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
getchan(int channel)
|
||||
{
|
||||
int s = open (CXDEV, 0);
|
||||
if (s < 0)
|
||||
err (1, "%s", CXDEV);
|
||||
o.board = channel/NCHAN;
|
||||
o.channel = channel%NCHAN;
|
||||
if (ioctl (s, CXIOCGETMODE, (caddr_t)&o) < 0)
|
||||
err (1, "CXIOCGETMODE");
|
||||
close (s);
|
||||
if (o.type == T_NONE)
|
||||
errx (1, "cx%d: channel %d not configured", o.board,
|
||||
o.channel);
|
||||
}
|
||||
|
||||
static int
|
||||
printstats(int channel, int hflag)
|
||||
{
|
||||
int s, res;
|
||||
|
||||
s = open (CXDEV, 0);
|
||||
if (s < 0)
|
||||
err (1, "%s", CXDEV);
|
||||
st.board = channel/NCHAN;
|
||||
st.channel = channel%NCHAN;
|
||||
res = ioctl (s, CXIOCGETSTAT, (caddr_t)&st);
|
||||
close (s);
|
||||
if (res < 0)
|
||||
return (-1);
|
||||
|
||||
if (hflag)
|
||||
printf ("Chan Rintr Tintr Mintr Ibytes Ipkts Ierrs Obytes Opkts Oerrs\n");
|
||||
printf ("cx%-2d %7ld %7ld %7ld %8ld %7ld %7ld %8ld %7ld %7ld\n",
|
||||
channel, st.rintr, st.tintr, st.mintr, st.ibytes, st.ipkts,
|
||||
st.ierrs, st.obytes, st.opkts, st.oerrs);
|
||||
return (0);
|
||||
}
|
||||
|
||||
static void
|
||||
printallstats(void)
|
||||
{
|
||||
int b, c;
|
||||
|
||||
printf ("Chan Rintr Tintr Mintr Ibytes Ipkts Ierrs Obytes Opkts Oerrs\n");
|
||||
for (b=0; b<NBRD; ++b)
|
||||
for (c=0; c<NCHAN; ++c)
|
||||
printstats (b*NCHAN + c, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
setchan(int channel)
|
||||
{
|
||||
int s = open (CXDEV, 0);
|
||||
if (s < 0)
|
||||
err (1, "%s", CXDEV);
|
||||
o.board = channel/NCHAN;
|
||||
o.channel = channel%NCHAN;
|
||||
if (ioctl (s, CXIOCSETMODE, (caddr_t)&o) < 0)
|
||||
err (1, "CXIOCSETMODE");
|
||||
close (s);
|
||||
}
|
||||
|
||||
static void
|
||||
printopt(void)
|
||||
{
|
||||
/* Common channel options */
|
||||
/* channel option register 4 */
|
||||
printf ("\t");
|
||||
printf ("fifo=%d ", o.opt.cor4.thr); /* FIFO threshold */
|
||||
printf ("%cctsdown ", o.opt.cor4.cts_zd ? '+' : '-'); /* detect 1 to 0 transition on the CTS */
|
||||
printf ("%ccddown ", o.opt.cor4.cd_zd ? '+' : '-'); /* detect 1 to 0 transition on the CD */
|
||||
printf ("%cdsrdown ", o.opt.cor4.dsr_zd ? '+' : '-'); /* detect 1 to 0 transition on the DSR */
|
||||
printf ("\n");
|
||||
|
||||
/* channel option register 5 */
|
||||
printf ("\t");
|
||||
printf ("rfifo=%d ", o.opt.cor5.rx_thr); /* receive flow control FIFO threshold */
|
||||
printf ("%cctsup ", o.opt.cor5.cts_od ? '+' : '-'); /* detect 0 to 1 transition on the CTS */
|
||||
printf ("%ccdup ", o.opt.cor5.cd_od ? '+' : '-'); /* detect 0 to 1 transition on the CD */
|
||||
printf ("%cdsrup ", o.opt.cor5.dsr_od ? '+' : '-'); /* detect 0 to 1 transition on the DSR */
|
||||
printf ("\n");
|
||||
|
||||
/* receive clock option register */
|
||||
printf ("\t");
|
||||
printf ("%s ", o.opt.rcor.encod == ENCOD_NRZ ? "nrz" : /* signal encoding */
|
||||
o.opt.rcor.encod == ENCOD_NRZI ? "nrzi" :
|
||||
o.opt.rcor.encod == ENCOD_MANCHESTER ? "manchester" : "???");
|
||||
printf ("%cdpll ", o.opt.rcor.dpll ? '+' : '-'); /* DPLL enable */
|
||||
|
||||
/* transmit clock option register */
|
||||
printf ("%clloop ", o.opt.tcor.llm ? '+' : '-'); /* local loopback mode */
|
||||
printf ("%cextclock ", o.opt.tcor.ext1x ? '+' : '-'); /* external 1x clock mode */
|
||||
printf ("\n");
|
||||
|
||||
switch (o.mode) {
|
||||
case M_ASYNC: /* async mode options */
|
||||
/* channel option register 1 */
|
||||
printf ("\t");
|
||||
printf ("cs%d ", o.aopt.cor1.charlen+1); /* character length, 5..8 */
|
||||
printf ("par%s ", o.aopt.cor1.parity ? "odd" : "even"); /* parity */
|
||||
printf ("%cignpar ", o.aopt.cor1.ignpar ? '+' : '-'); /* ignore parity */
|
||||
if (o.aopt.cor1.parmode != PARM_NORMAL) /* parity mode */
|
||||
printf ("%s ", o.aopt.cor1.parmode == PARM_NOPAR ? "nopar" :
|
||||
o.aopt.cor1.parmode == PARM_FORCE ? "forcepar" : "???");
|
||||
printf ("\n");
|
||||
|
||||
/* channel option register 2 */
|
||||
printf ("\t");
|
||||
printf ("%cdsr ", o.aopt.cor2.dsrae ? '+' : '-'); /* DSR automatic enable */
|
||||
printf ("%ccts ", o.aopt.cor2.ctsae ? '+' : '-'); /* CTS automatic enable */
|
||||
printf ("%crts ", o.aopt.cor2.rtsao ? '+' : '-'); /* RTS automatic output enable */
|
||||
printf ("%crloop ", o.aopt.cor2.rlm ? '+' : '-'); /* remote loopback mode enable */
|
||||
printf ("%cetc ", o.aopt.cor2.etc ? '+' : '-'); /* embedded transmitter cmd enable */
|
||||
printf ("%cxon ", o.aopt.cor2.ixon ? '+' : '-'); /* in-band XON/XOFF enable */
|
||||
printf ("%cxany ", o.aopt.cor2.ixany ? '+' : '-'); /* XON on any character */
|
||||
printf ("\n");
|
||||
|
||||
/* option register 3 */
|
||||
printf ("\t");
|
||||
printf ("%s ", o.aopt.cor3.stopb == STOPB_1 ? "stopb1" : /* stop bit length */
|
||||
o.aopt.cor3.stopb == STOPB_15 ? "stopb1.5" :
|
||||
o.aopt.cor3.stopb == STOPB_2 ? "stopb2" : "???");
|
||||
printf ("%csdt ", o.aopt.cor3.scde ? '+' : '-'); /* special char detection enable */
|
||||
printf ("%cflowct ", o.aopt.cor3.flowct ? '+' : '-'); /* flow control transparency mode */
|
||||
printf ("%crdt ", o.aopt.cor3.rngde ? '+' : '-'); /* range detect enable */
|
||||
printf ("%cexdt ", o.aopt.cor3.escde ? '+' : '-'); /* extended spec. char detect enable */
|
||||
printf ("\n");
|
||||
|
||||
/* channel option register 6 */
|
||||
printf ("\t");
|
||||
printf ("%s ", o.aopt.cor6.parerr == PERR_INTR ? "parintr" : /* parity/framing error actions */
|
||||
o.aopt.cor6.parerr == PERR_NULL ? "parnull" :
|
||||
o.aopt.cor6.parerr == PERR_IGNORE ? "parign" :
|
||||
o.aopt.cor6.parerr == PERR_DISCARD ? "pardisc" :
|
||||
o.aopt.cor6.parerr == PERR_FFNULL ? "parffnull" : "???");
|
||||
printf ("%s ", o.aopt.cor6.brk == BRK_INTR ? "brkintr" : /* action on break condition */
|
||||
o.aopt.cor6.brk == BRK_NULL ? "brknull" :
|
||||
o.aopt.cor6.brk == BRK_DISCARD ? "brkdisc" : "???");
|
||||
printf ("%cinlcr ", o.aopt.cor6.inlcr ? '+' : '-'); /* translate NL to CR on input */
|
||||
printf ("%cicrnl ", o.aopt.cor6.icrnl ? '+' : '-'); /* translate CR to NL on input */
|
||||
printf ("%cigncr ", o.aopt.cor6.igncr ? '+' : '-'); /* discard CR on input */
|
||||
printf ("\n");
|
||||
|
||||
/* channel option register 7 */
|
||||
printf ("\t");
|
||||
printf ("%cocrnl ", o.aopt.cor7.ocrnl ? '+' : '-'); /* translate CR to NL on output */
|
||||
printf ("%conlcr ", o.aopt.cor7.onlcr ? '+' : '-'); /* translate NL to CR on output */
|
||||
printf ("%cfcerr ", o.aopt.cor7.fcerr ? '+' : '-'); /* process flow ctl err chars enable */
|
||||
printf ("%clnext ", o.aopt.cor7.lnext ? '+' : '-'); /* LNext option enable */
|
||||
printf ("%cistrip ", o.aopt.cor7.istrip ? '+' : '-'); /* strip 8-bit on input */
|
||||
printf ("\n");
|
||||
|
||||
printf ("\t");
|
||||
printf ("schr1=%s ", symbol (o.aopt.schr1)); /* special character register 1 (XON) */
|
||||
printf ("schr2=%s ", symbol (o.aopt.schr2)); /* special character register 2 (XOFF) */
|
||||
printf ("schr3=%s ", symbol (o.aopt.schr3)); /* special character register 3 */
|
||||
printf ("schr4=%s ", symbol (o.aopt.schr4)); /* special character register 4 */
|
||||
printf ("scrl=%s ", symbol (o.aopt.scrl)); /* special character range low */
|
||||
printf ("scrh=%s ", symbol (o.aopt.scrh)); /* special character range high */
|
||||
printf ("lnext=%s ", symbol (o.aopt.lnxt)); /* LNext character */
|
||||
printf ("\n");
|
||||
break;
|
||||
|
||||
case M_HDLC: /* hdlc mode options */
|
||||
/* hdlc channel option register 1 */
|
||||
printf ("\t");
|
||||
printf ("if%d ", o.hopt.cor1.ifflags); /* number of inter-frame flags sent */
|
||||
printf ("%s ", o.hopt.cor1.admode == ADMODE_NOADDR ? "noaddr" : /* addressing mode */
|
||||
o.hopt.cor1.admode == ADMODE_4_1 ? "addr1" :
|
||||
o.hopt.cor1.admode == ADMODE_2_2 ? "addr2" : "???");
|
||||
printf ("%cclrdet ", o.hopt.cor1.clrdet ? '+' : '-'); /* clear detect for X.21 data transfer phase */
|
||||
printf ("addrlen%d ", o.hopt.cor1.aflo + 1); /* address field length option */
|
||||
printf ("\n");
|
||||
|
||||
/* hdlc channel option register 2 */
|
||||
printf ("\t");
|
||||
printf ("%cdsr ", o.hopt.cor2.dsrae ? '+' : '-'); /* DSR automatic enable */
|
||||
printf ("%ccts ", o.hopt.cor2.ctsae ? '+' : '-'); /* CTS automatic enable */
|
||||
printf ("%crts ", o.hopt.cor2.rtsao ? '+' : '-'); /* RTS automatic output enable */
|
||||
printf ("%ccrcinv ", o.hopt.cor2.crcninv ? '-' : '+'); /* CRC invertion option */
|
||||
printf ("%cfcsapd ", o.hopt.cor2.fcsapd ? '+' : '-'); /* FCS append */
|
||||
printf ("\n");
|
||||
|
||||
/* hdlc channel option register 3 */
|
||||
printf ("\t");
|
||||
printf ("pad%d ", o.hopt.cor3.padcnt); /* pad character count */
|
||||
printf ("idle%s ", o.hopt.cor3.idle ? "mark" : "flag"); /* idle mode */
|
||||
printf ("%cfcs ", o.hopt.cor3.nofcs ? '-' : '+'); /* FCS disable */
|
||||
printf ("fcs-%s ", o.hopt.cor3.fcspre ? "crc-16" : "v.41"); /* FCS preset */
|
||||
printf ("syn=%s ", o.hopt.cor3.syncpat ? "0xAA" : "0x00"); /* send sync pattern */
|
||||
printf ("%csyn ", o.hopt.cor3.sndpad ? '+' : '-'); /* send pad characters before flag enable */
|
||||
printf ("\n");
|
||||
|
||||
printf ("\t");
|
||||
printf ("rfar1=0x%02x ", o.hopt.rfar1); /* receive frame address register 1 */
|
||||
printf ("rfar2=0x%02x ", o.hopt.rfar2); /* receive frame address register 2 */
|
||||
printf ("rfar3=0x%02x ", o.hopt.rfar3); /* receive frame address register 3 */
|
||||
printf ("rfar4=0x%02x ", o.hopt.rfar4); /* receive frame address register 4 */
|
||||
printf ("crc-%s ", o.hopt.cpsr ? "16" : "v.41"); /* CRC polynomial select */
|
||||
printf ("\n");
|
||||
break;
|
||||
|
||||
case M_BISYNC: /* bisync mode options */
|
||||
/* channel option register 1 */
|
||||
printf ("\t");
|
||||
printf ("cs%d ", o.bopt.cor1.charlen+1); /* character length, 5..8 */
|
||||
printf ("par%s ", o.bopt.cor1.parity ? "odd" : "even"); /* parity */
|
||||
printf ("%cignpar ", o.bopt.cor1.ignpar ? '+' : '-'); /* ignore parity */
|
||||
if (o.bopt.cor1.parmode != PARM_NORMAL) /* parity mode */
|
||||
printf ("%s ", o.bopt.cor1.parmode == PARM_NOPAR ? "nopar" :
|
||||
o.bopt.cor1.parmode == PARM_FORCE ? "forcepar" : "???");
|
||||
printf ("\n");
|
||||
|
||||
/* channel option register 2 */
|
||||
printf ("\t");
|
||||
printf ("syn%d ", o.bopt.cor2.syns+2); /* number of extra SYN chars before a frame */
|
||||
printf ("%ccrcinv ", o.bopt.cor2.crcninv ? '-' : '+'); /* CRC invertion option */
|
||||
printf ("%s ", o.bopt.cor2.ebcdic ? "ebcdic" : "ascii"); /* use EBCDIC as char set (instead of ASCII) */
|
||||
printf ("%cbccapd ", o.bopt.cor2.bcc ? '+' : '-'); /* BCC append enable */
|
||||
printf ("%s ", o.bopt.cor2.lrc ? "lrc" : "crc-16"); /* longitudinal redundancy check */
|
||||
printf ("\n");
|
||||
|
||||
/* channel option register 3 */
|
||||
printf ("\t");
|
||||
printf ("pad%d ", o.bopt.cor3.padcnt); /* pad character count */
|
||||
printf ("idle%s ", o.bopt.cor3.idle ? "mark" : "syn"); /* idle mode */
|
||||
printf ("%cfcs ", o.bopt.cor3.nofcs ? '-' : '+'); /* FCS disable */
|
||||
printf ("fcs-%s ", o.bopt.cor3.fcspre ? "crc-16" : "v.41"); /* FCS preset */
|
||||
printf ("syn=%s ", o.bopt.cor3.padpat ? "0x55" : "0xAA"); /* send sync pattern */
|
||||
printf ("%csyn ", o.bopt.cor3.sndpad ? '+' : '-'); /* send pad characters before flag enable */
|
||||
printf ("\n");
|
||||
|
||||
/* channel option register 6 */
|
||||
printf ("\t");
|
||||
printf ("specterm=%s ", symbol (o.bopt.cor6.specterm)); /* special termination character */
|
||||
|
||||
printf ("crc-%s ", o.bopt.cpsr ? "16" : "v.41"); /* CRC polynomial select */
|
||||
printf ("\n");
|
||||
break;
|
||||
|
||||
case M_X21: /* x.21 mode options */
|
||||
/* channel option register 1 */
|
||||
printf ("\t");
|
||||
printf ("cs%d ", o.xopt.cor1.charlen+1); /* character length, 5..8 */
|
||||
printf ("par%s ", o.xopt.cor1.parity ? "odd" : "even"); /* parity */
|
||||
printf ("%cignpar ", o.xopt.cor1.ignpar ? '+' : '-'); /* ignore parity */
|
||||
if (o.xopt.cor1.parmode != PARM_NORMAL) /* parity mode */
|
||||
printf ("%s ", o.xopt.cor1.parmode == PARM_NOPAR ? "nopar" :
|
||||
o.xopt.cor1.parmode == PARM_FORCE ? "forcepar" : "???");
|
||||
printf ("\n");
|
||||
|
||||
/* channel option register 2 */
|
||||
printf ("\t");
|
||||
printf ("%cetc ", o.xopt.cor2.etc ? '+' : '-'); /* embedded transmitter cmd enable */
|
||||
|
||||
/* channel option register 3 */
|
||||
printf ("%csdt ", o.xopt.cor3.scde ? '+' : '-'); /* special char detection enable */
|
||||
printf ("%cstripsyn ", o.xopt.cor3.stripsyn ? '+' : '-'); /* treat SYN chars as special condition */
|
||||
printf ("%cssdt ", o.xopt.cor3.ssde ? '+' : '-'); /* steady state detect enable */
|
||||
printf ("syn%c ", o.xopt.cor3.syn ? '1' : '2'); /* the number of SYN chars on receive */
|
||||
printf ("\n");
|
||||
|
||||
/* channel option register 6 */
|
||||
printf ("\t");
|
||||
printf ("syn=%s ", symbol (o.xopt.cor6.synchar)); /* syn character */
|
||||
|
||||
printf ("schr1=%s ", symbol (o.xopt.schr1)); /* special character register 1 */
|
||||
printf ("schr2=%s ", symbol (o.xopt.schr2)); /* special character register 2 */
|
||||
printf ("schr3=%s ", symbol (o.xopt.schr3)); /* special character register 3 */
|
||||
printf ("\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
printchan(int channel)
|
||||
{
|
||||
printf ("cx%d (%s) %s", channel, chantype (o.type), chanmode (o.mode));
|
||||
if (o.txbaud == o.rxbaud)
|
||||
printf (" %lu", o.rxbaud);
|
||||
else
|
||||
printf (" ospeed=%lu ispeed=%lu", o.txbaud, o.rxbaud);
|
||||
if ((o.channel == 0 || o.channel == 8) &&
|
||||
(o.type == T_UNIV_V35 || o.type == T_UNIV_RS449))
|
||||
printf (" port=%s", o.iftype ? (o.type == T_UNIV_V35 ?
|
||||
"v35" : "rs449") : "rs232");
|
||||
printf (o.sopt.ext ? " ext" : o.sopt.cisco ? " cisco" : " ppp");
|
||||
printf (" %ckeepalive", o.sopt.keepalive ? '+' : '-');
|
||||
printf (" %cautorts", o.sopt.norts ? '-' : '+');
|
||||
if (*o.master)
|
||||
printf (" master=%s", o.master);
|
||||
printf ("\n");
|
||||
if (aflag)
|
||||
printopt ();
|
||||
}
|
||||
|
||||
static void
|
||||
printall(void)
|
||||
{
|
||||
struct ifconf ifc;
|
||||
struct ifreq *ifr;
|
||||
char buf[BUFSIZ], *cp;
|
||||
int s, c;
|
||||
|
||||
s = socket (AF_INET, SOCK_DGRAM, 0);
|
||||
if (s < 0)
|
||||
err (1, "socket");
|
||||
ifc.ifc_len = sizeof (buf);
|
||||
ifc.ifc_buf = buf;
|
||||
if (ioctl (s, SIOCGIFCONF, (caddr_t)&ifc) < 0)
|
||||
err (1, "SIOCGIFCONF");
|
||||
close (s);
|
||||
s = open (CXDEV, 0);
|
||||
if (s < 0)
|
||||
err (1, "%s", CXDEV);
|
||||
|
||||
ifr = ifc.ifc_req;
|
||||
#define max(a,b) ((a)>(b) ? (a) : (b))
|
||||
#define size(p) max((p).sa_len, sizeof(p))
|
||||
for (cp=buf; cp<buf+ifc.ifc_len; cp+=sizeof(ifr->ifr_name)+size(ifr->ifr_addr)) {
|
||||
ifr = (struct ifreq*) cp;
|
||||
if (ifr->ifr_addr.sa_family != AF_LINK)
|
||||
continue;
|
||||
if (strncmp (ifr->ifr_name, "cx", 2) != 0)
|
||||
continue;
|
||||
c = atoi (ifr->ifr_name + 2);
|
||||
o.board = c/NCHAN;
|
||||
o.channel = c%NCHAN;
|
||||
if (ioctl (s, CXIOCGETMODE, (caddr_t)&o) < 0)
|
||||
err (1, "CXIOCGETMODE");
|
||||
printchan (c);
|
||||
}
|
||||
close (s);
|
||||
}
|
||||
|
||||
static void
|
||||
set_interface_type(char *type)
|
||||
{
|
||||
if (o.channel != 0 && o.channel != 8) {
|
||||
printf ("interface option is applicable only for channels 0 and 8\n");
|
||||
exit (1);
|
||||
}
|
||||
if (o.type != T_UNIV_V35 && o.type != T_UNIV_RS449) {
|
||||
printf ("interface option is applicable only for universal channels\n");
|
||||
exit (1);
|
||||
}
|
||||
if (! strcasecmp (type, "port=rs232"))
|
||||
o.iftype = 0;
|
||||
else
|
||||
o.iftype = 1;
|
||||
}
|
||||
|
||||
static void
|
||||
set_master(char *ifname)
|
||||
{
|
||||
if (o.type == T_ASYNC) {
|
||||
printf ("master option is not applicable for async channels\n");
|
||||
exit (1);
|
||||
}
|
||||
strcpy (o.master, ifname);
|
||||
}
|
||||
|
||||
static void
|
||||
set_async_opt(char *opt)
|
||||
{
|
||||
/* channel option register 1 */
|
||||
if (! strncasecmp (opt, "cs", 2)) o.aopt.cor1.charlen = atoi (opt + 2) - 1;
|
||||
else if (! strcasecmp (opt, "parodd")) o.aopt.cor1.parity = 1;
|
||||
else if (! strcasecmp (opt, "pareven")) o.aopt.cor1.parity = 0;
|
||||
else if (! strcasecmp (opt, "-ignpar")) o.aopt.cor1.ignpar = 0;
|
||||
else if (! strcasecmp (opt, "+ignpar")) o.aopt.cor1.ignpar = 1;
|
||||
else if (! strcasecmp (opt, "nopar")) o.aopt.cor1.parmode = PARM_NOPAR;
|
||||
else if (! strcasecmp (opt, "forcepar")) o.aopt.cor1.parmode = PARM_FORCE;
|
||||
|
||||
/* channel option register 2 */
|
||||
else if (! strcasecmp (opt, "-dsr")) o.aopt.cor2.dsrae = 0;
|
||||
else if (! strcasecmp (opt, "+dsr")) o.aopt.cor2.dsrae = 1;
|
||||
else if (! strcasecmp (opt, "-cts")) o.aopt.cor2.ctsae = 0;
|
||||
else if (! strcasecmp (opt, "+cts")) o.aopt.cor2.ctsae = 1;
|
||||
else if (! strcasecmp (opt, "-rts")) o.aopt.cor2.rtsao = 0;
|
||||
else if (! strcasecmp (opt, "+rts")) o.aopt.cor2.rtsao = 1;
|
||||
else if (! strcasecmp (opt, "-rloop")) o.aopt.cor2.rlm = 0;
|
||||
else if (! strcasecmp (opt, "+rloop")) o.aopt.cor2.rlm = 1;
|
||||
else if (! strcasecmp (opt, "-etc")) o.aopt.cor2.etc = 0;
|
||||
else if (! strcasecmp (opt, "+etc")) o.aopt.cor2.etc = 1;
|
||||
else if (! strcasecmp (opt, "-ixon")) o.aopt.cor2.ixon = 0;
|
||||
else if (! strcasecmp (opt, "+ixon")) o.aopt.cor2.ixon = 1;
|
||||
else if (! strcasecmp (opt, "-ixany")) o.aopt.cor2.ixany = 0;
|
||||
else if (! strcasecmp (opt, "+ixany")) o.aopt.cor2.ixany = 1;
|
||||
|
||||
/* option register 3 */
|
||||
else if (! strcasecmp (opt, "stopb1")) o.aopt.cor3.stopb = STOPB_1;
|
||||
else if (! strcasecmp (opt, "stopb1.5")) o.aopt.cor3.stopb = STOPB_15;
|
||||
else if (! strcasecmp (opt, "stopb2")) o.aopt.cor3.stopb = STOPB_2;
|
||||
else if (! strcasecmp (opt, "-sdt")) o.aopt.cor3.scde = 0;
|
||||
else if (! strcasecmp (opt, "+sdt")) o.aopt.cor3.scde = 1;
|
||||
else if (! strcasecmp (opt, "-flowct")) o.aopt.cor3.flowct = 0;
|
||||
else if (! strcasecmp (opt, "+flowct")) o.aopt.cor3.flowct = 1;
|
||||
else if (! strcasecmp (opt, "-rdt")) o.aopt.cor3.rngde = 0;
|
||||
else if (! strcasecmp (opt, "+rdt")) o.aopt.cor3.rngde = 1;
|
||||
else if (! strcasecmp (opt, "-exdt")) o.aopt.cor3.escde = 0;
|
||||
else if (! strcasecmp (opt, "+exdt")) o.aopt.cor3.escde = 1;
|
||||
|
||||
/* channel option register 6 */
|
||||
else if (! strcasecmp (opt, "parintr")) o.aopt.cor6.parerr = PERR_INTR;
|
||||
else if (! strcasecmp (opt, "parnull")) o.aopt.cor6.parerr = PERR_NULL;
|
||||
else if (! strcasecmp (opt, "parign")) o.aopt.cor6.parerr = PERR_IGNORE;
|
||||
else if (! strcasecmp (opt, "pardisc")) o.aopt.cor6.parerr = PERR_DISCARD;
|
||||
else if (! strcasecmp (opt, "parffnull")) o.aopt.cor6.parerr = PERR_FFNULL;
|
||||
else if (! strcasecmp (opt, "brkintr")) o.aopt.cor6.brk = BRK_INTR;
|
||||
else if (! strcasecmp (opt, "brknull")) o.aopt.cor6.brk = BRK_NULL;
|
||||
else if (! strcasecmp (opt, "brkdisc")) o.aopt.cor6.brk = BRK_DISCARD;
|
||||
else if (! strcasecmp (opt, "-inlcr")) o.aopt.cor6.inlcr = 0;
|
||||
else if (! strcasecmp (opt, "+inlcr")) o.aopt.cor6.inlcr = 1;
|
||||
else if (! strcasecmp (opt, "-icrnl")) o.aopt.cor6.icrnl = 0;
|
||||
else if (! strcasecmp (opt, "+icrnl")) o.aopt.cor6.icrnl = 1;
|
||||
else if (! strcasecmp (opt, "-igncr")) o.aopt.cor6.igncr = 0;
|
||||
else if (! strcasecmp (opt, "+igncr")) o.aopt.cor6.igncr = 1;
|
||||
|
||||
/* channel option register 7 */
|
||||
else if (! strcasecmp (opt, "-ocrnl")) o.aopt.cor7.ocrnl = 0;
|
||||
else if (! strcasecmp (opt, "+ocrnl")) o.aopt.cor7.ocrnl = 1;
|
||||
else if (! strcasecmp (opt, "-onlcr")) o.aopt.cor7.onlcr = 0;
|
||||
else if (! strcasecmp (opt, "+onlcr")) o.aopt.cor7.onlcr = 1;
|
||||
else if (! strcasecmp (opt, "-fcerr")) o.aopt.cor7.fcerr = 0;
|
||||
else if (! strcasecmp (opt, "+fcerr")) o.aopt.cor7.fcerr = 1;
|
||||
else if (! strcasecmp (opt, "-lnext")) o.aopt.cor7.lnext = 0;
|
||||
else if (! strcasecmp (opt, "+lnext")) o.aopt.cor7.lnext = 1;
|
||||
else if (! strcasecmp (opt, "-istrip")) o.aopt.cor7.istrip = 0;
|
||||
else if (! strcasecmp (opt, "+istrip")) o.aopt.cor7.istrip = 1;
|
||||
|
||||
else if (! strncasecmp (opt, "schr1=", 6)) o.aopt.schr1 = atosym (opt+6);
|
||||
else if (! strncasecmp (opt, "schr2=", 6)) o.aopt.schr2 = atosym (opt+6);
|
||||
else if (! strncasecmp (opt, "schr3=", 6)) o.aopt.schr3 = atosym (opt+6);
|
||||
else if (! strncasecmp (opt, "schr4=", 6)) o.aopt.schr4 = atosym (opt+6);
|
||||
else if (! strncasecmp (opt, "scrl=", 5)) o.aopt.scrl = atosym (opt+5);
|
||||
else if (! strncasecmp (opt, "scrh=", 5)) o.aopt.scrh = atosym (opt+5);
|
||||
else if (! strncasecmp (opt, "lnext=", 6)) o.aopt.lnxt = atosym (opt+6);
|
||||
else
|
||||
usage ();
|
||||
}
|
||||
|
||||
static void
|
||||
set_hdlc_opt(char *opt)
|
||||
{
|
||||
/* hdlc channel option register 1 */
|
||||
if (! strncasecmp (opt, "if", 2)) o.hopt.cor1.ifflags = atoi (opt + 2);
|
||||
else if (! strcasecmp (opt, "noaddr")) o.hopt.cor1.admode = ADMODE_NOADDR;
|
||||
else if (! strcasecmp (opt, "addr1")) o.hopt.cor1.admode = ADMODE_4_1;
|
||||
else if (! strcasecmp (opt, "addr2")) o.hopt.cor1.admode = ADMODE_2_2;
|
||||
else if (! strcasecmp (opt, "-clrdet")) o.hopt.cor1.clrdet = 0;
|
||||
else if (! strcasecmp (opt, "+clrdet")) o.hopt.cor1.clrdet = 1;
|
||||
else if (! strcasecmp (opt, "addrlen1")) o.hopt.cor1.aflo = 0;
|
||||
else if (! strcasecmp (opt, "addrlen2")) o.hopt.cor1.aflo = 1;
|
||||
|
||||
/* hdlc channel option register 2 */
|
||||
else if (! strcasecmp (opt, "-dsr")) o.hopt.cor2.dsrae = 0;
|
||||
else if (! strcasecmp (opt, "+dsr")) o.hopt.cor2.dsrae = 1;
|
||||
else if (! strcasecmp (opt, "-cts")) o.hopt.cor2.ctsae = 0;
|
||||
else if (! strcasecmp (opt, "+cts")) o.hopt.cor2.ctsae = 1;
|
||||
else if (! strcasecmp (opt, "-rts")) o.hopt.cor2.rtsao = 0;
|
||||
else if (! strcasecmp (opt, "+rts")) o.hopt.cor2.rtsao = 1;
|
||||
else if (! strcasecmp (opt, "-fcsapd")) o.hopt.cor2.fcsapd = 0;
|
||||
else if (! strcasecmp (opt, "+fcsapd")) o.hopt.cor2.fcsapd = 1;
|
||||
else if (! strcasecmp (opt, "-crcinv")) o.hopt.cor2.crcninv = 1;
|
||||
else if (! strcasecmp (opt, "+crcinv")) o.hopt.cor2.crcninv = 0;
|
||||
|
||||
/* hdlc channel option register 3 */
|
||||
else if (! strncasecmp (opt, "pad", 3)) o.hopt.cor3.padcnt = atoi (opt + 3);
|
||||
else if (! strcasecmp (opt, "idlemark")) o.hopt.cor3.idle = 1;
|
||||
else if (! strcasecmp (opt, "idleflag")) o.hopt.cor3.idle = 0;
|
||||
else if (! strcasecmp (opt, "-fcs")) o.hopt.cor3.nofcs = 1;
|
||||
else if (! strcasecmp (opt, "+fcs")) o.hopt.cor3.nofcs = 0;
|
||||
else if (! strcasecmp (opt, "fcs-crc-16")) o.hopt.cor3.fcspre = 1;
|
||||
else if (! strcasecmp (opt, "fcs-v.41")) o.hopt.cor3.fcspre = 0;
|
||||
else if (! strcasecmp (opt, "syn=0xaa")) o.hopt.cor3.syncpat = 1;
|
||||
else if (! strcasecmp (opt, "syn=0x00")) o.hopt.cor3.syncpat = 0;
|
||||
else if (! strcasecmp (opt, "-syn")) o.hopt.cor3.sndpad = 0;
|
||||
else if (! strcasecmp (opt, "+syn")) o.hopt.cor3.sndpad = 1;
|
||||
|
||||
else if (! strncasecmp (opt, "rfar1=", 6)) o.hopt.rfar1 = atoi (opt + 6);
|
||||
else if (! strncasecmp (opt, "rfar2=", 6)) o.hopt.rfar2 = atoi (opt + 6);
|
||||
else if (! strncasecmp (opt, "rfar3=", 6)) o.hopt.rfar3 = atoi (opt + 6);
|
||||
else if (! strncasecmp (opt, "rfar4=", 6)) o.hopt.rfar4 = atoi (opt + 6);
|
||||
else if (! strcasecmp (opt, "crc-16")) o.hopt.cpsr = 1;
|
||||
else if (! strcasecmp (opt, "crc-v.41")) o.hopt.cpsr = 0;
|
||||
else usage ();
|
||||
}
|
||||
|
||||
static void
|
||||
set_bisync_opt(char *opt __unused)
|
||||
{
|
||||
usage ();
|
||||
}
|
||||
|
||||
static void
|
||||
set_x21_opt(char *opt __unused)
|
||||
{
|
||||
usage ();
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
int channel;
|
||||
|
||||
for (--argc, ++argv; argc>0 && **argv=='-'; --argc, ++argv)
|
||||
if (! strcasecmp (*argv, "-a"))
|
||||
++aflag;
|
||||
else if (! strcasecmp (*argv, "-s"))
|
||||
++sflag;
|
||||
else
|
||||
usage ();
|
||||
|
||||
if (argc <= 0) {
|
||||
if (sflag)
|
||||
printallstats ();
|
||||
else
|
||||
printall ();
|
||||
return (0);
|
||||
}
|
||||
|
||||
if (argv[0][0]=='c' && argv[0][1]=='x')
|
||||
*argv += 2;
|
||||
if (**argv<'0' || **argv>'9')
|
||||
usage ();
|
||||
channel = atoi (*argv);
|
||||
--argc, ++argv;
|
||||
|
||||
if (sflag) {
|
||||
if (printstats (channel, 1) < 0)
|
||||
printf ("channel cx%d not available\n", channel);
|
||||
return (0);
|
||||
}
|
||||
|
||||
getchan (channel);
|
||||
|
||||
if (argc <= 0) {
|
||||
printchan (channel);
|
||||
return (0);
|
||||
}
|
||||
|
||||
for (; argc>0; --argc, ++argv)
|
||||
if (**argv == '(')
|
||||
continue;
|
||||
else if (! strncasecmp (*argv, "ispeed=", 7))
|
||||
o.rxbaud = atoi (*argv+7);
|
||||
else if (! strncasecmp (*argv, "ospeed=", 7))
|
||||
o.txbaud = atoi (*argv+7);
|
||||
else if (! strcasecmp (*argv, "async"))
|
||||
o.mode = M_ASYNC;
|
||||
else if (! strcasecmp (*argv, "hdlc"))
|
||||
o.mode = M_HDLC;
|
||||
else if (! strcasecmp (*argv, "bisync") ||
|
||||
! strcasecmp (*argv, "bsc"))
|
||||
o.mode = M_BISYNC;
|
||||
else if (! strcasecmp (*argv, "x.21") ||
|
||||
! strcasecmp (*argv, "x21"))
|
||||
o.mode = M_X21;
|
||||
else if (**argv>='0' && **argv<='9')
|
||||
o.txbaud = o.rxbaud = atoi (*argv);
|
||||
else if (! strcasecmp (*argv, "cisco")) {
|
||||
o.sopt.cisco = 1;
|
||||
o.sopt.ext = 0;
|
||||
} else if (! strcasecmp (*argv, "ppp")) {
|
||||
o.sopt.cisco = 0;
|
||||
o.sopt.ext = 0;
|
||||
} else if (! strcasecmp (*argv, "ext"))
|
||||
o.sopt.ext = 1;
|
||||
else if (! strcasecmp (*argv, "+keepalive"))
|
||||
o.sopt.keepalive = 1;
|
||||
else if (! strcasecmp (*argv, "-keepalive"))
|
||||
o.sopt.keepalive = 0;
|
||||
else if (! strcasecmp (*argv, "+autorts"))
|
||||
o.sopt.norts = 0;
|
||||
else if (! strcasecmp (*argv, "-autorts"))
|
||||
o.sopt.norts = 1;
|
||||
else if (! strcasecmp (*argv, "port=rs232") ||
|
||||
! strcasecmp (*argv, "port=rs449") ||
|
||||
! strcasecmp (*argv, "port=v35"))
|
||||
set_interface_type (*argv);
|
||||
else if (! strncasecmp (*argv, "master=",7))
|
||||
set_master (*argv+7);
|
||||
|
||||
/*
|
||||
* Common channel options
|
||||
*/
|
||||
/* channel option register 4 */
|
||||
else if (! strcasecmp (*argv, "-ctsdown"))
|
||||
o.opt.cor4.cts_zd = 0;
|
||||
else if (! strcasecmp (*argv, "+ctsdown"))
|
||||
o.opt.cor4.cts_zd = 1;
|
||||
else if (! strcasecmp (*argv, "-cddown"))
|
||||
o.opt.cor4.cd_zd = 0;
|
||||
else if (! strcasecmp (*argv, "+cddown"))
|
||||
o.opt.cor4.cd_zd = 1;
|
||||
else if (! strcasecmp (*argv, "-dsrdown"))
|
||||
o.opt.cor4.dsr_zd = 0;
|
||||
else if (! strcasecmp (*argv, "+dsrdown"))
|
||||
o.opt.cor4.dsr_zd = 1;
|
||||
else if (! strncasecmp (*argv, "fifo=", 5))
|
||||
o.opt.cor4.thr = atoi (*argv + 5);
|
||||
|
||||
/* channel option register 5 */
|
||||
else if (! strcasecmp (*argv, "-ctsup"))
|
||||
o.opt.cor5.cts_od = 0;
|
||||
else if (! strcasecmp (*argv, "+ctsup"))
|
||||
o.opt.cor5.cts_od = 1;
|
||||
else if (! strcasecmp (*argv, "-cdup"))
|
||||
o.opt.cor5.cd_od = 0;
|
||||
else if (! strcasecmp (*argv, "+cdup"))
|
||||
o.opt.cor5.cd_od = 1;
|
||||
else if (! strcasecmp (*argv, "-dsrup"))
|
||||
o.opt.cor5.dsr_od = 0;
|
||||
else if (! strcasecmp (*argv, "+dsrup"))
|
||||
o.opt.cor5.dsr_od = 1;
|
||||
else if (! strncasecmp (*argv, "rfifo=", 6))
|
||||
o.opt.cor5.rx_thr = atoi (*argv + 6);
|
||||
|
||||
/* receive clock option register */
|
||||
else if (! strcasecmp (*argv, "nrz"))
|
||||
o.opt.rcor.encod = ENCOD_NRZ;
|
||||
else if (! strcasecmp (*argv, "nrzi"))
|
||||
o.opt.rcor.encod = ENCOD_NRZI;
|
||||
else if (! strcasecmp (*argv, "manchester"))
|
||||
o.opt.rcor.encod = ENCOD_MANCHESTER;
|
||||
else if (! strcasecmp (*argv, "-dpll"))
|
||||
o.opt.rcor.dpll = 0;
|
||||
else if (! strcasecmp (*argv, "+dpll"))
|
||||
o.opt.rcor.dpll = 1;
|
||||
|
||||
/* transmit clock option register */
|
||||
else if (! strcasecmp (*argv, "-lloop"))
|
||||
o.opt.tcor.llm = 0;
|
||||
else if (! strcasecmp (*argv, "+lloop"))
|
||||
o.opt.tcor.llm = 1;
|
||||
else if (! strcasecmp (*argv, "-extclock"))
|
||||
o.opt.tcor.ext1x = 0;
|
||||
else if (! strcasecmp (*argv, "+extclock"))
|
||||
o.opt.tcor.ext1x = 1;
|
||||
|
||||
/*
|
||||
* Mode dependent channel options
|
||||
*/
|
||||
else switch (o.mode) {
|
||||
case M_ASYNC: set_async_opt (*argv); break;
|
||||
case M_HDLC: set_hdlc_opt (*argv); break;
|
||||
case M_BISYNC: set_bisync_opt (*argv); break;
|
||||
case M_X21: set_x21_opt (*argv); break;
|
||||
}
|
||||
|
||||
setchan (channel);
|
||||
return (0);
|
||||
}
|
@ -1,6 +0,0 @@
|
||||
# $FreeBSD$
|
||||
|
||||
PROG= fdisk
|
||||
MAN= fdisk.8
|
||||
|
||||
.include <bsd.prog.mk>
|
@ -1,433 +0,0 @@
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd October 4, 1996
|
||||
.Dt FDISK 8
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm fdisk
|
||||
.Nd PC partition table maintenance program
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Op Fl BIaistu
|
||||
.Op Fl b Ar bootcode
|
||||
.Op Fl 1234
|
||||
.Op Ar disk
|
||||
.Bl -tag -width time
|
||||
.Nm
|
||||
.Fl f Ar configfile
|
||||
.Op Fl itv
|
||||
.Op Ar disk
|
||||
.Sh PROLOGUE
|
||||
In order for the BIOS to boot the kernel,
|
||||
certain conventions must be adhered to.
|
||||
Sector 0 of the disk must contain boot code,
|
||||
a partition table,
|
||||
and a magic number.
|
||||
BIOS partitions can be used to break the disk up into several pieces.
|
||||
The BIOS brings in sector 0 and verifies the magic number. The sector
|
||||
0 boot code then searches the partition table to determine which
|
||||
partition is marked
|
||||
.Em active .
|
||||
This boot code then brings in the bootstrap from the
|
||||
.Em active
|
||||
partition and, if marked bootable, runs it.
|
||||
Under DOS,
|
||||
you can have one or more partitions with one
|
||||
.Em active .
|
||||
The DOS
|
||||
.Nm
|
||||
program can be used to divide space on the disk into partitions and set one
|
||||
.Em active .
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Fx
|
||||
program
|
||||
.Nm
|
||||
serves a similar purpose to the DOS program. The first form is used to
|
||||
display partition information or to interactively edit the partition
|
||||
table. The second is used to write a partition table using a
|
||||
.Ar configfile
|
||||
and is designed to be used by other scripts/programs.
|
||||
.Pp
|
||||
Options are:
|
||||
.It Fl a
|
||||
Change the active partition only. Ignored if
|
||||
.Fl f
|
||||
is given.
|
||||
.It Fl b Ar bootcode
|
||||
Get the boot code from the file
|
||||
.Ar bootcode .
|
||||
Default is
|
||||
.Pa /boot/mbr .
|
||||
.It Fl B
|
||||
Reinitialize the boot code contained in sector 0 of the disk. Ignored
|
||||
if
|
||||
.Fl f
|
||||
is given.
|
||||
.It Fl f Ar configfile
|
||||
Set partition values using the file
|
||||
.Ar configfile .
|
||||
The
|
||||
.Ar configfile
|
||||
always modifies existing partitions, unless
|
||||
.Fl i
|
||||
is also given, in which case all existing partitions are deleted (marked
|
||||
as "unused") before the
|
||||
.Ar configfile
|
||||
is read. The
|
||||
.Ar configfile
|
||||
can be "-", in which case
|
||||
.Ar stdin
|
||||
is read. See
|
||||
.Sx CONFIGURATION FILE ,
|
||||
below, for file syntax.
|
||||
.Pp
|
||||
.Em WARNING :
|
||||
when
|
||||
.Fl f
|
||||
is used, you are not asked if you really want to write the partition
|
||||
table (as you are in the interactive mode). Use with caution!
|
||||
.It Fl i
|
||||
Initialize sector 0 of the disk. This implies
|
||||
.Fl u ,
|
||||
unless
|
||||
.Fl f
|
||||
is given.
|
||||
.It Fl I
|
||||
Initialize the contents of sector 0
|
||||
with one
|
||||
.Fx
|
||||
slice covering the entire disk.
|
||||
.It Fl s
|
||||
Print summary information and exit.
|
||||
.It Fl t
|
||||
Test mode; do not write partition values. Generally used with the
|
||||
.Fl f
|
||||
option to see what would be written to the partition table. Implies
|
||||
.Fl v .
|
||||
.It Fl u
|
||||
Is used for updating (editing) sector 0 of the disk. Ignored if
|
||||
.Fl f
|
||||
is given.
|
||||
.It Fl v
|
||||
Be verbose. When
|
||||
.Fl f
|
||||
is used,
|
||||
.Nm
|
||||
prints out the partition table that is written to the disk.
|
||||
.It Fl 1234
|
||||
Operate on a single fdisk entry only. Ignored if
|
||||
.Fl f
|
||||
is given.
|
||||
.El
|
||||
.Pp
|
||||
The final disk name can be provided as a
|
||||
.Sq bare
|
||||
disk name only, e.g.\&
|
||||
.Ql da0 ,
|
||||
or as a full pathname.
|
||||
If omitted,
|
||||
.Nm
|
||||
tries to figure out the default disk device name from the
|
||||
mounted root device.
|
||||
.Pp
|
||||
When called with no arguments, it prints the sector 0 partition table.
|
||||
An example follows:
|
||||
.Bd -literal
|
||||
******* Working on device /dev/ad0 *******
|
||||
parameters extracted from in-core disklabel are:
|
||||
cylinders=769 heads=15 sectors/track=33 (495 blks/cyl)
|
||||
|
||||
parameters to be used for BIOS calculations are:
|
||||
cylinders=769 heads=15 sectors/track=33 (495 blks/cyl)
|
||||
|
||||
Warning: BIOS sector numbering starts with sector 1
|
||||
Information from DOS bootblock is:
|
||||
The data for partition 1 is:
|
||||
sysid 165,(FreeBSD/NetBSD/386BSD)
|
||||
start 495, size 380160 (185 Meg), flag 0
|
||||
beg: cyl 1/ sector 1/ head 0;
|
||||
end: cyl 768/ sector 33/ head 14
|
||||
The data for partition 2 is:
|
||||
sysid 164,(unknown)
|
||||
start 378180, size 2475 (1 Meg), flag 0
|
||||
beg: cyl 764/ sector 1/ head 0;
|
||||
end: cyl 768/ sector 33/ head 14
|
||||
The data for partition 3 is:
|
||||
<UNUSED>
|
||||
The data for partition 4 is:
|
||||
sysid 99,(ISC UNIX, other System V/386, GNU HURD or Mach)
|
||||
start 380656, size 224234 (109 Meg), flag 80
|
||||
beg: cyl 769/ sector 2/ head 0;
|
||||
end: cyl 197/ sector 33/ head 14
|
||||
.Ed
|
||||
.Pp
|
||||
The disk is divided into three partitions that happen to fill the disk.
|
||||
The second partition overlaps the end of the first.
|
||||
(Used for debugging purposes)
|
||||
.Bl -tag -width "cyl, sector and head"
|
||||
.It Em "sysid"
|
||||
is used to label the partition.
|
||||
.Fx
|
||||
reserves the
|
||||
magic number 165 decimal (A5 in hex).
|
||||
.It Em start No and Em size
|
||||
fields provide the start address
|
||||
and size of a partition in sectors.
|
||||
.It Em "flag 80"
|
||||
specifies that this is the active partition.
|
||||
.It Em cyl , sector No and Em head
|
||||
fields are used to specify the beginning address
|
||||
and end address for the partition.
|
||||
.It Em Note :
|
||||
these numbers are calculated using BIOS's understanding of the disk geometry
|
||||
and saved in the bootblock.
|
||||
.El
|
||||
.Pp
|
||||
The flags
|
||||
.Fl i
|
||||
or
|
||||
.Fl u
|
||||
are used to indicate that the partition data is to be updated, unless the
|
||||
.Fl f
|
||||
option is used. If the
|
||||
.Fl f
|
||||
option is not used, the
|
||||
.Nm
|
||||
program will enter a conversational mode.
|
||||
This mode is designed not to change any data unless you explicitly tell it to.
|
||||
.Nm Fdisk
|
||||
selects defaults for its questions to guarantee the above behavior.
|
||||
.Pp
|
||||
It displays each partition
|
||||
and ask if you want to edit it.
|
||||
If you say yes,
|
||||
it will step through each field showing the old value
|
||||
and asking for a new one.
|
||||
When you are done with a partition,
|
||||
.Nm
|
||||
will display it and ask if it is correct.
|
||||
.Nm Fdisk
|
||||
will then proceed to the next entry.
|
||||
.Pp
|
||||
Getting the
|
||||
.Em cyl , sector ,
|
||||
and
|
||||
.Em head
|
||||
fields correct is tricky.
|
||||
So by default,
|
||||
they will be calculated for you;
|
||||
you can specify them if you choose.
|
||||
.Pp
|
||||
After all the partitions are processed,
|
||||
you are given the option to change the
|
||||
.Em active
|
||||
partition.
|
||||
Finally,
|
||||
when the all the data for the first sector has been accumulated,
|
||||
you are asked if you really want to rewrite sector 0.
|
||||
Only if you answer yes,
|
||||
will the data be written to disk.
|
||||
.Pp
|
||||
The difference between the
|
||||
.Fl u
|
||||
flag and
|
||||
.Fl i
|
||||
flag is that
|
||||
the
|
||||
.Fl u
|
||||
flag just edits the fields as they appear on the disk.
|
||||
While the
|
||||
.Fl i
|
||||
flag is used to "initialize" sector 0;
|
||||
it will setup the last BIOS partition to use the whole disk for
|
||||
.Fx ;
|
||||
and make it active.
|
||||
.Sh NOTES
|
||||
The automatic calculation of starting cylinder etc. uses
|
||||
a set of figures that represent what the BIOS thinks is the
|
||||
geometry of the drive.
|
||||
These figures are by default taken from the incore disklabel,
|
||||
but the program initially gives you an opportunity to change them.
|
||||
This allows the user to create a bootblock that can work with drives
|
||||
that use geometry translation under the BIOS.
|
||||
.Pp
|
||||
If you hand craft your disk layout,
|
||||
please make sure that the
|
||||
.Fx
|
||||
partition starts on a cylinder boundary.
|
||||
A number of decisions made later may assume this.
|
||||
(This might not be necessary later.)
|
||||
.Pp
|
||||
Editing an existing partition will most likely cause you to
|
||||
lose all the data in that partition.
|
||||
.Pp
|
||||
You should run this program interactively once or twice to see how it
|
||||
works. This is completely safe as long as you answer the last question
|
||||
in the negative. There are subtleties that the program detects that are
|
||||
not fully explained in this manual page.
|
||||
.Sh CONFIGURATION FILE
|
||||
When the
|
||||
.Fl f
|
||||
option is given, a disk's partition table can be written using values
|
||||
from a
|
||||
.Ar configfile .
|
||||
The syntax of this file is very simple. Each line is either a comment or
|
||||
a specification, and whitespace (except for newlines) are ignored:
|
||||
.Bl -tag -width Ds
|
||||
.It Xo
|
||||
.Ic #
|
||||
.Ar comment ...
|
||||
.Xc
|
||||
Lines beginning with a "#" are comments and are ignored.
|
||||
.It Xo
|
||||
.Ic g
|
||||
.Ar spec1
|
||||
.Ar spec2
|
||||
.Ar spec3
|
||||
.Xc
|
||||
Set the BIOS geometry used in partition calculations. There must be
|
||||
three values specified, with a letter preceding each number:
|
||||
.Bl -tag -width Ds
|
||||
.Sm off
|
||||
.It Cm c Ar num
|
||||
.Sm on
|
||||
Set the number of cylinders to
|
||||
.Ar num .
|
||||
.Sm off
|
||||
.It Cm h Ar num
|
||||
.Sm on
|
||||
Set the number of heads to
|
||||
.Ar num .
|
||||
.Sm off
|
||||
.It Cm s Ar num
|
||||
.Sm on
|
||||
Set the number of sectors/track to
|
||||
.Ar num .
|
||||
.El
|
||||
.Pp
|
||||
These specs can occur in any order, as the leading letter determines
|
||||
which value is which; however, all three must be specified.
|
||||
.Pp
|
||||
This line must occur before any lines that specify partition
|
||||
information.
|
||||
.Pp
|
||||
It is an error if the following is not true:
|
||||
.Bd -literal -offset indent
|
||||
1 <= number of cylinders
|
||||
1 <= number of heads <= 256
|
||||
1 <= number of sectors/track < 64
|
||||
.Ed
|
||||
.Pp
|
||||
The number of cylinders should be less than or equal to 1024, but this
|
||||
is not enforced, although a warning will be output. Note that bootable
|
||||
.Fx
|
||||
partitions (the "/" filesystem) must lie completely within the
|
||||
first 1024 cylinders; if this is not true, booting may fail.
|
||||
Non-bootable partitions do not have this restriction.
|
||||
.Pp
|
||||
Example (all of these are equivalent), for a disk with 1019 cylinders,
|
||||
39 heads, and 63 sectors:
|
||||
.Bd -literal -offset indent
|
||||
g c1019 h39 s63
|
||||
g h39 c1019 s63
|
||||
g s63 h39 c1019
|
||||
.Ed
|
||||
.It Xo
|
||||
.Ic p
|
||||
.Ar partition
|
||||
.Ar type
|
||||
.Ar start
|
||||
.Ar length
|
||||
.Xc
|
||||
Set the partition given by
|
||||
.Ar partition
|
||||
(1-4) to type
|
||||
.Ar type ,
|
||||
starting at sector
|
||||
.Ar start
|
||||
for
|
||||
.Ar length
|
||||
sectors.
|
||||
.Pp
|
||||
Only those partitions explicitly mentioned by these lines are modified;
|
||||
any partition not referenced by a "p" line will not be modified.
|
||||
However, if an invalid partition table is present, or the
|
||||
.Fl i
|
||||
option is specified, all existing partition entries will be cleared
|
||||
(marked as unused), and these "p" lines will have to be used to
|
||||
explicitly set partition information. If multiple partitions need to be
|
||||
set, multiple "p" lines must be specified; one for each partition.
|
||||
.Pp
|
||||
These partition lines must occur after any geometry specification lines,
|
||||
if one is present.
|
||||
.Pp
|
||||
The
|
||||
.Ar type
|
||||
is 165 for
|
||||
.Fx
|
||||
partitions. Specifying a partition type of zero is
|
||||
the same as clearing the partition and marking it as unused; however,
|
||||
dummy values (such as "0") must still be specified for
|
||||
.Ar start
|
||||
and
|
||||
.Ar length .
|
||||
.Pp
|
||||
Note: the start offset will be rounded upwards to a head boundary if
|
||||
necessary, and the end offset will be rounded downwards to a cylinder
|
||||
boundary if necessary.
|
||||
.Pp
|
||||
Example: to clear partition 4 and mark it as unused:
|
||||
.Bd -literal -offset indent
|
||||
p 4 0 0 0
|
||||
.Ed
|
||||
.Pp
|
||||
Example: to set partition 1 to a
|
||||
.Fx
|
||||
partition, starting at sector 1
|
||||
for 2503871 sectors (note: these numbers will be rounded upwards and
|
||||
downwards to correspond to head and cylinder boundaries):
|
||||
.Pp
|
||||
.Bd -literal -offset indent
|
||||
p 1 165 1 2503871
|
||||
.Ed
|
||||
.Pp
|
||||
.It Xo
|
||||
.Ic a
|
||||
.Ar partition
|
||||
.Xc
|
||||
Make
|
||||
.Ar partition
|
||||
the active partition. Can occur anywhere in the config file, but only
|
||||
one must be present.
|
||||
.Pp
|
||||
Example: to make partition 1 the active partition:
|
||||
.Bd -literal -offset indent
|
||||
a 1
|
||||
.Ed
|
||||
.El
|
||||
.Sh FILES
|
||||
.Bl -tag -width /boot/mbr -compact
|
||||
.It Pa /boot/mbr
|
||||
The default boot code
|
||||
.El
|
||||
.Sh SEE ALSO
|
||||
.Xr boot0cfg 8 ,
|
||||
.Xr disklabel 8
|
||||
.Sh BUGS
|
||||
The default boot code will not necessarily handle all partition types
|
||||
correctly, in particular those introduced since MS-DOS 6.x.
|
||||
.Pp
|
||||
The entire program should be made more user-friendly.
|
||||
.Pp
|
||||
Throughout this man page, the term
|
||||
.Sq partition
|
||||
is used where it should actually be
|
||||
.Sq slice ,
|
||||
in order to conform with the terms used elsewhere.
|
||||
.Pp
|
||||
You cannot use this command to completely dedicate a disk to
|
||||
.Fx .
|
||||
The
|
||||
.Xr disklabel 8
|
||||
command must be used for this.
|
File diff suppressed because it is too large
Load Diff
@ -1,7 +0,0 @@
|
||||
# @(#)Makefile 1.1 (Julian Elischer) 3/28/93
|
||||
# $FreeBSD$
|
||||
|
||||
PROG= nextboot
|
||||
MAN= nextboot.8
|
||||
|
||||
.include <bsd.prog.mk>
|
@ -1,115 +0,0 @@
|
||||
.\" $FreeBSD$
|
||||
.Dd July 9, 1996
|
||||
.Dt NEXTBOOT 8
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm nextboot
|
||||
.Nd install a default bootstring block on the boot disk
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Op Fl b
|
||||
.Ar filename bootstring
|
||||
.Ar
|
||||
.Nm
|
||||
.Op Fl ed
|
||||
.Ar filename
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Fx
|
||||
program
|
||||
.Nm
|
||||
controls the actions of the boot blocks at the time of the next boot.
|
||||
If compiled with the correct option,
|
||||
the boot blocks will check the nameblock for a magic number and a
|
||||
default name to use for booting.
|
||||
If compiled to do so they will also
|
||||
delete the name from the block, ensuring that if the boot should fail,
|
||||
then it will not be tried again.
|
||||
It is the job of
|
||||
.Pa /etc/rc
|
||||
to use
|
||||
.Nm
|
||||
to re-install the string if that boot is found to have succeeded.
|
||||
This allows a one-time only boot string to be used for such applications
|
||||
as remote debugging, and installation of new, untrusted kernels.
|
||||
The nameblock is defined at compile time to be the second physical block
|
||||
on the disk.
|
||||
.Pp
|
||||
The following options are available:
|
||||
.Bl -tag -width indent
|
||||
.It Fl b
|
||||
Is used for bootstrapping (initially configuring) the nameblock.
|
||||
Without
|
||||
this,
|
||||
.Nm
|
||||
will refuse to write to a block that does not already contain the magic
|
||||
number.
|
||||
.It Fl d
|
||||
Disable (temporarily) an existing name block by changing a bit
|
||||
in the magic number.
|
||||
.It Fl e
|
||||
Restore the good magic number on a block disabled by
|
||||
.Fl d .
|
||||
.El
|
||||
.Pp
|
||||
The
|
||||
.Fl e
|
||||
and
|
||||
.Fl d
|
||||
flags are mutually exclusive.
|
||||
.Sh DESCRIPTION
|
||||
.Nm Nextboot
|
||||
first checks that the disk has an fdisk table and checks that none of the
|
||||
partitions defined in that table include the nameblock.
|
||||
If the name block is
|
||||
shown to be unused, it will install the bootstrings given as arguments,
|
||||
one after the other, each preceded by a small magic number, and NULL
|
||||
terminated.
|
||||
The end of the list of strings is delimited by a sequence of
|
||||
0xff bytes.
|
||||
If the boot blocks are compiled to write back the nameblock
|
||||
after each boot, it will zero out the supplied names as it uses them,
|
||||
one per boot,
|
||||
until it reaches the 0xff, at which time it will revert to the compiled in
|
||||
boot string.
|
||||
At this time the nameblock will contain only zeroed out names.
|
||||
.Pp
|
||||
An example of usage might be:
|
||||
.Bd -literal
|
||||
nextboot -b /dev/rwd0 1:sd(0,a)/kernel.experimental wd(0,a)/kernel.old
|
||||
.Ed
|
||||
.Pp
|
||||
Which would instruct the boot blocks at the next boot,
|
||||
to try boot the experimental kernel off the SCSI disk.
|
||||
If for any reason this failed, the next boot attempt would
|
||||
boot the kernel
|
||||
.Pa /kernel.old
|
||||
off the IDE drive. (Assuming the write-back option were enabled) If this
|
||||
in turn failed.
|
||||
The compiled in default would be used.
|
||||
.Pp
|
||||
If the write-back feature is disabled, the nextboot program is a convenient way
|
||||
to change the default boot string.
|
||||
Note, that should the file specified in
|
||||
the nameblock be non-existent, then the name compiled into the boot blocks
|
||||
will be used for the boot rather than the next name in the nameblock.
|
||||
The
|
||||
nameblock is only consulted
|
||||
.Em once
|
||||
per boot.
|
||||
.Sh SEE ALSO
|
||||
.Xr boot 8 ,
|
||||
.Xr disklabel 8 ,
|
||||
.Xr fdisk 8
|
||||
.Sh BUGS
|
||||
This program works only in conjunction with the legacy boot code.
|
||||
.Pp
|
||||
The entire program should be made more user-friendly.
|
||||
The option of whether to write back or not should be stored on the
|
||||
disk and not a compile time option.
|
||||
I want to rethink this at some
|
||||
later stage to make it co-exist with disks that do not have
|
||||
a fdisk partitioning table (i.e. purely disklabel'd systems).
|
||||
.Pp
|
||||
Whether to write back or not should be specified at run-time in the nameblock
|
||||
so that the boot blocks need not be altered to get this feature.
|
@ -1,202 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1996 Whistle Communications
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission to use, copy, modify and distribute this software and its
|
||||
* documentation is hereby granted, provided that both the copyright
|
||||
* notice and this permission notice appear in all copies of the
|
||||
* software, derivative works or modified versions, and any portions
|
||||
* thereof, and that both notices appear in supporting documentation.
|
||||
*
|
||||
* Whistle Communications allows free use of this software in its "as is"
|
||||
* condition. Whistle Communications disclaims any liability of any kind for
|
||||
* any damages whatsoever resulting from the use of this software.
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static const char rcsid[] =
|
||||
"$FreeBSD$";
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/disklabel.h>
|
||||
#include <fcntl.h>
|
||||
#include <err.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
struct mboot
|
||||
{
|
||||
unsigned char padding[2]; /* force the longs to be long aligned */
|
||||
unsigned char bootinst[DOSPARTOFF];
|
||||
struct dos_partition parts[4];
|
||||
unsigned short int signature;
|
||||
};
|
||||
struct mboot mboot;
|
||||
|
||||
#define NAMEBLOCK 1 /* 2nd block */
|
||||
#define BLOCKSIZE 512
|
||||
#define ENABLE_MAGIC 0xfadefeed
|
||||
#define DISABLE_MAGIC 0xfadefade
|
||||
static int bflag;
|
||||
static int eflag;
|
||||
static int dflag;
|
||||
|
||||
#define BOOT_MAGIC 0xAA55
|
||||
|
||||
static void
|
||||
usage(void) {
|
||||
fprintf (stderr, "%s\n%s\n",
|
||||
"usage: nextboot [-b] device bootstring [bootstring] ...",
|
||||
" nextboot {-e,-d} device");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char** argv)
|
||||
{
|
||||
int fd = -1;
|
||||
char namebuf[1024], *cp = namebuf;
|
||||
int i,j;
|
||||
int ch;
|
||||
int part;
|
||||
|
||||
bflag = 0;
|
||||
while ((ch = getopt(argc, argv, "bde")) != -1) {
|
||||
switch(ch) {
|
||||
case 'b':
|
||||
bflag = 1;
|
||||
break;
|
||||
case 'd':
|
||||
dflag = 1;
|
||||
break;
|
||||
case 'e':
|
||||
eflag = 1;
|
||||
break;
|
||||
case '?':
|
||||
default:
|
||||
usage();
|
||||
}
|
||||
}
|
||||
argc -= optind;
|
||||
argv += optind;
|
||||
|
||||
if ( (dflag + eflag + bflag) > 1 ) {
|
||||
usage();
|
||||
}
|
||||
if (dflag + eflag){
|
||||
if(argc != 1 ) {
|
||||
usage();
|
||||
}
|
||||
} else {
|
||||
if (argc <2) {
|
||||
usage();
|
||||
}
|
||||
}
|
||||
if ((fd = open(argv[0], O_RDWR, 0)) < 0)
|
||||
errx(1, "can't open %s", argv[0]);
|
||||
|
||||
argc--;
|
||||
argv++;
|
||||
|
||||
/*******************************************
|
||||
* Check that we have an MBR
|
||||
*/
|
||||
if (lseek(fd,0,0) == -1)
|
||||
err(1, "lseek");
|
||||
if (read (fd,&mboot.bootinst[0],BLOCKSIZE ) != BLOCKSIZE)
|
||||
err(1, "read0");
|
||||
if (mboot.signature != (unsigned short)BOOT_MAGIC)
|
||||
errx(1, "no fdisk part.. not touching block 1");
|
||||
|
||||
/*******************************************
|
||||
* And check that none of the partitions in it cover the name block;
|
||||
*/
|
||||
for ( part = 0; part < 4; part++) {
|
||||
if( mboot.parts[part].dp_size
|
||||
&& (mboot.parts[part].dp_start <= NAMEBLOCK)
|
||||
&& (mboot.parts[part].dp_start
|
||||
+ mboot.parts[part].dp_size > NAMEBLOCK))
|
||||
errx(1,
|
||||
"name sector lies within a Bios partition: aborting write");
|
||||
}
|
||||
|
||||
|
||||
/*******************************************
|
||||
* Now check the name sector itself to see if it's been initialized.
|
||||
*/
|
||||
if (lseek(fd,NAMEBLOCK * BLOCKSIZE,0) == -1)
|
||||
err(1, "lseek");
|
||||
if (read(fd,namebuf,BLOCKSIZE) != BLOCKSIZE)
|
||||
err(1, "read1");
|
||||
/*******************************************
|
||||
* check if we are just enabling or disabling
|
||||
* Remember the flags are exclusive..
|
||||
*/
|
||||
if(!bflag) { /* don't care what's there if bflag is set */
|
||||
switch(*(unsigned long *)cp)
|
||||
{
|
||||
case DISABLE_MAGIC:
|
||||
case ENABLE_MAGIC:
|
||||
break;
|
||||
default:
|
||||
errx(1, "namesector not initialized, use the -b flag");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*******************************************
|
||||
* If the z or r flag is set, damage or restore the magic number..
|
||||
* to disable/enable the feature
|
||||
*/
|
||||
if(dflag) {
|
||||
*(unsigned long *)cp = DISABLE_MAGIC;
|
||||
} else {
|
||||
*(unsigned long *)cp = ENABLE_MAGIC;
|
||||
}
|
||||
if ((!dflag) && (!eflag)) {
|
||||
/*******************************************
|
||||
* Create a new namesector in ram
|
||||
*/
|
||||
cp += 4;
|
||||
for ( i = 0 ; i < argc ; i++ ) {
|
||||
*cp++ = 'D';
|
||||
*cp++ = 'N';
|
||||
j = strlen(argv[i]);
|
||||
strncpy(cp,argv[i],j);
|
||||
cp += j;
|
||||
*cp++ = 0;
|
||||
}
|
||||
*cp++ = 0xff;
|
||||
*cp++ = 0xff;
|
||||
*cp++ = 0xff;
|
||||
namebuf[BLOCKSIZE-1] = 0; /* paranoid */
|
||||
namebuf[BLOCKSIZE] = 0xff;
|
||||
}
|
||||
|
||||
/*******************************************
|
||||
* write it to disk.
|
||||
*/
|
||||
if (lseek(fd,NAMEBLOCK * BLOCKSIZE,0) == -1)
|
||||
err(1, "lseek");
|
||||
if(write (fd,namebuf,BLOCKSIZE ) != BLOCKSIZE)
|
||||
err(1, "write");
|
||||
|
||||
#if 0
|
||||
/*******************************************
|
||||
* just to be safe/paranoid.. read it back..
|
||||
* and print it..
|
||||
*/
|
||||
if (lseek(fd,NAMEBLOCK * BLOCKSIZE,0) == -1)
|
||||
err(1, "lseek (second)");
|
||||
read (fd,namebuf,512);
|
||||
for (i = 0;i< 16;i++) {
|
||||
for ( j = 0; j < 16; j++) {
|
||||
printf("%02x ",(unsigned char )namebuf[(i*16) + j ]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
#endif
|
||||
exit(0);
|
||||
}
|
Loading…
Reference in New Issue
Block a user