1 #!/bin/sh - 2 # $NetBSD: MAKEDEV.tmpl,v 1.237 2025/03/28 18:41:25 riastradh 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 # virtio virtio(4)-related 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 # ttyVI?? viocon(4) 153 # 154 # Terminal multiplexors: 155 # dc* 4 channel serial interface (keyboard, mouse, modem, printer) 156 # dh* UNIBUS DH11 and emulations (e.g. Able DMAX, Emulex CS-11) 157 # dhu* UNIBUS DHU11 158 # dl* UNIBUS DL11 159 # dmf* UNIBUS DMF32 160 # dmz* UNIBUS DMZ32 161 # dz* UNIBUS DZ11 and DZ32 162 # scc* 82530 serial interface 163 # 164 # Call units: 165 # dn* UNIBUS DN11 and emulations (e.g. Able Quadracall) 166 # 167 # Pseudo terminals: 168 # ptm pty multiplexor device, and pts directory 169 # pty* set of 16 master and slave pseudo terminals 170 # opty first 16 ptys, to save inodes on install media 171 # ipty first 2 ptys, for install media use only 172 # 173 # Printers: 174 # arcpp* Archimedes parallel port 175 # lpt* stock lp 176 # lpa* interruptless lp 177 # par* Amiga motherboard parallel port 178 # cpi* Macintosh Nubus CSI parallel printer card 179 # 180 # USB devices: 181 # usb* USB control devices 182 # uhid* USB generic HID devices 183 # ulpt* USB printer devices 184 # ugen* USB generic devices 185 # ttyHS* USB Option N.V. modems 186 # ttyU* USB modems 187 # ttyY* USB serial adapters 188 # 189 # Video devices: 190 # bwtwo* monochromatic frame buffer 191 # cgtwo* 8-bit color frame buffer 192 # cgthree* 8-bit color frame buffer 193 # cgfour* 8-bit color frame buffer 194 # cgsix* accelerated 8-bit color frame buffer 195 # cgeight* 24-bit color frame buffer 196 # etvme Tseng et-compatible cards on VME (atari) 197 # ik* UNIBUS interface to Ikonas frame buffer 198 # leo Circad Leonardo VME-bus true color (atari) 199 # ps* UNIBUS interface to Picture System 2 200 # qv* QVSS (MicroVAX) display 201 # tcx* accelerated 8/24-bit color frame buffer 202 # 203 # Maple bus devices: 204 # maple Maple bus control devices 205 # mlcd* Maple bus LCD devices 206 # mmem* Maple bus storage devices 207 # 208 # IEEE1394 bus devices: 209 # fw* IEEE1394 bus generic node access devices 210 # fwmem* IEEE1394 bus physical memory of the remote node access devices 211 # 212 # Special purpose devices: 213 # ad* UNIBUS interface to Data Translation A/D converter 214 # agp* AGP GART devices 215 # altq ALTQ control interface 216 # amr* AMI MegaRaid control device 217 # apm power management device 218 # audio* audio devices 219 # bell* OPM bell device (x68k) 220 # bktr Brooktree 848/849/878/879 based TV cards 221 # bpf packet filter 222 # bthub Bluetooth Device Hub control interface 223 # cfs* Coda file system device 224 # ch* SCSI media changer 225 # cir* Consumer IR 226 # clockctl clock control for non root users 227 # cpuctl CPU control 228 # crypto hardware crypto access driver 229 # dmoverio hardware-assisted data movers 230 # dpt* DPT/Adaptec EATA RAID management interface 231 # dpti* DPT/Adaptec I2O RAID management interface 232 # drm* Direct Rendering Manager interface 233 # dtv* Digital TV interface 234 # fb* PMAX generic framebuffer pseudo-device 235 # fd file descriptors 236 # gpioirq* Interrupts on GPIO pins 237 # gpiopps* 1PPS signals on GPIO pins 238 # grf* graphics frame buffer device 239 # hdaudio* High Definition audio control device 240 # hdmicec* HDMI CEC devices 241 # hil HP300 HIL input devices 242 # icp ICP-Vortex/Intel RAID control interface 243 # iic* IIC bus device 244 # io x86 IOPL access for COMPAT_10, COMPAT_FREEBSD 245 # iop* I2O IOP control interface 246 # ipmi* OpenIPMI compatible interface 247 # ipl IP Filter 248 # irframe* IrDA physical frame 249 # ite* terminal emulator interface to HP300 graphics devices 250 # joy* joystick device 251 # kttcp kernel ttcp helper device 252 # lockstat kernel locking statistics 253 # magma* Magma multiport serial/parallel cards 254 # midi* MIDI 255 # mfi* LSI MegaRAID/MegaSAS control interface 256 # mlx* Mylex DAC960 control interface 257 # mly* Mylex AcceleRAID/eXtremeRAID control interface 258 # np* UNIBUS Ethernet co-processor interface, for downloading. 259 # npf NPF packet filter 260 # nvme* Non-Volatile Memory Host Controller Interface device driver 261 # nvme*ns* Non-Volatile Memory namespace 262 # nvmm NetBSD Virtual Machine Monitor 263 # openfirm OpenFirmware accessor 264 # pad* Pseudo-audio device driver 265 # pci* PCI bus access devices 266 # pf PF packet filter 267 # putter Pass-to-Userspace Transporter 268 # px* PixelStamp Xserver access 269 # qemufwcfg* QEMU Firmware Configuration 270 # radio* radio devices 271 # random Random number generator 272 # rtc* RealTimeClock 273 # scmd* Sparkfun Serial Controlled Motor Driver 274 # scsibus* SCSI busses 275 # se* SCSI Ethernet 276 # ses* SES/SAF-TE SCSI Devices 277 # sht3xtemp* Sensirion SHT3X temperature and humidity device driver 278 # speaker PC speaker (XXX - installed) 279 # spi* SPI bus device 280 # sram battery backuped memory (x68k) 281 # srt* source-address based routing 282 # ss* SCSI scanner 283 # stic* PixelStamp interface chip 284 # sysmon System Monitoring hardware 285 # tap* virtual Ethernet device 286 # tprof task profiler 287 # tun* network tunnel driver 288 # twa 3ware Apache control interface 289 # twe 3ware Escalade control interface 290 # uk* unknown SCSI device 291 # veriexec Veriexec fingerprint loader 292 # vhci virtual host controller interface 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 325 usage() 326 { 327 cat 1>&2 << _USAGE_ 328 Usage: ${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 # 345 zeropad() 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 # 361 hexprint() 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 # 376 linecount() 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 # 394 nooutput() 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 # 410 check_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 # 420 check_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 # 430 setup() 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 passed 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_nvmm="%gid_nvmm%" 507 g_operator="%gid_operator%" 508 g_wheel="%gid_wheel%" 509 dialin=0 510 dialout=524288 511 callunit=262144 512 513 # only allow read&write for owner by default 514 umask 077 515 516 # Set fdesc_mounted=true if the fdesc file system is mounted 517 # on the current directory (typically "/dev"). 518 # Later, this will be used to suppress creation of device nodes 519 # that are supplied by the fdesc file system. 520 # 521 fdesc_mounted=false 522 if [ -d fd ]; then 523 # Parse the output from "mount -u -o nosuchoption .". 524 # We don't parse the output from df(1) because that's 525 # less likely to be available on install media. 526 # 527 # If the current directory is a mount point for the 528 # fdesc file system, then the expected output (whether 529 # or not the current user is root) is: 530 # mount_fdesc: -o suchoption: option not supported. 531 # 532 # If the current directory is not a mount point, then 533 # the expected output is: 534 # mount: .: unknown special file or file system. 535 # 536 # If we are not running on NetBSD, or mount(8) is not 537 # found, then we should get some other error message. 538 # 539 case "$({ LC_ALL=C mount -u -o nosuchoption . ; } 2>&1)" in 540 *mount_fdesc*) fdesc_mounted=true ;; 541 esac 542 fi 543 544 # do_force requires mknod 545 if $do_force; then 546 if $do_mtree || $do_pax || $do_specfile; then 547 die "-f option works only with mknod" 548 fi 549 do_mknod=true 550 fi 551 552 # do_force and do_update do not work together 553 if $do_force && $do_update; then 554 die "-f and -u options do not work together" 555 fi 556 557 # If no explicit method was specified on the command line or 558 # forced above, then use one of mtree, pax, or mknod, in that 559 # order of preference. 560 # 561 # mtree is preferred because it's fast and designed for the 562 # purpose. However, it's unlikely to be available early in the 563 # boot sequence, when init(8) may invoke MAKEDEV(8). 564 # 565 # pax is usually acceptable, and it's likely to be available 566 # early in the boot sequence. However, it's much slower than mtree. 567 # 568 # mknod is just very slow, because the shell has to fork for 569 # each device node. 570 # 571 572 case ",${do_mtree},,${do_pax},,${do_mknod},,${do_specfile}," in 573 ( ,false,,false,,false,,false, ) 574 if check_mtree "${TOOL_MTREE}"; then 575 do_mtree=true 576 elif check_pax "${TOOL_PAX}"; then 577 do_pax=true 578 else 579 do_mknod=true 580 fi 581 ;; 582 ( *,true,*,true,* ) 583 die "-m, -p, -s, and -t options are mutually exclusive" 584 ;; 585 esac 586 587 # If we are using mknod, then decide what options to pass it. 588 MKNOD="${TOOL_MKNOD:-mknod} -F netbsd" 589 if $do_mknod; then 590 if $do_force; then 591 MKNOD="${MKNOD} -R" 592 else 593 MKNOD="${MKNOD} -r" 594 fi 595 fi 596 597 # do_mtree or do_pax internally implies do_specfile. 598 # This happens after checking for mutually-exclusive options. 599 if $do_mtree || $do_pax && ! $do_specfile; then 600 do_specfile=true 601 opts="${opts} -s" 602 fi 603 } 604 605 # specfile_before 606 # This is called before the bulk of the makedev processing, 607 # if do_specfile is set. 608 # 609 # It simply prints ". type=dir optional", which must be the 610 # first line of the specfile. 611 # 612 specfile_before() 613 { 614 echo ". type=dir optional" 615 } 616 617 # mtree_after 618 # Output in specfile format is piped into this function. 619 # 620 # It uses mtree to create the devices defined in the specfile. 621 # 622 mtree_after() 623 { 624 nooutput -1 "${TOOL_MTREE}" -e -U 625 } 626 627 # pax_after 628 # Output in specfile format is piped into this function. 629 # 630 # It uses pax to create the devices defined in the specfile. 631 # 632 pax_after() 633 { 634 # Run pax in an empty directory, so it pays 635 # attention only to the specfile, without being 636 # confused by the existing contents of the target 637 # directory. Without this, pax would complain "file 638 # would overwrite itself" for already-existing 639 # device nodes. 640 tmpdir=./tmp.$$ 641 mkdir "${tmpdir}" || die "can't create temporary directory" 642 cd "${tmpdir}" || die "can't cd to temporary directory" 643 "${TOOL_PAX}" -r -w -M -pe .. 644 pax_status=$? 645 cd .. # back to where we started 646 rmdir "${tmpdir}" 647 return $pax_status 648 } 649 650 # makedev_main makedev_name args... 651 # Perform most of the work of the main program. makedev_name 652 # is typically "makedev", but may be the name of some other 653 # makedev-like function (if we are invoked from MAKEDEV.local or 654 # some other script). The other args to this function are the 655 # command line args with which the MAKEDEV (or MAKEDEV.local) 656 # script was invoked. 657 # 658 makedev_main() 659 { 660 local makedev="$1" ; shift 661 662 # Parse command line args 663 setup ${1+"$@"} 664 shift $((${OPTIND}-1)) 665 666 if $do_create_mfs; then 667 # Count inodes and create mfs file system. 668 # The makedev call merely updates $count_nodes. 669 count_nodes=0 670 $makedev ${1+"$@"} 671 create_mfs_dev $count_nodes 672 unset count_nodes 673 fi 674 675 # Set before, middle, and after variables, so we can do 676 # something like "( $before && $middle ) | $after", 677 # except it will have to be more complex so we can capture 678 # the exit status from both sides of the pipe. 679 # 680 if $do_specfile; then 681 before=specfile_before 682 else 683 before=: 684 fi 685 middle='$makedev ${1+"$@"} && (exit $status)' 686 if $do_mtree; then 687 after=mtree_after 688 elif $do_pax ; then 689 after=pax_after 690 else 691 after=cat 692 fi 693 694 # Actually perform the "{ $before && $middle } | $after" commands. 695 # 696 # We go to some trouble to ensure that, if any of 697 # $before, $middle, or $after fails, then we also 698 # exit with a non-zero status. 699 # 700 # In the block below, fd 3 is a copy of the original stdout, 701 # and fd 4 goes to a subshell that analyses the exit status 702 # status from the other commands. 703 # 704 { 705 exec 3>&1; 706 { 707 { eval "$before" && eval "$middle"; echo $? >&4; } \ 708 | { eval "$after"; echo $? >&4; } \ 709 } 4>&1 1>&3 \ 710 | ( 711 read status1; 712 read status2; 713 case "$status1,$status2" in 714 0,0) exit 0;; 715 0,*) exit $status2;; 716 *,*) exit $status1;; 717 esac 718 ) 719 } 720 } 721 722 # 723 # functions available to create nodes: 724 # 725 # mkdev name [b|c] major minor [mode{=600} [gid{=0} [uid{=0}]]] 726 # create device node `name' with the appropriate permissions 727 # 728 # lndev src target 729 # create a symlink from src to target 730 # 731 # makedir dir mode 732 # create directory with appropriate mode 733 # 734 735 mkdev() 736 { 737 if [ -n "$count_nodes" ]; then 738 count_nodes=$((count_nodes + 1)) 739 return 740 fi 741 if $do_update && test -e $1; then 742 return 743 fi 744 if $do_specfile; then 745 case $2 in 746 b) type=block ;; 747 c) type=char ;; 748 esac 749 echo "./$1 type=${type} device=netbsd,$3,$4 mode=${5:-600} gid=${6:-$g_wheel} uid=${7:-$u_root}" 750 else 751 ${MKNOD} -m ${5:-600} -g \#${6:-$g_wheel} -u \#${7:-$u_root} $1 $2 $3 $4 752 fi 753 } 754 755 lndev() 756 { 757 if [ -n "$count_nodes" ]; then 758 count_nodes=$((count_nodes + 1)) 759 return 760 fi 761 if $do_update && test -e $2; then 762 return 763 fi 764 if $do_specfile; then 765 echo "./$2 type=link link=$1 mode=0700 gid=$g_wheel uid=$u_root" 766 else 767 ln -f -s $1 $2 768 fi 769 } 770 771 makedir() 772 { 773 if [ -n "$count_nodes" ]; then 774 count_nodes=$((count_nodes + 1)) 775 return 776 fi 777 if $do_update && test -e $1; then 778 return 779 fi 780 if $do_specfile; then 781 echo "./$1 type=dir mode=$2 gid=$g_wheel uid=$u_root" 782 else 783 nooutput -2 mkdir $1 784 chmod $2 $1 785 fi 786 } 787 788 warn() 789 { 790 echo 1>&2 "$0: $*" 791 status=1 792 } 793 794 die() 795 { 796 echo 1>&2 "$0: $*" 797 exit 1 798 } 799 800 # makedev special [...] 801 # the main loop 802 # 803 makedev() 804 { 805 806 for i 807 do 808 809 case $i in 810 811 %MD_DEVICES% 812 813 all) 814 makedev all_md 815 makedev std fd ptm 816 makedev dk0 dk1 dk2 dk3 dk4 dk5 dk6 dk7 817 makedev dk8 dk9 dk10 dk11 dk12 dk13 dk14 dk15 818 makedev dk16 dk17 dk18 dk19 dk20 dk21 dk22 dk23 819 makedev dk24 dk25 dk26 dk27 dk28 dk29 dk30 dk31 820 makedev ccd0 ccd1 ccd2 ccd3 821 makedev cgd0 cgd1 cgd2 cgd3 cgd4 cgd5 cgd6 cgd7 822 makedev fss0 fss1 fss2 fss3 823 makedev md0 md1 824 makedev raid0 raid1 raid2 raid3 raid4 raid5 raid6 raid7 825 makedev vnd0 vnd1 vnd2 vnd3 826 makedev iscsi0 827 makedev bpf npf 828 makedev tun0 tun1 tun2 tun3 829 makedev ipl pf crypto random 830 makedev lockstat clockctl cpuctl 831 makedev atabus0 atabus1 atabus2 atabus3 atabus4 atabus5 atabus6 atabus7 832 makedev srt0 srt1 srt2 srt3 833 makedev tap tap0 tap1 tap2 tap3 834 makedev gpio gpio0 gpio1 gpio2 gpio3 gpio4 gpio5 gpio6 gpio7 835 makedev gpioirq0 gpiopps0 836 makedev pad pad0 pad1 pad2 pad3 837 makedev bthub 838 makedev putter 839 makedev drvctl 840 makedev video 841 makedev dtv 842 makedev drm0 drm1 drm2 drm3 843 makedev altmem 844 makedev zfs 845 makedev lua 846 makedev hdmicec0 847 makedev dtrace 848 makedev veriexec 849 makedev autofs 850 makedev fw0 fw1 fw2 fw3 851 makedev ipmi0 852 makedev qemufwcfg 853 makedev sht3xtemp0 854 makedev scmd0 855 makedev local # do this last 856 ;; 857 858 init) 859 # unless overridden by MD entry, this is equal to 'all' 860 makedev all opty 861 ;; 862 863 %MI_DEVICES_BEGIN% 864 audio) 865 makedev audio0 audio1 audio2 audio3 866 makedev hdaudio0 hdaudio1 hdaudio2 hdaudio3 867 lndev sound0 sound 868 lndev audio0 audio 869 lndev mixer0 mixer 870 lndev audioctl0 audioctl 871 ;; 872 873 emcfan[0-9]*) 874 unit=${i#emcfan} 875 mkdev emcfan$unit c %emcfan_chr% $unit 660 876 ;; 877 878 gpio) 879 makedev gpio0 gpio1 gpio2 gpio3 gpio4 gpio5 gpio6 gpio7 880 lndev gpio0 gpio 881 ;; 882 883 gpioirq) 884 makedev gpioirq0 885 ;; 886 887 gpiopps) 888 makedev gpiopps0 889 lndev gpiopps0 gpiopps 890 ;; 891 892 lua) 893 makedev lua0 894 lndev lua0 lua 895 ;; 896 897 pad) 898 makedev pad0 pad1 pad2 pad3 899 lndev pad0 pad 900 ;; 901 902 qemufwcfg) 903 makedev qemufwcfg0 904 lndev qemufwcfg0 qemufwcfg 905 ;; 906 907 radio) 908 makedev radio0 radio1 909 lndev radio0 radio 910 ;; 911 912 video) 913 makedev video0 video1 video2 video3 914 ;; 915 916 dtv) 917 makedev dtv0 dtv1 dtv2 dtv3 918 ;; 919 920 iic) 921 makedev iic0 iic1 iic2 iic3 922 ;; 923 924 altmem) 925 makedev altmem0 altmem1 926 ;; 927 928 ramdisk) 929 makedev floppy md0 930 ;; 931 932 sht3xtemp) 933 makedev sht3xtemp0 934 ;; 935 936 scmd) 937 makedev scmd0 938 ;; 939 940 usbs) 941 makedev usb usb0 usb1 usb2 usb3 usb4 usb5 usb6 usb7 942 makedev usb8 usb9 usb10 usb11 usb12 usb13 usb14 usb15 943 makedev uhid0 uhid1 uhid2 uhid3 uhid4 uhid5 944 makedev uhid6 uhid7 uhid8 uhid9 uhid10 uhid11 945 makedev uhid12 uhid13 uhid14 uhid15 946 makedev ulpt0 ulpt1 947 makedev ttyU0 ttyU1 ttyU2 ttyU3 ttyU4 ttyU5 ttyU6 ttyU7 948 makedev ttyY0 ttyY1 949 makedev ttyHS0 950 makedev utoppy0 utoppy1 951 makedev ugen0 ugen1 ugen2 ugen3 952 ;; 953 954 virtio) 955 makedev ttyVI 956 makedev vio9p0 vio9p1 vio9p2 vio9p3 957 makedev vio9p4 vio9p5 vio9p6 vio9p7 958 ;; 959 960 std) 961 mkdev console c %cons_chr% 0 600 962 mkdev constty c %cons_chr% 1 600 963 mkdev drum c %swap_chr% 0 640 $g_kmem 964 mkdev kmem c %mem_chr% 1 640 $g_kmem 965 mkdev mem c %mem_chr% 0 640 $g_kmem 966 mkdev null c %mem_chr% 2 666 967 mkdev full c %mem_chr% 11 666 968 mkdev zero c %mem_chr% 12 666 969 mkdev klog c %log_chr% 0 600 970 mkdev ksyms c %ksyms_chr% 0 440 $g_kmem 971 mkdev random c %rnd_chr% 0 444 972 mkdev urandom c %rnd_chr% 1 644 973 if ! $fdesc_mounted; then 974 mkdev tty c %ctty_chr% 0 666 975 mkdev stdin c %filedesc_chr% 0 666 976 mkdev stdout c %filedesc_chr% 1 666 977 mkdev stderr c %filedesc_chr% 2 666 978 fi 979 ;; 980 981 usb) 982 mkdev usb c %usb_chr% 255 444 983 ;; 984 985 usb[0-9]*) 986 unit=${i#usb} 987 usb=usb$unit 988 mkdev usb$unit c %usb_chr% $unit 989 ;; 990 991 uhid[0-9]*) 992 unit=${i#uhid} 993 mkdev uhid$unit c %uhid_chr% $unit 666 994 ;; 995 996 ulpt[0-9]*) 997 unit=${i#ulpt} 998 mkdev ulpt$unit c %ulpt_chr% $unit 999 mkdev ulpn$unit c %ulpt_chr% $(($unit + 64)) 1000 ;; 1001 1002 utoppy[0-9]*) 1003 unit=${i#utoppy} 1004 mkdev utoppy$unit c %utoppy_chr% $unit 1005 ;; 1006 1007 ttyHS[0-9]*) 1008 unit=${i#ttyHS} 1009 for j in 00 01 02 03 04 05 06 07 08 09 10 1010 do 1011 base=$(($unit * 16 + ${j#0})) 1012 mkdev ttyHS$unit.$j c %uhso_chr% $(($base + $dialin )) "" "" $u_uucp 1013 mkdev dtyHS$unit.$j c %uhso_chr% $(($base + $dialout )) "" "" $u_uucp 1014 mkdev ctyHS$unit.$j c %uhso_chr% $(($base + $callunit)) "" "" $u_uucp 1015 done 1016 ;; 1017 1018 ttyY[0-9]*) 1019 unit=${i#ttyY} 1020 mkdev ttyY$unit c %ucycom_chr% $(($unit + $dialin )) "" "" $u_uucp 1021 mkdev dtyY$unit c %ucycom_chr% $(($unit + $dialout )) "" "" $u_uucp 1022 mkdev ctyY$unit c %ucycom_chr% $(($unit + $callunit)) "" "" $u_uucp 1023 ;; 1024 1025 ucom[0-9]*) 1026 makedev ttyU${i#ucom} 1027 ;; 1028 1029 ttyU[0-9]*) 1030 unit=${i#ttyU} 1031 mkdev ttyU$unit c %ucom_chr% $(($unit + $dialin )) "" "" $u_uucp 1032 mkdev dtyU$unit c %ucom_chr% $(($unit + $dialout )) "" "" $u_uucp 1033 mkdev ctyU$unit c %ucom_chr% $(($unit + $callunit)) "" "" $u_uucp 1034 ;; 1035 1036 ugen[0-9]*) 1037 unit=${i#ugen} 1038 for j in 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 1039 do 1040 mkdev ugen$unit.$j c %ugen_chr% $(($unit * 16 + ${j#0})) 1041 done 1042 ;; 1043 1044 umcpmio[0-9]*) 1045 unit=${i#umcpmio} 1046 mkdev umcpmio${unit}ctl c %umcpmio_chr% $unit 660 1047 for j in 0 1 2 1048 do 1049 mkdev umcpmio${unit}GP$(($j + 1)) c %umcpmio_chr% $(($unit * 3 + 128 + ${j#})) 666 1050 done 1051 ;; 1052 1053 wscons) 1054 makedev ttyE0 ttyE1 ttyE2 ttyE3 ttyE4 ttyE5 ttyE6 ttyE7 1055 makedev ttyF0 ttyF1 ttyF2 ttyF3 ttyF4 ttyF5 ttyF6 ttyF7 1056 makedev ttyG0 ttyG1 ttyG2 ttyG3 ttyG4 ttyG5 ttyG6 ttyG7 1057 makedev ttyH0 ttyH1 ttyH2 ttyH3 ttyH4 ttyH5 ttyH6 ttyH7 1058 makedev wsmouse0 wsmouse1 wsmouse2 wsmouse3 1059 makedev wskbd0 wskbd1 wskbd2 wskbd3 1060 makedev wsmux0 wsmux1 wsmux2 wsmux3 1061 makedev wsmouse wskbd 1062 makedev ttyEcfg ttyEstat 1063 makedev ttyFcfg ttyFstat 1064 makedev ttyGcfg ttyGstat 1065 makedev ttyHcfg ttyHstat 1066 makedev wsfont 1067 ;; 1068 1069 wsmouse) 1070 mkdev wsmouse c %wsmux_chr% 0 1071 ;; 1072 1073 wskbd) 1074 mkdev wskbd c %wsmux_chr% 1 1075 ;; 1076 1077 wsmux[0-9]*) 1078 unit=${i#wsmux} 1079 mkdev wsmux$unit c %wsmux_chr% $unit 1080 mkdev wsmuxctl$unit c %wsmux_chr% $(($unit + 128)) 200 1081 ;; 1082 1083 xenevt) 1084 mkdev xenevt c %xenevt_chr% 0 1085 ;; 1086 1087 xsd_kva) 1088 mkdev xsd_kva c %xenevt_chr% 1 1089 ;; 1090 1091 xencons) 1092 mkdev xencons c %xencons_chr% 0 1093 ;; 1094 1095 ttyEstat) 1096 mkdev ttyEstat c %wsdisplay_chr% 254 1097 ;; 1098 1099 ttyEcfg) 1100 mkdev ttyEcfg c %wsdisplay_chr% 255 1101 ;; 1102 1103 ttyE[0-9]*) 1104 unit=${i#ttyE} 1105 mkdev ttyE$unit c %wsdisplay_chr% $unit 1106 ;; 1107 1108 ttyFstat) 1109 mkdev ttyFstat c %wsdisplay_chr% 510 1110 ;; 1111 1112 ttyFcfg) 1113 mkdev ttyFcfg c %wsdisplay_chr% 511 1114 ;; 1115 1116 ttyF[0-9]*) 1117 unit=${i#ttyF} 1118 mkdev ttyF$unit c %wsdisplay_chr% $(($unit + 256)) 1119 ;; 1120 1121 ttyGstat) 1122 mkdev ttyGstat c %wsdisplay_chr% 766 1123 ;; 1124 1125 ttyGcfg) 1126 mkdev ttyGcfg c %wsdisplay_chr% 767 1127 ;; 1128 1129 ttyG[0-9]*) 1130 unit=${i#ttyG} 1131 mkdev ttyG$unit c %wsdisplay_chr% $(($unit + 512)) 1132 ;; 1133 1134 ttyHstat) 1135 mkdev ttyHstat c %wsdisplay_chr% 1022 1136 ;; 1137 1138 ttyHcfg) 1139 mkdev ttyHcfg c %wsdisplay_chr% 1023 1140 ;; 1141 1142 ttyH[0-9]*) 1143 unit=${i#ttyH} 1144 mkdev ttyH$unit c %wsdisplay_chr% $(($unit + 768)) 1145 ;; 1146 1147 wsmouse[0-9]*) 1148 unit=${i#wsmouse} 1149 mkdev wsmouse$unit c %wsmouse_chr% $unit 1150 ;; 1151 1152 wskbd[0-9]*) 1153 unit=${i#wskbd} 1154 mkdev wskbd$unit c %wskbd_chr% $unit 1155 ;; 1156 1157 fd) 1158 if ! $fdesc_mounted; then 1159 # Create the "fd" subdirectory, and devices "fd/0" to "fd/63" 1160 makedir fd 755 1161 n=0 1162 while [ $n -lt 64 ] 1163 do 1164 mkdev fd/$n c %filedesc_chr% $n 666 1165 n=$(($n + 1)) 1166 done 1167 fi 1168 ;; 1169 1170 wt[0-9]*) 1171 name=wt; unit=${i#wt}; chr=%wt_chr%; blk=%wt_blk% 1172 for sub in $unit $(($unit+8)) $(($unit+16)) 1173 do 1174 mkdev $name$sub b $blk $(($sub + 0)) 660 $g_operator 1175 mkdev n$name$sub b $blk $(($sub + 4)) 660 $g_operator 1176 mkdev r$name$sub c $chr $(($sub + 0)) 660 $g_operator 1177 mkdev nr$name$sub c $chr $(($sub + 4)) 660 $g_operator 1178 done 1179 ;; 1180 1181 md[0-9]*) 1182 makedisk_minimal md ${i#md} %md_blk% %md_chr% 1183 ;; 1184 1185 fss[0-9]*) 1186 name=fss; unit=${i#fss}; blk=%fss_blk%; chr=%fss_chr% 1187 mkdev $name$unit b $blk $unit 660 $g_operator 1188 mkdev r$name$unit c $chr $unit 660 $g_operator 1189 ;; 1190 1191 ss[0-9]*) 1192 name=ss; unit=${i#ss}; chr=%ss_chr% 1193 mkdev $name$unit c $chr $(($unit * 16 + 0)) 640 $g_operator 1194 mkdev n$name$unit c $chr $(($unit * 16 + 1)) 640 $g_operator 1195 mkdev en$name$unit c $chr $(($unit * 16 + 3)) 640 $g_operator 1196 ;; 1197 1198 ccd[0-9]*|cgd[0-9]*|raid[0-9]*|vnd[0-9]*) 1199 case $i in 1200 ccd*) name=ccd; unit=${i#ccd}; blk=%ccd_blk%; chr=%ccd_chr%;; 1201 cgd*) name=cgd; unit=${i#cgd}; blk=%cgd_blk%; chr=%cgd_chr%;; 1202 raid*) name=raid; unit=${i#raid}; blk=%raid_blk%; chr=%raid_chr%;; 1203 vnd*) name=vnd; unit=${i#vnd}; blk=%vnd_blk%; chr=%vnd_chr%;; 1204 esac 1205 %MKDISK% $name $unit $blk $chr 1206 ;; 1207 1208 sd[0-9]*) 1209 name=sd; unit=${i#sd}; blk=%sd_blk%; chr=%sd_chr% 1210 %MKDISK% $name $unit $blk $chr 1211 ;; 1212 1213 ace[0-9]*) 1214 name=ace; unit=${i#ace}; blk=%ace_blk%; chr=%ace_chr% 1215 %MKDISK% $name $unit $blk $chr 1216 ;; 1217 1218 eflash[0-9]*) 1219 name=eflash; unit=${i#eflash}; blk=%eflash_blk%; chr=%eflash_chr% 1220 %MKDISK% $name $unit $blk $chr 1221 ;; 1222 1223 wd[0-9]*) 1224 name=wd; unit=${i#wd}; blk=%wd_blk%; chr=%wd_chr% 1225 %MKDISK% $name $unit $blk $chr 1226 ;; 1227 1228 fd[0-9]*) 1229 name=fd; unit=${i#fd}; blk=%fd_blk%; chr=%fd_chr% 1230 %MKDISK% $name $unit $blk $chr 1231 ;; 1232 1233 ld[0-9]*) 1234 name=ld; unit=${i#ld}; blk=%ld_blk%; chr=%ld_chr% 1235 %MKDISK% $name $unit $blk $chr 1236 ;; 1237 1238 flash[0-9]*) 1239 unit=${i#flash} 1240 flash=flash$unit 1241 mkdev flash$unit b %flash_blk% $unit 1242 mkdev rflash$unit c %flash_chr% $unit 1243 ;; 1244 1245 spiflash[0-9]*) 1246 unit=${i#spiflash} 1247 spiflash=spiflash$unit 1248 mkdev spiflash$unit b %spiflash_blk% $unit 1249 mkdev rspiflash$unit c %spiflash_chr% $unit 1250 ;; 1251 1252 altmem[0-9]*) 1253 name=altmem; unit=${i#altmem}; blk=%altmem_blk%; chr=%altmem_chr% 1254 %MKDISK% $name $unit $blk $chr 1255 ;; 1256 1257 bio) 1258 mkdev bio c %bio_chr% 0 1259 ;; 1260 1261 ed[0-9]*) 1262 name=ed; unit=${i#ed}; blk=%ed_blk%; chr=%ed_chr% 1263 %MKDISK% $name $unit $blk $chr 1264 ;; 1265 1266 ofdisk[0-9]*) 1267 name=ofdisk; unit=${i#ofdisk}; blk=%ofdisk_blk%; chr=%ofdisk_chr% 1268 %MKDISK% $name $unit $blk $chr 1269 ;; 1270 1271 xbd[0-9]*) 1272 name=xbd; unit=${i#xbd}; blk=%xbd_blk%; chr=%xbd_chr% 1273 %MKDISK% $name $unit $blk $chr 1274 ;; 1275 1276 dk[0-9]*) 1277 name=dk; unit=${i#dk}; blk=%dk_blk%; chr=%dk_chr% 1278 mkdev r$name$unit c $chr $unit 0640 $g_operator 1279 mkdev $name$unit b $blk $unit 0640 $g_operator 1280 ;; 1281 1282 tprof) 1283 mkdev tprof c %tprof_chr% 0 1284 ;; 1285 1286 ttyCY[0-9]*) 1287 # Each unit number creates 32 pairs of {tty,dty} device nodes: 1288 # ttyCY0 => device nodes [td]tyCY000 to [td]tyCY031; 1289 # ttyCY1 => device nodes [td]tyCY032 to [td]tyCY063; 1290 name=tyCY; chr=%cy_chr%; off=32 1291 unit=${i#t${name}} 1292 minor=$(($unit * $off)) 1293 eminor=$(($minor + $off)) 1294 while [ $minor -lt $eminor ] 1295 do 1296 nminor=000$minor 1297 nminor=${nminor#${nminor%???}} 1298 mkdev t$name$nminor c $chr $(($minor + $dialin )) "" "" $u_uucp 1299 mkdev d$name$nminor c $chr $(($minor + $dialout)) "" "" $u_uucp 1300 minor=$(($minor + 1)) 1301 done 1302 ;; 1303 1304 ttyCZ[0-9]*) 1305 # Each unit number creates 64 pairs of {tty,dty} device nodes: 1306 # ttyCZ0 => device nodes [td]tyCZ0000 to [td]tyCZ0063; 1307 # ttyCZ1 => device nodes [td]tyCZ0064 to [td]tyCZ0127; 1308 name=tyCZ; chr=%cz_chr%; off=64 1309 unit=${i#t${name}} 1310 minor=$(($unit * $off)) 1311 eminor=$(($minor + $off)) 1312 while [ $minor -lt $eminor ] 1313 do 1314 nminor=0000$minor 1315 nminor=${nminor#${nminor%????}} 1316 mkdev t$name$nminor c $chr $(($minor + $dialin )) "" "" $u_uucp 1317 mkdev d$name$nminor c $chr $(($minor + $dialout)) "" "" $u_uucp 1318 minor=$(($minor + 1)) 1319 done 1320 ;; 1321 1322 1323 tty[0-9]|tty0[0-9]) 1324 # some archs have built-in zstty (major %zstty_chr%) instead 1325 # of NS16550; create ttyZ* and hardlink as [dt]ty0*; this 1326 # needs to be before com entry, for archs which have both 1327 unit=${i#tty} 1328 unit=$(($unit + 0)) 1329 makedev ttyZ${unit} 1330 lndev ttyZ$unit tty0${unit} 1331 lndev dtyZ$unit dty0${unit} 1332 ;; 1333 1334 tty[0-9]*) 1335 unit=${i#tty} 1336 ounit=00$unit 1337 ounit=${ounit#${ounit%??}} 1338 mkdev tty$ounit c %com_chr% $(($unit + $dialin )) "" "" $u_uucp 1339 mkdev dty$ounit c %com_chr% $(($unit + $dialout)) "" "" $u_uucp 1340 ;; 1341 1342 ttyC[0-9]*) 1343 # some archs call com_chr ttyC traditionally 1344 unit=${i#ttyC}; name=ttyC; dname=dtyC; chr=%com_chr% 1345 mkdev $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp 1346 mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp 1347 ;; 1348 1349 ttyh[0-9]*) 1350 unit=${i#ttyh}; name=ttyh; dname=dtyh; chr=%sabtty_chr% 1351 mkdev $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp 1352 mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp 1353 ;; 1354 1355 ttyTX[0-9]*) 1356 unit=${i#ttyTX}; name=ttyTX0; dname=dtyTX0; chr=%txcom_chr% 1357 mkdev $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp 1358 mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp 1359 ;; 1360 1361 ttyZ[0-9]*) 1362 unit=${i#ttyZ}; name=ttyZ; dname=dtyZ; chr=%zstty_chr% 1363 mkdev $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp 1364 mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp 1365 ;; 1366 1367 opty) 1368 # Create 16 device nodes, [pt]typ0 to [pt]typf, 1369 # same as "MAKEDEV pty0". 1370 for j in 0 1 2 3 4 5 6 7 8 9 a b c d e f 1371 do 1372 case $j in 1373 [0-9]) jn=$j ;; 1374 a) jn=10 ;; 1375 b) jn=11 ;; 1376 c) jn=12 ;; 1377 d) jn=13 ;; 1378 e) jn=14 ;; 1379 f) jn=15 ;; 1380 esac 1381 mkdev ttyp$j c %pts_chr% $jn 666 1382 mkdev ptyp$j c %ptc_chr% $jn 666 1383 done 1384 ;; 1385 1386 pty[0-9]*) 1387 # Each unit number creates up to 16 pairs of {tty,pty} device nodes: 1388 # pty0 => 16 pairs, [tp]typ0 to [tp]typf 1389 # pty1 => 16 pairs, [tp]tyq0 to [tp]tyqf 1390 # pty16 => 16 pairs, [tp]typg to [tp]typv 1391 # pty17 => 16 pairs, [tp]typw to [tp]typL 1392 # pty18 => 14 pairs, [tp]typM to [tp]typZ 1393 warn "$i: creating BSD style tty nodes with ptyfs is a security issue" 1394 class=${i#pty} 1395 d1="p q r s t u v w x y z P Q R S T" 1396 if [ "$class" -ge 64 ] 1397 then 1398 warn "$i: pty unit must be between 0 and 63" 1399 continue 1400 elif [ "$class" -lt 16 ] 1401 then 1402 # pty[p-zP-T][0-9a-f] 1403 offset=0 1404 mult=0 1405 d2="0 1 2 3 4 5 6 7 8 9 a b c d e f" 1406 else 1407 # pty[p-zP-T][g-zA-Z] 1408 class=$(($class - 16)) 1409 offset=256 1410 mult=2 1411 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" 1412 fi 1413 start=$(($class * 16)) 1414 set -- $d2 1415 nt=$# 1416 s1=$(($start / $nt)) 1417 set -- $d1 1418 shift $s1 1419 t1=$1 1420 if [ "$t1" = v ]; then 1421 warn "$i: pty unit conflicts with console ttyv0 device" 1422 continue 1423 fi 1424 s2=$(($start % ($nt - $s1 * $mult))) 1425 set -- $d2 1426 shift $s2 1427 t2=$1 1428 unit=$(($start + $offset - $s1 * $mult)) 1429 end=$(($unit + 16)) 1430 while [ "$unit" -lt "$end" ] 1431 do 1432 mkdev tty$t1$t2 c %pts_chr% $unit 666 1433 mkdev pty$t1$t2 c %ptc_chr% $unit 666 1434 shift 1435 t2=$1 1436 if [ -z "$t2" ] 1437 then 1438 break 1439 fi 1440 unit=$(($unit + 1)) 1441 done 1442 ;; 1443 1444 stic[0-9]*) 1445 unit=${i#stic} 1446 mkdev stic$unit c %stic_chr% $unit 1447 ;; 1448 1449 st[0-9]*) 1450 name=st; unit=${i#st}; chr=%st_chr%; blk=%st_blk% 1451 mkdev $name$unit b $blk $(($unit * 16 + 0)) 660 $g_operator 1452 mkdev n$name$unit b $blk $(($unit * 16 + 1)) 660 $g_operator 1453 mkdev e$name$unit b $blk $(($unit * 16 + 2)) 660 $g_operator 1454 mkdev en$name$unit b $blk $(($unit * 16 + 3)) 660 $g_operator 1455 mkdev r$name$unit c $chr $(($unit * 16 + 0)) 660 $g_operator 1456 mkdev nr$name$unit c $chr $(($unit * 16 + 1)) 660 $g_operator 1457 mkdev er$name$unit c $chr $(($unit * 16 + 2)) 660 $g_operator 1458 mkdev enr$name$unit c $chr $(($unit * 16 + 3)) 660 $g_operator 1459 ;; 1460 1461 ses[0-9]*|ch[0-9]*|uk[0-9]*) 1462 case $i in 1463 ch*) name=ch; unit=${i#ch}; chr=%ch_chr%;; 1464 uk*) name=uk; unit=${i#uk}; chr=%uk_chr%;; 1465 ses*) name=ses; unit=${i#ses}; chr=%ses_chr%;; 1466 esac 1467 mkdev $name$unit c $chr $unit 640 $g_operator 1468 ;; 1469 1470 cd[0-9]*) 1471 makedisk_minimal cd ${i#cd} %cd_blk% %cd_chr% 1472 ;; 1473 1474 mcd[0-9]*) 1475 makedisk_minimal mcd ${i#mcd} %mcd_blk% %mcd_chr% 1476 ;; 1477 1478 gdrom[0-9]*) 1479 makedisk_minimal gdrom ${i#gdrom} %gdrom_blk% %gdrom_chr% 1480 ;; 1481 1482 lpt[0-9]*|lpa[0-9]*) 1483 case $i in 1484 lpt*) name=lpt; unit=${i#lpt}; chr=%lpt_chr%; flags=0;; 1485 lpa*) name=lpa; unit=${i#lpa}; chr=%lpt_chr%; flags=128;; 1486 esac 1487 mkdev $name$unit c $chr $(($unit + $flags)) 1488 mkdev lpt${unit}ctl c $chr $(($unit + 256)) 1489 ;; 1490 1491 bpf) 1492 mkdev bpf c %bpf_chr% 0 1493 lndev bpf bpf0 1494 ;; 1495 1496 npf) 1497 mkdev npf c %npf_chr% 0 1498 ;; 1499 1500 bthub) 1501 mkdev bthub c %bthub_chr% 0 1502 ;; 1503 1504 tun[0-9]*) 1505 unit=${i#tun} 1506 mkdev tun$unit c %tun_chr% $unit 1507 ;; 1508 1509 joy[0-9]*) 1510 unit=${i#joy} 1511 mkdev joy$unit c %joy_chr% $unit 1512 ;; 1513 1514 ipl) 1515 mkdev ipl c %ipl_chr% 0 1516 mkdev ipnat c %ipl_chr% 1 1517 mkdev ipstate c %ipl_chr% 2 1518 mkdev ipauth c %ipl_chr% 3 1519 mkdev ipsync c %ipl_chr% 4 1520 mkdev ipscan c %ipl_chr% 5 1521 mkdev iplookup c %ipl_chr% 6 1522 ;; 1523 1524 pf) 1525 mkdev pf c %pf_chr% 0 1526 ;; 1527 1528 crypto) 1529 mkdev crypto c %crypto_chr% 0 666 1530 ;; 1531 1532 cmos) 1533 mkdev cmos c %cmos_chr% 0 644 1534 ;; 1535 1536 speaker) 1537 mkdev speaker c %spkr_chr% 0 1538 ;; 1539 1540 lockstat) 1541 mkdev lockstat c %lockstat_chr% 0 1542 ;; 1543 1544 cpuctl) 1545 mkdev cpuctl c %cpuctl_chr% 0 666 1546 ;; 1547 1548 audio|audio[0-9]*) 1549 unit=${i#audio} 1550 audio=audio$unit 1551 sound=sound$unit 1552 mixer=mixer$unit 1553 audioctl=audioctl$unit 1554 : ${unit:-0} 1555 mkdev $sound c %audio_chr% $(($unit + 0)) 666 1556 mkdev $audio c %audio_chr% $(($unit + 128)) 666 1557 mkdev $mixer c %audio_chr% $(($unit + 16)) 666 1558 mkdev $audioctl c %audio_chr% $(($unit + 192)) 666 1559 ;; 1560 1561 hdaudio[0-9]*) 1562 unit=${i#hdaudio} 1563 mkdev hdaudio$unit c %hdaudio_chr% $unit 644 1564 ;; 1565 1566 hdmicec[0-9]*) 1567 uint=${i#hdmicec} 1568 mkdev hdmicec$unit c %hdmicec_chr% $unit 644 1569 ;; 1570 1571 gpio[0-9]*) 1572 unit=${i#gpio} 1573 mkdev gpio$unit c %gpio_chr% $unit 664 $g_gpio 1574 ;; 1575 1576 gpioirq[0-9]*) 1577 unit=${i#gpioirq} 1578 mkdev gpioirq$unit c %gpioirq_chr% $unit 444 $g_gpio 1579 ;; 1580 1581 gpiopps[0-9]*) 1582 unit=${i#gpiopps} 1583 mkdev gpiopps$unit c %gpiopps_chr% $unit 664 $g_gpio 1584 ;; 1585 1586 lua[0-9]*) 1587 unit=${i#lua} 1588 mkdev lua$unit c %lua_chr% $unit 664 1589 ;; 1590 1591 rmidi[0-9]*) 1592 unit=${i#rmidi} 1593 mkdev rmidi$unit c %midi_chr% $unit 666 1594 ;; 1595 1596 music|music[0-9]*) 1597 unit=${i#music} 1598 : ${unit:-0} 1599 mkdev music$unit c %sequencer_chr% $(($unit + 0)) 666 1600 mkdev sequencer$unit c %sequencer_chr% $(($unit + 128)) 666 1601 ;; 1602 1603 radio|radio[0-9]*) 1604 unit=${i#radio} 1605 : ${unit:-0} 1606 mkdev radio$unit c %radio_chr% $unit 666 1607 ;; 1608 1609 video|video[0-9]*) 1610 unit=${i#video} 1611 : ${unit:-0} 1612 mkdev video$unit c %video_chr% $unit 666 1613 ;; 1614 1615 dtv[0-9]*) 1616 unit=${i#dtv} 1617 makedir dvb 755 1618 makedir dvb/adapter$unit 755 1619 mkdev dvb/adapter$unit/frontend0 c %dtv_chr% $(($unit + 0)) 666 1620 mkdev dvb/adapter$unit/demux0 c %dtv_chr% $(($unit + 16)) 666 1621 mkdev dvb/adapter$unit/dvr0 c %dtv_chr% $(($unit + 32)) 666 1622 ;; 1623 1624 iic[0-9]*) 1625 unit=${i#iic} 1626 : ${unit:-0} 1627 mkdev iic$unit c %iic_chr% $unit 600 1628 ;; 1629 1630 spi[0-9]*) 1631 unit=${i#spi} 1632 : ${unit:-0} 1633 mkdev spi$unit c %spi_chr% $unit 600 1634 ;; 1635 1636 amr[0-9]*) 1637 unit=${i#amr} 1638 mkdev amr$unit c %amr_chr% $unit 1639 ;; 1640 1641 apm) 1642 mkdev apm c %apm_chr% 0 644 1643 mkdev apmctl c %apm_chr% 8 644 1644 ;; 1645 1646 apm) 1647 # hpcmips uses `apmdev_chr' instead of `apm_chr' 1648 mkdev apm c %apmdev_chr% 0 644 1649 mkdev apmctl c %apmdev_chr% 8 644 1650 ;; 1651 1652 random) 1653 mkdev random c %rnd_chr% 0 444 1654 mkdev urandom c %rnd_chr% 1 644 1655 ;; 1656 1657 cfs) 1658 makedev cfs0 1659 ;; 1660 1661 cfs[0-9]*) 1662 unit=${i#cfs} 1663 mkdev cfs$unit c %vcoda_chr% $unit 1664 ;; 1665 1666 sysmon) 1667 mkdev sysmon c %sysmon_chr% 0 644 1668 mkdev watchdog c %sysmon_chr% 1 644 1669 mkdev power c %sysmon_chr% 2 640 1670 ;; 1671 1672 scsibus[0-9]*) 1673 unit=${i#scsibus} 1674 mkdev scsibus$unit c %scsibus_chr% $unit 644 1675 ;; 1676 1677 bktr) 1678 makedev bktr0 bktr1 1679 lndev bktr0 bktr 1680 lndev tuner0 tuner 1681 lndev vbi0 vbi 1682 ;; 1683 1684 bktr[0-9]*) 1685 unit=${i#bktr} 1686 mkdev bktr$unit c %bktr_chr% $(($unit + 0)) 444 1687 mkdev tuner$unit c %bktr_chr% $(($unit + 16)) 444 1688 mkdev vbi$unit c %bktr_chr% $(($unit + 32)) 444 1689 ;; 1690 1691 io) 1692 mkdev io c %mem_chr% 14 600 1693 ;; 1694 1695 iop[0-9]*) 1696 unit=${i#iop} 1697 mkdev iop$unit c %iop_chr% $unit 1698 ;; 1699 1700 mfi[0-9]*) 1701 unit=${i#mfi} 1702 mkdev mfi$unit c %mfi_chr% $unit 1703 ;; 1704 1705 mlx[0-9]*) 1706 unit=${i#mlx} 1707 mkdev mlx$unit c %mlx_chr% $unit 1708 ;; 1709 1710 mly[0-9]*) 1711 unit=${i#mly} 1712 mkdev mly$unit c %mly_chr% $unit 1713 ;; 1714 1715 twa[0-9]*) 1716 unit=${i#twa} 1717 mkdev twa$unit c %twa_chr% $unit 1718 ;; 1719 1720 twe[0-9]*) 1721 unit=${i#twe} 1722 mkdev twe$unit c %twe_chr% $unit 1723 ;; 1724 1725 icp[0-9]*) 1726 unit=${i#icp} 1727 mkdev icp$unit c %icp_chr% $unit 1728 ;; 1729 1730 agp[0-9]*) 1731 unit=${i#agp} 1732 mkdev agp$unit c %agp_chr% $unit 644 1733 if [ "$unit" = "0" ]; then 1734 lndev agp$unit agpgart 1735 fi 1736 ;; 1737 1738 pci[0-9]*) 1739 unit=${i#pci} 1740 mkdev pci$unit c %pci_chr% $unit 640 1741 ;; 1742 1743 dpti[0-9]*) 1744 unit=${i#dpti} 1745 mkdev dpti$unit c %dpti_chr% $unit 1746 ;; 1747 1748 dpt[0-9]*) 1749 unit=${i#dpt} 1750 mkdev dpt$unit c %dpt_chr% $unit 1751 ;; 1752 1753 altq) 1754 makedir altq 755 1755 unit=0 1756 for dev in altq cbq wfq afm fifoq red rio localq hfsc cdnr blue priq jobs 1757 do 1758 mkdev altq/$dev c %altq_chr% $unit 644 1759 unit=$(($unit + 1)) 1760 done 1761 ;; 1762 1763 wsfont) 1764 mkdev wsfont c %wsfont_chr% 0 644 1765 ;; 1766 1767 cir[0-9]*) 1768 unit=${i#cir} 1769 mkdev cir$unit c %cir_chr% $unit 666 1770 ;; 1771 1772 irframe[0-9]*) 1773 unit=${i#irframe} 1774 mkdev irframe$unit c %irframe_chr% $unit 1775 ;; 1776 1777 fcom[0-9]*) 1778 unit=${i#fcom} 1779 mkdev fcom$unit c %fcom_chr% $unit "" "" $u_uucp 1780 ;; 1781 1782 openfirm) 1783 mkdev openfirm c %openfirm_chr% 0 444 1784 ;; 1785 1786 pad[0-9]*) 1787 unit=${i#pad} 1788 mkdev pad$unit c %pad_chr% $unit 444 1789 ;; 1790 1791 qemufwcfg[0-9]*) 1792 unit=${i#qemufwcfg} 1793 mkdev qemufwcfg$unit c %qemufwcfg_chr% $unit 660 1794 ;; 1795 1796 vio9p[0-9]*) 1797 unit=${i#vio9p} 1798 mkdev vio9p$unit c %vio9p_chr% $unit 660 1799 ;; 1800 1801 fault) 1802 mkdev fault c %fault_chr% 0 1803 ;; 1804 1805 nvram) 1806 mkdev nvram c %nvram_chr% 0 644 1807 ;; 1808 1809 rtc) 1810 mkdev rtc c %rtc_chr% 0 644 1811 ;; 1812 1813 clockctl) 1814 mkdev clockctl c %clockctl_chr% 0 660 $g_ntpd 1815 ;; 1816 1817 kttcp) 1818 mkdev kttcp c %kttcp_chr% 0 1819 ;; 1820 1821 dmoverio) 1822 mkdev dmoverio c %dmoverio_chr% 0 644 1823 ;; 1824 1825 veriexec) 1826 mkdev veriexec c %veriexec_chr% 0 600 1827 ;; 1828 1829 vhci[0-7]*) 1830 unit=${i#vhci} 1831 mkdev vhci$unit c %vhci_chr% $unit 1832 ;; 1833 1834 ttyv[0-9]*) 1835 unit=${i#ttyv} 1836 mkdev ttyv$unit c %pc_chr% $unit 1837 ;; 1838 1839 # arm, acorn32 1840 ttyv[0-9]*) 1841 unit=${i#ttyv} 1842 mkdev ttyv$unit c %physcon_chr% $unit 1843 ;; 1844 1845 arcpp[0-9]*) 1846 unit=${i#arcpp} 1847 mkdev arcpp$unit c %arcpp_chr% $unit 1848 ;; 1849 1850 par[0-9]*) 1851 unit=${i#par} 1852 case $unit in 1853 0) 1854 mkdev par$unit c %par_chr% $unit 1855 ;; 1856 *) 1857 warn "bad unit for par in: $i" 1858 ;; 1859 esac 1860 ;; 1861 1862 cpi[0-9]*) 1863 unit=${i#cpi} 1864 mkdev cpi$unit c %cpi_chr% $unit 1865 ;; 1866 1867 ite[0-9]*|ttye[0-9]*) 1868 case $i in 1869 ite*) unit=${i#ite};; 1870 ttye*) unit=${i#ttye};; 1871 esac 1872 mkdev ttye$unit c %ite_chr% $unit 1873 ;; 1874 1875 pms[0-9]*) 1876 unit=${i#pms} 1877 mkdev pms$unit c %opms_chr% $unit 1878 ;; 1879 1880 qms[0-9]*) 1881 unit=${i#qms} 1882 mkdev qms$unit c %qms_chr% $unit 1883 ;; 1884 1885 lms[0-9]*) 1886 unit=${i#lms} 1887 mkdev lms$unit c %lms_chr% $unit 1888 ;; 1889 1890 mms[0-9]*) 1891 unit=${i#mms} 1892 mkdev mms$unit c %mms_chr% $unit 1893 ;; 1894 1895 mouse-pms[0-9]*|mouse-qms[0-9]*) 1896 case $i in 1897 mouse-pms*) name=pms ;; 1898 mouse-qms*) name=qms ;; 1899 esac 1900 unit=${i#mouse-${name}} 1901 lndev $name$unit mouse 1902 ;; 1903 1904 kbd) 1905 mkdev kbd c %kbd_chr% 0 1906 ;; 1907 1908 kbdctl) 1909 mkdev kbdctl c %kbd_chr% 1 1910 ;; 1911 1912 vidcconsole0) 1913 mkdev vidcconsole0 c %vidcconsole_chr% 0 640 1914 ;; 1915 1916 view[0-9]*) 1917 unit=${i#view} 1918 mkdev view$unit c %view_chr% $unit 666 1919 ;; 1920 1921 mouse[0-9]*) 1922 unit=${i#mouse} 1923 case $unit in 1924 0|1) 1925 mkdev mouse$unit c %ms_chr% $unit 666 1926 if [ $unit = 0 ]; then 1927 lndev mouse$unit mouse 1928 fi 1929 ;; 1930 *) 1931 warn "bad unit for mouse in: $i" 1932 ;; 1933 esac 1934 ;; 1935 1936 panel) 1937 mkdev panel0 c %panel_chr% 0 660 1938 ;; 1939 1940 tslcd) 1941 mkdev tslcd0 c %tslcd_chr% 0 660 1942 ;; 1943 1944 ipty) 1945 mkdev ttyp0 c %pts_chr% 0 666 1946 mkdev ttyp1 c %pts_chr% 1 666 1947 mkdev ptyp0 c %ptc_chr% 0 666 1948 mkdev ptyp1 c %ptc_chr% 1 666 1949 ;; 1950 1951 ptm) 1952 makedir pts 755 1953 mkdev ptmx c %ptm_chr% 0 666 1954 mkdev ptm c %ptm_chr% 1 666 1955 ;; 1956 1957 grf[0-9]*) 1958 unit=${i#grf} 1959 mkdev grf$unit c %grf_chr% $unit 666 1960 ;; 1961 1962 etvme) 1963 mkdev etvme c %et_chr% 0 1964 ;; 1965 1966 leo[0-9]*) 1967 unit=${i#leo} 1968 mkdev leo$unit c %leo_chr% $unit 1969 ;; 1970 1971 scif[0-9]*) 1972 unit=${i#scif} 1973 mkdev scif$unit c %scif_chr% $(($unit + $dialin )) "" "" $u_uucp 1974 mkdev dscif$unit c %scif_chr% $(($unit + $dialout)) "" "" $u_uucp 1975 ;; 1976 1977 sci[0-9]*) 1978 unit=${i#sci} 1979 mkdev sci$unit c %sci_chr% $(($unit + $dialin )) "" "" $u_uucp 1980 mkdev dsci$unit c %sci_chr% $(($unit + $dialout)) "" "" $u_uucp 1981 ;; 1982 1983 maple[ABCD]|maple[ABCD][0-9]*) 1984 case $i in 1985 mapleA*) name="mapleA"; unit=0;; 1986 mapleB*) name="mapleB"; unit=1;; 1987 mapleC*) name="mapleC"; unit=2;; 1988 mapleD*) name="mapleD"; unit=3;; 1989 esac 1990 subunit=${i#$name} 1991 mkdev $name$subunit c %maple_chr% $(($unit * 8 + 0$subunit)) 1992 ;; 1993 1994 mmem[0-9]*) 1995 unit=${i#mmem} 1996 for pt in 0 # 1 2 3 4 ... 255 1997 do 1998 # mkdev mmem${unit}.${pt}a b %mmem_blk% $(($unit * 4096 + $pt * 16 + 0)) 640 $g_operator 1999 mkdev mmem${unit}.${pt}c b %mmem_blk% $(($unit * 4096 + $pt * 16 + 2)) 640 $g_operator 2000 # mkdev rmmem${unit}.${pt}a c %mmem_chr% $(($unit * 4096 + $pt * 16 + 0)) 640 $g_operator 2001 mkdev rmmem${unit}.${pt}c c %mmem_chr% $(($unit * 4096 + $pt * 16 + 2)) 640 $g_operator 2002 done 2003 ;; 2004 2005 mlcd[0-9]*) 2006 unit=${i#mlcd} 2007 for pt in 0 # 1 2 3 4 ... 255 2008 do 2009 mkdev mlcd${unit}.${pt} c %mlcd_chr% $(($unit * 256 + $pt)) 640 $g_operator 2010 done 2011 ;; 2012 2013 ixpcom[0-9]*) 2014 unit=${i#ixpcom} 2015 mkdev ixpcom$unit c %ixpcom_chr% $unit "" "" $u_uucp 2016 ;; 2017 2018 epcom[0-9]*) 2019 unit=${i#epcom} 2020 mkdev epcom$unit c %epcom_chr% $unit "" "" $u_uucp 2021 ;; 2022 2023 plcom[0-9]*) 2024 unit=${i#plcom} 2025 mkdev plcom$unit c %plcom_chr% $unit "" "" $u_uucp 2026 mkdev dplcom$unit c %plcom_chr% $(($unit + $dialout)) "" "" $u_uucp 2027 ;; 2028 2029 wmcom[0-9]*) 2030 unit=${i#wmcom} 2031 mkdev wmcom$unit c %wmcom_chr% $unit "" "" $u_uucp 2032 ;; 2033 2034 ucbsnd) 2035 mkdev ucbsnd c %ucbsnd_chr% 0 666 2036 ;; 2037 2038 adb) 2039 mkdev adb c %aed_chr% 0 666 2040 ;; 2041 2042 asc[0-9]*) 2043 unit=${i#asc} 2044 mkdev asc$unit c %asc_chr% $unit 666 2045 ;; 2046 2047 bwtwo[0-9]*) 2048 unit=${i#bwtwo} 2049 mkdev bwtwo$unit c %bwtwo_chr% $unit 666 2050 ;; 2051 2052 cgtwo[0-9]*) 2053 unit=${i#cgtwo} 2054 mkdev cgtwo$unit c %cgtwo_chr% $unit 666 2055 ;; 2056 2057 cgthree[0-9]*) 2058 unit=${i#cgthree} 2059 mkdev cgthree$unit c %cgthree_chr% $unit 666 2060 ;; 2061 2062 cgfour[0-9]*) 2063 unit=${i#cgfour} 2064 mkdev cgfour$unit c %cgfour_chr% $unit 666 2065 ;; 2066 2067 cgsix[0-9]*) 2068 unit=${i#cgsix} 2069 mkdev cgsix$unit c %cgsix_chr% $unit 666 2070 ;; 2071 2072 cgeight[0-9]*) 2073 unit=${i#cgeight} 2074 mkdev cgeight$unit c %cgeight_chr% $unit 666 2075 ;; 2076 2077 tcx[0-9]*) 2078 unit=${i#tcx} 2079 mkdev tcx$unit c %tcx_chr% $unit 666 2080 ;; 2081 2082 xd[0-9]*|xy[0-9]*) 2083 case $i in 2084 xd*) name=xd; unit=${i#xd}; blk=%xd_blk%; chr=%xd_chr%;; 2085 xy*) name=xy; unit=${i#xy}; blk=%xy_blk%; chr=%xy_chr%;; 2086 esac 2087 %MKDISK% $name $unit $blk $chr 2088 ;; 2089 2090 magma[0-9]*) 2091 unit=${i#magma} 2092 if [ 0$unit -gt 3 ]; then 2093 warn "bad unit for $i: $unit" 2094 break 2095 fi 2096 for j in 0 1 2 3 4 5 6 7 8 9 a b c d e f 2097 do 2098 case $j in 2099 [0-9]) jn=$j ;; 2100 a) jn=10 ;; 2101 b) jn=11 ;; 2102 c) jn=12 ;; 2103 d) jn=13 ;; 2104 e) jn=14 ;; 2105 f) jn=15 ;; 2106 esac 2107 mkdev tty$unit$j c %mtty_chr% $(($unit * 64 + $jn)) 2108 done 2109 mkdev bpp${unit}0 c %mbpp_chr% $(($unit * 64 + 0)) 2110 mkdev bpp${unit}1 c %mbpp_chr% $(($unit * 64 + 1)) 2111 ;; 2112 2113 clcd[0-9]*) 2114 unit=${i#clcd} 2115 if [ 0$unit -gt 7 ]; then 2116 warn "bad unit for $i: $unit" 2117 break 2118 fi 2119 for j in 0 1 2 3 4 5 6 7 2120 do 2121 mkdev ttyA$unit$j c %clcd_chr% $(($unit * 8 + $j + $dialin)) "" "" $u_uucp 2122 mkdev dtyA$unit$j c %clcd_chr% $(($unit * 8 + $j + $dialout)) "" "" $u_uucp 2123 done 2124 ;; 2125 2126 spif[0-9]*) 2127 unit=${i#spif} 2128 if [ 0$unit -gt 3 ]; then 2129 warn "bad unit for $i: $unit" 2130 break 2131 fi 2132 for j in 0 1 2 3 4 5 6 7; do 2133 mkdev ttyS$unit$j c %stty_chr% $(($unit * 64 + $j)) "" "" $u_uucp 2134 done 2135 mkdev bppS${unit}0 c %sbpp_chr% $(($unit * 64 + 0)) 2136 mkdev bppS${unit}1 c %sbpp_chr% $(($unit * 64 + 1)) 2137 ;; 2138 2139 bpp|bpp[0-9]*) 2140 unit=${i#bpp} 2141 mkdev bpp$unit c %bpp_chr% $(($unit + 0)) 2142 ;; 2143 2144 tctrl[0-9]*) 2145 unit=${i#tctrl} 2146 mkdev tctrl$unit c %tctrl_chr% $unit 666 2147 ;; 2148 2149 bmd[0-9]*) 2150 unit=${i#bmd} 2151 mkdev bmd${unit}a b %bmd_blk% $(($unit * 8 + 0)) 640 $g_operator 2152 mkdev bmd${unit}c b %bmd_blk% $(($unit * 8 + 2)) 640 $g_operator 2153 mkdev rbmd${unit}a c %bmd_chr% $(($unit * 8 + 0)) 640 $g_operator 2154 mkdev rbmd${unit}c c %bmd_chr% $(($unit * 8 + 2)) 640 $g_operator 2155 ;; 2156 2157 sram) 2158 mkdev sram c %sram_chr% 0 644 2159 ;; 2160 2161 ttyS[0-9]*) 2162 unit=${i#ttyS} 2163 mkdev ttyS$unit c %sacom_chr% $(($unit + $dialin )) "" "" $u_uucp 2164 mkdev dtyS$unit c %sacom_chr% $(($unit + $dialout)) "" "" $u_uucp 2165 ;; 2166 2167 atabus[0-9]*) 2168 unit=${i#atabus} 2169 mkdev atabus$unit c %atabus_chr% $unit 644 2170 ;; 2171 2172 drm[0-9]*) 2173 unit=${i#drm} 2174 unit2=$((unit + 128)) 2175 makedir dri 755 2176 mkdev dri/card$unit c %drm_chr% $unit 660 2177 mkdev dri/renderD${unit2} c %drm_chr% ${unit2} 660 2178 ;; 2179 2180 drvctl) 2181 mkdev drvctl c %drvctl_chr% 0 644 2182 ;; 2183 2184 isv) 2185 mkdev isv c %isv_chr% 0 644 2186 ;; 2187 2188 tap|tap[0-9]*) 2189 unit=${i#tap} 2190 case "$unit" in 2191 [0-9]*) 2192 mkdev tap${unit} c %tap_chr% ${unit} 600 2193 ;; 2194 "") 2195 mkdev tap c %tap_chr% 0xfffff 600 2196 ;; 2197 esac 2198 ;; 2199 2200 srt[0-9]*) 2201 unit=${i#srt} 2202 mkdev srt$unit c %srt_chr% $unit 600 2203 ;; 2204 2205 tpm) 2206 mkdev tpm c %tpm_chr% 0 600 2207 ;; 2208 2209 dtrace) 2210 makedir dtrace 755 2211 mkdev dtrace/dtrace c %dtrace_chr% 0 600 2212 ;; 2213 2214 fw[0-9]*) 2215 unit=${i#fw} 2216 for j in 0 1 2 3 2217 do 2218 mkdev fw${unit}.${j} c %fw_chr% $((${unit} * 256 + ${j})) 660 ${g_operator} 2219 mkdev fwmem${unit}.${j} c %fw_chr% $((65536 + ${unit} * 256 + ${j})) 660 ${g_operator} 2220 done 2221 ;; 2222 2223 # create putter device and symlinks for all subsystems using it 2224 putter) 2225 mkdev putter c %putter_chr% 0 600 2226 mkdev pud c %putter_chr% 1 600 2227 lndev putter puffs 2228 ;; 2229 2230 zfs) 2231 mkdev zfs c %zfs_chr% 0 600 2232 makedir zpool 755 2233 ;; 2234 2235 iscsi[0-9]*) 2236 unit=${i#iscsi} 2237 mkdev iscsi${unit} c %iscsi_chr% $unit 600 2238 ;; 2239 2240 vchiq) 2241 mkdev vchiq c %vchiq_chr% 0 600 2242 ;; 2243 2244 nvme[0-9]*ns[0-9]*) 2245 unit=${i#nvme} 2246 unit=${unit%ns*} 2247 subunit=${i#nvme${unit}ns} 2248 if [ 0$subunit -le 0 ] || [ 0$subunit -ge 65536 ]; then 2249 warn "bad nsid for $i: $subunit" 2250 break 2251 fi 2252 mkdev nvme${unit}ns$subunit c %nvme_chr% $(($unit * 65536 + $subunit)) 2253 ;; 2254 2255 nvme[0-9]*) 2256 unit=${i#nvme} 2257 mkdev nvme$unit c %nvme_chr% $(($unit * 65536)) 2258 ;; 2259 2260 nvmm) 2261 mkdev nvmm c %nvmm_chr% 0 660 $g_nvmm 2262 ;; 2263 2264 autofs) 2265 mkdev autofs c %autofs_chr% 0 600 2266 ;; 2267 2268 kcov) 2269 mkdev kcov c %kcov_chr% 0 2270 ;; 2271 2272 ipmi[0-9]*) 2273 unit=${i#ipmi} 2274 mkdev ipmi${unit} c %ipmi_chr% $unit 600 2275 ;; 2276 2277 xmm[0-9]) 2278 unit=${i#xmm} 2279 makedir xmm${unit} 755 2280 mkdev xmm${unit}/rpc c %wwanc_chr% $(($unit * 65536 + 1)) 2281 mkdev ttyXMM${unit}0 c %wwanc_chr% $(($unit * 65536 + 2)) 2282 mkdev ttyXMM${unit}1 c %wwanc_chr% $(($unit * 65536 + 4)) 2283 ;; 2284 2285 acpi) 2286 mkdev acpi c %acpi_chr% 0 2287 ;; 2288 2289 smbios) 2290 mkdev smbios c %smbios_chr% 0 2291 ;; 2292 2293 efi) 2294 mkdev efi c %efi_chr% 0 660 2295 ;; 2296 2297 sht3xtemp[0-9]*) 2298 unit=${i#sht3xtemp} 2299 mkdev sht3xtemp$unit c %sht3xtemp_chr% $unit 664 2300 ;; 2301 2302 scmd[0-9]*) 2303 unit=${i#scmd} 2304 mkdev scmd$unit c %scmd_chr% $unit 666 2305 ;; 2306 2307 ttyVI[0-9][0-9]) 2308 port=${i#ttyVI?} 2309 devunit=${i%$port} 2310 unit=${devunit#ttyVI} 2311 mkdev ttyVI$unit$port c %viocon_chr% $((16*$unit + $port)) 2312 ;; 2313 2314 ttyVI) 2315 makedev ttyVI00 ttyVI10 ttyVI20 ttyVI30 2316 ;; 2317 2318 midevend) 2319 %MI_DEVICES_END% 2320 local) 2321 if [ -f "$0.local" ]; then 2322 umask 0 2323 if [ -n "$count_nodes" ]; then 2324 count_nodes=$((count_nodes + \ 2325 $(linecount "$("$HOST_SH" "$0.local" $opts -s all)") )) 2326 else 2327 "$HOST_SH" "$0.local" $opts all 2328 fi 2329 umask 077 2330 fi 2331 ;; 2332 2333 *) 2334 warn "$i: unknown device" 2335 ;; 2336 2337 esac 2338 done 2339 2340 } 2341 2342 2343 # three variants of disk partitions - max 8, max 16, max 16 with highpartoffset 2344 # hack; only the one used by port is retained in final MAKEDEV script 2345 # routine is called as: 2346 # makedisk name unit blk chr 2347 makedisk_p8() 2348 { 2349 name="$1"; unit="$2"; blk="$3"; chr="$4" 2350 2351 ro=%RAWDISK_OFF% 2352 mkdev ${name}${unit} b $blk $(($unit * 8 + $ro)) 640 $g_operator 2353 mkdev r${name}${unit} c $chr $(($unit * 8 + $ro)) 640 $g_operator 2354 2355 mkdev ${name}${unit}a b $blk $(($unit * 8 + 0)) 640 $g_operator 2356 mkdev ${name}${unit}b b $blk $(($unit * 8 + 1)) 640 $g_operator 2357 mkdev ${name}${unit}c b $blk $(($unit * 8 + 2)) 640 $g_operator 2358 mkdev ${name}${unit}d b $blk $(($unit * 8 + 3)) 640 $g_operator 2359 mkdev ${name}${unit}e b $blk $(($unit * 8 + 4)) 640 $g_operator 2360 mkdev ${name}${unit}f b $blk $(($unit * 8 + 5)) 640 $g_operator 2361 mkdev ${name}${unit}g b $blk $(($unit * 8 + 6)) 640 $g_operator 2362 mkdev ${name}${unit}h b $blk $(($unit * 8 + 7)) 640 $g_operator 2363 mkdev r${name}${unit}a c $chr $(($unit * 8 + 0)) 640 $g_operator 2364 mkdev r${name}${unit}b c $chr $(($unit * 8 + 1)) 640 $g_operator 2365 mkdev r${name}${unit}c c $chr $(($unit * 8 + 2)) 640 $g_operator 2366 mkdev r${name}${unit}d c $chr $(($unit * 8 + 3)) 640 $g_operator 2367 mkdev r${name}${unit}e c $chr $(($unit * 8 + 4)) 640 $g_operator 2368 mkdev r${name}${unit}f c $chr $(($unit * 8 + 5)) 640 $g_operator 2369 mkdev r${name}${unit}g c $chr $(($unit * 8 + 6)) 640 $g_operator 2370 mkdev r${name}${unit}h c $chr $(($unit * 8 + 7)) 640 $g_operator 2371 } 2372 2373 makedisk_p12high() 2374 { 2375 ho=524280 # offset for partition 9 to 11 (same as ...p16high) 2376 name="$1"; unit="$2"; blk="$3"; chr="$4" 2377 2378 ro=%RAWDISK_OFF% 2379 mkdev ${name}${unit} b $blk $(($unit * 8 + $ro)) 640 $g_operator 2380 mkdev r${name}${unit} c $chr $(($unit * 8 + $ro)) 640 $g_operator 2381 2382 mkdev ${name}${unit}a b $blk $(($unit * 8 + 0)) 640 $g_operator 2383 mkdev ${name}${unit}b b $blk $(($unit * 8 + 1)) 640 $g_operator 2384 mkdev ${name}${unit}c b $blk $(($unit * 8 + 2)) 640 $g_operator 2385 mkdev ${name}${unit}d b $blk $(($unit * 8 + 3)) 640 $g_operator 2386 mkdev ${name}${unit}e b $blk $(($unit * 8 + 4)) 640 $g_operator 2387 mkdev ${name}${unit}f b $blk $(($unit * 8 + 5)) 640 $g_operator 2388 mkdev ${name}${unit}g b $blk $(($unit * 8 + 6)) 640 $g_operator 2389 mkdev ${name}${unit}h b $blk $(($unit * 8 + 7)) 640 $g_operator 2390 mkdev ${name}${unit}i b $blk $(($unit * 8 + $ho + 8)) 640 $g_operator 2391 mkdev ${name}${unit}j b $blk $(($unit * 8 + $ho + 9)) 640 $g_operator 2392 mkdev ${name}${unit}k b $blk $(($unit * 8 + $ho + 10)) 640 $g_operator 2393 mkdev ${name}${unit}l b $blk $(($unit * 8 + $ho + 11)) 640 $g_operator 2394 mkdev r${name}${unit}a c $chr $(($unit * 8 + 0)) 640 $g_operator 2395 mkdev r${name}${unit}b c $chr $(($unit * 8 + 1)) 640 $g_operator 2396 mkdev r${name}${unit}c c $chr $(($unit * 8 + 2)) 640 $g_operator 2397 mkdev r${name}${unit}d c $chr $(($unit * 8 + 3)) 640 $g_operator 2398 mkdev r${name}${unit}e c $chr $(($unit * 8 + 4)) 640 $g_operator 2399 mkdev r${name}${unit}f c $chr $(($unit * 8 + 5)) 640 $g_operator 2400 mkdev r${name}${unit}g c $chr $(($unit * 8 + 6)) 640 $g_operator 2401 mkdev r${name}${unit}h c $chr $(($unit * 8 + 7)) 640 $g_operator 2402 mkdev r${name}${unit}i c $chr $(($unit * 8 + $ho + 8)) 640 $g_operator 2403 mkdev r${name}${unit}j c $chr $(($unit * 8 + $ho + 9)) 640 $g_operator 2404 mkdev r${name}${unit}k c $chr $(($unit * 8 + $ho + 10)) 640 $g_operator 2405 mkdev r${name}${unit}l c $chr $(($unit * 8 + $ho + 11)) 640 $g_operator 2406 } 2407 2408 makedisk_p16() 2409 { 2410 name="$1"; unit="$2"; blk="$3"; chr="$4" 2411 2412 ro=%RAWDISK_OFF% 2413 mkdev ${name}${unit} b $blk $(($unit * 16 + $ro)) 640 $g_operator 2414 mkdev r${name}${unit} c $chr $(($unit * 16 + $ro)) 640 $g_operator 2415 2416 mkdev ${name}${unit}a b $blk $(($unit * 16 + 0)) 640 $g_operator 2417 mkdev ${name}${unit}b b $blk $(($unit * 16 + 1)) 640 $g_operator 2418 mkdev ${name}${unit}c b $blk $(($unit * 16 + 2)) 640 $g_operator 2419 mkdev ${name}${unit}d b $blk $(($unit * 16 + 3)) 640 $g_operator 2420 mkdev ${name}${unit}e b $blk $(($unit * 16 + 4)) 640 $g_operator 2421 mkdev ${name}${unit}f b $blk $(($unit * 16 + 5)) 640 $g_operator 2422 mkdev ${name}${unit}g b $blk $(($unit * 16 + 6)) 640 $g_operator 2423 mkdev ${name}${unit}h b $blk $(($unit * 16 + 7)) 640 $g_operator 2424 mkdev ${name}${unit}i b $blk $(($unit * 16 + 8)) 640 $g_operator 2425 mkdev ${name}${unit}j b $blk $(($unit * 16 + 9)) 640 $g_operator 2426 mkdev ${name}${unit}k b $blk $(($unit * 16 + 10)) 640 $g_operator 2427 mkdev ${name}${unit}l b $blk $(($unit * 16 + 11)) 640 $g_operator 2428 mkdev ${name}${unit}m b $blk $(($unit * 16 + 12)) 640 $g_operator 2429 mkdev ${name}${unit}n b $blk $(($unit * 16 + 13)) 640 $g_operator 2430 mkdev ${name}${unit}o b $blk $(($unit * 16 + 14)) 640 $g_operator 2431 mkdev ${name}${unit}p b $blk $(($unit * 16 + 15)) 640 $g_operator 2432 mkdev r${name}${unit}a c $chr $(($unit * 16 + 0)) 640 $g_operator 2433 mkdev r${name}${unit}b c $chr $(($unit * 16 + 1)) 640 $g_operator 2434 mkdev r${name}${unit}c c $chr $(($unit * 16 + 2)) 640 $g_operator 2435 mkdev r${name}${unit}d c $chr $(($unit * 16 + 3)) 640 $g_operator 2436 mkdev r${name}${unit}e c $chr $(($unit * 16 + 4)) 640 $g_operator 2437 mkdev r${name}${unit}f c $chr $(($unit * 16 + 5)) 640 $g_operator 2438 mkdev r${name}${unit}g c $chr $(($unit * 16 + 6)) 640 $g_operator 2439 mkdev r${name}${unit}h c $chr $(($unit * 16 + 7)) 640 $g_operator 2440 mkdev r${name}${unit}i c $chr $(($unit * 16 + 8)) 640 $g_operator 2441 mkdev r${name}${unit}j c $chr $(($unit * 16 + 9)) 640 $g_operator 2442 mkdev r${name}${unit}k c $chr $(($unit * 16 + 10)) 640 $g_operator 2443 mkdev r${name}${unit}l c $chr $(($unit * 16 + 11)) 640 $g_operator 2444 mkdev r${name}${unit}m c $chr $(($unit * 16 + 12)) 640 $g_operator 2445 mkdev r${name}${unit}n c $chr $(($unit * 16 + 13)) 640 $g_operator 2446 mkdev r${name}${unit}o c $chr $(($unit * 16 + 14)) 640 $g_operator 2447 mkdev r${name}${unit}p c $chr $(($unit * 16 + 15)) 640 $g_operator 2448 } 2449 2450 makedisk_p16high() 2451 { 2452 ho=524280 # offset for partition 9 to 16 2453 name="$1"; unit="$2"; blk="$3"; chr="$4" 2454 2455 ro=%RAWDISK_OFF% 2456 mkdev ${name}${unit} b $blk $(($unit * 8 + $ro)) 640 $g_operator 2457 mkdev r${name}${unit} c $chr $(($unit * 8 + $ro)) 640 $g_operator 2458 2459 mkdev ${name}${unit}a b $blk $(($unit * 8 + 0)) 640 $g_operator 2460 mkdev ${name}${unit}b b $blk $(($unit * 8 + 1)) 640 $g_operator 2461 mkdev ${name}${unit}c b $blk $(($unit * 8 + 2)) 640 $g_operator 2462 mkdev ${name}${unit}d b $blk $(($unit * 8 + 3)) 640 $g_operator 2463 mkdev ${name}${unit}e b $blk $(($unit * 8 + 4)) 640 $g_operator 2464 mkdev ${name}${unit}f b $blk $(($unit * 8 + 5)) 640 $g_operator 2465 mkdev ${name}${unit}g b $blk $(($unit * 8 + 6)) 640 $g_operator 2466 mkdev ${name}${unit}h b $blk $(($unit * 8 + 7)) 640 $g_operator 2467 mkdev ${name}${unit}i b $blk $(($unit * 8 + $ho + 8)) 640 $g_operator 2468 mkdev ${name}${unit}j b $blk $(($unit * 8 + $ho + 9)) 640 $g_operator 2469 mkdev ${name}${unit}k b $blk $(($unit * 8 + $ho + 10)) 640 $g_operator 2470 mkdev ${name}${unit}l b $blk $(($unit * 8 + $ho + 11)) 640 $g_operator 2471 mkdev ${name}${unit}m b $blk $(($unit * 8 + $ho + 12)) 640 $g_operator 2472 mkdev ${name}${unit}n b $blk $(($unit * 8 + $ho + 13)) 640 $g_operator 2473 mkdev ${name}${unit}o b $blk $(($unit * 8 + $ho + 14)) 640 $g_operator 2474 mkdev ${name}${unit}p b $blk $(($unit * 8 + $ho + 15)) 640 $g_operator 2475 mkdev r${name}${unit}a c $chr $(($unit * 8 + 0)) 640 $g_operator 2476 mkdev r${name}${unit}b c $chr $(($unit * 8 + 1)) 640 $g_operator 2477 mkdev r${name}${unit}c c $chr $(($unit * 8 + 2)) 640 $g_operator 2478 mkdev r${name}${unit}d c $chr $(($unit * 8 + 3)) 640 $g_operator 2479 mkdev r${name}${unit}e c $chr $(($unit * 8 + 4)) 640 $g_operator 2480 mkdev r${name}${unit}f c $chr $(($unit * 8 + 5)) 640 $g_operator 2481 mkdev r${name}${unit}g c $chr $(($unit * 8 + 6)) 640 $g_operator 2482 mkdev r${name}${unit}h c $chr $(($unit * 8 + 7)) 640 $g_operator 2483 mkdev r${name}${unit}i c $chr $(($unit * 8 + $ho + 8)) 640 $g_operator 2484 mkdev r${name}${unit}j c $chr $(($unit * 8 + $ho + 9)) 640 $g_operator 2485 mkdev r${name}${unit}k c $chr $(($unit * 8 + $ho + 10)) 640 $g_operator 2486 mkdev r${name}${unit}l c $chr $(($unit * 8 + $ho + 11)) 640 $g_operator 2487 mkdev r${name}${unit}m c $chr $(($unit * 8 + $ho + 12)) 640 $g_operator 2488 mkdev r${name}${unit}n c $chr $(($unit * 8 + $ho + 13)) 640 $g_operator 2489 mkdev r${name}${unit}o c $chr $(($unit * 8 + $ho + 14)) 640 $g_operator 2490 mkdev r${name}${unit}p c $chr $(($unit * 8 + $ho + 15)) 640 $g_operator 2491 } 2492 2493 # make only the very few basic disk device nodes - 'a' partition 2494 # and raw partition 2495 makedisk_minimal() 2496 { 2497 name=$1; unit=$2; blk=$3; chr=$4 2498 doff=%DISKMINOROFFSET% 2499 ro=%RAWDISK_OFF% 2500 rn=%RAWDISK_NAME% 2501 2502 mkdev ${name}${unit} b $blk $(($unit * $doff + $ro)) 640 $g_operator 2503 mkdev r${name}${unit} c $chr $(($unit * $doff + $ro)) 640 $g_operator 2504 2505 mkdev ${name}${unit}a b $blk $(($unit * $doff + 0)) 640 $g_operator 2506 mkdev ${name}${unit}$rn b $blk $(($unit * $doff + $ro)) 640 $g_operator 2507 mkdev r${name}${unit}a c $chr $(($unit * $doff + 0)) 640 $g_operator 2508 mkdev r${name}${unit}$rn c $chr $(($unit * $doff + $ro)) 640 $g_operator 2509 } 2510 2511 # create_mfs_dev nodes 2512 # Create a memory file system for a given number of device nodes, 2513 # and mount it. Attempts to use mount_tmpfs, or falls back to 2514 # mount_mfs. 2515 # 2516 # If do_redirect, then also redirect output to the console. 2517 # 2518 create_mfs_dev() 2519 { 2520 ndevnodes=${1-1200} 2521 dev_mountpoint=${PWD:-/dev} 2522 2523 # Number of inodes is the specified number of device nodes, plus 2524 # a margin to allow for extra device nodes created later. 2525 ninode=$((ndevnodes * 11 / 10)) 2526 # Add 2 reserved inodes (needed for both mfs and tmpfs), and round 2527 # up to a multiple of 32 (needed for mfs, not needed for tmpfs). 2528 ninode=$(( (ninode + 2 + 31) / 32 * 32 )) 2529 # Try tmpfs; if that fails try mfs. 2530 # 2531 # For tmpfs, allocate 16KB and 512 byte per node. 2532 # Actual requirements are much lower, but the size limit 2533 # is only intended to avoid accidental writing to /dev. 2534 fs_bytes=$((16384 + ninode * 512)) 2535 if mount_tmpfs -s $fs_bytes -n $ninode -m 0755 \ 2536 -o union tmpfs "$dev_mountpoint" 2537 then 2538 fstype=tmpfs 2539 else 2540 # This file system size calculation is exact for mount_mfs(8) 2541 # with 512-byte sectors. 40960 bytes (80 blocks) is the 2542 # minimum size allowed by mount_mfs. 2543 fs_bytes=$((8192 + 2 * 8192 + 4096 + ninode*512 + 8192)) 2544 [ "$fs_bytes" -lt 40960 ] && fs_bytes=40960 2545 fs_blocks=$((fs_bytes/512)) 2546 if mount_mfs -b 4096 -f 512 -s $fs_blocks -n $ninode -p 0755 \ 2547 -o union swap "$dev_mountpoint" 2548 then 2549 fstype=mfs 2550 else 2551 die "Failed to create memory file system" 2552 fi 2553 fi 2554 2555 # Our current directory was in the lower file system; change it to 2556 # the newly mounted upper file system. 2557 cd "$dev_mountpoint" 2558 2559 if $do_redirect; then 2560 # Redirect stdout and stderr to console 2561 ${MKNOD} -m 600 -g 0 -u 0 temp_console c %CONSOLE_CMAJOR% 0 2562 exec >temp_console 2>&1 2563 rm temp_console 2564 fi 2565 2566 echo "Created $fstype $dev_mountpoint" \ 2567 "($fs_bytes byte, $ninode inodes)" 2568 } 2569 2570 # 2571 # MAIN: If MAKEDEV_AS_LIBRARY is set, then we are being used as a 2572 # function library, so just return. Otherwise, do all the real work. 2573 # 2574 [ -n "${MAKEDEV_AS_LIBRARY}" ] && return 2575 makedev_main makedev ${1+"$@"} 2576