# $OpenBSD: GENERIC,v 1.109 2004/07/31 21:27:31 brad Exp $
#
# Machine-independent option; used by all architectures for their
# GENERIC kernel
#option INSECURE # default to secure
#option DDB # in-kernel debugger
#option DDB_SAFE_CONSOLE # allow break into ddb during boot
#makeoptions DEBUG="-g" # compile full symbol table
#makeoptions PROF="-pg" # build profiled kernel
#option GPROF # kernel profiling, kgmon(8)
#option DIAGNOSTIC # internal consistency checks
#option KTRACE # system call tracing, a la ktrace(1)
#option ACCOUNTING # acct(2) process accounting
#option KMEMSTATS # collect malloc(9) statistics
#option PTRACE # ptrace(2) system call
#option CRYPTO # Cryptographic framework
#option SYSVMSG # System V-like message queues
#option SYSVSEM # System V-like semaphores
#option SYSVSHM # System V-like memory sharing
#option UVM_SWAP_ENCRYPT# support encryption of pages going to swap
#option COMPAT_23 # Kernel compatibility with OpenBSD 2.3,
#option COMPAT_25 # 2.5,
#option COMPAT_35 # 3.5,
#option COMPAT_43 # and 4.3BSD
#option TCP_COMPAT_42 # TCP bug compatibility with 4.2BSD
#option LKM # loadable kernel modules
option FFS # UFS
option FFS_SOFTUPDATES # Soft updates
#option UFS_DIRHASH # hash large directories
#option QUOTA # UFS quotas
option EXT2FS # Second Extended Filesystem
option MFS # memory file system
#option XFS # xfs filesystem
option TCP_SACK # Selective Acknowledgements for TCP
option TCP_ECN # Explicit Congestion Notification for TCP
option TCP_SIGNATURE # TCP MD5 Signatures, for BGP routing sessions
#option TCP_FACK # Forward Acknowledgements for TCP
#option NFSCLIENT # Network File System client
#option NFSSERVER # Network File System server
option CD9660 # ISO 9660 + Rock Ridge file system
option MSDOSFS # MS-DOS file system
#option FDESC # /dev/fd
#option FIFO # FIFOs; RECOMMENDED
#option KERNFS # /kern
#option PORTAL # dynamically created filesystem objects
#option PROCFS # /proc
# layer filesystems
option NULLFS # loopback file system
option UMAPFS # NULLFS + uid and gid remapping
option UNION # union file system
option INET # IP + ICMP + TCP + UDP
option ALTQ # ALTQ base
option INET6 # IPv6 (needs INET)
option IPSEC # IPsec
#option KEY # PF_KEY (implied by IPSEC)
#option NS # XNS
#option NSIP # XNS tunneling over IP
#option IPX # IPX+SPX
#option IPXIP # IPX tunneling over IP
#option NETATALK # AppleTalk
#option CCITT,LLC,HDLC # X.25
option PPP_BSDCOMP # PPP BSD compression
option PPP_DEFLATE
#option MROUTING # Multicast router
pseudo-device pf # packet filter
pseudo-device pflog # pf log if
pseudo-device pfsync # pf sync if
pseudo-device sppp 1 # Sync PPP/HDLC
pseudo-device enc 1 # option IPSEC needs the encapsulation interface
#pseudo-device strip 1 # Starmode Radio IP interface
pseudo-device pty 16 # initial number of pseudo-terminals
pseudo-device tb 1 # tablet line discipline
pseudo-device vnd 16 # paging to files
pseudo-device ccd 4 # concatenated disk devices
pseudo-device ksyms 1 # kernel symbols device
pseudo-device systrace 1 # system call tracing device
# clonable devices
pseudo-device bpfilter # packet filter
pseudo-device bridge # network bridging support
pseudo-device carp # CARP protocol support
pseudo-device gif # IPv[46] over IPv[46] tunnel (RFC1933)
pseudo-device gre # GRE encapsulation interface
pseudo-device loop # network loopback
pseudo-device ppp # PPP
pseudo-device sl # CSLIP
pseudo-device tun # network tunneling over tty
pseudo-device vlan # IEEE 802.1Q VLAN
# for IPv6
#pseudo-device faith 1 # IPv[46] tcp relay translation i/f
option BOOT_CONFIG # add support for boot ?c
setnetwork:
#!/bin/sh
get_dkdevs() {
bsort `sed -ne "${MDDISKDEVS:-/^[sw]d[0-9][0-9]* /s/ .*//p}" /var/run/dmesg.boot`
}
get_cddevs() {
bsort `sed -ne "${MDCDDEVS:-/^cd[0-9][0-9]* /s/ .*//p}" /var/run/dmesg.boot`
}
get_ifdevs() {
ifconfig -a \
| egrep -v '^[[:space:]]|(bridge|enc|gif|gre|lo|pflog|pfsync|ppp|sl|tun|vlan)[[:digit:]]+:' \
| sed -ne 's/^\(.*\):.*/\1/p'
}
askpass() {
set -o noglob
stty -echo
read resp?"$1 "
stty echo
set +o noglob
echo
}
ask() {
local _question=$1 _default=$2
set -o noglob
while : ; do
echo -n "$_question "
[[ -z $_default ]] || echo -n "[$_default] "
read resp
case $resp in
!) echo "Type 'exit' to return to install."
sh
;;
!*) eval ${resp#?}
;;
*) : ${resp:=$_default}
break
;;
esac
done
set +o noglob
}
ask_until() {
resp=
while [[ -z $resp ]] ; do
ask "$1" "$2"
done
}
ask_yn() {
local _q=$1 _a=${2:-no} _resp
typeset -l _resp
while : ; do
ask "$_q" "$_a"
_resp=$resp
case $_resp in
y|yes) resp=y ; return ;;
n|no) resp=n ; return ;;
esac
done
}
ask_which() {
local _name=$1 _query=$2 _devs=$3 _defdev=$4 _err=$5
set -- $_devs
if [[ $# -lt 1 ]]; then
echo "${_err:=No ${_name}s found}."
resp=done
return
fi
: ${_defdev:=$1}
_devs="$*"
while : ; do
ask "Available ${_name}s are: ${_devs}.\nWhich one ${_query}? (or 'done')" "$_defdev"
[[ $resp == done ]] && break
if isin "$resp" $_devs; then
makedev $resp && break
else
echo "'$resp' is not a valid choice."
fi
done
}
isin() {
local _a=$1 _b
shift
for _b; do
[ "$_a" = "$_b" ] && return 0
done
return 1
}
addel() {
local _a=$1
shift
echo -n "$*"
isin "$_a" $* || echo -n " $_a"
}
rmel() {
local _a=$1 _b
shift
for _b; do
[ "$_a" != "$_b" ] && echo -n "$_b "
done
}
edit_tmp_file() {
local _file=$1
ask_yn "Edit $_file with $EDITOR?"
[[ $resp == y ]] && $EDITOR /tmp/$_file
}
manual_net_cfg() {
ask_yn "Do you want to do any manual network configuration?"
[[ $resp == y ]] && { echo "Type 'exit' to return to $MODE." ; sh ; }
}
makedev() {
local _dev=$1 _node=/dev/r${1}c
if isin $_dev $IFDEVS || [[ -c $_node || -z ${_dev##+([0-9])} ]] ; then
return 0
fi
if [[ ! -r /dev/MAKEDEV ]] ; then
echo "No /dev/MAKEDEV. Can't create device nodes for ${_dev}."
return 1
fi
(cd /dev; sh MAKEDEV $_dev)
[[ -c $_node ]] || return 1
DEVSMADE=`addel $_dev $DEVSMADE`
}
addhostent() {
sed "/ $2\$/d" /etc/hosts > /etc/hosts.new
mv /etc/hosts.new /etc/hosts
echo "$1 $2" >> /etc/hosts
}
configure_ifs() {
local _IFDEVS=$IFDEVS _ifs _name _media _hn
while : ; do
ask_which "interface" "do you wish to initialize" "$_IFDEVS" \
"" "No more interfaces to initialize"
[[ $resp == done ]] && break
_ifs=$resp
_hn=/etc/hostname.$_ifs
ask "Symbolic (host) name for $_ifs?" "$(hostname -s)"
_name=$resp
_media=$(ifconfig -m $_ifs | grep "media ")
if [[ -n $_media ]]; then
cat << __EOT
The media options for $_ifs are currently
$(ifconfig -m $_ifs | sed -n '/supported/D;/media:/p')
__EOT
ask_yn "Do you want to change the media options?"
case $resp in
y) cat << __EOT
Supported media options for $_ifs are:
$_media
__EOT
ask "Media options for $_ifs?"
_media=$resp
ifconfig $_ifs $_media || return 1
;;
n) _media=
;;
esac
fi
rm -f $_hn
v4_config "$_ifs" "$_media" "$_name" "$_hn"
[[ -f $_hn ]] && _IFDEVS=$(rmel "$_ifs" $_IFDEVS)
done
}
v4_info() {
ifconfig $1 inet | sed -n '
1s/.*<UP,.*/UP/p
1s/.*<.*/DOWN/p
/inet/s/netmask//
/inet/s///p'
}
dhcp_request() {
local _ifs=$1 _hostname=$2
echo "initial-interval 1;" > /etc/dhclient.conf
if [[ -n $_hostname ]]; then
echo "send host-name \"$_hostname\";" >> /etc/dhclient.conf
echo "Issuing hostname-associated DHCP request for $_ifs."
else
echo "Issuing free-roaming DHCP request for $_ifs."
fi
cat >> /etc/dhclient.conf << __EOT
request subnet-mask,
broadcast-address,
routers,
domain-name,
domain-name-servers,
host-name;
__EOT
cat >> /etc/resolv.conf.tail << __EOT
lookup file bind
__EOT
dhclient $_ifs
set -- $(v4_info $_ifs)
if [[ $1 == UP && $2 == "0.0.0.0" ]]; then
ifconfig $_ifs delete down
rm /etc/dhclient.conf /etc/resolv.conf.tail
return 1
fi
# cp /etc/dhclient.conf /tmp/dhclient.conf
# cp /etc/resolv.conf.tail /tmp/resolv.conf.tail
return 0
}
v4_config() {
local _ifs=$1 _media=$2 _name=$3 _hn=$4 _prompt
set -- $(v4_info $_ifs)
if [[ -n $2 ]]; then
ifconfig $_ifs inet $2 delete
[[ $2 != "0.0.0.0" ]] && { _addr=$2; _mask=$3; }
fi
[[ -x /sbin/dhclient ]] && _prompt=" or 'dhcp'"
_prompt="IPv4 address for $_ifs? (or 'none'$_prompt)"
ask_until "$_prompt" "$_addr"
case $resp in
none) ;;
dhcp) if [[ ! -x /sbin/dhclient ]]; then
echo "DHCP not possible - no /sbin/dhclient."
elif dhcp_request $_ifs "$_name" || dhcp_request $_ifs ; then
addhostent "127.0.0.1" "$_name"
echo "dhcp NONE NONE NONE $_media" > $_hn
fi
;;
*) _addr=$resp
ask_until "Netmask?" "${_mask:=255.255.255.0}"
if ifconfig $_ifs inet $_addr netmask $resp up ; then
addhostent "$_addr" "$_name"
echo "inet $_addr $resp NONE $_media" > $_hn
fi
;;
esac
}
v4_defroute() {
local _dr _prompt=" or 'none'"
[[ -x /sbin/dhclient ]] && _prompt=", 'dhcp'$_prompt"
_prompt="Default IPv4 route? (IPv4 address$_prompt)"
_dr=$(route -n show -inet | sed -ne '/^default */{s///; s/ .*//; p;}')
[[ -f /tmp/dhclient.conf ]] && _dr=dhcp
while : ; do
ask_until "$_prompt" "$_dr"
case $resp in
none|dhcp) break ;;
esac
route delete -inet default > /dev/null 2>&1
route -n add -inet -host default "$resp" && { echo "$resp" >/etc/mygate ; break ; }
route -n add -inet -host default $_dr >/dev/null 2>&1
done
}
isalphanumeric() {
local _n=$1
while [[ ${#_n} -ne 0 ]]; do
case $_n in
[A-Za-z0-9]*) ;;
*) return 1;;
esac
_n=${_n#?}
done
return 0
}
enable_network() {
local _netfile
# for _netfile in hosts dhclient.conf resolv.conf resolv.conf.tail protocols services; do
# if [ -f /mnt/etc/${_netfile} ]; then
# cp /mnt/etc/${_netfile} /etc/${_netfile}
# fi
# done
ifconfig lo0 inet 127.0.0.1
for hn in /etc/hostname.*; do
if=${hn#/etc/hostname.}
if ! isalphanumeric "$if"; then
continue
fi
ifconfig $if > /dev/null 2>&1
if [ $? -ne 0 ]; then
continue
fi
while :; do
if [ "$cmd2" ]; then
set -- $cmd2
af=$1 name=$2 mask=$3 bcaddr=$4 ext1=$5 cmd2=
i=1; while [ i -lt 6 -a -n "$1" ]; do shift; let i=i+1; done
ext2="$@"
else
read af name mask bcaddr ext1 ext2 || break
fi
case $af in
"#"*|"!"*|"bridge"|""|"rtsol")
continue
;;
"dhcp") [ "$name" = "NONE" ] && name=
[ "$mask" = "NONE" ] && mask=
[ "$bcaddr" = "NONE" ] && bcaddr=
ifconfig $if $name $mask $bcaddr $ext1 $ext2 down
cmd="dhclient $if"
;;
"up")
cmd="ifconfig $if $name $mask $bcaddr $ext1 $ext2 up"
;;
*) read dt dtaddr
if [ "$name" = "alias" ]; then
alias=$name
name=$mask
mask=$bcaddr
bcaddr=$ext1
ext1=$ext2
ext2=
else
alias=
fi
cmd="ifconfig $if $af $alias $name "
case $dt in
dest) cmd="$cmd $dtaddr"
;;
[a-z!]*)
cmd2="$dt $dtaddr"
;;
esac
if [ ! -n "$name" ]; then
echo "/etc/hostname.$if: invalid network configuration file"
return
fi
case $af in
inet) [ "$mask" ] && cmd="$cmd netmask $mask"
if [ "$bcaddr" -a "$bcaddr" != "NONE" ]; then
cmd="$cmd broadcast $bcaddr"
fi
[ "$alias" ] && rtcmd="; route -qn add -host $name 127.0.0.1"
;;
inet6)
continue
;;
*) cmd="$cmd $mask $bcaddr"
esac
cmd="$cmd $ext1 $ext2$rtcmd" rtcmd=
;;
esac
eval "$cmd"
done </etc/hostname.$if