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
325usage()
326{
327          cat 1>&2 << _USAGE_
328Usage: ${0##*/} [-fMsu] [-m mknod] [-p pax] [-t mtree] special [...]
329          Create listed special devices.  Options:
330          -f                  Force permissions to be updated on existing devices.
331          -M                  Create memory file system.
332          -m mknod  Name of mknod(8) program.  [\$TOOL_MKNOD or mknod]
333          -p pax    Name of pax(1) program.  [\$TOOL_PAX or pax]
334          -s                  Generate mtree(8) specfile instead of creating devices.
335          -t mtree  Name of mtree(8) program.  [\$TOOL_MTREE or mtree]
336          -u                  Don't re-create devices that already exist.
337
338_USAGE_
339          exit 1
340}
341
342# zeropad width number
343#         display number with a zero (`0') padding of width digits.
344#
345zeropad()
346{
347          case $(($1 - ${#2})) in
348          5)        echo 00000$2;;
349          4)        echo 0000$2;;
350          3)        echo 000$2;;
351          2)        echo 00$2;;
352          1)        echo 0$2;;
353          0)        echo $2;;
354          *)        die "bad padding" ;;
355          esac
356}
357
358# hexprint number
359#         display (base10) number as hexadecimal
360#
361hexprint()
362{
363          val="$(($1 + 0))"
364          hex=
365          set -- 0 1 2 3 4 5 6 7 8 9 a b c d e f
366          while [ "$val" -gt 0 ]; do
367                    eval hex=\${$(($val % 16 + 1))}\$hex
368                    val="$(($val / 16))"
369          done
370          echo "${hex:-0}"
371}
372
373# linecount multiline_string
374#         count the number of lines in the string
375#
376linecount()
377{
378          local IFS='
379' # just a newline, no other white space between the quotes
380          set -- $1
381          echo $#
382}
383
384# nooutput -12 cmd [args...]
385#         run a command with stdout and/or stderr ignored.
386#         "nooutput -1 cmd" is like "cmd >/dev/null";
387#         "nooutput -2 cmd" is like "{ cmd ; } 2>/dev/null";
388#         "nooutput -12 cmd" is like "{ cmd ; } >/dev/null 2>&1";
389#         except they should work even if /dev/null doesn't [yet] exist.
390#
391#         The "{...}" wrapper used in cases where stderr is redirected
392#         serves to capture shell error messages such as "cmd: not found".
393#
394nooutput()
395{
396          local flags="$1" ; shift
397          local junk
398          case "$flags" in
399          "-1")     junk="$( "$@" )" ;;
400          "-2")     ( exec 4>&1 ; junk="$( { "$@" ; } 2>&1 1>&4 )" ) ;;
401          "-12")    junk="$( { "$@" ; } 2>&1 )" ;;
402          *)        warn "Incorrect use of nooutput" ;;
403          esac
404}
405
406# check_pax path_to_pax
407#         Check whether pax exists and supports the command line options
408#         and input format that we will want to use.
409#
410check_pax()
411{
412          local pax="$1"
413          echo ". type=dir optional" | nooutput -12 "${pax}" -r -w -M -pe .
414}
415
416# check_mtree path_to_mtree
417#         Check whether mtree exists and supports the command line options
418#         and input format that we will want to use.
419#
420check_mtree()
421{
422          local mtree="$1"
423          echo ". type=dir optional" | nooutput -12 "${mtree}" -e -U
424}
425
426# setup args...
427#         Parse command line arguments, exit on error.
428#         Callers should shift $((OPTIND - 1)) afterwards.
429#
430setup()
431{
432          PATH=/sbin:/usr/sbin:/bin:/usr/bin:/rescue
433
434          : ${HOST_SH:=sh}
435          : ${TOOL_MKNOD:=mknod}
436          : ${TOOL_MTREE:=mtree}
437          : ${TOOL_PAX:=pax}
438          status=0
439          do_create_mfs=false
440          do_force=false
441          do_mknod=false
442          do_pax=false
443          do_mtree=false
444          do_redirect=false
445          do_specfile=false
446          do_update=false
447          opts=
448          while getopts Mfm:p:st:u ch; do
449                    # Note that $opts is only for options 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#
612specfile_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#
622mtree_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#
632pax_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#
658makedev_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
735mkdev()
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
755lndev()
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
771makedir()
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
788warn()
789{
790          echo 1>&2 "$0: $*"
791          status=1
792}
793
794die()
795{
796          echo 1>&2 "$0: $*"
797          exit 1
798}
799
800# makedev special [...]
801#         the main loop
802#
803makedev()
804{
805
806for i
807do
808
809case $i in
810
811%MD_DEVICES%
812
813all)
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
858init)
859          # unless overridden by MD entry, this is equal to 'all'
860          makedev all opty
861          ;;
862
863%MI_DEVICES_BEGIN%
864audio)
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
873emcfan[0-9]*)
874          unit=${i#emcfan}
875          mkdev emcfan$unit c %emcfan_chr% $unit 660
876          ;;
877
878gpio)
879          makedev gpio0 gpio1 gpio2 gpio3 gpio4 gpio5 gpio6 gpio7
880          lndev gpio0 gpio
881          ;;
882
883gpioirq)
884          makedev gpioirq0
885          ;;
886
887gpiopps)
888          makedev gpiopps0
889          lndev gpiopps0 gpiopps
890          ;;
891
892lua)
893          makedev lua0
894          lndev lua0 lua
895          ;;
896
897pad)
898          makedev pad0 pad1 pad2 pad3
899          lndev pad0 pad
900          ;;
901
902qemufwcfg)
903          makedev qemufwcfg0
904          lndev qemufwcfg0 qemufwcfg
905          ;;
906
907radio)
908          makedev radio0 radio1
909          lndev radio0 radio
910          ;;
911
912video)
913          makedev video0 video1 video2 video3
914          ;;
915
916dtv)
917          makedev dtv0 dtv1 dtv2 dtv3
918          ;;
919
920iic)
921          makedev iic0 iic1 iic2 iic3
922          ;;
923
924altmem)
925          makedev altmem0 altmem1
926          ;;
927
928ramdisk)
929          makedev floppy md0
930          ;;
931
932sht3xtemp)
933          makedev sht3xtemp0
934          ;;
935
936scmd)
937          makedev scmd0
938          ;;
939
940usbs)
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
954virtio)
955          makedev ttyVI
956          makedev vio9p0 vio9p1 vio9p2 vio9p3
957          makedev vio9p4 vio9p5 vio9p6 vio9p7
958          ;;
959
960std)
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
981usb)
982          mkdev usb c %usb_chr% 255 444
983          ;;
984
985usb[0-9]*)
986          unit=${i#usb}
987          usb=usb$unit
988          mkdev usb$unit c %usb_chr% $unit
989          ;;
990
991uhid[0-9]*)
992          unit=${i#uhid}
993          mkdev uhid$unit c %uhid_chr% $unit 666
994          ;;
995
996ulpt[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
1002utoppy[0-9]*)
1003          unit=${i#utoppy}
1004          mkdev utoppy$unit c %utoppy_chr% $unit
1005          ;;
1006
1007ttyHS[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
1018ttyY[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
1025ucom[0-9]*)
1026          makedev ttyU${i#ucom}
1027          ;;
1028
1029ttyU[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
1036ugen[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
1044umcpmio[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
1053wscons)
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
1069wsmouse)
1070          mkdev wsmouse c %wsmux_chr% 0
1071          ;;
1072
1073wskbd)
1074          mkdev wskbd c %wsmux_chr% 1
1075          ;;
1076
1077wsmux[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
1083xenevt)
1084          mkdev xenevt c %xenevt_chr% 0
1085          ;;
1086
1087xsd_kva)
1088          mkdev xsd_kva c %xenevt_chr% 1
1089          ;;
1090
1091xencons)
1092          mkdev xencons c %xencons_chr% 0
1093          ;;
1094
1095ttyEstat)
1096          mkdev ttyEstat c %wsdisplay_chr% 254
1097          ;;
1098
1099ttyEcfg)
1100          mkdev ttyEcfg c %wsdisplay_chr% 255
1101          ;;
1102
1103ttyE[0-9]*)
1104          unit=${i#ttyE}
1105          mkdev ttyE$unit c %wsdisplay_chr% $unit
1106          ;;
1107
1108ttyFstat)
1109          mkdev ttyFstat c %wsdisplay_chr% 510
1110          ;;
1111
1112ttyFcfg)
1113          mkdev ttyFcfg c %wsdisplay_chr% 511
1114          ;;
1115
1116ttyF[0-9]*)
1117          unit=${i#ttyF}
1118          mkdev ttyF$unit c %wsdisplay_chr% $(($unit + 256))
1119          ;;
1120
1121ttyGstat)
1122          mkdev ttyGstat c %wsdisplay_chr% 766
1123          ;;
1124
1125ttyGcfg)
1126          mkdev ttyGcfg c %wsdisplay_chr% 767
1127          ;;
1128
1129ttyG[0-9]*)
1130          unit=${i#ttyG}
1131          mkdev ttyG$unit c %wsdisplay_chr% $(($unit + 512))
1132          ;;
1133
1134ttyHstat)
1135          mkdev ttyHstat c %wsdisplay_chr% 1022
1136          ;;
1137
1138ttyHcfg)
1139          mkdev ttyHcfg c %wsdisplay_chr% 1023
1140          ;;
1141
1142ttyH[0-9]*)
1143          unit=${i#ttyH}
1144          mkdev ttyH$unit c %wsdisplay_chr% $(($unit + 768))
1145          ;;
1146
1147wsmouse[0-9]*)
1148          unit=${i#wsmouse}
1149          mkdev wsmouse$unit c %wsmouse_chr% $unit
1150          ;;
1151
1152wskbd[0-9]*)
1153          unit=${i#wskbd}
1154          mkdev wskbd$unit c %wskbd_chr% $unit
1155          ;;
1156
1157fd)
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
1170wt[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
1181md[0-9]*)
1182          makedisk_minimal md ${i#md} %md_blk% %md_chr%
1183          ;;
1184
1185fss[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
1191ss[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
1198ccd[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
1208sd[0-9]*)
1209          name=sd; unit=${i#sd};        blk=%sd_blk%;       chr=%sd_chr%
1210          %MKDISK% $name $unit $blk $chr
1211          ;;
1212
1213ace[0-9]*)
1214          name=ace; unit=${i#ace};      blk=%ace_blk%;                chr=%ace_chr%
1215          %MKDISK% $name $unit $blk $chr
1216          ;;
1217
1218eflash[0-9]*)
1219          name=eflash; unit=${i#eflash};          blk=%eflash_blk%;   chr=%eflash_chr%
1220          %MKDISK% $name $unit $blk $chr
1221          ;;
1222
1223wd[0-9]*)
1224          name=wd; unit=${i#wd}; blk=%wd_blk%; chr=%wd_chr%
1225          %MKDISK% $name $unit $blk $chr
1226          ;;
1227
1228fd[0-9]*)
1229          name=fd; unit=${i#fd}; blk=%fd_blk%; chr=%fd_chr%
1230          %MKDISK% $name $unit $blk $chr
1231          ;;
1232
1233ld[0-9]*)
1234          name=ld; unit=${i#ld}; blk=%ld_blk%; chr=%ld_chr%
1235          %MKDISK% $name $unit $blk $chr
1236          ;;
1237
1238flash[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
1245spiflash[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
1252altmem[0-9]*)
1253          name=altmem; unit=${i#altmem}; blk=%altmem_blk%; chr=%altmem_chr%
1254          %MKDISK% $name $unit $blk $chr
1255          ;;
1256
1257bio)
1258          mkdev bio c %bio_chr% 0
1259          ;;
1260
1261ed[0-9]*)
1262          name=ed; unit=${i#ed}; blk=%ed_blk%; chr=%ed_chr%
1263          %MKDISK% $name $unit $blk $chr
1264          ;;
1265
1266ofdisk[0-9]*)
1267          name=ofdisk; unit=${i#ofdisk}; blk=%ofdisk_blk%; chr=%ofdisk_chr%
1268          %MKDISK% $name $unit $blk $chr
1269          ;;
1270
1271xbd[0-9]*)
1272          name=xbd; unit=${i#xbd}; blk=%xbd_blk%; chr=%xbd_chr%
1273          %MKDISK% $name $unit $blk $chr
1274          ;;
1275
1276dk[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
1282tprof)
1283          mkdev tprof c %tprof_chr% 0
1284          ;;
1285
1286ttyCY[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
1304ttyCZ[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
1323tty[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
1334tty[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
1342ttyC[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
1349ttyh[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
1355ttyTX[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
1361ttyZ[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
1367opty)
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
1386pty[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
1444stic[0-9]*)
1445          unit=${i#stic}
1446          mkdev stic$unit c %stic_chr% $unit
1447          ;;
1448
1449st[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
1461ses[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
1470cd[0-9]*)
1471          makedisk_minimal cd ${i#cd} %cd_blk% %cd_chr%
1472          ;;
1473
1474mcd[0-9]*)
1475          makedisk_minimal mcd ${i#mcd} %mcd_blk% %mcd_chr%
1476          ;;
1477
1478gdrom[0-9]*)
1479          makedisk_minimal gdrom ${i#gdrom} %gdrom_blk% %gdrom_chr%
1480          ;;
1481
1482lpt[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
1491bpf)
1492          mkdev bpf c %bpf_chr% 0
1493          lndev bpf bpf0
1494          ;;
1495
1496npf)
1497          mkdev npf c %npf_chr% 0
1498          ;;
1499
1500bthub)
1501          mkdev bthub c %bthub_chr% 0
1502          ;;
1503
1504tun[0-9]*)
1505          unit=${i#tun}
1506          mkdev tun$unit c %tun_chr% $unit
1507          ;;
1508
1509joy[0-9]*)
1510          unit=${i#joy}
1511          mkdev joy$unit c %joy_chr% $unit
1512          ;;
1513
1514ipl)
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
1524pf)
1525          mkdev pf c %pf_chr% 0
1526          ;;
1527
1528crypto)
1529          mkdev crypto c %crypto_chr% 0 666
1530          ;;
1531
1532cmos)
1533          mkdev cmos c %cmos_chr% 0 644
1534          ;;
1535
1536speaker)
1537          mkdev speaker c %spkr_chr% 0
1538          ;;
1539
1540lockstat)
1541          mkdev lockstat c %lockstat_chr% 0
1542          ;;
1543
1544cpuctl)
1545          mkdev cpuctl c %cpuctl_chr% 0 666
1546          ;;
1547
1548audio|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
1561hdaudio[0-9]*)
1562          unit=${i#hdaudio}
1563          mkdev hdaudio$unit c %hdaudio_chr% $unit 644
1564          ;;
1565
1566hdmicec[0-9]*)
1567          uint=${i#hdmicec}
1568          mkdev hdmicec$unit c %hdmicec_chr% $unit 644
1569          ;;
1570
1571gpio[0-9]*)
1572          unit=${i#gpio}
1573          mkdev gpio$unit c %gpio_chr% $unit 664 $g_gpio
1574          ;;
1575
1576gpioirq[0-9]*)
1577          unit=${i#gpioirq}
1578          mkdev gpioirq$unit c %gpioirq_chr% $unit 444 $g_gpio
1579          ;;
1580
1581gpiopps[0-9]*)
1582          unit=${i#gpiopps}
1583          mkdev gpiopps$unit c %gpiopps_chr% $unit 664 $g_gpio
1584          ;;
1585
1586lua[0-9]*)
1587          unit=${i#lua}
1588          mkdev lua$unit c %lua_chr% $unit 664
1589          ;;
1590
1591rmidi[0-9]*)
1592          unit=${i#rmidi}
1593          mkdev rmidi$unit c %midi_chr% $unit 666
1594          ;;
1595
1596music|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
1603radio|radio[0-9]*)
1604          unit=${i#radio}
1605          : ${unit:-0}
1606          mkdev radio$unit c %radio_chr% $unit 666
1607          ;;
1608
1609video|video[0-9]*)
1610          unit=${i#video}
1611          : ${unit:-0}
1612          mkdev video$unit c %video_chr% $unit 666
1613          ;;
1614
1615dtv[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
1624iic[0-9]*)
1625          unit=${i#iic}
1626          : ${unit:-0}
1627          mkdev iic$unit c %iic_chr% $unit 600
1628          ;;
1629
1630spi[0-9]*)
1631          unit=${i#spi}
1632          : ${unit:-0}
1633          mkdev spi$unit c %spi_chr% $unit 600
1634          ;;
1635
1636amr[0-9]*)
1637          unit=${i#amr}
1638          mkdev amr$unit c %amr_chr% $unit
1639          ;;
1640
1641apm)
1642          mkdev apm c %apm_chr% 0 644
1643          mkdev apmctl        c %apm_chr% 8 644
1644          ;;
1645
1646apm)
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
1652random)
1653          mkdev random        c %rnd_chr% 0 444
1654          mkdev urandom       c %rnd_chr% 1 644
1655          ;;
1656
1657cfs)
1658          makedev cfs0
1659          ;;
1660
1661cfs[0-9]*)
1662          unit=${i#cfs}
1663          mkdev cfs$unit c %vcoda_chr% $unit
1664          ;;
1665
1666sysmon)
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
1672scsibus[0-9]*)
1673          unit=${i#scsibus}
1674          mkdev scsibus$unit c %scsibus_chr% $unit 644
1675          ;;
1676
1677bktr)
1678          makedev bktr0 bktr1
1679          lndev     bktr0     bktr
1680          lndev     tuner0    tuner
1681          lndev     vbi0      vbi
1682          ;;
1683
1684bktr[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
1691io)
1692          mkdev               io        c %mem_chr% 14      600
1693          ;;
1694
1695iop[0-9]*)
1696          unit=${i#iop}
1697          mkdev iop$unit c %iop_chr% $unit
1698          ;;
1699
1700mfi[0-9]*)
1701          unit=${i#mfi}
1702          mkdev mfi$unit c %mfi_chr% $unit
1703          ;;
1704
1705mlx[0-9]*)
1706          unit=${i#mlx}
1707          mkdev mlx$unit c %mlx_chr% $unit
1708          ;;
1709
1710mly[0-9]*)
1711          unit=${i#mly}
1712          mkdev mly$unit c %mly_chr% $unit
1713          ;;
1714
1715twa[0-9]*)
1716          unit=${i#twa}
1717          mkdev twa$unit c %twa_chr% $unit
1718          ;;
1719
1720twe[0-9]*)
1721          unit=${i#twe}
1722          mkdev twe$unit c %twe_chr% $unit
1723          ;;
1724
1725icp[0-9]*)
1726          unit=${i#icp}
1727          mkdev icp$unit c %icp_chr% $unit
1728          ;;
1729
1730agp[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
1738pci[0-9]*)
1739          unit=${i#pci}
1740          mkdev pci$unit c %pci_chr% $unit 640
1741          ;;
1742
1743dpti[0-9]*)
1744          unit=${i#dpti}
1745          mkdev dpti$unit c %dpti_chr% $unit
1746          ;;
1747
1748dpt[0-9]*)
1749          unit=${i#dpt}
1750          mkdev dpt$unit c %dpt_chr% $unit
1751          ;;
1752
1753altq)
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
1763wsfont)
1764          mkdev wsfont c %wsfont_chr% 0 644
1765          ;;
1766
1767cir[0-9]*)
1768          unit=${i#cir}
1769          mkdev cir$unit c %cir_chr% $unit 666
1770          ;;
1771
1772irframe[0-9]*)
1773          unit=${i#irframe}
1774          mkdev irframe$unit c %irframe_chr% $unit
1775          ;;
1776
1777fcom[0-9]*)
1778          unit=${i#fcom}
1779          mkdev fcom$unit c %fcom_chr% $unit "" "" $u_uucp
1780          ;;
1781
1782openfirm)
1783          mkdev openfirm c %openfirm_chr% 0 444
1784          ;;
1785
1786pad[0-9]*)
1787          unit=${i#pad}
1788          mkdev pad$unit c %pad_chr% $unit 444
1789          ;;
1790
1791qemufwcfg[0-9]*)
1792          unit=${i#qemufwcfg}
1793          mkdev qemufwcfg$unit c %qemufwcfg_chr% $unit 660
1794          ;;
1795
1796vio9p[0-9]*)
1797          unit=${i#vio9p}
1798          mkdev vio9p$unit c %vio9p_chr% $unit 660
1799          ;;
1800
1801fault)
1802          mkdev fault c %fault_chr% 0
1803          ;;
1804
1805nvram)
1806          mkdev nvram c %nvram_chr% 0 644
1807          ;;
1808
1809rtc)
1810          mkdev rtc c %rtc_chr% 0 644
1811          ;;
1812
1813clockctl)
1814          mkdev clockctl c %clockctl_chr% 0 660 $g_ntpd
1815          ;;
1816
1817kttcp)
1818          mkdev kttcp c %kttcp_chr% 0
1819          ;;
1820
1821dmoverio)
1822          mkdev dmoverio c %dmoverio_chr% 0 644
1823          ;;
1824
1825veriexec)
1826          mkdev veriexec c %veriexec_chr% 0 600
1827          ;;
1828
1829vhci[0-7]*)
1830          unit=${i#vhci}
1831          mkdev vhci$unit c %vhci_chr% $unit
1832          ;;
1833
1834ttyv[0-9]*)
1835          unit=${i#ttyv}
1836          mkdev ttyv$unit c %pc_chr% $unit
1837          ;;
1838
1839# arm, acorn32
1840ttyv[0-9]*)
1841          unit=${i#ttyv}
1842          mkdev ttyv$unit c %physcon_chr% $unit
1843          ;;
1844
1845arcpp[0-9]*)
1846          unit=${i#arcpp}
1847          mkdev arcpp$unit c %arcpp_chr% $unit
1848          ;;
1849
1850par[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
1862cpi[0-9]*)
1863          unit=${i#cpi}
1864          mkdev cpi$unit c %cpi_chr% $unit
1865          ;;
1866
1867ite[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
1875pms[0-9]*)
1876          unit=${i#pms}
1877          mkdev pms$unit c %opms_chr% $unit
1878          ;;
1879
1880qms[0-9]*)
1881          unit=${i#qms}
1882          mkdev qms$unit c %qms_chr% $unit
1883          ;;
1884
1885lms[0-9]*)
1886          unit=${i#lms}
1887          mkdev lms$unit c %lms_chr% $unit
1888          ;;
1889
1890mms[0-9]*)
1891          unit=${i#mms}
1892          mkdev mms$unit c %mms_chr% $unit
1893          ;;
1894
1895mouse-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
1904kbd)
1905          mkdev kbd c %kbd_chr% 0
1906          ;;
1907
1908kbdctl)
1909          mkdev kbdctl c %kbd_chr% 1
1910          ;;
1911
1912vidcconsole0)
1913          mkdev vidcconsole0 c %vidcconsole_chr% 0 640
1914          ;;
1915
1916view[0-9]*)
1917          unit=${i#view}
1918          mkdev view$unit c %view_chr% $unit 666
1919          ;;
1920
1921mouse[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
1936panel)
1937          mkdev panel0 c %panel_chr% 0 660
1938          ;;
1939
1940tslcd)
1941          mkdev tslcd0 c %tslcd_chr% 0 660
1942          ;;
1943
1944ipty)
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
1951ptm)
1952          makedir pts 755
1953          mkdev ptmx c %ptm_chr% 0 666
1954          mkdev ptm c %ptm_chr% 1 666
1955          ;;
1956
1957grf[0-9]*)
1958          unit=${i#grf}
1959          mkdev grf$unit c %grf_chr% $unit 666
1960          ;;
1961
1962etvme)
1963          mkdev etvme c %et_chr% 0
1964          ;;
1965
1966leo[0-9]*)
1967          unit=${i#leo}
1968          mkdev leo$unit c %leo_chr% $unit
1969          ;;
1970
1971scif[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
1977sci[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
1983maple[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
1994mmem[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
2005mlcd[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
2013ixpcom[0-9]*)
2014          unit=${i#ixpcom}
2015          mkdev ixpcom$unit c %ixpcom_chr% $unit "" "" $u_uucp
2016          ;;
2017
2018epcom[0-9]*)
2019          unit=${i#epcom}
2020          mkdev epcom$unit c %epcom_chr% $unit "" "" $u_uucp
2021          ;;
2022
2023plcom[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
2029wmcom[0-9]*)
2030          unit=${i#wmcom}
2031          mkdev wmcom$unit c %wmcom_chr% $unit "" "" $u_uucp
2032          ;;
2033
2034ucbsnd)
2035          mkdev ucbsnd c %ucbsnd_chr% 0 666
2036          ;;
2037
2038adb)
2039          mkdev adb c %aed_chr% 0 666
2040          ;;
2041
2042asc[0-9]*)
2043          unit=${i#asc}
2044          mkdev asc$unit c %asc_chr% $unit 666
2045          ;;
2046
2047bwtwo[0-9]*)
2048          unit=${i#bwtwo}
2049          mkdev bwtwo$unit c %bwtwo_chr% $unit 666
2050          ;;
2051
2052cgtwo[0-9]*)
2053          unit=${i#cgtwo}
2054          mkdev cgtwo$unit c %cgtwo_chr% $unit 666
2055          ;;
2056
2057cgthree[0-9]*)
2058          unit=${i#cgthree}
2059          mkdev cgthree$unit c %cgthree_chr% $unit 666
2060          ;;
2061
2062cgfour[0-9]*)
2063          unit=${i#cgfour}
2064          mkdev cgfour$unit c %cgfour_chr% $unit 666
2065          ;;
2066
2067cgsix[0-9]*)
2068          unit=${i#cgsix}
2069          mkdev cgsix$unit c %cgsix_chr% $unit 666
2070          ;;
2071
2072cgeight[0-9]*)
2073          unit=${i#cgeight}
2074          mkdev cgeight$unit c %cgeight_chr% $unit 666
2075          ;;
2076
2077tcx[0-9]*)
2078          unit=${i#tcx}
2079          mkdev tcx$unit c %tcx_chr% $unit 666
2080          ;;
2081
2082xd[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
2090magma[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
2113clcd[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
2126spif[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
2139bpp|bpp[0-9]*)
2140          unit=${i#bpp}
2141          mkdev bpp$unit c %bpp_chr% $(($unit + 0))
2142          ;;
2143
2144tctrl[0-9]*)
2145          unit=${i#tctrl}
2146          mkdev tctrl$unit c %tctrl_chr% $unit 666
2147          ;;
2148
2149bmd[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
2157sram)
2158          mkdev sram c %sram_chr% 0 644
2159          ;;
2160
2161ttyS[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
2167atabus[0-9]*)
2168          unit=${i#atabus}
2169          mkdev atabus$unit c %atabus_chr% $unit 644
2170          ;;
2171
2172drm[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
2180drvctl)
2181          mkdev drvctl c %drvctl_chr% 0 644
2182          ;;
2183
2184isv)
2185          mkdev isv c %isv_chr% 0 644
2186          ;;
2187
2188tap|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
2200srt[0-9]*)
2201          unit=${i#srt}
2202          mkdev srt$unit c %srt_chr% $unit 600
2203          ;;
2204
2205tpm)
2206          mkdev tpm c %tpm_chr% 0 600
2207          ;;
2208
2209dtrace)
2210          makedir dtrace 755
2211          mkdev dtrace/dtrace c %dtrace_chr% 0 600
2212          ;;
2213
2214fw[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
2224putter)
2225          mkdev putter c %putter_chr% 0 600
2226          mkdev pud c %putter_chr% 1 600
2227          lndev putter puffs
2228          ;;
2229
2230zfs)
2231          mkdev zfs c %zfs_chr% 0 600
2232          makedir zpool 755
2233          ;;
2234
2235iscsi[0-9]*)
2236          unit=${i#iscsi}
2237          mkdev iscsi${unit} c %iscsi_chr% $unit 600
2238          ;;
2239
2240vchiq)
2241          mkdev vchiq c %vchiq_chr% 0 600
2242          ;;
2243
2244nvme[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
2255nvme[0-9]*)
2256          unit=${i#nvme}
2257          mkdev nvme$unit c %nvme_chr% $(($unit * 65536))
2258          ;;
2259
2260nvmm)
2261          mkdev nvmm c %nvmm_chr% 0 660 $g_nvmm
2262          ;;
2263
2264autofs)
2265          mkdev autofs c %autofs_chr% 0 600
2266          ;;
2267
2268kcov)
2269        mkdev kcov c %kcov_chr% 0
2270        ;;
2271
2272ipmi[0-9]*)
2273          unit=${i#ipmi}
2274          mkdev ipmi${unit} c %ipmi_chr% $unit 600
2275          ;;
2276
2277xmm[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
2285acpi)
2286          mkdev acpi c %acpi_chr% 0
2287          ;;
2288
2289smbios)
2290          mkdev smbios c %smbios_chr% 0
2291          ;;
2292
2293efi)
2294          mkdev efi c %efi_chr% 0 660
2295          ;;
2296
2297sht3xtemp[0-9]*)
2298          unit=${i#sht3xtemp}
2299          mkdev sht3xtemp$unit c %sht3xtemp_chr% $unit 664
2300          ;;
2301
2302scmd[0-9]*)
2303          unit=${i#scmd}
2304          mkdev scmd$unit c %scmd_chr% $unit 666
2305          ;;
2306
2307ttyVI[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
2314ttyVI)
2315          makedev ttyVI00 ttyVI10 ttyVI20 ttyVI30
2316          ;;
2317
2318midevend)
2319%MI_DEVICES_END%
2320local)
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
2337esac
2338done
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
2347makedisk_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
2373makedisk_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
2408makedisk_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
2450makedisk_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
2495makedisk_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#
2518create_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
2575makedev_main makedev ${1+"$@"}
2576