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
4ca131b9a6
commit
32b6e93593
@ -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…
x
Reference in New Issue
Block a user