1#!/bin/sh - 2# $NetBSD: MAKEDEV.tmpl,v 1.189 2018/01/09 03:31:14 christos 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 drm1 drm2 drm3 839 makedev altmem 840 makedev zfs 841 makedev lua 842 makedev hdmicec0 843 makedev dtrace 844 makedev veriexec 845 makedev autofs 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 869lua) 870 makedev lua0 871 lndev lua0 lua 872 ;; 873 874pad) 875 makedev pad0 pad1 pad2 pad3 876 lndev pad0 pad 877 ;; 878 879qemufwcfg) 880 makedev qemufwcfg0 881 lndev qemufwcfg0 qemufwcfg 882 ;; 883 884radio) 885 makedev radio0 radio1 886 lndev radio0 radio 887 ;; 888 889video) 890 makedev video0 video1 video2 video3 891 ;; 892 893dtv) 894 makedev dtv0 dtv1 dtv2 dtv3 895 ;; 896 897iic) 898 makedev iic0 iic1 iic2 iic3 899 ;; 900 901altmem) 902 makedev altmem0 altmem1 903 ;; 904 905ramdisk) 906 makedev floppy md0 907 ;; 908 909usbs) 910 makedev usb usb0 usb1 usb2 usb3 usb4 usb5 usb6 usb7 911 makedev uhid0 uhid1 uhid2 uhid3 912 makedev ulpt0 ulpt1 913 makedev ttyU0 ttyU1 ttyU2 ttyU3 ttyU4 ttyU5 ttyU6 ttyU7 914 makedev ttyY0 ttyY1 915 makedev ttyHS0 916 makedev urio0 917 makedev uscanner0 uscanner1 918 makedev utoppy0 utoppy1 919 makedev ugen0 ugen1 ugen2 ugen3 920 ;; 921 922isdns) 923 makedev isdn isdnctl isdnbchan0 isdnbchan1 isdntel0 isdntel1 isdnteld0 isdnteld1 isdntrc0 isdntrc1 924 ;; 925 926std) 927 mkdev console c %cons_chr% 0 600 928 mkdev constty c %cons_chr% 1 600 929 mkdev drum c %swap_chr% 0 640 $g_kmem 930 mkdev kmem c %mem_chr% 1 640 $g_kmem 931 mkdev mem c %mem_chr% 0 640 $g_kmem 932 mkdev null c %mem_chr% 2 666 933 mkdev full c %mem_chr% 11 666 934 mkdev zero c %mem_chr% 12 666 935 mkdev klog c %log_chr% 0 600 936 mkdev ksyms c %ksyms_chr% 0 444 937 mkdev random c %rnd_chr% 0 444 938 mkdev urandom c %rnd_chr% 1 644 939 if ! $fdesc_mounted; then 940 mkdev tty c %ctty_chr% 0 666 941 mkdev stdin c %filedesc_chr% 0 666 942 mkdev stdout c %filedesc_chr% 1 666 943 mkdev stderr c %filedesc_chr% 2 666 944 fi 945 ;; 946 947usb) 948 mkdev usb c %usb_chr% 255 444 949 ;; 950 951usb[0-9]*) 952 unit=${i#usb} 953 usb=usb$unit 954 mkdev usb$unit c %usb_chr% $unit 955 ;; 956 957uhid[0-9]*) 958 unit=${i#uhid} 959 mkdev uhid$unit c %uhid_chr% $unit 666 960 ;; 961 962ulpt[0-9]*) 963 unit=${i#ulpt} 964 mkdev ulpt$unit c %ulpt_chr% $unit 965 mkdev ulpn$unit c %ulpt_chr% $(($unit + 64)) 966 ;; 967 968urio[0-9]*) 969 unit=${i#urio} 970 mkdev urio$unit c %urio_chr% $unit 666 971 ;; 972 973uscanner[0-9]*) 974 unit=${i#uscanner} 975 mkdev uscanner$unit c %uscanner_chr% $unit 976 ;; 977 978utoppy[0-9]*) 979 unit=${i#utoppy} 980 mkdev utoppy$unit c %utoppy_chr% $unit 981 ;; 982 983ttyHS[0-9]*) 984 unit=${i#ttyHS} 985 for j in 00 01 02 03 04 05 06 07 08 09 10 986 do 987 base=$(($unit * 16 + ${j#0})) 988 mkdev ttyHS$unit.$j c %uhso_chr% $(($base + $dialin )) "" "" $u_uucp 989 mkdev dtyHS$unit.$j c %uhso_chr% $(($base + $dialout )) "" "" $u_uucp 990 mkdev ctyHS$unit.$j c %uhso_chr% $(($base + $callunit)) "" "" $u_uucp 991 done 992 ;; 993 994ttyY[0-9]*) 995 unit=${i#ttyY} 996 mkdev ttyY$unit c %ucycom_chr% $(($unit + $dialin )) "" "" $u_uucp 997 mkdev dtyY$unit c %ucycom_chr% $(($unit + $dialout )) "" "" $u_uucp 998 mkdev ctyY$unit c %ucycom_chr% $(($unit + $callunit)) "" "" $u_uucp 999 ;; 1000 1001ucom[0-9]*) 1002 makedev ttyU${i#ucom} 1003 ;; 1004 1005ttyU[0-9]*) 1006 unit=${i#ttyU} 1007 mkdev ttyU$unit c %ucom_chr% $(($unit + $dialin )) "" "" $u_uucp 1008 mkdev dtyU$unit c %ucom_chr% $(($unit + $dialout )) "" "" $u_uucp 1009 mkdev ctyU$unit c %ucom_chr% $(($unit + $callunit)) "" "" $u_uucp 1010 ;; 1011 1012ugen[0-9]*) 1013 unit=${i#ugen} 1014 for j in 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 1015 do 1016 mkdev ugen$unit.$j c %ugen_chr% $(($unit * 16 + ${j#0})) 1017 done 1018 ;; 1019 1020wscons) 1021 makedev ttyE0 ttyE1 ttyE2 ttyE3 ttyE4 ttyE5 ttyE6 ttyE7 1022 makedev ttyF0 ttyF1 ttyF2 ttyF3 ttyF4 ttyF5 ttyF6 ttyF7 1023 makedev ttyG0 ttyG1 ttyG2 ttyG3 ttyG4 ttyG5 ttyG6 ttyG7 1024 makedev ttyH0 ttyH1 ttyH2 ttyH3 ttyH4 ttyH5 ttyH6 ttyH7 1025 makedev wsmouse0 wsmouse1 wsmouse2 wsmouse3 1026 makedev wskbd0 wskbd1 wskbd2 wskbd3 1027 makedev wsmux0 wsmux1 wsmux2 wsmux3 1028 makedev wsmouse wskbd 1029 makedev ttyEcfg ttyEstat 1030 makedev ttyFcfg ttyFstat 1031 makedev ttyGcfg ttyGstat 1032 makedev ttyHcfg ttyHstat 1033 makedev wsfont 1034 ;; 1035 1036wsmouse) 1037 mkdev wsmouse c %wsmux_chr% 0 1038 ;; 1039 1040wskbd) 1041 mkdev wskbd c %wsmux_chr% 1 1042 ;; 1043 1044wsmux[0-9]*) 1045 unit=${i#wsmux} 1046 mkdev wsmux$unit c %wsmux_chr% $unit 1047 mkdev wsmuxctl$unit c %wsmux_chr% $(($unit + 128)) 200 1048 ;; 1049 1050xenevt) 1051 mkdev xenevt c %xenevt_chr% 0 1052 ;; 1053 1054xsd_kva) 1055 mkdev xsd_kva c %xenevt_chr% 1 1056 ;; 1057 1058xencons) 1059 mkdev xencons c %xencons_chr% 0 1060 ;; 1061 1062ttyEstat) 1063 mkdev ttyEstat c %wsdisplay_chr% 254 1064 ;; 1065 1066ttyEcfg) 1067 mkdev ttyEcfg c %wsdisplay_chr% 255 1068 ;; 1069 1070ttyE[0-9]*) 1071 unit=${i#ttyE} 1072 mkdev ttyE$unit c %wsdisplay_chr% $unit 1073 ;; 1074 1075ttyFstat) 1076 mkdev ttyFstat c %wsdisplay_chr% 510 1077 ;; 1078 1079ttyFcfg) 1080 mkdev ttyFcfg c %wsdisplay_chr% 511 1081 ;; 1082 1083ttyF[0-9]*) 1084 unit=${i#ttyF} 1085 mkdev ttyF$unit c %wsdisplay_chr% $(($unit + 256)) 1086 ;; 1087 1088ttyGstat) 1089 mkdev ttyGstat c %wsdisplay_chr% 766 1090 ;; 1091 1092ttyGcfg) 1093 mkdev ttyGcfg c %wsdisplay_chr% 767 1094 ;; 1095 1096ttyG[0-9]*) 1097 unit=${i#ttyG} 1098 mkdev ttyG$unit c %wsdisplay_chr% $(($unit + 512)) 1099 ;; 1100 1101ttyHstat) 1102 mkdev ttyHstat c %wsdisplay_chr% 1022 1103 ;; 1104 1105ttyHcfg) 1106 mkdev ttyHcfg c %wsdisplay_chr% 1023 1107 ;; 1108 1109ttyH[0-9]*) 1110 unit=${i#ttyH} 1111 mkdev ttyH$unit c %wsdisplay_chr% $(($unit + 768)) 1112 ;; 1113 1114wsmouse[0-9]*) 1115 unit=${i#wsmouse} 1116 mkdev wsmouse$unit c %wsmouse_chr% $unit 1117 ;; 1118 1119wskbd[0-9]*) 1120 unit=${i#wskbd} 1121 mkdev wskbd$unit c %wskbd_chr% $unit 1122 ;; 1123 1124fd) 1125 if ! $fdesc_mounted; then 1126 # Create the "fd" subdirectory, and devices "fd/0" to "fd/63" 1127 makedir fd 755 1128 n=0 1129 while [ $n -lt 64 ] 1130 do 1131 mkdev fd/$n c %filedesc_chr% $n 666 1132 n=$(($n + 1)) 1133 done 1134 fi 1135 ;; 1136 1137wt[0-9]*) 1138 name=wt; unit=${i#wt}; chr=%wt_chr%; blk=%wt_blk% 1139 for sub in $unit $(($unit+8)) $(($unit+16)) 1140 do 1141 mkdev $name$sub b $blk $(($sub + 0)) 660 $g_operator 1142 mkdev n$name$sub b $blk $(($sub + 4)) 660 $g_operator 1143 mkdev r$name$sub c $chr $(($sub + 0)) 660 $g_operator 1144 mkdev nr$name$sub c $chr $(($sub + 4)) 660 $g_operator 1145 done 1146 ;; 1147 1148md[0-9]*) 1149 makedisk_minimal md ${i#md} %md_blk% %md_chr% 1150 ;; 1151 1152fss[0-9]*) 1153 name=fss; unit=${i#fss}; blk=%fss_blk%; chr=%fss_chr% 1154 mkdev $name$unit b $blk $unit 660 $g_operator 1155 mkdev r$name$unit c $chr $unit 660 $g_operator 1156 ;; 1157 1158ss[0-9]*) 1159 name=ss; unit=${i#ss}; chr=%ss_chr% 1160 mkdev $name$unit c $chr $(($unit * 16 + 0)) 640 $g_operator 1161 mkdev n$name$unit c $chr $(($unit * 16 + 1)) 640 $g_operator 1162 mkdev en$name$unit c $chr $(($unit * 16 + 3)) 640 $g_operator 1163 ;; 1164 1165ccd[0-9]*|cgd[0-9]*|raid[0-9]*|vnd[0-9]*) 1166 case $i in 1167 ccd*) name=ccd; unit=${i#ccd}; blk=%ccd_blk%; chr=%ccd_chr%;; 1168 cgd*) name=cgd; unit=${i#cgd}; blk=%cgd_blk%; chr=%cgd_chr%;; 1169 raid*) name=raid; unit=${i#raid}; blk=%raid_blk%; chr=%raid_chr%;; 1170 vnd*) name=vnd; unit=${i#vnd}; blk=%vnd_blk%; chr=%vnd_chr%;; 1171 esac 1172 %MKDISK% $name $unit $blk $chr 1173 ;; 1174 1175sd[0-9]*) 1176 name=sd; unit=${i#sd}; blk=%sd_blk%; chr=%sd_chr% 1177 %MKDISK% $name $unit $blk $chr 1178 ;; 1179 1180ace[0-9]*) 1181 name=ace; unit=${i#ace}; blk=%ace_blk%; chr=%ace_chr% 1182 %MKDISK% $name $unit $blk $chr 1183 ;; 1184 1185eflash[0-9]*) 1186 name=eflash; unit=${i#eflash}; blk=%eflash_blk%; chr=%eflash_chr% 1187 %MKDISK% $name $unit $blk $chr 1188 ;; 1189 1190wd[0-9]*) 1191 name=wd; unit=${i#wd}; blk=%wd_blk%; chr=%wd_chr% 1192 %MKDISK% $name $unit $blk $chr 1193 ;; 1194 1195fd[0-9]*) 1196 name=fd; unit=${i#fd}; blk=%fd_blk%; chr=%fd_chr% 1197 %MKDISK% $name $unit $blk $chr 1198 ;; 1199 1200ld[0-9]*) 1201 name=ld; unit=${i#ld}; blk=%ld_blk%; chr=%ld_chr% 1202 %MKDISK% $name $unit $blk $chr 1203 ;; 1204 1205flash[0-9]*) 1206 unit=${i#flash} 1207 flash=flash$unit 1208 mkdev flash$unit b %flash_blk% $unit 1209 mkdev rflash$unit c %flash_chr% $unit 1210 ;; 1211 1212spiflash[0-9]*) 1213 unit=${i#spiflash} 1214 spiflash=spiflash$unit 1215 mkdev spiflash$unit b %spiflash_blk% $unit 1216 ;; 1217 1218altmem[0-9]*) 1219 name=altmem; unit=${i#altmem}; blk=%altmem_blk%; chr=%altmem_chr% 1220 %MKDISK% $name $unit $blk $chr 1221 ;; 1222 1223bio) 1224 mkdev bio c %bio_chr% 0 1225 ;; 1226 1227ed[0-9]*) 1228 name=ed; unit=${i#ed}; blk=%ed_blk%; chr=%ed_chr% 1229 %MKDISK% $name $unit $blk $chr 1230 ;; 1231 1232ofdisk[0-9]*) 1233 name=ofdisk; unit=${i#ofdisk}; blk=%ofdisk_blk%; chr=%ofdisk_chr% 1234 %MKDISK% $name $unit $blk $chr 1235 ;; 1236 1237xbd[0-9]*) 1238 name=xbd; unit=${i#xbd}; blk=%xbd_blk%; chr=%xbd_chr% 1239 %MKDISK% $name $unit $blk $chr 1240 ;; 1241 1242dk[0-9]*) 1243 name=dk; unit=${i#dk}; blk=%dk_blk%; chr=%dk_chr% 1244 mkdev r$name$unit c $chr $unit 0640 $g_operator 1245 mkdev $name$unit b $blk $unit 0640 $g_operator 1246 ;; 1247 1248ttyCY[0-9]*) 1249 # Each unit number creates 32 pairs of {tty,dty} device nodes: 1250 # ttyCY0 => device nodes [td]tyCY000 to [td]tyCY031; 1251 # ttyCY1 => device nodes [td]tyCY032 to [td]tyCY063; 1252 name=tyCY; chr=%cy_chr%; off=32 1253 unit=${i#t${name}} 1254 minor=$(($unit * $off)) 1255 eminor=$(($minor + $off)) 1256 while [ $minor -lt $eminor ] 1257 do 1258 nminor=000$minor 1259 nminor=${nminor#${nminor%???}} 1260 mkdev t$name$nminor c $chr $(($minor + $dialin )) "" "" $u_uucp 1261 mkdev d$name$nminor c $chr $(($minor + $dialout)) "" "" $u_uucp 1262 minor=$(($minor + 1)) 1263 done 1264 ;; 1265 1266ttyCZ[0-9]*) 1267 # Each unit number creates 64 pairs of {tty,dty} device nodes: 1268 # ttyCZ0 => device nodes [td]tyCZ0000 to [td]tyCZ0063; 1269 # ttyCZ1 => device nodes [td]tyCZ0064 to [td]tyCZ0127; 1270 name=tyCZ; chr=%cz_chr%; off=64 1271 unit=${i#t${name}} 1272 minor=$(($unit * $off)) 1273 eminor=$(($minor + $off)) 1274 while [ $minor -lt $eminor ] 1275 do 1276 nminor=0000$minor 1277 nminor=${nminor#${nminor%????}} 1278 mkdev t$name$nminor c $chr $(($minor + $dialin )) "" "" $u_uucp 1279 mkdev d$name$nminor c $chr $(($minor + $dialout)) "" "" $u_uucp 1280 minor=$(($minor + 1)) 1281 done 1282 ;; 1283 1284 1285tty[0-9]|tty0[0-9]) 1286 # some archs have built-in zstty (major %zstty_chr%) instead 1287 # of NS16550; create ttyZ* and hardlink as [dt]ty0*; this 1288 # needs to be before com entry, for archs which have both 1289 unit=${i#tty} 1290 unit=$(($unit + 0)) 1291 makedev ttyZ${unit} 1292 lndev ttyZ$unit tty0${unit} 1293 lndev dtyZ$unit dty0${unit} 1294 ;; 1295 1296tty[0-9]*) 1297 unit=${i#tty} 1298 ounit=00$unit 1299 ounit=${ounit#${ounit%??}} 1300 mkdev tty$ounit c %com_chr% $(($unit + $dialin )) "" "" $u_uucp 1301 mkdev dty$ounit c %com_chr% $(($unit + $dialout)) "" "" $u_uucp 1302 ;; 1303 1304ttyC[0-9]*) 1305 # some archs call com_chr ttyC traditionally 1306 unit=${i#ttyC}; name=ttyC; dname=dtyC; chr=%com_chr% 1307 mkdev $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp 1308 mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp 1309 ;; 1310 1311ttyh[0-9]*) 1312 unit=${i#ttyh}; name=ttyh; dname=dtyh; chr=%sabtty_chr% 1313 mkdev $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp 1314 mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp 1315 ;; 1316 1317ttyTX[0-9]*) 1318 unit=${i#ttyTX}; name=ttyTX0; dname=dtyTX0; chr=%txcom_chr% 1319 mkdev $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp 1320 mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp 1321 ;; 1322 1323ttyZ[0-9]*) 1324 unit=${i#ttyZ}; name=ttyZ; dname=dtyZ; chr=%zstty_chr% 1325 mkdev $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp 1326 mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp 1327 ;; 1328 1329opty) 1330 # Create 16 device nodes, [pt]typ0 to [pt]typf, 1331 # same as "MAKEDEV pty0". 1332 for j in 0 1 2 3 4 5 6 7 8 9 a b c d e f 1333 do 1334 case $j in 1335 [0-9]) jn=$j ;; 1336 a) jn=10 ;; 1337 b) jn=11 ;; 1338 c) jn=12 ;; 1339 d) jn=13 ;; 1340 e) jn=14 ;; 1341 f) jn=15 ;; 1342 esac 1343 mkdev ttyp$j c %pts_chr% $jn 666 1344 mkdev ptyp$j c %ptc_chr% $jn 666 1345 done 1346 ;; 1347 1348pty[0-9]*) 1349 # Each unit number creates up to 16 pairs of {tty,pty} device nodes: 1350 # pty0 => 16 pairs, [tp]typ0 to [tp]typf 1351 # pty1 => 16 pairs, [tp]tyq0 to [tp]tyqf 1352 # pty16 => 16 pairs, [tp]typg to [tp]typv 1353 # pty17 => 16 pairs, [tp]typw to [tp]typL 1354 # pty18 => 14 pairs, [tp]typM to [tp]typZ 1355 warn "$i: creating BSD style tty nodes with ptyfs is a security issue" 1356 class=${i#pty} 1357 d1="p q r s t u v w x y z P Q R S T" 1358 if [ "$class" -ge 64 ] 1359 then 1360 warn "$i: pty unit must be between 0 and 63" 1361 continue 1362 elif [ "$class" -lt 16 ] 1363 then 1364 # pty[p-zP-T][0-9a-f] 1365 offset=0 1366 mult=0 1367 d2="0 1 2 3 4 5 6 7 8 9 a b c d e f" 1368 else 1369 # pty[p-zP-T][g-zA-Z] 1370 class=$(($class - 16)) 1371 offset=256 1372 mult=2 1373 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" 1374 fi 1375 start=$(($class * 16)) 1376 set -- $d2 1377 nt=$# 1378 s1=$(($start / $nt)) 1379 set -- $d1 1380 shift $s1 1381 t1=$1 1382 if [ "$t1" = v ]; then 1383 warn "$i: pty unit conflicts with console ttyv0 device" 1384 continue 1385 fi 1386 s2=$(($start % ($nt - $s1 * $mult))) 1387 set -- $d2 1388 shift $s2 1389 t2=$1 1390 unit=$(($start + $offset - $s1 * $mult)) 1391 end=$(($unit + 16)) 1392 while [ "$unit" -lt "$end" ] 1393 do 1394 mkdev tty$t1$t2 c %pts_chr% $unit 666 1395 mkdev pty$t1$t2 c %ptc_chr% $unit 666 1396 shift 1397 t2=$1 1398 if [ -z "$t2" ] 1399 then 1400 break 1401 fi 1402 unit=$(($unit + 1)) 1403 done 1404 ;; 1405 1406stic[0-9]*) 1407 unit=${i#stic} 1408 mkdev stic$unit c %stic_chr% $unit 1409 ;; 1410 1411st[0-9]*) 1412 name=st; unit=${i#st}; chr=%st_chr%; blk=%st_blk% 1413 mkdev $name$unit b $blk $(($unit * 16 + 0)) 660 $g_operator 1414 mkdev n$name$unit b $blk $(($unit * 16 + 1)) 660 $g_operator 1415 mkdev e$name$unit b $blk $(($unit * 16 + 2)) 660 $g_operator 1416 mkdev en$name$unit b $blk $(($unit * 16 + 3)) 660 $g_operator 1417 mkdev r$name$unit c $chr $(($unit * 16 + 0)) 660 $g_operator 1418 mkdev nr$name$unit c $chr $(($unit * 16 + 1)) 660 $g_operator 1419 mkdev er$name$unit c $chr $(($unit * 16 + 2)) 660 $g_operator 1420 mkdev enr$name$unit c $chr $(($unit * 16 + 3)) 660 $g_operator 1421 ;; 1422 1423ses[0-9]*|ch[0-9]*|uk[0-9]*) 1424 case $i in 1425 ch*) name=ch; unit=${i#ch}; chr=%ch_chr%;; 1426 uk*) name=uk; unit=${i#uk}; chr=%uk_chr%;; 1427 ses*) name=ses; unit=${i#ses}; chr=%ses_chr%;; 1428 esac 1429 mkdev $name$unit c $chr $unit 640 $g_operator 1430 ;; 1431 1432cd[0-9]*) 1433 makedisk_minimal cd ${i#cd} %cd_blk% %cd_chr% 1434 ;; 1435 1436mcd[0-9]*) 1437 makedisk_minimal mcd ${i#mcd} %mcd_blk% %mcd_chr% 1438 ;; 1439 1440gdrom[0-9]*) 1441 makedisk_minimal gdrom ${i#gdrom} %gdrom_blk% %gdrom_chr% 1442 ;; 1443 1444lpt[0-9]*|lpa[0-9]*) 1445 case $i in 1446 lpt*) name=lpt; unit=${i#lpt}; chr=%lpt_chr%; flags=0;; 1447 lpa*) name=lpa; unit=${i#lpa}; chr=%lpt_chr%; flags=128;; 1448 esac 1449 mkdev $name$unit c $chr $(($unit + $flags)) 1450 mkdev lpt${unit}ctl c $chr $(($unit + 256)) 1451 ;; 1452 1453bpf) 1454 mkdev bpf c %bpf_chr% 0 1455 lndev bpf bpf0 1456 ;; 1457 1458npf) 1459 mkdev npf c %npf_chr% 0 1460 ;; 1461 1462bthub) 1463 mkdev bthub c %bthub_chr% 0 1464 ;; 1465 1466tun[0-9]*) 1467 unit=${i#tun} 1468 mkdev tun$unit c %tun_chr% $unit 1469 ;; 1470 1471joy[0-9]*) 1472 unit=${i#joy} 1473 mkdev joy$unit c %joy_chr% $unit 1474 ;; 1475 1476ipl) 1477 mkdev ipl c %ipl_chr% 0 1478 mkdev ipnat c %ipl_chr% 1 1479 mkdev ipstate c %ipl_chr% 2 1480 mkdev ipauth c %ipl_chr% 3 1481 mkdev ipsync c %ipl_chr% 4 1482 mkdev ipscan c %ipl_chr% 5 1483 mkdev iplookup c %ipl_chr% 6 1484 ;; 1485 1486pf) 1487 mkdev pf c %pf_chr% 0 1488 ;; 1489 1490crypto) 1491 mkdev crypto c %crypto_chr% 0 666 1492 ;; 1493 1494cmos) 1495 mkdev cmos c %cmos_chr% 0 644 1496 ;; 1497 1498speaker) 1499 mkdev speaker c %spkr_chr% 0 1500 ;; 1501 1502lockstat) 1503 mkdev lockstat c %lockstat_chr% 0 1504 ;; 1505 1506cpuctl) 1507 mkdev cpuctl c %cpuctl_chr% 0 666 1508 ;; 1509 1510audio|audio[0-9]*) 1511 unit=${i#audio} 1512 audio=audio$unit 1513 sound=sound$unit 1514 mixer=mixer$unit 1515 audioctl=audioctl$unit 1516 : ${unit:-0} 1517 mkdev $sound c %audio_chr% $(($unit + 0)) 666 1518 mkdev $audio c %audio_chr% $(($unit + 128)) 666 1519 mkdev $mixer c %audio_chr% $(($unit + 16)) 666 1520 mkdev $audioctl c %audio_chr% $(($unit + 192)) 666 1521 ;; 1522 1523hdaudio[0-9]*) 1524 unit=${i#hdaudio} 1525 mkdev hdaudio$unit c %hdaudio_chr% $unit 644 1526 ;; 1527 1528hdmicec[0-9]*) 1529 uint=${i#hdmicec} 1530 mkdev hdmicec$unit c %hdmicec_chr% $unit 644 1531 ;; 1532 1533gpio[0-9]*) 1534 unit=${i#gpio} 1535 mkdev gpio$unit c %gpio_chr% $unit 664 $g_gpio 1536 ;; 1537 1538lua[0-9]*) 1539 unit=${i#lua} 1540 mkdev lua$unit c %lua_chr% $unit 664 1541 ;; 1542 1543rmidi[0-9]*) 1544 unit=${i#rmidi} 1545 mkdev rmidi$unit c %midi_chr% $unit 666 1546 ;; 1547 1548music|music[0-9]*) 1549 unit=${i#music} 1550 : ${unit:-0} 1551 mkdev music$unit c %sequencer_chr% $(($unit + 0)) 666 1552 mkdev sequencer$unit c %sequencer_chr% $(($unit + 128)) 666 1553 ;; 1554 1555radio|radio[0-9]*) 1556 unit=${i#radio} 1557 : ${unit:-0} 1558 mkdev radio$unit c %radio_chr% $unit 666 1559 ;; 1560 1561video|video[0-9]*) 1562 unit=${i#video} 1563 : ${unit:-0} 1564 mkdev video$unit c %video_chr% $unit 666 1565 ;; 1566 1567dtv[0-9]*) 1568 unit=${i#dtv} 1569 makedir dvb 755 1570 makedir dvb/adapter$unit 755 1571 mkdev dvb/adapter$unit/frontend0 c %dtv_chr% $(($unit + 0)) 666 1572 mkdev dvb/adapter$unit/demux0 c %dtv_chr% $(($unit + 16)) 666 1573 mkdev dvb/adapter$unit/dvr0 c %dtv_chr% $(($unit + 32)) 666 1574 ;; 1575 1576iic[0-9]*) 1577 unit=${i#iic} 1578 : ${unit:-0} 1579 mkdev iic$unit c %iic_chr% $unit 600 1580 ;; 1581 1582amr[0-9]*) 1583 unit=${i#amr} 1584 mkdev amr$unit c %amr_chr% $unit 1585 ;; 1586 1587apm) 1588 mkdev apm c %apm_chr% 0 644 1589 mkdev apmctl c %apm_chr% 8 644 1590 ;; 1591 1592apm) 1593 # hpcmips uses `apmdev_chr' instead of `apm_chr' 1594 mkdev apm c %apmdev_chr% 0 644 1595 mkdev apmctl c %apmdev_chr% 8 644 1596 ;; 1597 1598satlink[0-9]*) 1599 unit=${i#satlink} 1600 mkdev satlink$unit c %satlink_chr% $unit 444 1601 ;; 1602 1603random) 1604 mkdev random c %rnd_chr% 0 444 1605 mkdev urandom c %rnd_chr% 1 644 1606 ;; 1607 1608cfs) 1609 makedev cfs0 1610 ;; 1611 1612cfs[0-9]*) 1613 unit=${i#cfs} 1614 mkdev cfs$unit c %vcoda_chr% $unit 1615 ;; 1616 1617sysmon) 1618 mkdev sysmon c %sysmon_chr% 0 644 1619 mkdev watchdog c %sysmon_chr% 1 644 1620 mkdev power c %sysmon_chr% 2 640 1621 ;; 1622 1623scsibus[0-9]*) 1624 unit=${i#scsibus} 1625 mkdev scsibus$unit c %scsibus_chr% $unit 644 1626 ;; 1627 1628bktr) 1629 makedev bktr0 bktr1 1630 lndev bktr0 bktr 1631 lndev tuner0 tuner 1632 lndev vbi0 vbi 1633 ;; 1634 1635bktr[0-9]*) 1636 unit=${i#bktr} 1637 mkdev bktr$unit c %bktr_chr% $(($unit + 0)) 444 1638 mkdev tuner$unit c %bktr_chr% $(($unit + 16)) 444 1639 mkdev vbi$unit c %bktr_chr% $(($unit + 32)) 444 1640 ;; 1641 1642io) 1643 mkdev io c %mem_chr% 14 600 1644 ;; 1645 1646iop[0-9]*) 1647 unit=${i#iop} 1648 mkdev iop$unit c %iop_chr% $unit 1649 ;; 1650 1651mfi[0-9]*) 1652 unit=${i#mfi} 1653 mkdev mfi$unit c %mfi_chr% $unit 1654 ;; 1655 1656mlx[0-9]*) 1657 unit=${i#mlx} 1658 mkdev mlx$unit c %mlx_chr% $unit 1659 ;; 1660 1661mly[0-9]*) 1662 unit=${i#mly} 1663 mkdev mly$unit c %mly_chr% $unit 1664 ;; 1665 1666twa[0-9]*) 1667 unit=${i#twa} 1668 mkdev twa$unit c %twa_chr% $unit 1669 ;; 1670 1671twe[0-9]*) 1672 unit=${i#twe} 1673 mkdev twe$unit c %twe_chr% $unit 1674 ;; 1675 1676icp[0-9]*) 1677 unit=${i#icp} 1678 mkdev icp$unit c %icp_chr% $unit 1679 ;; 1680 1681agp[0-9]*) 1682 unit=${i#agp} 1683 mkdev agp$unit c %agp_chr% $unit 644 1684 if [ "$unit" = "0" ]; then 1685 lndev agp$unit agpgart 1686 fi 1687 ;; 1688 1689pci[0-9]*) 1690 unit=${i#pci} 1691 mkdev pci$unit c %pci_chr% $unit 640 1692 ;; 1693 1694dpti[0-9]*) 1695 unit=${i#dpti} 1696 mkdev dpti$unit c %dpti_chr% $unit 1697 ;; 1698 1699dpt[0-9]*) 1700 unit=${i#dpt} 1701 mkdev dpt$unit c %dpt_chr% $unit 1702 ;; 1703 1704altq) 1705 makedir altq 755 1706 unit=0 1707 for dev in altq cbq wfq afm fifoq red rio localq hfsc cdnr blue priq jobs 1708 do 1709 mkdev altq/$dev c %altq_chr% $unit 644 1710 unit=$(($unit + 1)) 1711 done 1712 ;; 1713 1714isdn) 1715 mkdev isdn c %isdn_chr% 0 1716 ;; 1717 1718isdnctl) 1719 mkdev isdnctl c %isdnctl_chr% 0 1720 ;; 1721 1722isdnbchan[0-9]*) 1723 unit=${i#isdnbchan} 1724 mkdev isdnbchan$unit c %isdnbchan_chr% $unit 1725 ;; 1726 1727isdnteld[0-9]*) 1728 unit=${i#isdnteld} 1729 mkdev isdnteld$unit c %isdntel_chr% $(($unit + 64)) 1730 ;; 1731 1732isdntel[0-9]*) 1733 unit=${i#isdntel} 1734 mkdev isdntel$unit c %isdntel_chr% $unit 1735 ;; 1736 1737isdntrc[0-9]*) 1738 unit=${i#isdntrc} 1739 mkdev isdntrc$unit c %isdntrc_chr% $unit 1740 ;; 1741 1742wsfont) 1743 mkdev wsfont c %wsfont_chr% 0 1744 ;; 1745 1746cir[0-9]*) 1747 unit=${i#cir} 1748 mkdev cir$unit c %cir_chr% $unit 666 1749 ;; 1750 1751irframe[0-9]*) 1752 unit=${i#irframe} 1753 mkdev irframe$unit c %irframe_chr% $unit 1754 ;; 1755 1756fcom[0-9]*) 1757 unit=${i#fcom} 1758 mkdev fcom$unit c %fcom_chr% $unit "" "" $u_uucp 1759 ;; 1760 1761openfirm) 1762 mkdev openfirm c %openfirm_chr% 0 444 1763 ;; 1764 1765pad[0-9]*) 1766 unit=${i#pad} 1767 mkdev pad$unit c %pad_chr% $unit 444 1768 ;; 1769 1770qemufwcfg[0-9]*) 1771 unit=${i#qemufwcfg} 1772 mkdev qemufwcfg$unit c %qemufwcfg_chr% $unit 660 1773 ;; 1774 1775nvram) 1776 mkdev nvram c %nvram_chr% 0 644 1777 ;; 1778 1779rtc) 1780 mkdev rtc c %rtc_chr% 0 644 1781 ;; 1782 1783clockctl) 1784 mkdev clockctl c %clockctl_chr% 0 660 $g_ntpd 1785 ;; 1786 1787nsmb) 1788 makedev nsmb0 nsmb1 nsmb2 nsmb3 1789 ;; 1790 1791nsmb[0-9]*) 1792 unit=${i#nsmb} 1793 mkdev nsmb$unit c %nsmb_chr% $unit 644 1794 ;; 1795 1796kttcp) 1797 mkdev kttcp c %kttcp_chr% 0 1798 ;; 1799 1800dmoverio) 1801 mkdev dmoverio c %dmoverio_chr% 0 644 1802 ;; 1803 1804veriexec) 1805 mkdev veriexec c %veriexec_chr% 0 600 1806 ;; 1807 1808ttyv[0-9]*) 1809 unit=${i#ttyv} 1810 mkdev ttyv$unit c %pc_chr% $unit 1811 ;; 1812 1813# arm, acorn32 1814ttyv[0-9]*) 1815 unit=${i#ttyv} 1816 mkdev ttyv$unit c %physcon_chr% $unit 1817 ;; 1818 1819arcpp[0-9]*) 1820 unit=${i#arcpp} 1821 mkdev arcpp$unit c %arcpp_chr% $unit 1822 ;; 1823 1824par[0-9]*) 1825 unit=${i#par} 1826 case $unit in 1827 0) 1828 mkdev par$unit c %par_chr% $unit 1829 ;; 1830 *) 1831 warn "bad unit for par in: $i" 1832 ;; 1833 esac 1834 ;; 1835 1836cpi[0-9]*) 1837 unit=${i#cpi} 1838 mkdev cpi$unit c %cpi_chr% $unit 1839 ;; 1840 1841ite[0-9]*|ttye[0-9]*) 1842 case $i in 1843 ite*) unit=${i#ite};; 1844 ttye*) unit=${i#ttye};; 1845 esac 1846 mkdev ttye$unit c %ite_chr% $unit 1847 ;; 1848 1849pms[0-9]*) 1850 unit=${i#pms} 1851 mkdev pms$unit c %opms_chr% $unit 1852 ;; 1853 1854qms[0-9]*) 1855 unit=${i#qms} 1856 mkdev qms$unit c %qms_chr% $unit 1857 ;; 1858 1859lms[0-9]*) 1860 unit=${i#lms} 1861 mkdev lms$unit c %lms_chr% $unit 1862 ;; 1863 1864mms[0-9]*) 1865 unit=${i#mms} 1866 mkdev mms$unit c %mms_chr% $unit 1867 ;; 1868 1869mouse-pms[0-9]*|mouse-qms[0-9]*) 1870 case $i in 1871 mouse-pms*) name=pms ;; 1872 mouse-qms*) name=qms ;; 1873 esac 1874 unit=${i#mouse-${name}} 1875 lndev $name$unit mouse 1876 ;; 1877 1878kbd) 1879 mkdev kbd c %kbd_chr% 0 1880 ;; 1881 1882kbdctl) 1883 mkdev kbdctl c %kbd_chr% 1 1884 ;; 1885 1886vidcconsole0) 1887 mkdev vidcconsole0 c %vidcconsole_chr% 0 640 1888 ;; 1889 1890view[0-9]*) 1891 unit=${i#view} 1892 mkdev view$unit c %view_chr% $unit 666 1893 ;; 1894 1895mouse[0-9]*) 1896 unit=${i#mouse} 1897 case $unit in 1898 0|1) 1899 mkdev mouse$unit c %ms_chr% $unit 666 1900 if [ $unit = 0 ]; then 1901 lndev mouse$unit mouse 1902 fi 1903 ;; 1904 *) 1905 warn "bad unit for mouse in: $i" 1906 ;; 1907 esac 1908 ;; 1909 1910panel) 1911 mkdev panel0 c %panel_chr% 0 660 1912 ;; 1913 1914tslcd) 1915 mkdev tslcd0 c %tslcd_chr% 0 660 1916 ;; 1917 1918ipty) 1919 mkdev ttyp0 c %pts_chr% 0 666 1920 mkdev ttyp1 c %pts_chr% 1 666 1921 mkdev ptyp0 c %ptc_chr% 0 666 1922 mkdev ptyp1 c %ptc_chr% 1 666 1923 ;; 1924 1925ptm) 1926 makedir pts 755 1927 mkdev ptmx c %ptm_chr% 0 666 1928 mkdev ptm c %ptm_chr% 1 666 1929 ;; 1930 1931grf[0-9]*) 1932 unit=${i#grf} 1933 mkdev grf$unit c %grf_chr% $unit 666 1934 ;; 1935 1936etvme) 1937 mkdev etvme c %et_chr% 0 1938 ;; 1939 1940leo[0-9]*) 1941 unit=${i#leo} 1942 mkdev leo$unit c %leo_chr% $unit 1943 ;; 1944 1945scif[0-9]*) 1946 unit=${i#scif} 1947 mkdev scif$unit c %scif_chr% $(($unit + $dialin )) "" "" $u_uucp 1948 mkdev dscif$unit c %scif_chr% $(($unit + $dialout)) "" "" $u_uucp 1949 ;; 1950 1951sci[0-9]*) 1952 unit=${i#sci} 1953 mkdev sci$unit c %sci_chr% $(($unit + $dialin )) "" "" $u_uucp 1954 mkdev dsci$unit c %sci_chr% $(($unit + $dialout)) "" "" $u_uucp 1955 ;; 1956 1957maple[ABCD]|maple[ABCD][0-9]*) 1958 case $i in 1959 mapleA*) name="mapleA"; unit=0;; 1960 mapleB*) name="mapleB"; unit=1;; 1961 mapleC*) name="mapleC"; unit=2;; 1962 mapleD*) name="mapleD"; unit=3;; 1963 esac 1964 subunit=${i#$name} 1965 mkdev $name$subunit c %maple_chr% $(($unit * 8 + 0$subunit)) 1966 ;; 1967 1968mmem[0-9]*) 1969 unit=${i#mmem} 1970 for pt in 0 # 1 2 3 4 ... 255 1971 do 1972# mkdev mmem${unit}.${pt}a b %mmem_blk% $(($unit * 4096 + $pt * 16 + 0)) 640 $g_operator 1973 mkdev mmem${unit}.${pt}c b %mmem_blk% $(($unit * 4096 + $pt * 16 + 2)) 640 $g_operator 1974# mkdev rmmem${unit}.${pt}a c %mmem_chr% $(($unit * 4096 + $pt * 16 + 0)) 640 $g_operator 1975 mkdev rmmem${unit}.${pt}c c %mmem_chr% $(($unit * 4096 + $pt * 16 + 2)) 640 $g_operator 1976 done 1977 ;; 1978 1979mlcd[0-9]*) 1980 unit=${i#mlcd} 1981 for pt in 0 # 1 2 3 4 ... 255 1982 do 1983 mkdev mlcd${unit}.${pt} c %mlcd_chr% $(($unit * 256 + $pt)) 640 $g_operator 1984 done 1985 ;; 1986 1987ixpcom[0-9]*) 1988 unit=${i#ixpcom} 1989 mkdev ixpcom$unit c %ixpcom_chr% $unit "" "" $u_uucp 1990 ;; 1991 1992epcom[0-9]*) 1993 unit=${i#epcom} 1994 mkdev epcom$unit c %epcom_chr% $unit "" "" $u_uucp 1995 ;; 1996 1997plcom[0-9]*) 1998 unit=${i#plcom} 1999 mkdev plcom$unit c %plcom_chr% $unit "" "" $u_uucp 2000 mkdev dplcom$unit c %plcom_chr% $(($unit + $dialout)) "" "" $u_uucp 2001 ;; 2002 2003wmcom[0-9]*) 2004 unit=${i#wmcom} 2005 mkdev wmcom$unit c %wmcom_chr% $unit "" "" $u_uucp 2006 ;; 2007 2008ucbsnd) 2009 mkdev ucbsnd c %ucbsnd_chr% 0 666 2010 ;; 2011 2012adb) 2013 mkdev adb c %aed_chr% 0 666 2014 ;; 2015 2016asc[0-9]*) 2017 unit=${i#asc} 2018 mkdev asc$unit c %asc_chr% $unit 666 2019 ;; 2020 2021bwtwo[0-9]*) 2022 unit=${i#bwtwo} 2023 mkdev bwtwo$unit c %bwtwo_chr% $unit 666 2024 ;; 2025 2026cgtwo[0-9]*) 2027 unit=${i#cgtwo} 2028 mkdev cgtwo$unit c %cgtwo_chr% $unit 666 2029 ;; 2030 2031cgthree[0-9]*) 2032 unit=${i#cgthree} 2033 mkdev cgthree$unit c %cgthree_chr% $unit 666 2034 ;; 2035 2036cgfour[0-9]*) 2037 unit=${i#cgfour} 2038 mkdev cgfour$unit c %cgfour_chr% $unit 666 2039 ;; 2040 2041cgsix[0-9]*) 2042 unit=${i#cgsix} 2043 mkdev cgsix$unit c %cgsix_chr% $unit 666 2044 ;; 2045 2046cgeight[0-9]*) 2047 unit=${i#cgeight} 2048 mkdev cgeight$unit c %cgeight_chr% $unit 666 2049 ;; 2050 2051tcx[0-9]*) 2052 unit=${i#tcx} 2053 mkdev tcx$unit c %tcx_chr% $unit 666 2054 ;; 2055 2056xd[0-9]*|xy[0-9]*) 2057 case $i in 2058 xd*) name=xd; unit=${i#xd}; blk=%xd_blk%; chr=%xd_chr%;; 2059 xy*) name=xy; unit=${i#xy}; blk=%xy_blk%; chr=%xy_chr%;; 2060 esac 2061 %MKDISK% $name $unit $blk $chr 2062 ;; 2063 2064magma[0-9]*) 2065 unit=${i#magma} 2066 if [ 0$unit -gt 3 ]; then 2067 warn "bad unit for $i: $unit" 2068 break 2069 fi 2070 for j in 0 1 2 3 4 5 6 7 8 9 a b c d e f 2071 do 2072 case $j in 2073 [0-9]) jn=$j ;; 2074 a) jn=10 ;; 2075 b) jn=11 ;; 2076 c) jn=12 ;; 2077 d) jn=13 ;; 2078 e) jn=14 ;; 2079 f) jn=15 ;; 2080 esac 2081 mkdev tty$unit$j c %mtty_chr% $(($unit * 64 + $jn)) 2082 done 2083 mkdev bpp${unit}0 c %mbpp_chr% $(($unit * 64 + 0)) 2084 mkdev bpp${unit}1 c %mbpp_chr% $(($unit * 64 + 1)) 2085 ;; 2086 2087clcd[0-9]*) 2088 unit=${i#clcd} 2089 if [ 0$unit -gt 7 ]; then 2090 warn "bad unit for $i: $unit" 2091 break 2092 fi 2093 for j in 0 1 2 3 4 5 6 7 2094 do 2095 mkdev ttyA$unit$j c %clcd_chr% $(($unit * 8 + $j + $dialin)) "" "" $u_uucp 2096 mkdev dtyA$unit$j c %clcd_chr% $(($unit * 8 + $j + $dialout)) "" "" $u_uucp 2097 done 2098 ;; 2099 2100spif[0-9]*) 2101 unit=${i#spif} 2102 if [ 0$unit -gt 3 ]; then 2103 warn "bad unit for $i: $unit" 2104 break 2105 fi 2106 for j in 0 1 2 3 4 5 6 7; do 2107 mkdev ttyS$unit$j c %stty_chr% $(($unit * 64 + $j)) "" "" $u_uucp 2108 done 2109 mkdev bppS${unit}0 c %sbpp_chr% $(($unit * 64 + 0)) 2110 mkdev bppS${unit}1 c %sbpp_chr% $(($unit * 64 + 1)) 2111 ;; 2112 2113bpp|bpp[0-9]*) 2114 unit=${i#bpp} 2115 mkdev bpp$unit c %bpp_chr% $(($unit + 0)) 2116 ;; 2117 2118tctrl[0-9]*) 2119 unit=${i#tctrl} 2120 mkdev tctrl$unit c %tctrl_chr% $unit 666 2121 ;; 2122 2123bmd[0-9]*) 2124 unit=${i#bmd} 2125 mkdev bmd${unit}a b %bmd_blk% $(($unit * 8 + 0)) 640 $g_operator 2126 mkdev bmd${unit}c b %bmd_blk% $(($unit * 8 + 2)) 640 $g_operator 2127 mkdev rbmd${unit}a c %bmd_chr% $(($unit * 8 + 0)) 640 $g_operator 2128 mkdev rbmd${unit}c c %bmd_chr% $(($unit * 8 + 2)) 640 $g_operator 2129 ;; 2130 2131sram) 2132 mkdev sram c %sram_chr% 0 644 2133 ;; 2134 2135ttyS[0-9]*) 2136 unit=${i#ttyS} 2137 mkdev ttyS$unit c %sacom_chr% $(($unit + $dialin )) "" "" $u_uucp 2138 mkdev dtyS$unit c %sacom_chr% $(($unit + $dialout)) "" "" $u_uucp 2139 ;; 2140 2141atabus[0-9]*) 2142 unit=${i#atabus} 2143 mkdev atabus$unit c %atabus_chr% $unit 644 2144 ;; 2145 2146drm[0-9]*) 2147 unit=${i#drm} 2148 makedir dri 755 2149 mkdev dri/card$unit c %drm_chr% $unit 660 2150 ;; 2151 2152drvctl) 2153 mkdev drvctl c %drvctl_chr% 0 644 2154 ;; 2155 2156isv) 2157 mkdev isv c %isv_chr% 0 644 2158 ;; 2159 2160tap|tap[0-9]*) 2161 unit=${i#tap} 2162 case "$unit" in 2163 [0-9]*) 2164 mkdev tap${unit} c %tap_chr% ${unit} 600 2165 ;; 2166 "") 2167 mkdev tap c %tap_chr% 0xfffff 600 2168 ;; 2169 esac 2170 ;; 2171 2172tpm) 2173 mkdev tpm c %tpm_chr% 0 600 2174 ;; 2175 2176dtrace) 2177 makedir dtrace 755 2178 mkdev dtrace/dtrace c %dtrace_chr% 0 600 2179 ;; 2180 2181filemon) 2182 mkdev filemon c %filemon_chr% 0 666 2183 ;; 2184 2185fw[0-9]*) 2186 unit=${i#fw} 2187 for j in 0 1 2 3 2188 do 2189 mkdev fw${unit}.${j} c %fw_chr% $((${unit} * 256 + ${j})) 660 ${g_operator} 2190 mkdev fwmem${unit}.${j} c %fw_chr% $((65536 + ${unit} * 256 + ${j})) 660 ${g_operator} 2191 done 2192 ;; 2193 2194# create putter device and symlinks for all subsystems using it 2195putter) 2196 mkdev putter c %putter_chr% 0 600 2197 mkdev pud c %putter_chr% 1 600 2198 lndev putter puffs 2199 ;; 2200 2201zfs) 2202 mkdev zfs c %zfs_chr% 0 600 2203 makedir zpool 755 2204 ;; 2205 2206iscsi[0-9]*) 2207 unit=${i#iscsi} 2208 mkdev iscsi${unit} c %iscsi_chr% 0 600 2209 ;; 2210 2211vchiq) 2212 mkdev vchiq c %vchiq_chr% 0 600 2213 ;; 2214 2215nvme[0-9]*ns[0-9]*) 2216 unit=${i#nvme} 2217 unit=${unit%ns*} 2218 subunit=${i#nvme${unit}ns} 2219 if [ 0$subunit -le 0 -o 0$subunit -ge 65536 ]; then 2220 warn "bad nsid for $i: $subunit" 2221 break 2222 fi 2223 mkdev nvme${unit}ns$subunit c %nvme_chr% $(($unit * 65536 + $subunit)) 2224 ;; 2225 2226nvme[0-9]*) 2227 unit=${i#nvme} 2228 mkdev nvme$unit c %nvme_chr% $(($unit * 65536)) 2229 ;; 2230 2231autofs) 2232 mkdev autofs c %autofs_chr% 0 600 2233 ;; 2234 2235midevend) 2236%MI_DEVICES_END% 2237local) 2238 if [ -f "$0.local" ]; then 2239 umask 0 2240 if [ -n "$count_nodes" ]; then 2241 count_nodes=$((count_nodes + \ 2242 $(linecount "$("$HOST_SH" "$0.local" $opts -s all)") )) 2243 else 2244 "$HOST_SH" "$0.local" $opts all 2245 fi 2246 umask 077 2247 fi 2248 ;; 2249 2250*) 2251 warn "$i: unknown device" 2252 ;; 2253 2254esac 2255done 2256 2257} 2258 2259 2260# three variants of disk partitions - max 8, max 16, max 16 with highpartoffset 2261# hack; only the one used by port is retained in final MAKEDEV script 2262# routine is called as: 2263# makedisk name unit blk chr 2264makedisk_p8() 2265{ 2266 name="$1"; unit="$2"; blk="$3"; chr="$4" 2267 2268 ro=%RAWDISK_OFF% 2269 mkdev ${name}${unit} b $blk $(($unit * 8 + $ro)) 640 $g_operator 2270 mkdev r${name}${unit} c $chr $(($unit * 8 + $ro)) 640 $g_operator 2271 2272 mkdev ${name}${unit}a b $blk $(($unit * 8 + 0)) 640 $g_operator 2273 mkdev ${name}${unit}b b $blk $(($unit * 8 + 1)) 640 $g_operator 2274 mkdev ${name}${unit}c b $blk $(($unit * 8 + 2)) 640 $g_operator 2275 mkdev ${name}${unit}d b $blk $(($unit * 8 + 3)) 640 $g_operator 2276 mkdev ${name}${unit}e b $blk $(($unit * 8 + 4)) 640 $g_operator 2277 mkdev ${name}${unit}f b $blk $(($unit * 8 + 5)) 640 $g_operator 2278 mkdev ${name}${unit}g b $blk $(($unit * 8 + 6)) 640 $g_operator 2279 mkdev ${name}${unit}h b $blk $(($unit * 8 + 7)) 640 $g_operator 2280 mkdev r${name}${unit}a c $chr $(($unit * 8 + 0)) 640 $g_operator 2281 mkdev r${name}${unit}b c $chr $(($unit * 8 + 1)) 640 $g_operator 2282 mkdev r${name}${unit}c c $chr $(($unit * 8 + 2)) 640 $g_operator 2283 mkdev r${name}${unit}d c $chr $(($unit * 8 + 3)) 640 $g_operator 2284 mkdev r${name}${unit}e c $chr $(($unit * 8 + 4)) 640 $g_operator 2285 mkdev r${name}${unit}f c $chr $(($unit * 8 + 5)) 640 $g_operator 2286 mkdev r${name}${unit}g c $chr $(($unit * 8 + 6)) 640 $g_operator 2287 mkdev r${name}${unit}h c $chr $(($unit * 8 + 7)) 640 $g_operator 2288} 2289 2290makedisk_p12high() 2291{ 2292 ho=524280 # offset for partition 9 to 11 (same as ...p16high) 2293 name="$1"; unit="$2"; blk="$3"; chr="$4" 2294 2295 ro=%RAWDISK_OFF% 2296 mkdev ${name}${unit} b $blk $(($unit * 8 + $ro)) 640 $g_operator 2297 mkdev r${name}${unit} c $chr $(($unit * 8 + $ro)) 640 $g_operator 2298 2299 mkdev ${name}${unit}a b $blk $(($unit * 8 + 0)) 640 $g_operator 2300 mkdev ${name}${unit}b b $blk $(($unit * 8 + 1)) 640 $g_operator 2301 mkdev ${name}${unit}c b $blk $(($unit * 8 + 2)) 640 $g_operator 2302 mkdev ${name}${unit}d b $blk $(($unit * 8 + 3)) 640 $g_operator 2303 mkdev ${name}${unit}e b $blk $(($unit * 8 + 4)) 640 $g_operator 2304 mkdev ${name}${unit}f b $blk $(($unit * 8 + 5)) 640 $g_operator 2305 mkdev ${name}${unit}g b $blk $(($unit * 8 + 6)) 640 $g_operator 2306 mkdev ${name}${unit}h b $blk $(($unit * 8 + 7)) 640 $g_operator 2307 mkdev ${name}${unit}i b $blk $(($unit * 8 + $ho + 8)) 640 $g_operator 2308 mkdev ${name}${unit}j b $blk $(($unit * 8 + $ho + 9)) 640 $g_operator 2309 mkdev ${name}${unit}k b $blk $(($unit * 8 + $ho + 10)) 640 $g_operator 2310 mkdev ${name}${unit}l b $blk $(($unit * 8 + $ho + 11)) 640 $g_operator 2311 mkdev r${name}${unit}a c $chr $(($unit * 8 + 0)) 640 $g_operator 2312 mkdev r${name}${unit}b c $chr $(($unit * 8 + 1)) 640 $g_operator 2313 mkdev r${name}${unit}c c $chr $(($unit * 8 + 2)) 640 $g_operator 2314 mkdev r${name}${unit}d c $chr $(($unit * 8 + 3)) 640 $g_operator 2315 mkdev r${name}${unit}e c $chr $(($unit * 8 + 4)) 640 $g_operator 2316 mkdev r${name}${unit}f c $chr $(($unit * 8 + 5)) 640 $g_operator 2317 mkdev r${name}${unit}g c $chr $(($unit * 8 + 6)) 640 $g_operator 2318 mkdev r${name}${unit}h c $chr $(($unit * 8 + 7)) 640 $g_operator 2319 mkdev r${name}${unit}i c $chr $(($unit * 8 + $ho + 8)) 640 $g_operator 2320 mkdev r${name}${unit}j c $chr $(($unit * 8 + $ho + 9)) 640 $g_operator 2321 mkdev r${name}${unit}k c $chr $(($unit * 8 + $ho + 10)) 640 $g_operator 2322 mkdev r${name}${unit}l c $chr $(($unit * 8 + $ho + 11)) 640 $g_operator 2323} 2324 2325makedisk_p16() 2326{ 2327 name="$1"; unit="$2"; blk="$3"; chr="$4" 2328 2329 ro=%RAWDISK_OFF% 2330 mkdev ${name}${unit} b $blk $(($unit * 16 + $ro)) 640 $g_operator 2331 mkdev r${name}${unit} c $chr $(($unit * 16 + $ro)) 640 $g_operator 2332 2333 mkdev ${name}${unit}a b $blk $(($unit * 16 + 0)) 640 $g_operator 2334 mkdev ${name}${unit}b b $blk $(($unit * 16 + 1)) 640 $g_operator 2335 mkdev ${name}${unit}c b $blk $(($unit * 16 + 2)) 640 $g_operator 2336 mkdev ${name}${unit}d b $blk $(($unit * 16 + 3)) 640 $g_operator 2337 mkdev ${name}${unit}e b $blk $(($unit * 16 + 4)) 640 $g_operator 2338 mkdev ${name}${unit}f b $blk $(($unit * 16 + 5)) 640 $g_operator 2339 mkdev ${name}${unit}g b $blk $(($unit * 16 + 6)) 640 $g_operator 2340 mkdev ${name}${unit}h b $blk $(($unit * 16 + 7)) 640 $g_operator 2341 mkdev ${name}${unit}i b $blk $(($unit * 16 + 8)) 640 $g_operator 2342 mkdev ${name}${unit}j b $blk $(($unit * 16 + 9)) 640 $g_operator 2343 mkdev ${name}${unit}k b $blk $(($unit * 16 + 10)) 640 $g_operator 2344 mkdev ${name}${unit}l b $blk $(($unit * 16 + 11)) 640 $g_operator 2345 mkdev ${name}${unit}m b $blk $(($unit * 16 + 12)) 640 $g_operator 2346 mkdev ${name}${unit}n b $blk $(($unit * 16 + 13)) 640 $g_operator 2347 mkdev ${name}${unit}o b $blk $(($unit * 16 + 14)) 640 $g_operator 2348 mkdev ${name}${unit}p b $blk $(($unit * 16 + 15)) 640 $g_operator 2349 mkdev r${name}${unit}a c $chr $(($unit * 16 + 0)) 640 $g_operator 2350 mkdev r${name}${unit}b c $chr $(($unit * 16 + 1)) 640 $g_operator 2351 mkdev r${name}${unit}c c $chr $(($unit * 16 + 2)) 640 $g_operator 2352 mkdev r${name}${unit}d c $chr $(($unit * 16 + 3)) 640 $g_operator 2353 mkdev r${name}${unit}e c $chr $(($unit * 16 + 4)) 640 $g_operator 2354 mkdev r${name}${unit}f c $chr $(($unit * 16 + 5)) 640 $g_operator 2355 mkdev r${name}${unit}g c $chr $(($unit * 16 + 6)) 640 $g_operator 2356 mkdev r${name}${unit}h c $chr $(($unit * 16 + 7)) 640 $g_operator 2357 mkdev r${name}${unit}i c $chr $(($unit * 16 + 8)) 640 $g_operator 2358 mkdev r${name}${unit}j c $chr $(($unit * 16 + 9)) 640 $g_operator 2359 mkdev r${name}${unit}k c $chr $(($unit * 16 + 10)) 640 $g_operator 2360 mkdev r${name}${unit}l c $chr $(($unit * 16 + 11)) 640 $g_operator 2361 mkdev r${name}${unit}m c $chr $(($unit * 16 + 12)) 640 $g_operator 2362 mkdev r${name}${unit}n c $chr $(($unit * 16 + 13)) 640 $g_operator 2363 mkdev r${name}${unit}o c $chr $(($unit * 16 + 14)) 640 $g_operator 2364 mkdev r${name}${unit}p c $chr $(($unit * 16 + 15)) 640 $g_operator 2365} 2366 2367makedisk_p16high() 2368{ 2369 ho=524280 # offset for partition 9 to 16 2370 name="$1"; unit="$2"; blk="$3"; chr="$4" 2371 2372 ro=%RAWDISK_OFF% 2373 mkdev ${name}${unit} b $blk $(($unit * 8 + $ro)) 640 $g_operator 2374 mkdev r${name}${unit} c $chr $(($unit * 8 + $ro)) 640 $g_operator 2375 2376 mkdev ${name}${unit}a b $blk $(($unit * 8 + 0)) 640 $g_operator 2377 mkdev ${name}${unit}b b $blk $(($unit * 8 + 1)) 640 $g_operator 2378 mkdev ${name}${unit}c b $blk $(($unit * 8 + 2)) 640 $g_operator 2379 mkdev ${name}${unit}d b $blk $(($unit * 8 + 3)) 640 $g_operator 2380 mkdev ${name}${unit}e b $blk $(($unit * 8 + 4)) 640 $g_operator 2381 mkdev ${name}${unit}f b $blk $(($unit * 8 + 5)) 640 $g_operator 2382 mkdev ${name}${unit}g b $blk $(($unit * 8 + 6)) 640 $g_operator 2383 mkdev ${name}${unit}h b $blk $(($unit * 8 + 7)) 640 $g_operator 2384 mkdev ${name}${unit}i b $blk $(($unit * 8 + $ho + 8)) 640 $g_operator 2385 mkdev ${name}${unit}j b $blk $(($unit * 8 + $ho + 9)) 640 $g_operator 2386 mkdev ${name}${unit}k b $blk $(($unit * 8 + $ho + 10)) 640 $g_operator 2387 mkdev ${name}${unit}l b $blk $(($unit * 8 + $ho + 11)) 640 $g_operator 2388 mkdev ${name}${unit}m b $blk $(($unit * 8 + $ho + 12)) 640 $g_operator 2389 mkdev ${name}${unit}n b $blk $(($unit * 8 + $ho + 13)) 640 $g_operator 2390 mkdev ${name}${unit}o b $blk $(($unit * 8 + $ho + 14)) 640 $g_operator 2391 mkdev ${name}${unit}p b $blk $(($unit * 8 + $ho + 15)) 640 $g_operator 2392 mkdev r${name}${unit}a c $chr $(($unit * 8 + 0)) 640 $g_operator 2393 mkdev r${name}${unit}b c $chr $(($unit * 8 + 1)) 640 $g_operator 2394 mkdev r${name}${unit}c c $chr $(($unit * 8 + 2)) 640 $g_operator 2395 mkdev r${name}${unit}d c $chr $(($unit * 8 + 3)) 640 $g_operator 2396 mkdev r${name}${unit}e c $chr $(($unit * 8 + 4)) 640 $g_operator 2397 mkdev r${name}${unit}f c $chr $(($unit * 8 + 5)) 640 $g_operator 2398 mkdev r${name}${unit}g c $chr $(($unit * 8 + 6)) 640 $g_operator 2399 mkdev r${name}${unit}h c $chr $(($unit * 8 + 7)) 640 $g_operator 2400 mkdev r${name}${unit}i c $chr $(($unit * 8 + $ho + 8)) 640 $g_operator 2401 mkdev r${name}${unit}j c $chr $(($unit * 8 + $ho + 9)) 640 $g_operator 2402 mkdev r${name}${unit}k c $chr $(($unit * 8 + $ho + 10)) 640 $g_operator 2403 mkdev r${name}${unit}l c $chr $(($unit * 8 + $ho + 11)) 640 $g_operator 2404 mkdev r${name}${unit}m c $chr $(($unit * 8 + $ho + 12)) 640 $g_operator 2405 mkdev r${name}${unit}n c $chr $(($unit * 8 + $ho + 13)) 640 $g_operator 2406 mkdev r${name}${unit}o c $chr $(($unit * 8 + $ho + 14)) 640 $g_operator 2407 mkdev r${name}${unit}p c $chr $(($unit * 8 + $ho + 15)) 640 $g_operator 2408} 2409 2410# make only the very few basic disk device nodes - 'a' partition 2411# and raw partition 2412makedisk_minimal() 2413{ 2414 name=$1; unit=$2; blk=$3; chr=$4 2415 doff=%DISKMINOROFFSET% 2416 ro=%RAWDISK_OFF% 2417 rn=%RAWDISK_NAME% 2418 2419 mkdev ${name}${unit} b $blk $(($unit * $doff + $ro)) 640 $g_operator 2420 mkdev r${name}${unit} c $chr $(($unit * $doff + $ro)) 640 $g_operator 2421 2422 mkdev ${name}${unit}a b $blk $(($unit * $doff + 0)) 640 $g_operator 2423 mkdev ${name}${unit}$rn b $blk $(($unit * $doff + $ro)) 640 $g_operator 2424 mkdev r${name}${unit}a c $chr $(($unit * $doff + 0)) 640 $g_operator 2425 mkdev r${name}${unit}$rn c $chr $(($unit * $doff + $ro)) 640 $g_operator 2426} 2427 2428# create_mfs_dev nodes 2429# Create a memory file system for a given number of device nodes, 2430# and mount it. Attempts to use mount_tmpfs, or falls back to 2431# mount_mfs. 2432# 2433# If do_redirect, then also redirect output to the console. 2434# 2435create_mfs_dev() 2436{ 2437 ndevnodes=${1-1200} 2438 dev_mountpoint=${PWD:-/dev} 2439 2440 # Number of inodes is the specified number of device nodes, plus 2441 # a margin to allow for extra device nodes created later. 2442 ninode=$((ndevnodes * 11 / 10)) 2443 # Add 2 reserved inodes (needed for both mfs and tmpfs), and round 2444 # up to a multiple of 32 (needed for mfs, not needed for tmpfs). 2445 ninode=$(( (ninode + 2 + 31) / 32 * 32 )) 2446 # Try tmpfs; if that fails try mfs. 2447 # 2448 # For tmpfs, allocate 16KB and 512 byte per node. 2449 # Actual requirements are much lower, but the size limit 2450 # is only intended to avoid accidental writing to /dev. 2451 fs_bytes=$((16384 + ninode * 512)) 2452 if mount_tmpfs -s $fs_bytes -n $ninode -m 0755 \ 2453 -o union tmpfs "$dev_mountpoint" 2454 then 2455 fstype=tmpfs 2456 else 2457 # This file system size calculation is exact for mount_mfs(8) 2458 # with 512-byte sectors. 40960 bytes (80 blocks) is the 2459 # minimum size allowed by mount_mfs. 2460 fs_bytes=$((8192 + 2 * 8192 + 4096 + ninode*512 + 8192)) 2461 [ "$fs_bytes" -lt 40960 ] && fs_bytes=40960 2462 fs_blocks=$((fs_bytes/512)) 2463 if mount_mfs -b 4096 -f 512 -s $fs_blocks -n $ninode -p 0755 \ 2464 -o union swap "$dev_mountpoint" 2465 then 2466 fstype=mfs 2467 else 2468 die "Failed to create memory file system" 2469 fi 2470 fi 2471 2472 # Our current directory was in the lower file system; change it to 2473 # the newly mounted upper file system. 2474 cd "$dev_mountpoint" 2475 2476 if $do_redirect; then 2477 # Redirect stdout and stderr to console 2478 ${MKNOD} -m 600 -g 0 -u 0 temp_console c %CONSOLE_CMAJOR% 0 2479 exec >temp_console 2>&1 2480 rm temp_console 2481 fi 2482 2483 echo "Created $fstype $dev_mountpoint" \ 2484 "($fs_bytes byte, $ninode inodes)" 2485} 2486 2487# 2488# MAIN: If MAKEDEV_AS_LIBRARY is set, then we are being used as a 2489# function library, so just return. Otherwise, do all the real work. 2490# 2491[ -n "${MAKEDEV_AS_LIBRARY}" ] && return 2492makedev_main makedev ${1+"$@"} 2493