MAKEDEV.tmpl revision 1.202
1#!/bin/sh - 2# $NetBSD: MAKEDEV.tmpl,v 1.202 2019/04/01 13:08:24 martin Exp $ 3# 4# Copyright (c) 2003,2007,2008 The NetBSD Foundation, Inc. 5# All rights reserved. 6# 7# Redistribution and use in source and binary forms, with or without 8# modification, are permitted provided that the following conditions 9# are met: 10# 1. Redistributions of source code must retain the above copyright 11# notice, this list of conditions and the following disclaimer. 12# 2. Redistributions in binary form must reproduce the above copyright 13# notice, this list of conditions and the following disclaimer in the 14# documentation and/or other materials provided with the distribution. 15# 16# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 17# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 20# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26# POSSIBILITY OF SUCH DAMAGE. 27# 28# 29########################################################################### 30# 31# PLEASE RUN "cd ../share/man/man8 ; make makedevs" 32# AFTER CHANGING THIS FILE, AND COMMIT THE UPDATED MANPAGE! 33# 34########################################################################### 35# 36# Device "make" file. Valid special arguments: 37# all makes all known devices, including local devices. 38# Tries to make the 'standard' number of each type. 39# init A set of devices that is used for MFS /dev by init. 40# May be equal to "all". 41# floppy devices to be put on install floppies 42# ramdisk devices to be put into INSTALL kernel ramdisks. 43# std standard devices 44# local configuration specific devices 45# lua Lua device 46# wscons make wscons devices 47# usbs make USB devices 48# 49# Tapes: 50# st* SCSI tapes 51# wt* QIC-interfaced (e.g. not SCSI) 3M cartridge tape 52# ht* MASSBUS TM03 and TU?? 53# mt* MSCP tapes (e.g. TU81, TK50) 54# tm* UNIBUS TM11 and TE10 emulations (e.g. Emulex TC-11) 55# ts* UNIBUS TS11 56# ut* UNIBUS TU45 emulations (e.g. si 9700) 57# uu* TU58 cassettes on DL11 controller 58# 59# Disks: 60# dk* wedge disk slices 61# ccd* concatenated disk devices 62# cd* SCSI or ATAPI CD-ROM 63# cgd* cryptographic disk devices 64# raid* RAIDframe disk devices 65# sd* SCSI disks 66# wd* "winchester" disk drives (ST506,IDE,ESDI,RLL,...) 67# bmd* Nereid bank memory disks 68# ed* IBM PS/2 ESDI disk devices 69# fd* "floppy" disk drives (3 1/2", 5 1/4") 70# fss* Files system snapshot devices 71# gdrom* Dreamcast "gigadisc" CD-ROM drive 72# hk* UNIBUS RK06 and RK07 73# hp* MASSBUS RM?? 74# ld* Logical disk devices (e.g., hardware RAID) 75# mcd* Mitsumi CD-ROM 76# md* memory pseudo-disk devices 77# ofdisk* OpenFirmware disk devices 78# ra* MSCP disks (RA??, RD??) 79# rb* 730 IDC w/ RB80 and/or RB02 80# rd* HDC9224 RD disks on VS2000 81# rl* UNIBUS RL02 82# rx* MSCP floppy disk (RX33/50/...) 83# up* other UNIBUS devices (e.g. on Emulex SC-21V controller) 84# vnd* "file" pseudo-disks 85# xbd* Xen virtual disks 86# xd* Xylogic 753/7053 disks 87# xy* Xylogic 450/451 disks 88# 89# Pointing devices: 90# wsmouse* wscons mouse events 91# lms* Logitech bus mouse 92# mms* Microsoft bus mouse 93# qms* "quadrature mouse" 94# pms* PS/2 mouse 95# mouse mouse (provides events, for X11) 96# 97# Keyboard devices: 98# wskbd* wscons keyboard events 99# kbd raw keyboard (provides events, for X11) 100# kbdctl keyboard control 101# 102# Terminals/Console ports: 103# tty[01]* standard serial ports 104# tty0* SB1250 ("sbscn") serial ports (sbmips) 105# ttyE* wscons - Workstation console ("wscons") glass-tty emulators 106# ttyCZ? Cyclades-Z multiport serial boards. Each "unit" 107# makes 64 ports. 108# ttyCY? Cyclom-Y multiport serial boards. Each "unit" makes 109# 32 ports. 110# ttye* ITE bitmapped consoles 111# ttyv0 pccons 112# ttyC? NS16550 ("com") serial ports 113# ttyS* SA1110 serial port (hpcarm) 114# ttyTX? TX39 internal serial ports (hpcmips) 115# ttyB? DEC 3000 ZS8530 ("scc") serial ports (alpha) 116# ttyA* mfc serial ports (amiga) 117# ttyB* msc serial ports (amiga) 118# ttyC* com style serial ports (DraCo, HyperCom) (amiga) 119# On the DraCo, units 0 and 1 are the built-in "modem" and 120# "mouse" ports, if configured. 121# ttyA0 8530 Channel A (formerly ser02) (atari) 122# ttyA1 8530 Channel B (formerly mdm02) (atari) 123# ttyB0 UART on first 68901 (formerly mdm01) (atari) 124# ixpcom IXP12x0 COM ports 125# epcom EP93xx COM ports 126# plcom ARM PL01[01] serial ports 127# wmcom EPOC Windermere COM ports 128# ttyM? HP200/300 4 port serial mux interface (hp300) 129# ttya "ttya" system console (luna68k) 130# ttyb second system serial port (luna68k) 131# tty* Onboard serial ports (mvme68k) 132# On the mvme147 these are: ttyZ1, ttyZ2 and ttyZ3. 133# On the mvme167, and '177: ttyC1, ttyC2 and ttyC3. 134# Note that tty[CZ]0 is grabbed by the console device 135# so is not created by default 136# dc* PMAX 4 channel serial interface (kbd, mouse, modem, printer) 137# scc* 82530 serial interface (pmax) 138# ttyZ* Zilog 8530 ("zstty") serial ports 139# tty[abcd] Built-in serial ports (sparc) 140# tty* Z88530 serial controllers (sparc64) 141# ttyh* SAB82532 serial controllers (sparc64) 142# tty[a-j] Built-in serial ports (sun2, sun3) 143# ttyC? pccons (arc) 144# dz* UNIBUS DZ11 and DZ32 (vax) 145# dh* UNIBUS DH11 and emulations (e.g. Able DMAX, Emulex CS-11) (vax) 146# dmf* UNIBUS DMF32 (vax) 147# dhu* UNIBUS DHU11 (vax) 148# dmz* UNIBUS DMZ32 (vax) 149# dl* UNIBUS DL11 (vax) 150# xencons Xen virtual console 151# 152# Terminal multiplexors: 153# dc* 4 channel serial interface (keyboard, mouse, modem, printer) 154# dh* UNIBUS DH11 and emulations (e.g. Able DMAX, Emulex CS-11) 155# dhu* UNIBUS DHU11 156# dl* UNIBUS DL11 157# dmf* UNIBUS DMF32 158# dmz* UNIBUS DMZ32 159# dz* UNIBUS DZ11 and DZ32 160# scc* 82530 serial interface 161# 162# Call units: 163# dn* UNIBUS DN11 and emulations (e.g. Able Quadracall) 164# 165# Pseudo terminals: 166# ptm pty multiplexor device, and pts directory 167# pty* set of 16 master and slave pseudo terminals 168# opty first 16 ptys, to save inodes on install media 169# ipty first 2 ptys, for install media use only 170# 171# Printers: 172# arcpp* Archimedes parallel port 173# lpt* stock lp 174# lpa* interruptless lp 175# par* Amiga motherboard parallel port 176# cpi* Macintosh Nubus CSI parallel printer card 177# 178# USB devices: 179# usb* USB control devices 180# uhid* USB generic HID devices 181# ulpt* USB printer devices 182# ugen* USB generic devices 183# urio* USB Diamond Rio 500 devices 184# uscanner* USB scanners 185# ttyHS* USB Option N.V. modems 186# ttyU* USB modems 187# ttyY* USB serial adapters 188# 189# Video devices: 190# bwtwo* monochromatic frame buffer 191# cgtwo* 8-bit color frame buffer 192# cgthree* 8-bit color frame buffer 193# cgfour* 8-bit color frame buffer 194# cgsix* accelerated 8-bit color frame buffer 195# cgeight* 24-bit color frame buffer 196# etvme Tseng et-compatible cards on VME (atari) 197# ik* UNIBUS interface to Ikonas frame buffer 198# leo Circad Leonardo VME-bus true color (atari) 199# ps* UNIBUS interface to Picture System 2 200# qv* QVSS (MicroVAX) display 201# tcx* accelerated 8/24-bit color frame buffer 202# 203# Maple bus devices: 204# maple Maple bus control devices 205# mlcd* Maple bus LCD devices 206# mmem* Maple bus storage devices 207# 208# IEEE1394 bus devices: 209# fw* IEEE1394 bus generic node access devices 210# fwmem* IEEE1394 bus physical memory of the remote node access devices 211# 212# Special purpose devices: 213# ad* UNIBUS interface to Data Translation A/D converter 214# agp* AGP GART devices 215# altq ALTQ control interface 216# amr* AMI MegaRaid control device 217# apm power management device 218# audio* audio devices 219# bell* OPM bell device (x68k) 220# bktr Brooktree 848/849/878/879 based TV cards 221# bpf packet filter 222# bthub Bluetooth Device Hub control interface 223# cfs* Coda file system device 224# ch* SCSI media changer 225# cir* Consumer IR 226# clockctl clock control for non root users 227# cpuctl CPU control 228# crypto hardware crypto access driver 229# dmoverio hardware-assisted data movers 230# dpt* DPT/Adaptec EATA RAID management interface 231# dpti* DPT/Adaptec I2O RAID management interface 232# drm* Direct Rendering Manager interface 233# dtv* Digital TV interface 234# fb* PMAX generic framebuffer pseudo-device 235# fd file descriptors 236# gpiopps* 1PPS signals on GPIO pins 237# grf* graphics frame buffer device 238# hdaudio* High Definition audio control device 239# hdmicec* HDMI CEC devices 240# hil HP300 HIL input devices 241# icp ICP-Vortex/Intel RAID control interface 242# iic* IIC bus device 243# io x86 IOPL access for COMPAT_10, COMPAT_FREEBSD 244# iop* I2O IOP control interface 245# ipl IP Filter 246# irframe* IrDA physical frame 247# ite* terminal emulator interface to HP300 graphics devices 248# joy* joystick device 249# kttcp kernel ttcp helper device 250# lockstat kernel locking statistics 251# magma* Magma multiport serial/parallel cards 252# midi* MIDI 253# mfi* LSI MegaRAID/MegaSAS control interface 254# mlx* Mylex DAC960 control interface 255# mly* Mylex AcceleRAID/eXtremeRAID control interface 256# np* UNIBUS Ethernet co-processor interface, for downloading. 257# npf NPF packet filter 258# nsmb* SMB requester 259# nvme* Non-Volatile Memory Host Controller Interface device driver 260# nvme*ns* Non-Volatile Memory namespace 261# nvmm NetBSD Virtual Machine Monitor 262# openfirm OpenFirmware accessor 263# pad* Pseudo-audio device driver 264# pci* PCI bus access devices 265# pf PF packet filter 266# putter Pass-to-Userspace Transporter 267# px* PixelStamp Xserver access 268# radio* radio devices 269# random Random number generator 270# rtc* RealTimeClock 271# scsibus* SCSI busses 272# se* SCSI Ethernet 273# ses* SES/SAF-TE SCSI Devices 274# speaker PC speaker (XXX - installed) 275# spi* SPI bus device 276# sram battery backuped memory (x68k) 277# srt* source-address based routing 278# ss* SCSI scanner 279# stic* PixelStamp interface chip 280# sysmon System Monitoring hardware 281# tap* virtual Ethernet device 282# tprof task profiler 283# tun* network tunnel driver 284# twa 3ware Apache control interface 285# twe 3ware Escalade control interface 286# uk* unknown SCSI device 287# veriexec Veriexec fingerprint loader 288# video* video capture devices 289# view* generic interface to graphic displays (Amiga) 290# wsfont* console font control 291# wsmux* wscons event multiplexor 292# xenevt Xen event interface 293# 294# iSCSI communication devices 295# iscsi* iSCSI driver and /sbin/iscsid communication 296# 297# Trusted Computing devices 298# tpm Trusted Platform Module 299# 300# Debugging and tracing 301# dtrace Dynamic tracing framework 302 303 304# 305# NOTE: 306# 307# * MAKEDEV is used both as a standalone script (via "sh ./MAKEDEV 308# all" or similar), and as a function library for MAKEDEV.local (via 309# "MAKEDEV_AS_LIBRARY=1 . MAKEDEV"). Because of this, the script 310# should consist almost entirely of function definitions, apart from a 311# few lines right at the end. 312# 313# * MAKEDEV may be executed in an environment that is missing some 314# common commands. For example, it may be executed from a minimal 315# system used during installation, or it may be executed early in the 316# boot sequence before most file systems have been mounted. It may 317# also be executed in a cross-build environment on a non-NetBSD host. 318# 319 320usage() 321{ 322 cat 1>&2 << _USAGE_ 323Usage: ${0##*/} [-fMsu] [-m mknod] [-p pax] [-t mtree] special [...] 324 Create listed special devices. Options: 325 -f Force permissions to be updated on existing devices. 326 -M Create memory file system. 327 -m mknod Name of mknod(8) program. [\$TOOL_MKNOD or mknod] 328 -p pax Name of pax(1) program. [\$TOOL_PAX or pax] 329 -s Generate mtree(8) specfile instead of creating devices. 330 -t mtree Name of mtree(8) program. [\$TOOL_MTREE or mtree] 331 -u Don't re-create devices that already exist. 332 333_USAGE_ 334 exit 1 335} 336 337# zeropad width number 338# display number with a zero (`0') padding of width digits. 339# 340zeropad() 341{ 342 case $(($1 - ${#2})) in 343 5) echo 00000$2;; 344 4) echo 0000$2;; 345 3) echo 000$2;; 346 2) echo 00$2;; 347 1) echo 0$2;; 348 0) echo $2;; 349 *) die "bad padding" ;; 350 esac 351} 352 353# hexprint number 354# display (base10) number as hexadecimal 355# 356hexprint() 357{ 358 val="$(($1 + 0))" 359 hex= 360 set -- 0 1 2 3 4 5 6 7 8 9 a b c d e f 361 while [ "$val" -gt 0 ]; do 362 eval hex=\$$(($val % 16 + 1))\$hex 363 val="$(($val / 16))" 364 done 365 echo "${hex:-0}" 366} 367 368# linecount multiline_string 369# count the number of lines in the string 370# 371linecount() 372{ 373 local IFS=' 374' # just a newline, no other white space between the quotes 375 set -- $1 376 echo $# 377} 378 379# nooutput -12 cmd [args...] 380# run a command with stdout and/or stderr ignored. 381# "nooutput -1 cmd" is like "cmd >/dev/null"; 382# "nooutput -2 cmd" is like "{ cmd ; } 2>/dev/null"; 383# "nooutput -12 cmd" is like "{ cmd ; } >/dev/null 2>&1"; 384# except they should work even if /dev/null doesn't [yet] exist. 385# 386# The "{...}" wrapper used in cases where stderr is redirected 387# serves to capture shell error messages such as "cmd: not found". 388# 389nooutput() 390{ 391 local flags="$1" ; shift 392 local junk 393 case "$flags" in 394 "-1") junk="$( "$@" )" ;; 395 "-2") ( exec 4>&1 ; junk="$( { "$@" ; } 2>&1 1>&4 )" ) ;; 396 "-12") junk="$( { "$@" ; } 2>&1 )" ;; 397 *) warn "Incorrect use of nooutput" ;; 398 esac 399} 400 401# check_pax path_to_pax 402# Check whether pax exists and supports the command line options 403# and input format that we will want to use. 404# 405check_pax() 406{ 407 local pax="$1" 408 echo ". type=dir optional" | nooutput -12 "${pax}" -r -w -M -pe . 409} 410 411# check_mtree path_to_mtree 412# Check whether mtree exists and supports the command line options 413# and input format that we will want to use. 414# 415check_mtree() 416{ 417 local mtree="$1" 418 echo ". type=dir optional" | nooutput -12 "${mtree}" -e -U 419} 420 421# setup args... 422# Parse command line arguments, exit on error. 423# Callers should shift $((OPTIND - 1)) afterwards. 424# 425setup() 426{ 427 PATH=/sbin:/usr/sbin:/bin:/usr/bin:/rescue 428 429 : ${HOST_SH:=sh} 430 : ${TOOL_MKNOD:=mknod} 431 : ${TOOL_MTREE:=mtree} 432 : ${TOOL_PAX:=pax} 433 status=0 434 do_create_mfs=false 435 do_force=false 436 do_mknod=false 437 do_pax=false 438 do_mtree=false 439 do_redirect=false 440 do_specfile=false 441 do_update=false 442 opts= 443 while getopts Mfm:p:st:u ch; do 444 # Note that $opts is only for options pased through to 445 # MAKEDEV.local, not for all options. 446 case ${ch} in 447 M) 448 # "-M" sets do_create_mfs; 449 # "-M -M" is for use from init(8), and sets do_redirect 450 do_redirect=$do_create_mfs 451 do_create_mfs=true 452 ;; 453 f) do_force=true 454 opts="${opts} -f" 455 ;; 456 m) TOOL_MKNOD=${OPTARG} 457 do_mknod=true 458 opts="${opts} -m ${OPTARG}" 459 ;; 460 p) TOOL_PAX="${OPTARG}" 461 if check_pax "${TOOL_PAX}"; then 462 do_pax=true 463 # do not add this to $opts; we will later 464 # add "-s" instead. 465 else 466 warn "Ignored -p option:" \ 467 "${TOOL_PAX} is missing or broken" 468 do_mknod=true 469 fi 470 ;; 471 s) do_specfile=true 472 opts="${opts} -s" 473 ;; 474 t) TOOL_MTREE="${OPTARG}" 475 if check_mtree "${TOOL_MTREE}"; then 476 do_mtree=true 477 # do not add this to $opts; we will later 478 # add "-s" instead. 479 else 480 warn "Ignored -t option:" \ 481 "${TOOL_MTREE} is missing or broken" 482 do_mknod=true 483 fi 484 ;; 485 u) 486 do_update=true 487 opts="${opts} -u" 488 ;; 489 *) usage ;; 490 esac 491 done 492 493 shift $((${OPTIND} - 1)) 494 [ $# -gt 0 ] || usage 495 496 u_root="%uid_root%" 497 u_uucp="%uid_uucp%" 498 g_gpio="%gid__gpio%" 499 g_kmem="%gid_kmem%" 500 g_ntpd="%gid_ntpd%" 501 g_operator="%gid_operator%" 502 g_wheel="%gid_wheel%" 503 dialin=0 504 dialout=524288 505 callunit=262144 506 507 # only allow read&write for owner by default 508 umask 077 509 510 # Set fdesc_mounted=true if the fdesc file system is mounted 511 # on the current directory (typically "/dev"). 512 # Later, this will be used to suppress creation of device nodes 513 # that are supplied by the fdesc file system. 514 # 515 fdesc_mounted=false 516 if [ -d fd ]; then 517 # Parse the output from "mount -u -o nosuchoption .". 518 # We don't parse the output from df(1) because that's 519 # less likely to be available on install media. 520 # 521 # If the current directory is a mount point for the 522 # fdesc file system, then the expected output (whether 523 # or not the current user is root) is: 524 # mount_fdesc: -o suchoption: option not supported. 525 # 526 # If the current directory is not a mount point, then 527 # the expected output is: 528 # mount: .: unknown special file or file system. 529 # 530 # If we are not running on NetBSD, or mount(8) is not 531 # found, then we should get some other error message. 532 # 533 case "$({ LC_ALL=C mount -u -o nosuchoption . ; } 2>&1)" in 534 *mount_fdesc*) fdesc_mounted=true ;; 535 esac 536 fi 537 538 # do_force requires mknod 539 if $do_force; then 540 if $do_mtree || $do_pax || $do_specfile; then 541 die "-f option works only with mknod" 542 fi 543 do_mknod=true 544 fi 545 546 # do_force and do_update do not work together 547 if $do_force && $do_update; then 548 die "-f and -u options do not work together" 549 fi 550 551 # If no explicit method was specified on the command line or 552 # forced above, then use one of mtree, pax, or mknod, in that 553 # order of preference. 554 # 555 # mtree is preferred because it's fast and designed for the 556 # purpose. However, it's unlikely to be available early in the 557 # boot sequence, when init(8) may invoke MAKEDEV(8). 558 # 559 # pax is usually acceptable, and it's likely to be available 560 # early in the boot sequence. However, it's much slower than mtree. 561 # 562 # mknod is just very slow, because the shell has to fork for 563 # each device node. 564 # 565 566 case ",${do_mtree},,${do_pax},,${do_mknod},,${do_specfile}," in 567 ( ,false,,false,,false,,false, ) 568 if check_mtree "${TOOL_MTREE}"; then 569 do_mtree=true 570 elif check_pax "${TOOL_PAX}"; then 571 do_pax=true 572 else 573 do_mknod=true 574 fi 575 ;; 576 ( *,true,*,true,* ) 577 die "-m, -p, -s, and -t options are mutually exclusive" 578 ;; 579 esac 580 581 # If we are using mknod, then decide what options to pass it. 582 MKNOD="${TOOL_MKNOD:-mknod} -F netbsd" 583 if $do_mknod; then 584 if $do_force; then 585 MKNOD="${MKNOD} -R" 586 else 587 MKNOD="${MKNOD} -r" 588 fi 589 fi 590 591 # do_mtree or do_pax internally implies do_specfile. 592 # This happens after checking for mutually-exclusive options. 593 if $do_mtree || $do_pax && ! $do_specfile; then 594 do_specfile=true 595 opts="${opts} -s" 596 fi 597} 598 599# specfile_before 600# This is called before the bulk of the makedev processing, 601# if do_specfile is set. 602# 603# It simply prints ". type=dir optional", which must be the 604# first line of the specfile. 605# 606specfile_before() 607{ 608 echo ". type=dir optional" 609} 610 611# mtree_after 612# Output in specfile format is piped into this function. 613# 614# It uses mtree to create the devices defined in the specfile. 615# 616mtree_after() 617{ 618 nooutput -1 "${TOOL_MTREE}" -e -U 619} 620 621# pax_after 622# Output in specfile format is piped into this function. 623# 624# It uses pax to create the devices defined in the specfile. 625# 626pax_after() 627{ 628 # Run pax in an empty directory, so it pays 629 # attention only to the specfile, without being 630 # confused by the existing contents of the target 631 # directory. Without this, pax would complain "file 632 # would overwrite itself" for already-existing 633 # device nodes. 634 tmpdir=./tmp.$$ 635 mkdir "${tmpdir}" || die "can't create temporary directory" 636 cd "${tmpdir}" || die "can't cd to temporary directory" 637 "${TOOL_PAX}" -r -w -M -pe .. 638 pax_status=$? 639 cd .. # back to where we started 640 rmdir "${tmpdir}" 641 return $pax_status 642} 643 644# makedev_main makedev_name args... 645# Perform most of the work of the main program. makedev_name 646# is typically "makedev", but may be the name of some other 647# makedev-like function (if we are invoked from MAKEDEV.local or 648# some other script). The other args to this function are the 649# command line args with which the MAKEDEV (or MAKEDEV.local) 650# script was invoked. 651# 652makedev_main() 653{ 654 local makedev="$1" ; shift 655 656 # Parse command line args 657 setup ${1+"$@"} 658 shift $((${OPTIND}-1)) 659 660 if $do_create_mfs; then 661 # Count inodes and create mfs file system. 662 # The makedev call merely updates $count_nodes. 663 count_nodes=0 664 $makedev ${1+"$@"} 665 create_mfs_dev $count_nodes 666 unset count_nodes 667 fi 668 669 # Set before, middle, and after variables, so we can do 670 # something like "( $before && $middle ) | $after", 671 # except it will have to be more complex so we can capture 672 # the exit status from both sides of the pipe. 673 # 674 if $do_specfile; then 675 before=specfile_before 676 else 677 before=: 678 fi 679 middle='$makedev ${1+"$@"} && (exit $status)' 680 if $do_mtree; then 681 after=mtree_after 682 elif $do_pax ; then 683 after=pax_after 684 else 685 after=cat 686 fi 687 688 # Actually perform the "{ $before && $middle } | $after" commands. 689 # 690 # We go to some trouble to ensure that, if any of 691 # $before, $middle, or $after fails, then we also 692 # exit with a non-zero status. 693 # 694 # In the block below, fd 3 is a copy of the original stdout, 695 # and fd 4 goes to a subshell that analyses the exit status 696 # status from the other commands. 697 # 698 { 699 exec 3>&1; 700 { 701 { eval "$before" && eval "$middle"; echo $? >&4; } \ 702 | { eval "$after"; echo $? >&4; } \ 703 } 4>&1 1>&3 \ 704 | ( 705 read status1; 706 read status2; 707 case "$status1,$status2" in 708 0,0) exit 0;; 709 0,*) exit $status2;; 710 *,*) exit $status1;; 711 esac 712 ) 713 } 714} 715 716# 717# functions available to create nodes: 718# 719# mkdev name [b|c] major minor [mode{=600} [gid{=0} [uid{=0}]]] 720# create device node `name' with the appropriate permissions 721# 722# lndev src target 723# create a symlink from src to target 724# 725# makedir dir mode 726# create directory with appropriate mode 727# 728 729mkdev() 730{ 731 if [ -n "$count_nodes" ]; then 732 count_nodes=$((count_nodes + 1)) 733 return 734 fi 735 if $do_update && test -e $1; then 736 return 737 fi 738 if $do_specfile; then 739 case $2 in 740 b) type=block ;; 741 c) type=char ;; 742 esac 743 echo "./$1 type=${type} device=netbsd,$3,$4 mode=${5:-600} gid=${6:-$g_wheel} uid=${7:-$u_root}" 744 else 745 ${MKNOD} -m ${5:-600} -g \#${6:-$g_wheel} -u \#${7:-$u_root} $1 $2 $3 $4 746 fi 747} 748 749lndev() 750{ 751 if [ -n "$count_nodes" ]; then 752 count_nodes=$((count_nodes + 1)) 753 return 754 fi 755 if $do_update && test -e $2; then 756 return 757 fi 758 if $do_specfile; then 759 echo "./$2 type=link link=$1 mode=0700 gid=$g_wheel uid=$u_root" 760 else 761 ln -f -s $1 $2 762 fi 763} 764 765makedir() 766{ 767 if [ -n "$count_nodes" ]; then 768 count_nodes=$((count_nodes + 1)) 769 return 770 fi 771 if $do_update && test -e $1; then 772 return 773 fi 774 if $do_specfile; then 775 echo "./$1 type=dir mode=$2 gid=$g_wheel uid=$u_root" 776 else 777 nooutput -2 mkdir $1 778 chmod $2 $1 779 fi 780} 781 782warn() 783{ 784 echo 1>&2 "$0: $*" 785 status=1 786} 787 788die() 789{ 790 echo 1>&2 "$0: $*" 791 exit 1 792} 793 794# makedev special [...] 795# the main loop 796# 797makedev() 798{ 799 800for i 801do 802 803case $i in 804 805%MD_DEVICES% 806 807all) 808 makedev all_md 809 makedev std fd ptm 810 makedev dk0 dk1 dk2 dk3 dk4 dk5 dk6 dk7 811 makedev dk8 dk9 dk10 dk11 dk12 dk13 dk14 dk15 812 makedev dk16 dk17 dk18 dk19 dk20 dk21 dk22 dk23 813 makedev dk24 dk25 dk26 dk27 dk28 dk29 dk30 dk31 814 makedev ccd0 ccd1 ccd2 ccd3 815 makedev cgd0 cgd1 cgd2 cgd3 816 makedev filemon 817 makedev fss0 fss1 fss2 fss3 818 makedev md0 md1 819 makedev raid0 raid1 raid2 raid3 raid4 raid5 raid6 raid7 820 makedev vnd0 vnd1 vnd2 vnd3 821 makedev iscsi0 822 makedev bpf npf 823 makedev tun0 tun1 tun2 tun3 824 makedev ipl pf crypto random 825 makedev lockstat clockctl cpuctl 826 makedev atabus0 atabus1 atabus2 atabus3 atabus4 atabus5 atabus6 atabus7 827 makedev srt0 srt1 srt2 srt3 828 makedev tap tap0 tap1 tap2 tap3 829 makedev gpio gpio0 gpio1 gpio2 gpio3 gpio4 gpio5 gpio6 gpio7 830 makedev gpiopps0 831 makedev pad pad0 pad1 pad2 pad3 832 makedev bthub 833 makedev putter 834 makedev drvctl 835 makedev video 836 makedev dtv 837 makedev drm0 drm1 drm2 drm3 838 makedev altmem 839 makedev zfs 840 makedev lua 841 makedev hdmicec0 842 makedev dtrace 843 makedev veriexec 844 makedev autofs 845 makedev fw0 fw1 fw2 fw3 846 makedev local # do this last 847 ;; 848 849init) 850 # unless overridden by MD entry, this is equal to 'all' 851 makedev all opty 852 ;; 853 854%MI_DEVICES_BEGIN% 855audio) 856 makedev audio0 audio1 audio2 audio3 857 makedev hdaudio0 hdaudio1 hdaudio2 hdaudio3 858 lndev sound0 sound 859 lndev audio0 audio 860 lndev mixer0 mixer 861 lndev audioctl0 audioctl 862 ;; 863 864gpio) 865 makedev gpio0 gpio1 gpio2 gpio3 gpio4 gpio5 gpio6 gpio7 866 lndev gpio0 gpio 867 ;; 868 869gpiopps) 870 makedev gpiopps0 871 lndev gpiopps0 gpiopps 872 ;; 873 874lua) 875 makedev lua0 876 lndev lua0 lua 877 ;; 878 879pad) 880 makedev pad0 pad1 pad2 pad3 881 lndev pad0 pad 882 ;; 883 884qemufwcfg) 885 makedev qemufwcfg0 886 lndev qemufwcfg0 qemufwcfg 887 ;; 888 889radio) 890 makedev radio0 radio1 891 lndev radio0 radio 892 ;; 893 894video) 895 makedev video0 video1 video2 video3 896 ;; 897 898dtv) 899 makedev dtv0 dtv1 dtv2 dtv3 900 ;; 901 902iic) 903 makedev iic0 iic1 iic2 iic3 904 ;; 905 906altmem) 907 makedev altmem0 altmem1 908 ;; 909 910ramdisk) 911 makedev floppy md0 912 ;; 913 914usbs) 915 makedev usb usb0 usb1 usb2 usb3 usb4 usb5 usb6 usb7 916 makedev uhid0 uhid1 uhid2 uhid3 917 makedev ulpt0 ulpt1 918 makedev ttyU0 ttyU1 ttyU2 ttyU3 ttyU4 ttyU5 ttyU6 ttyU7 919 makedev ttyY0 ttyY1 920 makedev ttyHS0 921 makedev urio0 922 makedev uscanner0 uscanner1 923 makedev utoppy0 utoppy1 924 makedev ugen0 ugen1 ugen2 ugen3 925 ;; 926 927std) 928 mkdev console c %cons_chr% 0 600 929 mkdev constty c %cons_chr% 1 600 930 mkdev drum c %swap_chr% 0 640 $g_kmem 931 mkdev kmem c %mem_chr% 1 640 $g_kmem 932 mkdev mem c %mem_chr% 0 640 $g_kmem 933 mkdev null c %mem_chr% 2 666 934 mkdev full c %mem_chr% 11 666 935 mkdev zero c %mem_chr% 12 666 936 mkdev klog c %log_chr% 0 600 937 mkdev ksyms c %ksyms_chr% 0 440 $g_kmem 938 mkdev random c %rnd_chr% 0 444 939 mkdev urandom c %rnd_chr% 1 644 940 if ! $fdesc_mounted; then 941 mkdev tty c %ctty_chr% 0 666 942 mkdev stdin c %filedesc_chr% 0 666 943 mkdev stdout c %filedesc_chr% 1 666 944 mkdev stderr c %filedesc_chr% 2 666 945 fi 946 ;; 947 948usb) 949 mkdev usb c %usb_chr% 255 444 950 ;; 951 952usb[0-9]*) 953 unit=${i#usb} 954 usb=usb$unit 955 mkdev usb$unit c %usb_chr% $unit 956 ;; 957 958uhid[0-9]*) 959 unit=${i#uhid} 960 mkdev uhid$unit c %uhid_chr% $unit 666 961 ;; 962 963ulpt[0-9]*) 964 unit=${i#ulpt} 965 mkdev ulpt$unit c %ulpt_chr% $unit 966 mkdev ulpn$unit c %ulpt_chr% $(($unit + 64)) 967 ;; 968 969urio[0-9]*) 970 unit=${i#urio} 971 mkdev urio$unit c %urio_chr% $unit 666 972 ;; 973 974uscanner[0-9]*) 975 unit=${i#uscanner} 976 mkdev uscanner$unit c %uscanner_chr% $unit 977 ;; 978 979utoppy[0-9]*) 980 unit=${i#utoppy} 981 mkdev utoppy$unit c %utoppy_chr% $unit 982 ;; 983 984ttyHS[0-9]*) 985 unit=${i#ttyHS} 986 for j in 00 01 02 03 04 05 06 07 08 09 10 987 do 988 base=$(($unit * 16 + ${j#0})) 989 mkdev ttyHS$unit.$j c %uhso_chr% $(($base + $dialin )) "" "" $u_uucp 990 mkdev dtyHS$unit.$j c %uhso_chr% $(($base + $dialout )) "" "" $u_uucp 991 mkdev ctyHS$unit.$j c %uhso_chr% $(($base + $callunit)) "" "" $u_uucp 992 done 993 ;; 994 995ttyY[0-9]*) 996 unit=${i#ttyY} 997 mkdev ttyY$unit c %ucycom_chr% $(($unit + $dialin )) "" "" $u_uucp 998 mkdev dtyY$unit c %ucycom_chr% $(($unit + $dialout )) "" "" $u_uucp 999 mkdev ctyY$unit c %ucycom_chr% $(($unit + $callunit)) "" "" $u_uucp 1000 ;; 1001 1002ucom[0-9]*) 1003 makedev ttyU${i#ucom} 1004 ;; 1005 1006ttyU[0-9]*) 1007 unit=${i#ttyU} 1008 mkdev ttyU$unit c %ucom_chr% $(($unit + $dialin )) "" "" $u_uucp 1009 mkdev dtyU$unit c %ucom_chr% $(($unit + $dialout )) "" "" $u_uucp 1010 mkdev ctyU$unit c %ucom_chr% $(($unit + $callunit)) "" "" $u_uucp 1011 ;; 1012 1013ugen[0-9]*) 1014 unit=${i#ugen} 1015 for j in 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 1016 do 1017 mkdev ugen$unit.$j c %ugen_chr% $(($unit * 16 + ${j#0})) 1018 done 1019 ;; 1020 1021wscons) 1022 makedev ttyE0 ttyE1 ttyE2 ttyE3 ttyE4 ttyE5 ttyE6 ttyE7 1023 makedev ttyF0 ttyF1 ttyF2 ttyF3 ttyF4 ttyF5 ttyF6 ttyF7 1024 makedev ttyG0 ttyG1 ttyG2 ttyG3 ttyG4 ttyG5 ttyG6 ttyG7 1025 makedev ttyH0 ttyH1 ttyH2 ttyH3 ttyH4 ttyH5 ttyH6 ttyH7 1026 makedev wsmouse0 wsmouse1 wsmouse2 wsmouse3 1027 makedev wskbd0 wskbd1 wskbd2 wskbd3 1028 makedev wsmux0 wsmux1 wsmux2 wsmux3 1029 makedev wsmouse wskbd 1030 makedev ttyEcfg ttyEstat 1031 makedev ttyFcfg ttyFstat 1032 makedev ttyGcfg ttyGstat 1033 makedev ttyHcfg ttyHstat 1034 makedev wsfont 1035 ;; 1036 1037wsmouse) 1038 mkdev wsmouse c %wsmux_chr% 0 1039 ;; 1040 1041wskbd) 1042 mkdev wskbd c %wsmux_chr% 1 1043 ;; 1044 1045wsmux[0-9]*) 1046 unit=${i#wsmux} 1047 mkdev wsmux$unit c %wsmux_chr% $unit 1048 mkdev wsmuxctl$unit c %wsmux_chr% $(($unit + 128)) 200 1049 ;; 1050 1051xenevt) 1052 mkdev xenevt c %xenevt_chr% 0 1053 ;; 1054 1055xsd_kva) 1056 mkdev xsd_kva c %xenevt_chr% 1 1057 ;; 1058 1059xencons) 1060 mkdev xencons c %xencons_chr% 0 1061 ;; 1062 1063ttyEstat) 1064 mkdev ttyEstat c %wsdisplay_chr% 254 1065 ;; 1066 1067ttyEcfg) 1068 mkdev ttyEcfg c %wsdisplay_chr% 255 1069 ;; 1070 1071ttyE[0-9]*) 1072 unit=${i#ttyE} 1073 mkdev ttyE$unit c %wsdisplay_chr% $unit 1074 ;; 1075 1076ttyFstat) 1077 mkdev ttyFstat c %wsdisplay_chr% 510 1078 ;; 1079 1080ttyFcfg) 1081 mkdev ttyFcfg c %wsdisplay_chr% 511 1082 ;; 1083 1084ttyF[0-9]*) 1085 unit=${i#ttyF} 1086 mkdev ttyF$unit c %wsdisplay_chr% $(($unit + 256)) 1087 ;; 1088 1089ttyGstat) 1090 mkdev ttyGstat c %wsdisplay_chr% 766 1091 ;; 1092 1093ttyGcfg) 1094 mkdev ttyGcfg c %wsdisplay_chr% 767 1095 ;; 1096 1097ttyG[0-9]*) 1098 unit=${i#ttyG} 1099 mkdev ttyG$unit c %wsdisplay_chr% $(($unit + 512)) 1100 ;; 1101 1102ttyHstat) 1103 mkdev ttyHstat c %wsdisplay_chr% 1022 1104 ;; 1105 1106ttyHcfg) 1107 mkdev ttyHcfg c %wsdisplay_chr% 1023 1108 ;; 1109 1110ttyH[0-9]*) 1111 unit=${i#ttyH} 1112 mkdev ttyH$unit c %wsdisplay_chr% $(($unit + 768)) 1113 ;; 1114 1115wsmouse[0-9]*) 1116 unit=${i#wsmouse} 1117 mkdev wsmouse$unit c %wsmouse_chr% $unit 1118 ;; 1119 1120wskbd[0-9]*) 1121 unit=${i#wskbd} 1122 mkdev wskbd$unit c %wskbd_chr% $unit 1123 ;; 1124 1125fd) 1126 if ! $fdesc_mounted; then 1127 # Create the "fd" subdirectory, and devices "fd/0" to "fd/63" 1128 makedir fd 755 1129 n=0 1130 while [ $n -lt 64 ] 1131 do 1132 mkdev fd/$n c %filedesc_chr% $n 666 1133 n=$(($n + 1)) 1134 done 1135 fi 1136 ;; 1137 1138wt[0-9]*) 1139 name=wt; unit=${i#wt}; chr=%wt_chr%; blk=%wt_blk% 1140 for sub in $unit $(($unit+8)) $(($unit+16)) 1141 do 1142 mkdev $name$sub b $blk $(($sub + 0)) 660 $g_operator 1143 mkdev n$name$sub b $blk $(($sub + 4)) 660 $g_operator 1144 mkdev r$name$sub c $chr $(($sub + 0)) 660 $g_operator 1145 mkdev nr$name$sub c $chr $(($sub + 4)) 660 $g_operator 1146 done 1147 ;; 1148 1149md[0-9]*) 1150 makedisk_minimal md ${i#md} %md_blk% %md_chr% 1151 ;; 1152 1153fss[0-9]*) 1154 name=fss; unit=${i#fss}; blk=%fss_blk%; chr=%fss_chr% 1155 mkdev $name$unit b $blk $unit 660 $g_operator 1156 mkdev r$name$unit c $chr $unit 660 $g_operator 1157 ;; 1158 1159ss[0-9]*) 1160 name=ss; unit=${i#ss}; chr=%ss_chr% 1161 mkdev $name$unit c $chr $(($unit * 16 + 0)) 640 $g_operator 1162 mkdev n$name$unit c $chr $(($unit * 16 + 1)) 640 $g_operator 1163 mkdev en$name$unit c $chr $(($unit * 16 + 3)) 640 $g_operator 1164 ;; 1165 1166ccd[0-9]*|cgd[0-9]*|raid[0-9]*|vnd[0-9]*) 1167 case $i in 1168 ccd*) name=ccd; unit=${i#ccd}; blk=%ccd_blk%; chr=%ccd_chr%;; 1169 cgd*) name=cgd; unit=${i#cgd}; blk=%cgd_blk%; chr=%cgd_chr%;; 1170 raid*) name=raid; unit=${i#raid}; blk=%raid_blk%; chr=%raid_chr%;; 1171 vnd*) name=vnd; unit=${i#vnd}; blk=%vnd_blk%; chr=%vnd_chr%;; 1172 esac 1173 %MKDISK% $name $unit $blk $chr 1174 ;; 1175 1176sd[0-9]*) 1177 name=sd; unit=${i#sd}; blk=%sd_blk%; chr=%sd_chr% 1178 %MKDISK% $name $unit $blk $chr 1179 ;; 1180 1181ace[0-9]*) 1182 name=ace; unit=${i#ace}; blk=%ace_blk%; chr=%ace_chr% 1183 %MKDISK% $name $unit $blk $chr 1184 ;; 1185 1186eflash[0-9]*) 1187 name=eflash; unit=${i#eflash}; blk=%eflash_blk%; chr=%eflash_chr% 1188 %MKDISK% $name $unit $blk $chr 1189 ;; 1190 1191wd[0-9]*) 1192 name=wd; unit=${i#wd}; blk=%wd_blk%; chr=%wd_chr% 1193 %MKDISK% $name $unit $blk $chr 1194 ;; 1195 1196fd[0-9]*) 1197 name=fd; unit=${i#fd}; blk=%fd_blk%; chr=%fd_chr% 1198 %MKDISK% $name $unit $blk $chr 1199 ;; 1200 1201ld[0-9]*) 1202 name=ld; unit=${i#ld}; blk=%ld_blk%; chr=%ld_chr% 1203 %MKDISK% $name $unit $blk $chr 1204 ;; 1205 1206flash[0-9]*) 1207 unit=${i#flash} 1208 flash=flash$unit 1209 mkdev flash$unit b %flash_blk% $unit 1210 mkdev rflash$unit c %flash_chr% $unit 1211 ;; 1212 1213spiflash[0-9]*) 1214 unit=${i#spiflash} 1215 spiflash=spiflash$unit 1216 mkdev spiflash$unit b %spiflash_blk% $unit 1217 ;; 1218 1219altmem[0-9]*) 1220 name=altmem; unit=${i#altmem}; blk=%altmem_blk%; chr=%altmem_chr% 1221 %MKDISK% $name $unit $blk $chr 1222 ;; 1223 1224bio) 1225 mkdev bio c %bio_chr% 0 1226 ;; 1227 1228ed[0-9]*) 1229 name=ed; unit=${i#ed}; blk=%ed_blk%; chr=%ed_chr% 1230 %MKDISK% $name $unit $blk $chr 1231 ;; 1232 1233ofdisk[0-9]*) 1234 name=ofdisk; unit=${i#ofdisk}; blk=%ofdisk_blk%; chr=%ofdisk_chr% 1235 %MKDISK% $name $unit $blk $chr 1236 ;; 1237 1238xbd[0-9]*) 1239 name=xbd; unit=${i#xbd}; blk=%xbd_blk%; chr=%xbd_chr% 1240 %MKDISK% $name $unit $blk $chr 1241 ;; 1242 1243dk[0-9]*) 1244 name=dk; unit=${i#dk}; blk=%dk_blk%; chr=%dk_chr% 1245 mkdev r$name$unit c $chr $unit 0640 $g_operator 1246 mkdev $name$unit b $blk $unit 0640 $g_operator 1247 ;; 1248 1249tprof) 1250 mkdev tprof c %tprof_chr% 0 1251 ;; 1252 1253ttyCY[0-9]*) 1254 # Each unit number creates 32 pairs of {tty,dty} device nodes: 1255 # ttyCY0 => device nodes [td]tyCY000 to [td]tyCY031; 1256 # ttyCY1 => device nodes [td]tyCY032 to [td]tyCY063; 1257 name=tyCY; chr=%cy_chr%; off=32 1258 unit=${i#t${name}} 1259 minor=$(($unit * $off)) 1260 eminor=$(($minor + $off)) 1261 while [ $minor -lt $eminor ] 1262 do 1263 nminor=000$minor 1264 nminor=${nminor#${nminor%???}} 1265 mkdev t$name$nminor c $chr $(($minor + $dialin )) "" "" $u_uucp 1266 mkdev d$name$nminor c $chr $(($minor + $dialout)) "" "" $u_uucp 1267 minor=$(($minor + 1)) 1268 done 1269 ;; 1270 1271ttyCZ[0-9]*) 1272 # Each unit number creates 64 pairs of {tty,dty} device nodes: 1273 # ttyCZ0 => device nodes [td]tyCZ0000 to [td]tyCZ0063; 1274 # ttyCZ1 => device nodes [td]tyCZ0064 to [td]tyCZ0127; 1275 name=tyCZ; chr=%cz_chr%; off=64 1276 unit=${i#t${name}} 1277 minor=$(($unit * $off)) 1278 eminor=$(($minor + $off)) 1279 while [ $minor -lt $eminor ] 1280 do 1281 nminor=0000$minor 1282 nminor=${nminor#${nminor%????}} 1283 mkdev t$name$nminor c $chr $(($minor + $dialin )) "" "" $u_uucp 1284 mkdev d$name$nminor c $chr $(($minor + $dialout)) "" "" $u_uucp 1285 minor=$(($minor + 1)) 1286 done 1287 ;; 1288 1289 1290tty[0-9]|tty0[0-9]) 1291 # some archs have built-in zstty (major %zstty_chr%) instead 1292 # of NS16550; create ttyZ* and hardlink as [dt]ty0*; this 1293 # needs to be before com entry, for archs which have both 1294 unit=${i#tty} 1295 unit=$(($unit + 0)) 1296 makedev ttyZ${unit} 1297 lndev ttyZ$unit tty0${unit} 1298 lndev dtyZ$unit dty0${unit} 1299 ;; 1300 1301tty[0-9]*) 1302 unit=${i#tty} 1303 ounit=00$unit 1304 ounit=${ounit#${ounit%??}} 1305 mkdev tty$ounit c %com_chr% $(($unit + $dialin )) "" "" $u_uucp 1306 mkdev dty$ounit c %com_chr% $(($unit + $dialout)) "" "" $u_uucp 1307 ;; 1308 1309ttyC[0-9]*) 1310 # some archs call com_chr ttyC traditionally 1311 unit=${i#ttyC}; name=ttyC; dname=dtyC; chr=%com_chr% 1312 mkdev $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp 1313 mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp 1314 ;; 1315 1316ttyh[0-9]*) 1317 unit=${i#ttyh}; name=ttyh; dname=dtyh; chr=%sabtty_chr% 1318 mkdev $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp 1319 mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp 1320 ;; 1321 1322ttyTX[0-9]*) 1323 unit=${i#ttyTX}; name=ttyTX0; dname=dtyTX0; chr=%txcom_chr% 1324 mkdev $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp 1325 mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp 1326 ;; 1327 1328ttyZ[0-9]*) 1329 unit=${i#ttyZ}; name=ttyZ; dname=dtyZ; chr=%zstty_chr% 1330 mkdev $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp 1331 mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp 1332 ;; 1333 1334opty) 1335 # Create 16 device nodes, [pt]typ0 to [pt]typf, 1336 # same as "MAKEDEV pty0". 1337 for j in 0 1 2 3 4 5 6 7 8 9 a b c d e f 1338 do 1339 case $j in 1340 [0-9]) jn=$j ;; 1341 a) jn=10 ;; 1342 b) jn=11 ;; 1343 c) jn=12 ;; 1344 d) jn=13 ;; 1345 e) jn=14 ;; 1346 f) jn=15 ;; 1347 esac 1348 mkdev ttyp$j c %pts_chr% $jn 666 1349 mkdev ptyp$j c %ptc_chr% $jn 666 1350 done 1351 ;; 1352 1353pty[0-9]*) 1354 # Each unit number creates up to 16 pairs of {tty,pty} device nodes: 1355 # pty0 => 16 pairs, [tp]typ0 to [tp]typf 1356 # pty1 => 16 pairs, [tp]tyq0 to [tp]tyqf 1357 # pty16 => 16 pairs, [tp]typg to [tp]typv 1358 # pty17 => 16 pairs, [tp]typw to [tp]typL 1359 # pty18 => 14 pairs, [tp]typM to [tp]typZ 1360 warn "$i: creating BSD style tty nodes with ptyfs is a security issue" 1361 class=${i#pty} 1362 d1="p q r s t u v w x y z P Q R S T" 1363 if [ "$class" -ge 64 ] 1364 then 1365 warn "$i: pty unit must be between 0 and 63" 1366 continue 1367 elif [ "$class" -lt 16 ] 1368 then 1369 # pty[p-zP-T][0-9a-f] 1370 offset=0 1371 mult=0 1372 d2="0 1 2 3 4 5 6 7 8 9 a b c d e f" 1373 else 1374 # pty[p-zP-T][g-zA-Z] 1375 class=$(($class - 16)) 1376 offset=256 1377 mult=2 1378 d2="g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z" 1379 fi 1380 start=$(($class * 16)) 1381 set -- $d2 1382 nt=$# 1383 s1=$(($start / $nt)) 1384 set -- $d1 1385 shift $s1 1386 t1=$1 1387 if [ "$t1" = v ]; then 1388 warn "$i: pty unit conflicts with console ttyv0 device" 1389 continue 1390 fi 1391 s2=$(($start % ($nt - $s1 * $mult))) 1392 set -- $d2 1393 shift $s2 1394 t2=$1 1395 unit=$(($start + $offset - $s1 * $mult)) 1396 end=$(($unit + 16)) 1397 while [ "$unit" -lt "$end" ] 1398 do 1399 mkdev tty$t1$t2 c %pts_chr% $unit 666 1400 mkdev pty$t1$t2 c %ptc_chr% $unit 666 1401 shift 1402 t2=$1 1403 if [ -z "$t2" ] 1404 then 1405 break 1406 fi 1407 unit=$(($unit + 1)) 1408 done 1409 ;; 1410 1411stic[0-9]*) 1412 unit=${i#stic} 1413 mkdev stic$unit c %stic_chr% $unit 1414 ;; 1415 1416st[0-9]*) 1417 name=st; unit=${i#st}; chr=%st_chr%; blk=%st_blk% 1418 mkdev $name$unit b $blk $(($unit * 16 + 0)) 660 $g_operator 1419 mkdev n$name$unit b $blk $(($unit * 16 + 1)) 660 $g_operator 1420 mkdev e$name$unit b $blk $(($unit * 16 + 2)) 660 $g_operator 1421 mkdev en$name$unit b $blk $(($unit * 16 + 3)) 660 $g_operator 1422 mkdev r$name$unit c $chr $(($unit * 16 + 0)) 660 $g_operator 1423 mkdev nr$name$unit c $chr $(($unit * 16 + 1)) 660 $g_operator 1424 mkdev er$name$unit c $chr $(($unit * 16 + 2)) 660 $g_operator 1425 mkdev enr$name$unit c $chr $(($unit * 16 + 3)) 660 $g_operator 1426 ;; 1427 1428ses[0-9]*|ch[0-9]*|uk[0-9]*) 1429 case $i in 1430 ch*) name=ch; unit=${i#ch}; chr=%ch_chr%;; 1431 uk*) name=uk; unit=${i#uk}; chr=%uk_chr%;; 1432 ses*) name=ses; unit=${i#ses}; chr=%ses_chr%;; 1433 esac 1434 mkdev $name$unit c $chr $unit 640 $g_operator 1435 ;; 1436 1437cd[0-9]*) 1438 makedisk_minimal cd ${i#cd} %cd_blk% %cd_chr% 1439 ;; 1440 1441mcd[0-9]*) 1442 makedisk_minimal mcd ${i#mcd} %mcd_blk% %mcd_chr% 1443 ;; 1444 1445gdrom[0-9]*) 1446 makedisk_minimal gdrom ${i#gdrom} %gdrom_blk% %gdrom_chr% 1447 ;; 1448 1449lpt[0-9]*|lpa[0-9]*) 1450 case $i in 1451 lpt*) name=lpt; unit=${i#lpt}; chr=%lpt_chr%; flags=0;; 1452 lpa*) name=lpa; unit=${i#lpa}; chr=%lpt_chr%; flags=128;; 1453 esac 1454 mkdev $name$unit c $chr $(($unit + $flags)) 1455 mkdev lpt${unit}ctl c $chr $(($unit + 256)) 1456 ;; 1457 1458bpf) 1459 mkdev bpf c %bpf_chr% 0 1460 lndev bpf bpf0 1461 ;; 1462 1463npf) 1464 mkdev npf c %npf_chr% 0 1465 ;; 1466 1467bthub) 1468 mkdev bthub c %bthub_chr% 0 1469 ;; 1470 1471tun[0-9]*) 1472 unit=${i#tun} 1473 mkdev tun$unit c %tun_chr% $unit 1474 ;; 1475 1476joy[0-9]*) 1477 unit=${i#joy} 1478 mkdev joy$unit c %joy_chr% $unit 1479 ;; 1480 1481ipl) 1482 mkdev ipl c %ipl_chr% 0 1483 mkdev ipnat c %ipl_chr% 1 1484 mkdev ipstate c %ipl_chr% 2 1485 mkdev ipauth c %ipl_chr% 3 1486 mkdev ipsync c %ipl_chr% 4 1487 mkdev ipscan c %ipl_chr% 5 1488 mkdev iplookup c %ipl_chr% 6 1489 ;; 1490 1491pf) 1492 mkdev pf c %pf_chr% 0 1493 ;; 1494 1495crypto) 1496 mkdev crypto c %crypto_chr% 0 666 1497 ;; 1498 1499cmos) 1500 mkdev cmos c %cmos_chr% 0 644 1501 ;; 1502 1503speaker) 1504 mkdev speaker c %spkr_chr% 0 1505 ;; 1506 1507lockstat) 1508 mkdev lockstat c %lockstat_chr% 0 1509 ;; 1510 1511cpuctl) 1512 mkdev cpuctl c %cpuctl_chr% 0 666 1513 ;; 1514 1515audio|audio[0-9]*) 1516 unit=${i#audio} 1517 audio=audio$unit 1518 sound=sound$unit 1519 mixer=mixer$unit 1520 audioctl=audioctl$unit 1521 : ${unit:-0} 1522 mkdev $sound c %audio_chr% $(($unit + 0)) 666 1523 mkdev $audio c %audio_chr% $(($unit + 128)) 666 1524 mkdev $mixer c %audio_chr% $(($unit + 16)) 666 1525 mkdev $audioctl c %audio_chr% $(($unit + 192)) 666 1526 ;; 1527 1528hdaudio[0-9]*) 1529 unit=${i#hdaudio} 1530 mkdev hdaudio$unit c %hdaudio_chr% $unit 644 1531 ;; 1532 1533hdmicec[0-9]*) 1534 uint=${i#hdmicec} 1535 mkdev hdmicec$unit c %hdmicec_chr% $unit 644 1536 ;; 1537 1538gpio[0-9]*) 1539 unit=${i#gpio} 1540 mkdev gpio$unit c %gpio_chr% $unit 664 $g_gpio 1541 ;; 1542 1543gpiopps[0-9]*) 1544 unit=${i#gpiopps} 1545 mkdev gpiopps$unit c %gpiopps_chr% $unit 664 $g_gpio 1546 ;; 1547 1548lua[0-9]*) 1549 unit=${i#lua} 1550 mkdev lua$unit c %lua_chr% $unit 664 1551 ;; 1552 1553rmidi[0-9]*) 1554 unit=${i#rmidi} 1555 mkdev rmidi$unit c %midi_chr% $unit 666 1556 ;; 1557 1558music|music[0-9]*) 1559 unit=${i#music} 1560 : ${unit:-0} 1561 mkdev music$unit c %sequencer_chr% $(($unit + 0)) 666 1562 mkdev sequencer$unit c %sequencer_chr% $(($unit + 128)) 666 1563 ;; 1564 1565radio|radio[0-9]*) 1566 unit=${i#radio} 1567 : ${unit:-0} 1568 mkdev radio$unit c %radio_chr% $unit 666 1569 ;; 1570 1571video|video[0-9]*) 1572 unit=${i#video} 1573 : ${unit:-0} 1574 mkdev video$unit c %video_chr% $unit 666 1575 ;; 1576 1577dtv[0-9]*) 1578 unit=${i#dtv} 1579 makedir dvb 755 1580 makedir dvb/adapter$unit 755 1581 mkdev dvb/adapter$unit/frontend0 c %dtv_chr% $(($unit + 0)) 666 1582 mkdev dvb/adapter$unit/demux0 c %dtv_chr% $(($unit + 16)) 666 1583 mkdev dvb/adapter$unit/dvr0 c %dtv_chr% $(($unit + 32)) 666 1584 ;; 1585 1586iic[0-9]*) 1587 unit=${i#iic} 1588 : ${unit:-0} 1589 mkdev iic$unit c %iic_chr% $unit 600 1590 ;; 1591 1592spi[0-9]*) 1593 unit=${i#spi} 1594 : ${unit:-0} 1595 mkdev spi$unit c %spi_chr% $unit 600 1596 ;; 1597 1598amr[0-9]*) 1599 unit=${i#amr} 1600 mkdev amr$unit c %amr_chr% $unit 1601 ;; 1602 1603apm) 1604 mkdev apm c %apm_chr% 0 644 1605 mkdev apmctl c %apm_chr% 8 644 1606 ;; 1607 1608apm) 1609 # hpcmips uses `apmdev_chr' instead of `apm_chr' 1610 mkdev apm c %apmdev_chr% 0 644 1611 mkdev apmctl c %apmdev_chr% 8 644 1612 ;; 1613 1614random) 1615 mkdev random c %rnd_chr% 0 444 1616 mkdev urandom c %rnd_chr% 1 644 1617 ;; 1618 1619cfs) 1620 makedev cfs0 1621 ;; 1622 1623cfs[0-9]*) 1624 unit=${i#cfs} 1625 mkdev cfs$unit c %vcoda_chr% $unit 1626 ;; 1627 1628sysmon) 1629 mkdev sysmon c %sysmon_chr% 0 644 1630 mkdev watchdog c %sysmon_chr% 1 644 1631 mkdev power c %sysmon_chr% 2 640 1632 ;; 1633 1634scsibus[0-9]*) 1635 unit=${i#scsibus} 1636 mkdev scsibus$unit c %scsibus_chr% $unit 644 1637 ;; 1638 1639bktr) 1640 makedev bktr0 bktr1 1641 lndev bktr0 bktr 1642 lndev tuner0 tuner 1643 lndev vbi0 vbi 1644 ;; 1645 1646bktr[0-9]*) 1647 unit=${i#bktr} 1648 mkdev bktr$unit c %bktr_chr% $(($unit + 0)) 444 1649 mkdev tuner$unit c %bktr_chr% $(($unit + 16)) 444 1650 mkdev vbi$unit c %bktr_chr% $(($unit + 32)) 444 1651 ;; 1652 1653io) 1654 mkdev io c %mem_chr% 14 600 1655 ;; 1656 1657iop[0-9]*) 1658 unit=${i#iop} 1659 mkdev iop$unit c %iop_chr% $unit 1660 ;; 1661 1662mfi[0-9]*) 1663 unit=${i#mfi} 1664 mkdev mfi$unit c %mfi_chr% $unit 1665 ;; 1666 1667mlx[0-9]*) 1668 unit=${i#mlx} 1669 mkdev mlx$unit c %mlx_chr% $unit 1670 ;; 1671 1672mly[0-9]*) 1673 unit=${i#mly} 1674 mkdev mly$unit c %mly_chr% $unit 1675 ;; 1676 1677twa[0-9]*) 1678 unit=${i#twa} 1679 mkdev twa$unit c %twa_chr% $unit 1680 ;; 1681 1682twe[0-9]*) 1683 unit=${i#twe} 1684 mkdev twe$unit c %twe_chr% $unit 1685 ;; 1686 1687icp[0-9]*) 1688 unit=${i#icp} 1689 mkdev icp$unit c %icp_chr% $unit 1690 ;; 1691 1692agp[0-9]*) 1693 unit=${i#agp} 1694 mkdev agp$unit c %agp_chr% $unit 644 1695 if [ "$unit" = "0" ]; then 1696 lndev agp$unit agpgart 1697 fi 1698 ;; 1699 1700pci[0-9]*) 1701 unit=${i#pci} 1702 mkdev pci$unit c %pci_chr% $unit 640 1703 ;; 1704 1705dpti[0-9]*) 1706 unit=${i#dpti} 1707 mkdev dpti$unit c %dpti_chr% $unit 1708 ;; 1709 1710dpt[0-9]*) 1711 unit=${i#dpt} 1712 mkdev dpt$unit c %dpt_chr% $unit 1713 ;; 1714 1715altq) 1716 makedir altq 755 1717 unit=0 1718 for dev in altq cbq wfq afm fifoq red rio localq hfsc cdnr blue priq jobs 1719 do 1720 mkdev altq/$dev c %altq_chr% $unit 644 1721 unit=$(($unit + 1)) 1722 done 1723 ;; 1724 1725wsfont) 1726 mkdev wsfont c %wsfont_chr% 0 1727 ;; 1728 1729cir[0-9]*) 1730 unit=${i#cir} 1731 mkdev cir$unit c %cir_chr% $unit 666 1732 ;; 1733 1734irframe[0-9]*) 1735 unit=${i#irframe} 1736 mkdev irframe$unit c %irframe_chr% $unit 1737 ;; 1738 1739fcom[0-9]*) 1740 unit=${i#fcom} 1741 mkdev fcom$unit c %fcom_chr% $unit "" "" $u_uucp 1742 ;; 1743 1744openfirm) 1745 mkdev openfirm c %openfirm_chr% 0 444 1746 ;; 1747 1748pad[0-9]*) 1749 unit=${i#pad} 1750 mkdev pad$unit c %pad_chr% $unit 444 1751 ;; 1752 1753qemufwcfg[0-9]*) 1754 unit=${i#qemufwcfg} 1755 mkdev qemufwcfg$unit c %qemufwcfg_chr% $unit 660 1756 ;; 1757 1758nvram) 1759 mkdev nvram c %nvram_chr% 0 644 1760 ;; 1761 1762rtc) 1763 mkdev rtc c %rtc_chr% 0 644 1764 ;; 1765 1766clockctl) 1767 mkdev clockctl c %clockctl_chr% 0 660 $g_ntpd 1768 ;; 1769 1770nsmb) 1771 makedev nsmb0 nsmb1 nsmb2 nsmb3 1772 ;; 1773 1774nsmb[0-9]*) 1775 unit=${i#nsmb} 1776 mkdev nsmb$unit c %nsmb_chr% $unit 644 1777 ;; 1778 1779kttcp) 1780 mkdev kttcp c %kttcp_chr% 0 1781 ;; 1782 1783dmoverio) 1784 mkdev dmoverio c %dmoverio_chr% 0 644 1785 ;; 1786 1787veriexec) 1788 mkdev veriexec c %veriexec_chr% 0 600 1789 ;; 1790 1791ttyv[0-9]*) 1792 unit=${i#ttyv} 1793 mkdev ttyv$unit c %pc_chr% $unit 1794 ;; 1795 1796# arm, acorn32 1797ttyv[0-9]*) 1798 unit=${i#ttyv} 1799 mkdev ttyv$unit c %physcon_chr% $unit 1800 ;; 1801 1802arcpp[0-9]*) 1803 unit=${i#arcpp} 1804 mkdev arcpp$unit c %arcpp_chr% $unit 1805 ;; 1806 1807par[0-9]*) 1808 unit=${i#par} 1809 case $unit in 1810 0) 1811 mkdev par$unit c %par_chr% $unit 1812 ;; 1813 *) 1814 warn "bad unit for par in: $i" 1815 ;; 1816 esac 1817 ;; 1818 1819cpi[0-9]*) 1820 unit=${i#cpi} 1821 mkdev cpi$unit c %cpi_chr% $unit 1822 ;; 1823 1824ite[0-9]*|ttye[0-9]*) 1825 case $i in 1826 ite*) unit=${i#ite};; 1827 ttye*) unit=${i#ttye};; 1828 esac 1829 mkdev ttye$unit c %ite_chr% $unit 1830 ;; 1831 1832pms[0-9]*) 1833 unit=${i#pms} 1834 mkdev pms$unit c %opms_chr% $unit 1835 ;; 1836 1837qms[0-9]*) 1838 unit=${i#qms} 1839 mkdev qms$unit c %qms_chr% $unit 1840 ;; 1841 1842lms[0-9]*) 1843 unit=${i#lms} 1844 mkdev lms$unit c %lms_chr% $unit 1845 ;; 1846 1847mms[0-9]*) 1848 unit=${i#mms} 1849 mkdev mms$unit c %mms_chr% $unit 1850 ;; 1851 1852mouse-pms[0-9]*|mouse-qms[0-9]*) 1853 case $i in 1854 mouse-pms*) name=pms ;; 1855 mouse-qms*) name=qms ;; 1856 esac 1857 unit=${i#mouse-${name}} 1858 lndev $name$unit mouse 1859 ;; 1860 1861kbd) 1862 mkdev kbd c %kbd_chr% 0 1863 ;; 1864 1865kbdctl) 1866 mkdev kbdctl c %kbd_chr% 1 1867 ;; 1868 1869vidcconsole0) 1870 mkdev vidcconsole0 c %vidcconsole_chr% 0 640 1871 ;; 1872 1873view[0-9]*) 1874 unit=${i#view} 1875 mkdev view$unit c %view_chr% $unit 666 1876 ;; 1877 1878mouse[0-9]*) 1879 unit=${i#mouse} 1880 case $unit in 1881 0|1) 1882 mkdev mouse$unit c %ms_chr% $unit 666 1883 if [ $unit = 0 ]; then 1884 lndev mouse$unit mouse 1885 fi 1886 ;; 1887 *) 1888 warn "bad unit for mouse in: $i" 1889 ;; 1890 esac 1891 ;; 1892 1893panel) 1894 mkdev panel0 c %panel_chr% 0 660 1895 ;; 1896 1897tslcd) 1898 mkdev tslcd0 c %tslcd_chr% 0 660 1899 ;; 1900 1901ipty) 1902 mkdev ttyp0 c %pts_chr% 0 666 1903 mkdev ttyp1 c %pts_chr% 1 666 1904 mkdev ptyp0 c %ptc_chr% 0 666 1905 mkdev ptyp1 c %ptc_chr% 1 666 1906 ;; 1907 1908ptm) 1909 makedir pts 755 1910 mkdev ptmx c %ptm_chr% 0 666 1911 mkdev ptm c %ptm_chr% 1 666 1912 ;; 1913 1914grf[0-9]*) 1915 unit=${i#grf} 1916 mkdev grf$unit c %grf_chr% $unit 666 1917 ;; 1918 1919etvme) 1920 mkdev etvme c %et_chr% 0 1921 ;; 1922 1923leo[0-9]*) 1924 unit=${i#leo} 1925 mkdev leo$unit c %leo_chr% $unit 1926 ;; 1927 1928scif[0-9]*) 1929 unit=${i#scif} 1930 mkdev scif$unit c %scif_chr% $(($unit + $dialin )) "" "" $u_uucp 1931 mkdev dscif$unit c %scif_chr% $(($unit + $dialout)) "" "" $u_uucp 1932 ;; 1933 1934sci[0-9]*) 1935 unit=${i#sci} 1936 mkdev sci$unit c %sci_chr% $(($unit + $dialin )) "" "" $u_uucp 1937 mkdev dsci$unit c %sci_chr% $(($unit + $dialout)) "" "" $u_uucp 1938 ;; 1939 1940maple[ABCD]|maple[ABCD][0-9]*) 1941 case $i in 1942 mapleA*) name="mapleA"; unit=0;; 1943 mapleB*) name="mapleB"; unit=1;; 1944 mapleC*) name="mapleC"; unit=2;; 1945 mapleD*) name="mapleD"; unit=3;; 1946 esac 1947 subunit=${i#$name} 1948 mkdev $name$subunit c %maple_chr% $(($unit * 8 + 0$subunit)) 1949 ;; 1950 1951mmem[0-9]*) 1952 unit=${i#mmem} 1953 for pt in 0 # 1 2 3 4 ... 255 1954 do 1955# mkdev mmem${unit}.${pt}a b %mmem_blk% $(($unit * 4096 + $pt * 16 + 0)) 640 $g_operator 1956 mkdev mmem${unit}.${pt}c b %mmem_blk% $(($unit * 4096 + $pt * 16 + 2)) 640 $g_operator 1957# mkdev rmmem${unit}.${pt}a c %mmem_chr% $(($unit * 4096 + $pt * 16 + 0)) 640 $g_operator 1958 mkdev rmmem${unit}.${pt}c c %mmem_chr% $(($unit * 4096 + $pt * 16 + 2)) 640 $g_operator 1959 done 1960 ;; 1961 1962mlcd[0-9]*) 1963 unit=${i#mlcd} 1964 for pt in 0 # 1 2 3 4 ... 255 1965 do 1966 mkdev mlcd${unit}.${pt} c %mlcd_chr% $(($unit * 256 + $pt)) 640 $g_operator 1967 done 1968 ;; 1969 1970ixpcom[0-9]*) 1971 unit=${i#ixpcom} 1972 mkdev ixpcom$unit c %ixpcom_chr% $unit "" "" $u_uucp 1973 ;; 1974 1975epcom[0-9]*) 1976 unit=${i#epcom} 1977 mkdev epcom$unit c %epcom_chr% $unit "" "" $u_uucp 1978 ;; 1979 1980plcom[0-9]*) 1981 unit=${i#plcom} 1982 mkdev plcom$unit c %plcom_chr% $unit "" "" $u_uucp 1983 mkdev dplcom$unit c %plcom_chr% $(($unit + $dialout)) "" "" $u_uucp 1984 ;; 1985 1986wmcom[0-9]*) 1987 unit=${i#wmcom} 1988 mkdev wmcom$unit c %wmcom_chr% $unit "" "" $u_uucp 1989 ;; 1990 1991ucbsnd) 1992 mkdev ucbsnd c %ucbsnd_chr% 0 666 1993 ;; 1994 1995adb) 1996 mkdev adb c %aed_chr% 0 666 1997 ;; 1998 1999asc[0-9]*) 2000 unit=${i#asc} 2001 mkdev asc$unit c %asc_chr% $unit 666 2002 ;; 2003 2004bwtwo[0-9]*) 2005 unit=${i#bwtwo} 2006 mkdev bwtwo$unit c %bwtwo_chr% $unit 666 2007 ;; 2008 2009cgtwo[0-9]*) 2010 unit=${i#cgtwo} 2011 mkdev cgtwo$unit c %cgtwo_chr% $unit 666 2012 ;; 2013 2014cgthree[0-9]*) 2015 unit=${i#cgthree} 2016 mkdev cgthree$unit c %cgthree_chr% $unit 666 2017 ;; 2018 2019cgfour[0-9]*) 2020 unit=${i#cgfour} 2021 mkdev cgfour$unit c %cgfour_chr% $unit 666 2022 ;; 2023 2024cgsix[0-9]*) 2025 unit=${i#cgsix} 2026 mkdev cgsix$unit c %cgsix_chr% $unit 666 2027 ;; 2028 2029cgeight[0-9]*) 2030 unit=${i#cgeight} 2031 mkdev cgeight$unit c %cgeight_chr% $unit 666 2032 ;; 2033 2034tcx[0-9]*) 2035 unit=${i#tcx} 2036 mkdev tcx$unit c %tcx_chr% $unit 666 2037 ;; 2038 2039xd[0-9]*|xy[0-9]*) 2040 case $i in 2041 xd*) name=xd; unit=${i#xd}; blk=%xd_blk%; chr=%xd_chr%;; 2042 xy*) name=xy; unit=${i#xy}; blk=%xy_blk%; chr=%xy_chr%;; 2043 esac 2044 %MKDISK% $name $unit $blk $chr 2045 ;; 2046 2047magma[0-9]*) 2048 unit=${i#magma} 2049 if [ 0$unit -gt 3 ]; then 2050 warn "bad unit for $i: $unit" 2051 break 2052 fi 2053 for j in 0 1 2 3 4 5 6 7 8 9 a b c d e f 2054 do 2055 case $j in 2056 [0-9]) jn=$j ;; 2057 a) jn=10 ;; 2058 b) jn=11 ;; 2059 c) jn=12 ;; 2060 d) jn=13 ;; 2061 e) jn=14 ;; 2062 f) jn=15 ;; 2063 esac 2064 mkdev tty$unit$j c %mtty_chr% $(($unit * 64 + $jn)) 2065 done 2066 mkdev bpp${unit}0 c %mbpp_chr% $(($unit * 64 + 0)) 2067 mkdev bpp${unit}1 c %mbpp_chr% $(($unit * 64 + 1)) 2068 ;; 2069 2070clcd[0-9]*) 2071 unit=${i#clcd} 2072 if [ 0$unit -gt 7 ]; then 2073 warn "bad unit for $i: $unit" 2074 break 2075 fi 2076 for j in 0 1 2 3 4 5 6 7 2077 do 2078 mkdev ttyA$unit$j c %clcd_chr% $(($unit * 8 + $j + $dialin)) "" "" $u_uucp 2079 mkdev dtyA$unit$j c %clcd_chr% $(($unit * 8 + $j + $dialout)) "" "" $u_uucp 2080 done 2081 ;; 2082 2083spif[0-9]*) 2084 unit=${i#spif} 2085 if [ 0$unit -gt 3 ]; then 2086 warn "bad unit for $i: $unit" 2087 break 2088 fi 2089 for j in 0 1 2 3 4 5 6 7; do 2090 mkdev ttyS$unit$j c %stty_chr% $(($unit * 64 + $j)) "" "" $u_uucp 2091 done 2092 mkdev bppS${unit}0 c %sbpp_chr% $(($unit * 64 + 0)) 2093 mkdev bppS${unit}1 c %sbpp_chr% $(($unit * 64 + 1)) 2094 ;; 2095 2096bpp|bpp[0-9]*) 2097 unit=${i#bpp} 2098 mkdev bpp$unit c %bpp_chr% $(($unit + 0)) 2099 ;; 2100 2101tctrl[0-9]*) 2102 unit=${i#tctrl} 2103 mkdev tctrl$unit c %tctrl_chr% $unit 666 2104 ;; 2105 2106bmd[0-9]*) 2107 unit=${i#bmd} 2108 mkdev bmd${unit}a b %bmd_blk% $(($unit * 8 + 0)) 640 $g_operator 2109 mkdev bmd${unit}c b %bmd_blk% $(($unit * 8 + 2)) 640 $g_operator 2110 mkdev rbmd${unit}a c %bmd_chr% $(($unit * 8 + 0)) 640 $g_operator 2111 mkdev rbmd${unit}c c %bmd_chr% $(($unit * 8 + 2)) 640 $g_operator 2112 ;; 2113 2114sram) 2115 mkdev sram c %sram_chr% 0 644 2116 ;; 2117 2118ttyS[0-9]*) 2119 unit=${i#ttyS} 2120 mkdev ttyS$unit c %sacom_chr% $(($unit + $dialin )) "" "" $u_uucp 2121 mkdev dtyS$unit c %sacom_chr% $(($unit + $dialout)) "" "" $u_uucp 2122 ;; 2123 2124atabus[0-9]*) 2125 unit=${i#atabus} 2126 mkdev atabus$unit c %atabus_chr% $unit 644 2127 ;; 2128 2129drm[0-9]*) 2130 unit=${i#drm} 2131 makedir dri 755 2132 mkdev dri/card$unit c %drm_chr% $unit 660 2133 ;; 2134 2135drvctl) 2136 mkdev drvctl c %drvctl_chr% 0 644 2137 ;; 2138 2139isv) 2140 mkdev isv c %isv_chr% 0 644 2141 ;; 2142 2143tap|tap[0-9]*) 2144 unit=${i#tap} 2145 case "$unit" in 2146 [0-9]*) 2147 mkdev tap${unit} c %tap_chr% ${unit} 600 2148 ;; 2149 "") 2150 mkdev tap c %tap_chr% 0xfffff 600 2151 ;; 2152 esac 2153 ;; 2154 2155srt[0-9]*) 2156 unit=${i#srt} 2157 mkdev srt$unit c %srt_chr% $unit 600 2158 ;; 2159 2160tpm) 2161 mkdev tpm c %tpm_chr% 0 600 2162 ;; 2163 2164dtrace) 2165 makedir dtrace 755 2166 mkdev dtrace/dtrace c %dtrace_chr% 0 600 2167 ;; 2168 2169filemon) 2170 mkdev filemon c %filemon_chr% 0 666 2171 ;; 2172 2173fw[0-9]*) 2174 unit=${i#fw} 2175 for j in 0 1 2 3 2176 do 2177 mkdev fw${unit}.${j} c %fw_chr% $((${unit} * 256 + ${j})) 660 ${g_operator} 2178 mkdev fwmem${unit}.${j} c %fw_chr% $((65536 + ${unit} * 256 + ${j})) 660 ${g_operator} 2179 done 2180 ;; 2181 2182# create putter device and symlinks for all subsystems using it 2183putter) 2184 mkdev putter c %putter_chr% 0 600 2185 mkdev pud c %putter_chr% 1 600 2186 lndev putter puffs 2187 ;; 2188 2189zfs) 2190 mkdev zfs c %zfs_chr% 0 600 2191 makedir zpool 755 2192 ;; 2193 2194iscsi[0-9]*) 2195 unit=${i#iscsi} 2196 mkdev iscsi${unit} c %iscsi_chr% $unit 600 2197 ;; 2198 2199vchiq) 2200 mkdev vchiq c %vchiq_chr% 0 600 2201 ;; 2202 2203nvme[0-9]*ns[0-9]*) 2204 unit=${i#nvme} 2205 unit=${unit%ns*} 2206 subunit=${i#nvme${unit}ns} 2207 if [ 0$subunit -le 0 ] || [ 0$subunit -ge 65536 ]; then 2208 warn "bad nsid for $i: $subunit" 2209 break 2210 fi 2211 mkdev nvme${unit}ns$subunit c %nvme_chr% $(($unit * 65536 + $subunit)) 2212 ;; 2213 2214nvme[0-9]*) 2215 unit=${i#nvme} 2216 mkdev nvme$unit c %nvme_chr% $(($unit * 65536)) 2217 ;; 2218 2219nvmm) 2220 mkdev nvmm c %nvmm_chr% 0 2221 ;; 2222 2223autofs) 2224 mkdev autofs c %autofs_chr% 0 600 2225 ;; 2226 2227kcov) 2228 mkdev kcov c %kcov_chr% 0 2229 ;; 2230 2231midevend) 2232%MI_DEVICES_END% 2233local) 2234 if [ -f "$0.local" ]; then 2235 umask 0 2236 if [ -n "$count_nodes" ]; then 2237 count_nodes=$((count_nodes + \ 2238 $(linecount "$("$HOST_SH" "$0.local" $opts -s all)") )) 2239 else 2240 "$HOST_SH" "$0.local" $opts all 2241 fi 2242 umask 077 2243 fi 2244 ;; 2245 2246*) 2247 warn "$i: unknown device" 2248 ;; 2249 2250esac 2251done 2252 2253} 2254 2255 2256# three variants of disk partitions - max 8, max 16, max 16 with highpartoffset 2257# hack; only the one used by port is retained in final MAKEDEV script 2258# routine is called as: 2259# makedisk name unit blk chr 2260makedisk_p8() 2261{ 2262 name="$1"; unit="$2"; blk="$3"; chr="$4" 2263 2264 ro=%RAWDISK_OFF% 2265 mkdev ${name}${unit} b $blk $(($unit * 8 + $ro)) 640 $g_operator 2266 mkdev r${name}${unit} c $chr $(($unit * 8 + $ro)) 640 $g_operator 2267 2268 mkdev ${name}${unit}a b $blk $(($unit * 8 + 0)) 640 $g_operator 2269 mkdev ${name}${unit}b b $blk $(($unit * 8 + 1)) 640 $g_operator 2270 mkdev ${name}${unit}c b $blk $(($unit * 8 + 2)) 640 $g_operator 2271 mkdev ${name}${unit}d b $blk $(($unit * 8 + 3)) 640 $g_operator 2272 mkdev ${name}${unit}e b $blk $(($unit * 8 + 4)) 640 $g_operator 2273 mkdev ${name}${unit}f b $blk $(($unit * 8 + 5)) 640 $g_operator 2274 mkdev ${name}${unit}g b $blk $(($unit * 8 + 6)) 640 $g_operator 2275 mkdev ${name}${unit}h b $blk $(($unit * 8 + 7)) 640 $g_operator 2276 mkdev r${name}${unit}a c $chr $(($unit * 8 + 0)) 640 $g_operator 2277 mkdev r${name}${unit}b c $chr $(($unit * 8 + 1)) 640 $g_operator 2278 mkdev r${name}${unit}c c $chr $(($unit * 8 + 2)) 640 $g_operator 2279 mkdev r${name}${unit}d c $chr $(($unit * 8 + 3)) 640 $g_operator 2280 mkdev r${name}${unit}e c $chr $(($unit * 8 + 4)) 640 $g_operator 2281 mkdev r${name}${unit}f c $chr $(($unit * 8 + 5)) 640 $g_operator 2282 mkdev r${name}${unit}g c $chr $(($unit * 8 + 6)) 640 $g_operator 2283 mkdev r${name}${unit}h c $chr $(($unit * 8 + 7)) 640 $g_operator 2284} 2285 2286makedisk_p12high() 2287{ 2288 ho=524280 # offset for partition 9 to 11 (same as ...p16high) 2289 name="$1"; unit="$2"; blk="$3"; chr="$4" 2290 2291 ro=%RAWDISK_OFF% 2292 mkdev ${name}${unit} b $blk $(($unit * 8 + $ro)) 640 $g_operator 2293 mkdev r${name}${unit} c $chr $(($unit * 8 + $ro)) 640 $g_operator 2294 2295 mkdev ${name}${unit}a b $blk $(($unit * 8 + 0)) 640 $g_operator 2296 mkdev ${name}${unit}b b $blk $(($unit * 8 + 1)) 640 $g_operator 2297 mkdev ${name}${unit}c b $blk $(($unit * 8 + 2)) 640 $g_operator 2298 mkdev ${name}${unit}d b $blk $(($unit * 8 + 3)) 640 $g_operator 2299 mkdev ${name}${unit}e b $blk $(($unit * 8 + 4)) 640 $g_operator 2300 mkdev ${name}${unit}f b $blk $(($unit * 8 + 5)) 640 $g_operator 2301 mkdev ${name}${unit}g b $blk $(($unit * 8 + 6)) 640 $g_operator 2302 mkdev ${name}${unit}h b $blk $(($unit * 8 + 7)) 640 $g_operator 2303 mkdev ${name}${unit}i b $blk $(($unit * 8 + $ho + 8)) 640 $g_operator 2304 mkdev ${name}${unit}j b $blk $(($unit * 8 + $ho + 9)) 640 $g_operator 2305 mkdev ${name}${unit}k b $blk $(($unit * 8 + $ho + 10)) 640 $g_operator 2306 mkdev ${name}${unit}l b $blk $(($unit * 8 + $ho + 11)) 640 $g_operator 2307 mkdev r${name}${unit}a c $chr $(($unit * 8 + 0)) 640 $g_operator 2308 mkdev r${name}${unit}b c $chr $(($unit * 8 + 1)) 640 $g_operator 2309 mkdev r${name}${unit}c c $chr $(($unit * 8 + 2)) 640 $g_operator 2310 mkdev r${name}${unit}d c $chr $(($unit * 8 + 3)) 640 $g_operator 2311 mkdev r${name}${unit}e c $chr $(($unit * 8 + 4)) 640 $g_operator 2312 mkdev r${name}${unit}f c $chr $(($unit * 8 + 5)) 640 $g_operator 2313 mkdev r${name}${unit}g c $chr $(($unit * 8 + 6)) 640 $g_operator 2314 mkdev r${name}${unit}h c $chr $(($unit * 8 + 7)) 640 $g_operator 2315 mkdev r${name}${unit}i c $chr $(($unit * 8 + $ho + 8)) 640 $g_operator 2316 mkdev r${name}${unit}j c $chr $(($unit * 8 + $ho + 9)) 640 $g_operator 2317 mkdev r${name}${unit}k c $chr $(($unit * 8 + $ho + 10)) 640 $g_operator 2318 mkdev r${name}${unit}l c $chr $(($unit * 8 + $ho + 11)) 640 $g_operator 2319} 2320 2321makedisk_p16() 2322{ 2323 name="$1"; unit="$2"; blk="$3"; chr="$4" 2324 2325 ro=%RAWDISK_OFF% 2326 mkdev ${name}${unit} b $blk $(($unit * 16 + $ro)) 640 $g_operator 2327 mkdev r${name}${unit} c $chr $(($unit * 16 + $ro)) 640 $g_operator 2328 2329 mkdev ${name}${unit}a b $blk $(($unit * 16 + 0)) 640 $g_operator 2330 mkdev ${name}${unit}b b $blk $(($unit * 16 + 1)) 640 $g_operator 2331 mkdev ${name}${unit}c b $blk $(($unit * 16 + 2)) 640 $g_operator 2332 mkdev ${name}${unit}d b $blk $(($unit * 16 + 3)) 640 $g_operator 2333 mkdev ${name}${unit}e b $blk $(($unit * 16 + 4)) 640 $g_operator 2334 mkdev ${name}${unit}f b $blk $(($unit * 16 + 5)) 640 $g_operator 2335 mkdev ${name}${unit}g b $blk $(($unit * 16 + 6)) 640 $g_operator 2336 mkdev ${name}${unit}h b $blk $(($unit * 16 + 7)) 640 $g_operator 2337 mkdev ${name}${unit}i b $blk $(($unit * 16 + 8)) 640 $g_operator 2338 mkdev ${name}${unit}j b $blk $(($unit * 16 + 9)) 640 $g_operator 2339 mkdev ${name}${unit}k b $blk $(($unit * 16 + 10)) 640 $g_operator 2340 mkdev ${name}${unit}l b $blk $(($unit * 16 + 11)) 640 $g_operator 2341 mkdev ${name}${unit}m b $blk $(($unit * 16 + 12)) 640 $g_operator 2342 mkdev ${name}${unit}n b $blk $(($unit * 16 + 13)) 640 $g_operator 2343 mkdev ${name}${unit}o b $blk $(($unit * 16 + 14)) 640 $g_operator 2344 mkdev ${name}${unit}p b $blk $(($unit * 16 + 15)) 640 $g_operator 2345 mkdev r${name}${unit}a c $chr $(($unit * 16 + 0)) 640 $g_operator 2346 mkdev r${name}${unit}b c $chr $(($unit * 16 + 1)) 640 $g_operator 2347 mkdev r${name}${unit}c c $chr $(($unit * 16 + 2)) 640 $g_operator 2348 mkdev r${name}${unit}d c $chr $(($unit * 16 + 3)) 640 $g_operator 2349 mkdev r${name}${unit}e c $chr $(($unit * 16 + 4)) 640 $g_operator 2350 mkdev r${name}${unit}f c $chr $(($unit * 16 + 5)) 640 $g_operator 2351 mkdev r${name}${unit}g c $chr $(($unit * 16 + 6)) 640 $g_operator 2352 mkdev r${name}${unit}h c $chr $(($unit * 16 + 7)) 640 $g_operator 2353 mkdev r${name}${unit}i c $chr $(($unit * 16 + 8)) 640 $g_operator 2354 mkdev r${name}${unit}j c $chr $(($unit * 16 + 9)) 640 $g_operator 2355 mkdev r${name}${unit}k c $chr $(($unit * 16 + 10)) 640 $g_operator 2356 mkdev r${name}${unit}l c $chr $(($unit * 16 + 11)) 640 $g_operator 2357 mkdev r${name}${unit}m c $chr $(($unit * 16 + 12)) 640 $g_operator 2358 mkdev r${name}${unit}n c $chr $(($unit * 16 + 13)) 640 $g_operator 2359 mkdev r${name}${unit}o c $chr $(($unit * 16 + 14)) 640 $g_operator 2360 mkdev r${name}${unit}p c $chr $(($unit * 16 + 15)) 640 $g_operator 2361} 2362 2363makedisk_p16high() 2364{ 2365 ho=524280 # offset for partition 9 to 16 2366 name="$1"; unit="$2"; blk="$3"; chr="$4" 2367 2368 ro=%RAWDISK_OFF% 2369 mkdev ${name}${unit} b $blk $(($unit * 8 + $ro)) 640 $g_operator 2370 mkdev r${name}${unit} c $chr $(($unit * 8 + $ro)) 640 $g_operator 2371 2372 mkdev ${name}${unit}a b $blk $(($unit * 8 + 0)) 640 $g_operator 2373 mkdev ${name}${unit}b b $blk $(($unit * 8 + 1)) 640 $g_operator 2374 mkdev ${name}${unit}c b $blk $(($unit * 8 + 2)) 640 $g_operator 2375 mkdev ${name}${unit}d b $blk $(($unit * 8 + 3)) 640 $g_operator 2376 mkdev ${name}${unit}e b $blk $(($unit * 8 + 4)) 640 $g_operator 2377 mkdev ${name}${unit}f b $blk $(($unit * 8 + 5)) 640 $g_operator 2378 mkdev ${name}${unit}g b $blk $(($unit * 8 + 6)) 640 $g_operator 2379 mkdev ${name}${unit}h b $blk $(($unit * 8 + 7)) 640 $g_operator 2380 mkdev ${name}${unit}i b $blk $(($unit * 8 + $ho + 8)) 640 $g_operator 2381 mkdev ${name}${unit}j b $blk $(($unit * 8 + $ho + 9)) 640 $g_operator 2382 mkdev ${name}${unit}k b $blk $(($unit * 8 + $ho + 10)) 640 $g_operator 2383 mkdev ${name}${unit}l b $blk $(($unit * 8 + $ho + 11)) 640 $g_operator 2384 mkdev ${name}${unit}m b $blk $(($unit * 8 + $ho + 12)) 640 $g_operator 2385 mkdev ${name}${unit}n b $blk $(($unit * 8 + $ho + 13)) 640 $g_operator 2386 mkdev ${name}${unit}o b $blk $(($unit * 8 + $ho + 14)) 640 $g_operator 2387 mkdev ${name}${unit}p b $blk $(($unit * 8 + $ho + 15)) 640 $g_operator 2388 mkdev r${name}${unit}a c $chr $(($unit * 8 + 0)) 640 $g_operator 2389 mkdev r${name}${unit}b c $chr $(($unit * 8 + 1)) 640 $g_operator 2390 mkdev r${name}${unit}c c $chr $(($unit * 8 + 2)) 640 $g_operator 2391 mkdev r${name}${unit}d c $chr $(($unit * 8 + 3)) 640 $g_operator 2392 mkdev r${name}${unit}e c $chr $(($unit * 8 + 4)) 640 $g_operator 2393 mkdev r${name}${unit}f c $chr $(($unit * 8 + 5)) 640 $g_operator 2394 mkdev r${name}${unit}g c $chr $(($unit * 8 + 6)) 640 $g_operator 2395 mkdev r${name}${unit}h c $chr $(($unit * 8 + 7)) 640 $g_operator 2396 mkdev r${name}${unit}i c $chr $(($unit * 8 + $ho + 8)) 640 $g_operator 2397 mkdev r${name}${unit}j c $chr $(($unit * 8 + $ho + 9)) 640 $g_operator 2398 mkdev r${name}${unit}k c $chr $(($unit * 8 + $ho + 10)) 640 $g_operator 2399 mkdev r${name}${unit}l c $chr $(($unit * 8 + $ho + 11)) 640 $g_operator 2400 mkdev r${name}${unit}m c $chr $(($unit * 8 + $ho + 12)) 640 $g_operator 2401 mkdev r${name}${unit}n c $chr $(($unit * 8 + $ho + 13)) 640 $g_operator 2402 mkdev r${name}${unit}o c $chr $(($unit * 8 + $ho + 14)) 640 $g_operator 2403 mkdev r${name}${unit}p c $chr $(($unit * 8 + $ho + 15)) 640 $g_operator 2404} 2405 2406# make only the very few basic disk device nodes - 'a' partition 2407# and raw partition 2408makedisk_minimal() 2409{ 2410 name=$1; unit=$2; blk=$3; chr=$4 2411 doff=%DISKMINOROFFSET% 2412 ro=%RAWDISK_OFF% 2413 rn=%RAWDISK_NAME% 2414 2415 mkdev ${name}${unit} b $blk $(($unit * $doff + $ro)) 640 $g_operator 2416 mkdev r${name}${unit} c $chr $(($unit * $doff + $ro)) 640 $g_operator 2417 2418 mkdev ${name}${unit}a b $blk $(($unit * $doff + 0)) 640 $g_operator 2419 mkdev ${name}${unit}$rn b $blk $(($unit * $doff + $ro)) 640 $g_operator 2420 mkdev r${name}${unit}a c $chr $(($unit * $doff + 0)) 640 $g_operator 2421 mkdev r${name}${unit}$rn c $chr $(($unit * $doff + $ro)) 640 $g_operator 2422} 2423 2424# create_mfs_dev nodes 2425# Create a memory file system for a given number of device nodes, 2426# and mount it. Attempts to use mount_tmpfs, or falls back to 2427# mount_mfs. 2428# 2429# If do_redirect, then also redirect output to the console. 2430# 2431create_mfs_dev() 2432{ 2433 ndevnodes=${1-1200} 2434 dev_mountpoint=${PWD:-/dev} 2435 2436 # Number of inodes is the specified number of device nodes, plus 2437 # a margin to allow for extra device nodes created later. 2438 ninode=$((ndevnodes * 11 / 10)) 2439 # Add 2 reserved inodes (needed for both mfs and tmpfs), and round 2440 # up to a multiple of 32 (needed for mfs, not needed for tmpfs). 2441 ninode=$(( (ninode + 2 + 31) / 32 * 32 )) 2442 # Try tmpfs; if that fails try mfs. 2443 # 2444 # For tmpfs, allocate 16KB and 512 byte per node. 2445 # Actual requirements are much lower, but the size limit 2446 # is only intended to avoid accidental writing to /dev. 2447 fs_bytes=$((16384 + ninode * 512)) 2448 if mount_tmpfs -s $fs_bytes -n $ninode -m 0755 \ 2449 -o union tmpfs "$dev_mountpoint" 2450 then 2451 fstype=tmpfs 2452 else 2453 # This file system size calculation is exact for mount_mfs(8) 2454 # with 512-byte sectors. 40960 bytes (80 blocks) is the 2455 # minimum size allowed by mount_mfs. 2456 fs_bytes=$((8192 + 2 * 8192 + 4096 + ninode*512 + 8192)) 2457 [ "$fs_bytes" -lt 40960 ] && fs_bytes=40960 2458 fs_blocks=$((fs_bytes/512)) 2459 if mount_mfs -b 4096 -f 512 -s $fs_blocks -n $ninode -p 0755 \ 2460 -o union swap "$dev_mountpoint" 2461 then 2462 fstype=mfs 2463 else 2464 die "Failed to create memory file system" 2465 fi 2466 fi 2467 2468 # Our current directory was in the lower file system; change it to 2469 # the newly mounted upper file system. 2470 cd "$dev_mountpoint" 2471 2472 if $do_redirect; then 2473 # Redirect stdout and stderr to console 2474 ${MKNOD} -m 600 -g 0 -u 0 temp_console c %CONSOLE_CMAJOR% 0 2475 exec >temp_console 2>&1 2476 rm temp_console 2477 fi 2478 2479 echo "Created $fstype $dev_mountpoint" \ 2480 "($fs_bytes byte, $ninode inodes)" 2481} 2482 2483# 2484# MAIN: If MAKEDEV_AS_LIBRARY is set, then we are being used as a 2485# function library, so just return. Otherwise, do all the real work. 2486# 2487[ -n "${MAKEDEV_AS_LIBRARY}" ] && return 2488makedev_main makedev ${1+"$@"} 2489