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