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:
Peter Wemm 2001-11-03 07:31:21 +00:00
parent f24c53d3ef
commit 67ad5f5700
11 changed files with 0 additions and 3388 deletions

View File

@ -1,7 +0,0 @@
# $FreeBSD$
SUBDIR= cxconfig \
fdisk \
nextboot
.include <bsd.subdir.mk>

View File

@ -1,3 +0,0 @@
# $FreeBSD$
.include "../Makefile.inc"

View File

@ -1,7 +0,0 @@
# $FreeBSD$
PROG= cxconfig
WARNS?= 2
MAN= cxconfig.8
.include <bsd.prog.mk>

View File

@ -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

View File

@ -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);
}

View File

@ -1,6 +0,0 @@
# $FreeBSD$
PROG= fdisk
MAN= fdisk.8
.include <bsd.prog.mk>

View File

@ -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

View File

@ -1,7 +0,0 @@
# @(#)Makefile 1.1 (Julian Elischer) 3/28/93
# $FreeBSD$
PROG= nextboot
MAN= nextboot.8
.include <bsd.prog.mk>

View File

@ -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.

View File

@ -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);
}