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