Daniel Burrows wrote:
On Mon, May 20, 2002 at 02:43:28PM -0400, Nathan Hawkins <[EMAIL PROTECTED]> was heard to say:
skaro:/dev# /sbin/MAKEDEV all
MAKEDEV: line 1292: syntax error near unexpected token `)'
MAKEDEV: line 1292: `   )'


  What does line 1292 look like?  This sounds like a possible bash or
ash bug to me.. (not sure which)

Might be, I don't know. The message about line 1292 repeats quite a few times. It won't work on Linux, even with ash, because the device numbers are much too large, but you can see what it does with bash.


I've got major bugs in other things right now (utmp code puts a 4G hole in /var/run/utmp sometimes. 8-), so I haven't spent any time on this. I've attached the script. If you can see what's wrong with it, I'd love to know what it is.

---Nathan
#!/bin/bash -
#
# Copyright (c) 1990 The Regents of the University of California.
# All rights reserved.
#
# Written and contributed by W. Jolitz 12/90
#
# Redistribution and use in source and binary forms are permitted provided
# that: (1) source distributions retain this entire copyright notice and
# comment, and (2) distributions including binaries display the following
# acknowledgement:  ``This product includes software developed by the
# University of California, Berkeley and its contributors'' in the
# documentation or other materials provided with the distribution and in
# all advertising materials mentioning features or use of this software.
# Neither the name of the University nor the names of its contributors may
# be used to endorse or promote products derived from this software without
# specific prior written permission.
# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
#       @(#)MAKEDEV     5.2 (Berkeley) 6/22/90
# $FreeBSD: src/etc/MAKEDEV,v 1.243.2.47 2002/04/21 19:47:06 will Exp $
#
# Device "make" file.  Valid arguments:
#       all     makes all known devices, standard number of units (or close)
#       std     standard devices
#       jail    suitable for a jail(8)
#       local   configuration specific devices
#       mach-4  mach4&lites+devices for Mach's XFree86 distribution
#       (see http://www.cs.hut.fi/lites.html for more info on LITES)
#
# Tapes:
#       wt*     QIC-interfaced (e.g. not SCSI) 3M cartridge tape
#       sa*     SCSI Sequential Access Devices
#
# Disks:
#       aac*    Adaptec FSA RAID controllers
#       aacd*   Adaptec FSA RAID
#       acd*    ATAPI CD-ROM disks
#       amrd*   AMI MegaRAID
#       cd*     SCSI CD-ROM disks
#       da*     SCSI Direct Access Devices
#       fd*     floppy disk drives (3 1/2", 5 1/4")
#       fla*    M-Systems DiskOnChip
#       idad*   Compaq Smart-2 RAID arrays
#       matcd*  Matsushita (Panasonic) CD-ROM disks
#       mcd*    Mitsumi CD-ROM disks
#       md*     Memory (or malloc) disk
#       mlx*    Mylex DAC960 RAID controllers
#       mlxd*   Mylex DAC960 RAID disk volumes
#       scd*    Sony CD-ROM disks
#       vn*     vnode disks
#       wd*     "Winchester" disk drives (ST506,IDE,ESDI,RLL,...)
#       wfd*    IDE floppy disk drives (LS-120)
#
# Console ports:
#       vty*    virtual console devices for syscons/pcvt/codrv
#
# Pointing devices:
#       mse*    Logitech and ATI Inport bus mouse
#       psm*    PS/2 mouse
#       jogdial Sony VAIO Jogdial
#       sysmouse Mousesystems mouse emulator for syscons
#
# Time devices:
#       refclock-* serial ports used by xntpd parse refclocks
#
# Terminal ports:
#       tty*    general purpose serial ports
#       cua*    dialout serial ports
#       ttyA*   Specialix SI/XIO dialin ports ('*' = number of devices)
#       cuaA*   Specialix SI/XIO dialout ports
#       ttyD*   Digiboard - 16 dialin ports
#       cuaD*   Digiboard - 16 dialout ports
#       ttyE*   Stallion EasyIO (stl) dialin ports
#       cuaE*   Stallion EasyIO (stl) dialout ports
#       ttyF*   Stallion Brumby (stli) dialin ports
#       cuaF*   Stallion Brumby (stli) dialout ports
#       ttyR*   Rocketport dialin ports
#       cuaR*   Rocketport dialout ports
#
#       stlN    Stallion EasyIO board N dialin and dialout
#       stliN   Stallion Brumby board N dialin and dialout
#
# Pseudo terminals:
#       pty*    set of 32 master and slave pseudo terminals
#       vty*    virtual terminals using syscons/pcvt/codrv console
#
# Parallel port:
#       lpt*    Printer
#       ppi*    Parallel port i/o
#       pps*    Pulse per second timing interface
#       pcfclock* Parallel time sync interface
#
# I2C and SMBus:
#       iic*    I2C devices
#       smb*    SMBUS devices
#
# USB devices:
#       usb*    USB bus control device
#       ugen*   generic USB device
#       uhid*   Human Interface Device (HID)
#       ulpt*   printer
#       umodem* modems
#       ums*    mouse
#       urio*   Diamond Rio 500
#       uscanner* USB scanners
#       usio*   USB serial devices
#
# SCSI devices (other than CD-ROM, tape and disk):
#       ch*     SCSI Media-Changer (juke box) driver
#       pt*     Processor Type (HP scanner, as one example)
#       pass*   CAM Passthrough device
#       ses*    SES (SCSI Environmental Services) and
#               SAF-TE (Scsi Accessable Fault-Tolerant Enclosures) device
#
# PC-CARD (previously called PCMCIA) support
#       card*   PC-CARD slots
#
# ISDN devices:
#       i4b     isdnd call control device
#       i4bctl  debugging control device
#       i4btrc* trace data interface(s), one per passive card
#       i4btel* telephony interface(s)
#       i4bteld* telephony dialout interface(s)
#       i4brbch* raw b channel access device(s)
#
# Special purpose devices:
#       apm     Advanced Power Management BIOS
#       apmctl  APM BIOS control device
#       bpf*    packet filter
#       speaker pc speaker
#       tw*     xten power controller
#       snd*    various sound cards
#       pcaudio PCM audio driver
#       socksys iBCS2 socket system driver
#       vat     VAT compatibility audio driver (requires snd*)
#       gsc     Genius GS-4500 hand scanner
#       joy     pc joystick
#       tun*    Tunneling IP device
#       tap*    Ethernet Tunneling device
#       snp*    tty snoop devices
#       spigot  Video Spigot video acquisition card
#       ctx*    Cortex-I video acquisition card
#       meteor* Matrox Meteor video acquisition card (pci)
#       bktr*   Bt848 based video acquisition card (pci)
#       labpc*  National Instrument's Lab-PC and LAB-PC+
#       perfmon CPU performance-monitoring counters
#       pci     PCI configuration-space access from user mode
#       ipl     ipfilter control devices (ipl, ipnat, ipstate, ipauth)
#       kbd     keyboard devices
#       agpgart AGP interface
#       cfs*    Coda Distributed Filesystem
#       nsmb*   SMB/CIFS protocol interface
#

if [ -n "$MAKEDEVPATH" ]; then
        PATH="$MAKEDEVPATH"
else
        PATH=/sbin:/bin
fi
umask 77

# Usage: die exitcode msg
die() {
        echo $2
        exit $1
}

# Convert integer to partition name
dkitop() {
        local p

        case $1 in
        0) p=a;; 1) p=b;; 2) p=c;; 3) p=d;; 4) p=e;; 5) p=f;; 6) p=g;; 7) p=h;;
        *) p="?";;
        esac
        echo $p
}

# Convert integer to slice name
dkitos() {
        local s

        case $1 in
        0) s="";;
        1) s="";;
        *) s=s$(($1-1));;
        esac
        echo $s
}

# Convert disk (type, unit, slice, partition) to minor number
dkminor()
{
        echo $(($1 << 25 | ($2 / 32) << 21 | ($2 % 32) << 3 | $3 << 16 | $4))
}

# Override mknod(2) to add extra handling to it.
mknod=/sbin/mknod
for i in `IFS=':'; echo $PATH`; do
        if [ -x "${i}/mknod" ]; then
                mknod="${i}/mknod"
                break
        fi
done
mknod() {
        rm -f "$1" || exit 1
        case $# in
        4) "$mknod" "$@" root:wheel || die 2 "$mknod $@ failed";;
        5) "$mknod" "$@"            || die 2 "$mknod $@ failed";;
        *) die 2 "bad node: mknod $@";;
        esac
}

# Convert tape (ctrl, unit, mode, access) to minor number
saminor()
{
        echo $(($1 << 29 | ($2 / 16) << 16 | ($2 % 16) << 4 | $3 << 2 | $4))
}

# Convert the last character of a tty name to a minor number.
ttyminor()
{
        case $1 in
        [0-9]) m=$1;;
        a) m=10;; b) m=11;; c) m=12;; d) m=13;; e) m=14;; f) m=15;; g) m=16;;
        h) m=17;; i) m=18;; j) m=19;; k) m=20;; l) m=21;; m) m=22;; n) m=23;;
        o) m=24;; p) m=25;; q) m=26;; r) m=27;; s) m=28;; t) m=29;; u) m=30;;
        v) m=31;;
        *) m="?";;
        esac
        echo $m
}

# Convert a unit number to a minor number.
unit2minor()
{
  echo $(((($1 >> 8) << 16) | ($1 % 256)))
}

# For the stallion devices tty[EF]
# stallion major letter card iscallout
stallion () {
        major=$1
        letter=$2
        card=$3
        iscallout=$4

        port=0
        maxport=8
        pref=tty
        owner=
        minorbase=0

        if [ $iscallout -gt 0 ]; then
            pref=cua
            owner=uucp:dialout
            minorbase=128
        fi

        case "$card" in 
        [0-7]);;
        *) die 1 "Invalid stl card number $card";;
        esac

        # make the mem interface for extracting stats & loading microcode.
        # 0x1000000 + card number
        mknod staliomem$card c $major 0x0100000$card

        while [ $port -lt $maxport ]; do
            minor=$(($minorbase + $card * 1048576 + $port))
            if [ $port -ge 32 ]; then
                minor=$(($minor + 65504))
            fi
            unit=$(($card * 64 + $port))

            mknod ${pref}${letter}$unit c $major $minor $owner
            mknod ${pref}i${letter}$unit c $major $(($minor + 32)) $owner
            mknod ${pref}l${letter}$unit c $major $(($minor + 64)) $owner
            port=$(($port + 1))
        done
}

# Raw partition for disks
dkrawpart=2

# Compatibility slice for disks
dkcompatslice=0

# Raw slice for disks
dkrawslice=1

# Standard umasks
disk_umask=037                  # allow group operator to read disks
tape_umask=017                  # allow group operator to read/write tapes

for i in $*; do
case $i in

all)
        sh MAKEDEV std                                  # standard
        sh MAKEDEV fd0 fd1                              # bdev, floppy disk
        sh MAKEDEV da0 da1 da2 da3                      # bdev, SCSI disk
        sh MAKEDEV ata                                  # cdev, ATA control
        sh MAKEDEV ad0 ad1 ad2 ad3                      # bdev, ATA disk
        sh MAKEDEV ar0 ar1                              # bdev, ATA RAID disk
        sh MAKEDEV acd0 afd0 ast0                       # bdev, ATAPI devices
        sh MAKEDEV wd0 wd1 wd2 wd3                      # bdev, OLD disk
        sh MAKEDEV wcd0 wfd0 wst0                       # bdev, OLD ATAPI devs
        sh MAKEDEV vn0                                  # bdev, virtual disk
        sh MAKEDEV cd0 matcd0 mcd0 scd0                 # bdev, cdrom
        sh MAKEDEV sa0 wt0                              # bdev, tape
        sh MAKEDEV vty12                                # cdev, virtual tty
        sh MAKEDEV cuaa0 cuaa1 cuaa2 cuaa3              # cdev, serial tty
        sh MAKEDEV pty0                                 # cdev, pseudo tty
        sh MAKEDEV ttyd0 ttyd1 ttyd2 ttyd3              # cdev, serial tty
        sh MAKEDEV zs0                                  # big-Alpha serial tty
        sh MAKEDEV kbd0 kbd1                            # cdev, keyboard
        sh MAKEDEV mse0 psm0 jogdial sysmouse           # cdev, mouse
        sh MAKEDEV pcaudio speaker snd0                 # cdev, noise
        sh MAKEDEV lpt0 lpt1 lpt2                       # cdev, printer
        sh MAKEDEV ppi0 ppi1 ppi2                       # cdev, parallel port
        sh MAKEDEV iic0 iic1                            # cdev, I2C device
        sh MAKEDEV smb0 smb1                            # cdev, SMBus device
        sh MAKEDEV usb usb0 uhid0 ums0 ulpt0 ugen0      # cdev, USB devices
        sh MAKEDEV urio0 uscanner0 umodem0              # cdev, USB devices too
        sh MAKEDEV bpf0 bpf1 bpf2 bpf3                  # cdev, network
        sh MAKEDEV ipl tun0 tun1 tun2 tun3              # cdev, network
        sh MAKEDEV tap0 tap1 tap2 tap3                  # cdev, network
        sh MAKEDEV ch0 perfmon tw0                      # cdev, miscellaneous
        sh MAKEDEV apm apmctl card0 card1 card2 card3   # cdev, laptop
        sh MAKEDEV pass4 xpt2                           # cdev, CAM
        sh MAKEDEV i4b i4bctl i4btrc0 i4btrc1           # cdev, ISDN
        sh MAKEDEV i4btel0 i4btel1 i4bteld0 i4bteld1    # cdev, ISDN
        sh MAKEDEV i4brbch0 i4brbch1                    # cdev, ISDN
        sh MAKEDEV agpgart                              # cdev, AGP
        sh MAKEDEV nsmb0                                # cdev, SMB/CIFS
        ;;

# a much restricted set of the above, to save precious i-nodes on the
# fixit floppy
fixit)
        sh MAKEDEV std                                  # standard
        sh MAKEDEV fd0                                  # bdev, floppy disk
        sh MAKEDEV da0                                  # bdev, SCSI disk
        sh MAKEDEV ad0                                  # bdev, ATA disk
        sh MAKEDEV acd0 afd0 ast0                       # bdev, ATAPI devices
        sh MAKEDEV wd0                                  # bdev, OLD disk
        sh MAKEDEV wcd0 wfd0 wst0                       # bdev, OLD ATAPI devs
        sh MAKEDEV vn0                                  # bdev, virtual disk
        sh MAKEDEV cd0                                  # bdev, cdrom
        sh MAKEDEV sa0                                  # bdev, tape
        sh MAKEDEV vty2                                 # cdev, virtual tty
        sh MAKEDEV cuaa0                                # cdev, serial tty
        sh MAKEDEV pty0                                 # cdev, pseudo tty
        sh MAKEDEV ttyd0                                # cdev, serial tty
        sh MAKEDEV zs0                                  # big-Alpha serial tty
        sh MAKEDEV kbd0                                 # cdev, keyboard
        sh MAKEDEV mse0 psm0 sysmouse                   # cdev, mouse
        sh MAKEDEV lpt0                                 # cdev, printer
        sh MAKEDEV ppi0                                 # cdev, parallel port
        sh MAKEDEV iic0                                 # cdev, I2C device
        sh MAKEDEV smb0                                 # cdev, SMBus device
        sh MAKEDEV ums0                                 # cdev, USB devices
        sh MAKEDEV tun0                                 # cdev, network
        sh MAKEDEV tap0                                 # cdev, network
        sh MAKEDEV ch0                                  # cdev, miscellaneous
        sh MAKEDEV apm apmctl card0                     # cdev, laptop
        sh MAKEDEV pass1 xpt1                           # cdev, CAM
        sh MAKEDEV i4b i4bctl i4btrc0 i4btrc1           # cdev, ISDN
        sh MAKEDEV i4btel0 i4bteld0                     # cdev, ISDN
        sh MAKEDEV i4brbch0                             # cdev, ISDN
        rm -f fd/[1-9]?
        ;;

std)
        mknod console   c 0 0;                  chmod 600 console
        mknod kmem      c 2 1 root:kmem;        chmod 640 kmem
        mknod mem       c 2 0 root:kmem;        chmod 640 mem
        mknod null      c 2 2;                  chmod 666 null
        mknod random    c 2 3;                  chmod 644 random
        mknod urandom   c 2 4;                  chmod 644 urandom
        mknod zero      c 2 12;                 chmod 666 zero
        mknod io        c 2 14;                 chmod 600 io
        mknod tty       c 1 0;                  chmod 666 tty
        mknod klog      c 7 0;                  chmod 600 klog
        mknod stdin     c 22 0;                 chmod 666 stdin
        mknod stdout    c 22 1;                 chmod 666 stdout
        mknod stderr    c 22 2;                 chmod 666 stderr
        mknod pci       c 78 0;                 chmod 644 pci
        mkdir -p fd
        (cd fd && i=0 &&
                while [ $i -lt 64 ]; do
                        mknod $i c 22 $i
                        i=$(($i + 1))
                done
        )
        chmod 555 fd
        chmod 666 fd/*
        ;;

jail)
        sh MAKEDEV std pty0
        rm mem kmem pci io klog console         # for security
        ln -sf null mem                 # for libkvm (ab)users
        ln -sf null kmem                # --//--
        ln -sf null console
        ;;

mach-4)
        mknod iopl c 22 0
        mknod kbd c 23 0
        mknod mouse c 24 0
        mknod time c 25 0
        mknod timezone c 26 0
        ;;

# Create device files for new Archive/Wangtek QIC-02 tape driver (vak)
wt*)
        umask $tape_umask
        u=`expr $i : '..\(.*\)'`
        if [ -z "${u}" ]; then u=0; fi
        # default density, 512b blocks
        mknod rwt${u}   c 10 $(( 0 + $u)) root:operator
        mknod nrwt${u}  c 10 $(( 4 + $u)) root:operator
        # default density, 1024b blocks
#       mknod rWt${u}   c 10 $((64 + $u)) root:operator
#       mknod nrWt${u}  c 10 $((68 + $u)) root:operator
        mknod rwt${u}b  c 10 $((16 + $u)) root:operator # 60 megabytes
        mknod nrwt${u}b c 10 $((20 + $u)) root:operator
        mknod rwt${u}c  c 10 $((24 + $u)) root:operator # 120 megabytes
        mknod nrwt${u}c c 10 $((28 + $u)) root:operator
        mknod rwt${u}d  c 10 $((32 + $u)) root:operator # 150 megabytes
        mknod nrwt${u}d c 10 $((36 + $u)) root:operator
#       mknod rwt${u}e  c 10 $((40 + $u)) root:operator # 300 megabytes?
#       mknod nrwt${u}e c 10 $((44 + $u)) root:operator
#       mknod rwt${u}f  c 10 $((48 + $u)) root:operator # 600 megabytes?
#       mknod nrwt${u}f c 10 $((52 + $u)) root:operator
        umask 77
        ;;

# Individual slices.
aacd*s*|ad*s*|ar*s*|afd*s*|amrd*s*|da*s*|fla*s*|idad*s*|md*s*|mlxd*s*|twed*s*|vn*s*|wd*s*|wfd*s*)
        umask $disk_umask
        case $i in
        aacd*s*) name=aacd; chr=151;;
        ad*s*) name=ad; chr=116;;
        ar*s*) name=ar; chr=157;;
        afd*s*) name=afd; chr=118;;
        amrd*s*) name=amrd; chr=133;;
        da*s*) name=da;  chr=13;;
        fla*s*) name=fla; chr=102;;
        idad*s*) name=idad; chr=109;;
        md*s*) name=md;  chr=95;;
        mlxd*s*) name=mlxd; chr=131;;
        twed*s*) name=twed; chr=147;;
        vn*s*) name=vn; chr=43;;
        wd*s*) name=wd;  chr=3;;
        wfd*s*) name=wfd; chr=87;;
        esac
        case $i in
        aacd*s*|amrd*s*|idad*s*|mlxd*s*|twed*s*)
                unit=`expr $i : '....\([0-9]*\)s'`
                slice=`expr $i : '....[0-9]*s\([0-9]*\)'`
                part=`expr $i : '....[0-9]*s[0-9]*\(.*\)'`
                ;;
        afd*s*|fla*s*|wfd*s*)
                unit=`expr $i : '...\([0-9]*\)s'`
                slice=`expr $i : '...[0-9]*s\([0-9]*\)'`
                part=`expr $i : '...[0-9]*s[0-9]*\(.*\)'`
                ;;
        *)
                unit=`expr $i : '..\([0-9]*\)s'`
                slice=`expr $i : '..[0-9]*s\([0-9]*\)'`
                part=`expr $i : '..[0-9]*s[0-9]*\(.*\)'`
                ;;
        esac
        case $unit in
        [0-9]|[0-9][0-9]|[0-4][0-9][0-9]|50[0-9]|51[0-1])
                case $slice in
                [0-9]|[1-2][0-9]|30)
                        oldslice=$slice
                        slice=$(($slice+1))
                        slicename=`dkitos $slice`
                        minor=`dkminor 0 $unit $slice $dkrawpart`
                        mknod  $name$unit$slicename c $chr $minor root:operator
                        ln -f $name$unit$slicename r$name$unit$slicename
                        case $part in
                        [a-h])
                                case $oldslice in
                                0) slice=$oldslice ;;
                                esac
                                for part in 0 1 2 3 4 5 6 7
                                do
                                        minor=`dkminor 0 $unit $slice $part`
                                        partname=`dkitop $part`
                                        mknod  $name$unit$slicename$partname \
                                              c $chr $minor root:operator
                                        ln -f $name$unit$slicename$partname \
                                             r$name$unit$slicename$partname
                                done
                                ;;
                        "")
                                ;;
                        *)
                                echo bad partition for disk in: $i
                                ;;
                        esac
                        ;;
                *)
                        echo bad slice for disk in: $i
                        ;;
                esac
                ;;
        *)
                echo bad unit for disk in: $i "(unit=$unit, slice=$slice, 
part=$part)"
                ;;
        esac
        umask 77
        ;;

fd*)
        umask $disk_umask
        unit=`expr $i : '..\(.*\)'`
        name=fd; chr=9
        case $unit in
        0|1|2|3)
                mknod ${name}${unit}   c $chr $(($unit * 64)) root:operator
                ln -f ${name}${unit} r${name}${unit}
                # Fake BSD partitions
                for i in a b c d e f g h
                do
                        ln -f ${name}${unit} ${name}${unit}$i
                        ln -f r${name}${unit} r${name}${unit}$i
                done
                # User-readable and programmer-readable name sets

                mknod ${name}${unit}.1720  c $chr $(($unit * 64 + 1)) \
                    root:operator
                ln -f ${name}${unit}.1720 r${name}${unit}.1720
                # ln -f ${name}${unit}.1720 ${name}${unit}135hs21
                # ln -f r${name}${unit}.1720 r${name}${unit}135hs21

                mknod ${name}${unit}.1480  c $chr $(($unit * 64 + 2)) \
                    root:operator
                ln -f ${name}${unit}.1480 r${name}${unit}.1480
                # ln -f ${name}${unit}.1480 ${name}${unit}135hs18
                # ln -f r${name}${unit}.1480 r${name}${unit}135hs18
                # ln -f ${name}${unit}.1480 ${name}${unit}96hs18
                # ln -f r${name}${unit}.1480 r${name}${unit}96hs18

                mknod ${name}${unit}.1440  c $chr $(($unit * 64 + 3)) \
                    root:operator
                ln -f ${name}${unit}.1440 r${name}${unit}.1440
                # ln -f ${name}${unit}.1440 ${name}${unit}135
                # ln -f r${name}${unit}.1440 r${name}${unit}135
                # ln -f ${name}${unit}.1440 ${name}${unit}135ds18
                # ln -f r${name}${unit}.1440 r${name}${unit}135ds18
                # ln -f ${name}${unit}.1440 ${name}${unit}96ds18
                # ln -f r${name}${unit}.1440 r${name}${unit}96ds18

                mknod ${name}${unit}.1200  c $chr $(($unit * 64 + 4)) \
                    root:operator
                ln -f ${name}${unit}.1200 r${name}${unit}.1200
                # ln -f ${name}${unit}.1200 ${name}${unit}96
                # ln -f r${name}${unit}.1200 r${name}${unit}96
                # ln -f ${name}${unit}.1200 ${name}${unit}96ds15
                # ln -f r${name}${unit}.1200 r${name}${unit}96ds15
                # ln -f ${name}${unit}.1200 ${name}${unit}135ds15
                # ln -f r${name}${unit}.1200 r${name}${unit}135ds15

                mknod ${name}${unit}.820  c $chr $(($unit * 64 + 5)) \
                    root:operator
                ln -f ${name}${unit}.820 r${name}${unit}.820
                # ln -f ${name}${unit}.820 ${name}${unit}96hs10
                # ln -f r${name}${unit}.820 r${name}${unit}96hs10
                # ln -f ${name}${unit}.820 ${name}${unit}135hs10
                # ln -f r${name}${unit}.820 r${name}${unit}135hs10

                mknod ${name}${unit}.800  c $chr $(($unit * 64 + 6)) \
                    root:operator
                ln -f ${name}${unit}.800 r${name}${unit}.800
                # ln -f ${name}${unit}.800 ${name}${unit}96ds10
                # ln -f r${name}${unit}.800 r${name}${unit}96ds10
                # ln -f ${name}${unit}.800 ${name}${unit}135ds10
                # ln -f r${name}${unit}.800 r${name}${unit}135ds10

                mknod ${name}${unit}.720  c $chr $(($unit * 64 + 7)) \
                    root:operator
                ln -f ${name}${unit}.720 r${name}${unit}.720
                # ln -f ${name}${unit}.720 ${name}${unit}96ds9
                # ln -f r${name}${unit}.720 r${name}${unit}96ds9
                # ln -f ${name}${unit}.720 ${name}${unit}135ds9
                # ln -f r${name}${unit}.720 r${name}${unit}135ds9

                mknod ${name}${unit}.360  c $chr $(($unit * 64 + 8)) \
                    root:operator
                ln -f ${name}${unit}.360 r${name}${unit}.360
                # ln -f ${name}${unit}.360 ${name}${unit}48
                # ln -f r${name}${unit}.360 r${name}${unit}48
                # ln -f ${name}${unit}.360 ${name}${unit}48ds9
                # ln -f r${name}${unit}.360 r${name}${unit}48ds9

                mknod ${name}${unit}.640  c $chr $(($unit * 64 + 9)) \
                    root:operator
                ln -f ${name}${unit}.640 r${name}${unit}.640
                # ln -f ${name}${unit}.640 ${name}${unit}96ds8
                # ln -f r${name}${unit}.640 r${name}${unit}96ds8
                # ln -f ${name}${unit}.640 ${name}${unit}135ds8
                # ln -f r${name}${unit}.640 r${name}${unit}135ds8

                mknod ${name}${unit}.1232  c $chr $(($unit * 64 + 10)) \
                    root:operator
                ln -f ${name}${unit}.1232 r${name}${unit}.1232
                # ln -f ${name}${unit}.1232 ${name}${unit}96ds8
                # ln -f r${name}${unit}.1232 r${name}${unit}96ds8
                # ln -f ${name}${unit}.1232 ${name}${unit}135ds8
                # ln -f r${name}${unit}.1232 r${name}${unit}135ds8
                ;;
        *)
                echo bad unit for disk in: $i
                ;;
        esac
        umask 77
        ;;

aacd*|ad*|ar*|afd*|amrd*|da*|fla*|idad*|md*|mlxd*|twed*|vn*|wd*|wfd*)
        umask $disk_umask
        case $i in
        aacd*) name=aacd; chr=151;;
        ad*) name=ad; chr=116;;
        ar*) name=ar; chr=157;;
        afd*) name=afd; chr=118;;
        amrd*) name=amrd; chr=133;;
        da*) name=da;  chr=13;;
        fla*) name=fla; chr=102;;
        idad*) name=idad; chr=109;;
        md*) name=md; chr=95;;
        mlxd*) name=mlxd; chr=131;;
        twed*) name=twed; chr=147;;
        vn*) name=vn; chr=43;;
        wd*) name=wd;  chr=3;;
        wfd*) name=wfd; chr=87;;
        esac
        case $i in
        aacd*|amrd*|idad*|mlxd*|twed*)
                unit=`expr $i : '....\(.*\)'`
                ;;
        afd*|fla*|wfd*)
                unit=`expr $i : '...\(.*\)'`
                ;;
        *)
                unit=`expr $i : '..\(.*\)'`
                ;;
        esac
        case $unit in
        [0-9]|[0-9][0-9]|[0-4][0-9][0-9]|50[0-9]|51[0-1])
                for slicepartname in s0h s1h s2 s3 s4
                do
                        sh MAKEDEV $name$unit$slicepartname
                done
                ;;
        *)
                echo bad unit for disk in: $i
                ;;
        esac
        umask 77
        ;;

ccd*)
        umask $disk_umask
        name=ccd
        chr=74
        unit=`expr $i : '...\(.*\)'`
        case $unit in
        [0-9]|[0-9][0-9]|[0-4][0-9][0-9]|50[0-9]|51[0-1])
                for part in 0 1 2 3 4 5 6 7
                do
                        minor=`dkminor 0 $unit 0 $part`
                        partname=`dkitop $part`
                        mknod  $name$unit$partname c $chr $minor root:operator
                        ln -f $name$unit$partname r$name$unit$partname
                done
                ;;
        *)
                echo bad unit for disk in: $i
                ;;
        esac
        umask 77
        ;;

# SCSI processor type driver
pt[0-9]*)
        chr=61
        name=pt
        unit=`expr $i : 'pt\([0-9][0-9]*\)'`
        if [ -z "${unit}" ]; then
                unit=0
        fi
        unit=$(($unit + 1 - 1))
        mknod ${name}${unit} c $chr `unit2minor $unit`
        ;;

# SCSI SES/SAF-TE type driver
ses[0-9]*)
        chr=110
        name=ses
        unit=`expr $i : 'ses\([0-9][0-9]*\)'`
        if [ -z "${unit}" ]; then
                unit=0
        fi
        unit=$(($unit + 1 - 1))
        mknod ${name}${unit} c $chr `unit2minor $unit`
        ;;
# SCSI target mode sample driver
targ[0-9]*)
        chr=65
        name=targ
        unit=`expr $i : 'targ\([0-9][0-9]*\)'`
        if [ -z "${unit}" ]; then
                unit=0
        fi
        unit=$(($unit + 1 - 1))
        mknod ${name}${unit} c $chr `unit2minor $unit`
        mknod ${name}.ctl c $chr 0xffff00ff
        ;;

# CAM transport layer device
xpt*)
        # This major number is temporary
        chr=104
        name=xpt
        units=`expr $i : 'xpt\(.*\)'`
        if [ -z "${units}" ]; then
                units=1
        fi
        i=0
        while [ $i -lt $units ]; do
                dname=$name$i
                rm -rf $dname r$dname
                mknod $dname c $chr `unit2minor $i` root:operator
                i=$(($i + 1))
        done
        ;;

# CAM passthrough device
pass*)
        # This major number is temporary
        chr=31
        name=pass
        units=`expr $i : 'pass\(.*\)'`
        if [ -z "${units}" ]; then
                units=1
        fi
        i=0
        while [ $i -lt $units ]; do
                dname=$name$i
                rm -rf $dname r$dname
                mknod $dname c $chr `unit2minor $i` root:operator
                i=$(($i + 1))
        done
        ;;
pty*)
        class=`expr $i : 'pty\(.*\)'`
        case $class in
        0) offset=0 name=p;;
        1) offset=32 name=q;;
        2) offset=64 name=r;;
        3) offset=96 name=s;;
# Note that xterm (at least) only look at p-s.
        4) offset=128 name=P;;
        5) offset=160 name=Q;;
        6) offset=192 name=R;;
        7) offset=224 name=S;;
        # This still leaves [tuTU].
        *) echo bad unit for pty in: $i;;
        esac
        umask 0
        case $class in
        0|1|2|3|4|5|6|7)
                i=0
                while [ $i -lt 32 ]; do
#                       This was an awk substr() before.
                        c=$(echo 0123456789abcdefghijklmnopqrstuv |
                            dd bs=1 skip=$i count=1 2>/dev/null)
                        mknod tty$name$c c 5 $(($offset + $i))
                        mknod pty$name$c c 6 $(($offset + $i))
                        i=$(($i + 1))
                done
                ;;
        esac
        umask 77
        ;;

sa*)
        umask $tape_umask
        unit=`expr $i : '..\(.*\)'`
        chr=14

        case $unit in
        [0-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9])
                mknod sa${unit}.ctl c $chr `saminor 1 ${unit} 0 0`
                ln -f sa${unit}.ctl rsa${unit}.ctl
                for m in 0 1 2 3
                do
                        mknod sa${unit}.${m} c $chr \
                            `saminor 0 ${unit} ${m} 0`  root:operator
                        ln -f sa${unit}.${m} rsa${unit}.${m}
                        mknod nsa${unit}.${m} c $chr \
                            `saminor 0 ${unit} ${m} 1` root:operator
                        ln -f nsa${unit}.${m} nrsa${unit}.${m}
                        mknod esa${unit}.${m} c $chr \
                            `saminor 0 ${unit} ${m} 2` root:operator
                        ln -f esa${unit}.${m} ersa${unit}.${m}
                done
                ln -f sa${unit}.0 sa${unit}
                ln -f sa${unit}.0 rsa${unit}.0
                ln -f sa${unit}.0 rsa${unit}
                ln -f nsa${unit}.0 nsa${unit}
                ln -f nsa${unit}.0 nrsa${unit}.0
                ln -f nsa${unit}.0 nrsa${unit}
                ln -f esa${unit}.0 esa${unit}
                ln -f esa${unit}.0 ersa${unit}.0
                ln -f esa${unit}.0 ersa${unit}
                ;;
        *)
                echo bad unit for tape in: $i
                ;;
        esac
        umask 77
        ;;

ch*)
        umask 37
        unit=`expr $i : '..\(.*\)'`
        case $i in
        ch*) name=ch;  chr=17;;
        esac
        case $unit in
        0|1|2|3|4|5|6)
                mknod ${name}${unit}    c $chr $unit root:operator
                ;;
        *)
                echo bad unit for media changer in: $i
                ;;
        esac
        umask 77
        ;;

ata)
        mknod ata c 159 0 root:operator
        ;;
ast*)
        umask 2 ;
        unit=`expr $i : '...\(.*\)'`
        chr=119
        case $unit in
        0|1|2|3)
                mknod ast${unit} c $chr $(($unit * 8 + 0)) root:operator
                chmod 640 ast${unit}
                mknod nast${unit} c $chr $(($unit * 8 + 1)) root:operator
                chmod 640 nast${unit}
                ;;
        *)
                echo bad unit for tape in: $i
                ;;
        esac
        umask 77
        ;;

acd*t*)
        umask $disk_umask
        units=`expr $i : '...\(.*\)t'`;
        tracks=`expr $i : '.*t\(.*\)'`;
        name=acd;
        chr=117;
        if [ -z "${units}" -o "${units}" -le 0 ]; then
                units=1
        fi
        if [ -z "${tracks}" -o "${tracks}" -le 0 ]; then
                tracks=100
        fi
        if [ "${units}" -le 31 -a "${tracks}" -le 169 ]; then
                i=0
                while [ $i -le $units ]; do
                        dname=$name$i
                        rm -rf ${dname}t*
                        j=1
                        while [ $j -le ${tracks} ]; do
                                mknod ${dname}t$j c $chr \
                                        $((($i * 8) + (65536 * $j))) \
                                        root:operator
                                j=$(($j + 1))
                        done
                        i=$(($i + 1))
                done
        else
                echo "$i is invalid -- can't have more than 32 cd devices or 
169 tracks"
        fi
        umask 77
        ;;

acd*|cd*|mcd*|scd*)
        umask $disk_umask
        case $i in
        acd*) units=`expr $i : '...\(.*\)'`; name=acd; chr=117;;
        cd*) units=`expr $i : '..\(.*\)'`; name=cd; chr=15;;
        mcd*) units=`expr $i : '...\(.*\)'`; name=mcd; chr=29;;
        scd*) units=`expr $i : '...\(.*\)'`; name=scd; chr=45;;
        esac
        if [ -z "${units}" -o "${units}" -le 0 ]; then
                units=1
        fi
        if [ "${units}" -le 31 ]; then
                i=0
                while [ $i -le $units ]; do
                        dname=$name$i
                        rm -rf ${dname}* r${dname}*
                        mknod ${dname}a c $chr $(($i * 8)) root:operator
                        case $name in 
                        acd)
                                ln -f ${dname}a ${dname}c;;
                        *)
                                mknod ${dname}c c $chr $(($i * 8 + 2)) 
root:operator;;
                        esac
                        ln -f ${dname}a r${dname}a
                        ln -f ${dname}c r${dname}c
                        i=$(($i + 1))
                done
        else
                echo "$i is invalid -- can't have more than 32 cd devices"
        fi
        umask 77
        ;;

matcd*)
        umask 2
        case $i in
        matcd*) unit=`expr $i : '.....\(.*\)'`; name=matcd; chr=46;;
        esac
        case $unit in
        0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15)
                mknod ${name}${unit}a   c $chr $(($unit * 8 + 0)) \
                    root:operator
                mknod ${name}${unit}c   c $chr $(($unit * 8 + 2)) \
                    root:operator
                ln -f ${name}${unit}a r${name}${unit}a
                ln -f ${name}${unit}c r${name}${unit}c
                chmod 640 ${name}${unit}[a-h] r${name}${unit}[a-h]

                mknod ${name}${unit}la  c $chr $(($unit * 8 + 128)) \
                    root:operator
                mknod ${name}${unit}lc  c $chr $(($unit * 8 + 130)) \
                    root:operator
                ln -f ${name}${unit}la r${name}${unit}la
                ln -f ${name}${unit}lc r${name}${unit}lc
                chmod 640 ${name}${unit}l[a-h] r${name}${unit}l[a-h]
                ;;
        *)
                echo bad unit for disk in: $i
                ;;
        esac
        umask 77
        ;;

wcd*)
        umask 2 ;
        unit=`expr $i : '...\(.*\)'`
        chr=69
        case $unit in
        0|1|2|3|4|5|6|7)
                mknod wcd${unit}a  c $chr $(($unit * 8 + 0)) root:operator
                mknod wcd${unit}c  c $chr $(($unit * 8 + 2)) root:operator
                ln -f wcd${unit}a rwcd${unit}a
                ln -f wcd${unit}c rwcd${unit}c
                chmod 640 wcd${unit}[a-h] rwcd${unit}[a-h]
                ;;
        *)
                echo bad unit for disk in: $i
                ;;
        esac
        umask 77
        ;;

wst*)
        umask 2 ;
        unit=`expr $i : '...\(.*\)'`
        chr=90
        case $unit in
        0|1|2|3)
                mknod rwst${unit} c $chr $(($unit * 8 + 0)) root:operator
                chmod 640 rwst${unit}
                ;;
        esac
        umask 77
        ;;

iic*)
        unit=`expr $i : 'iic\(.*\)'`
        mknod iic$unit c 105 `unit2minor $unit`
        ;;

smb*)
        unit=`expr $i : 'smb\(.*\)'`
        mknod smb$unit c 106 `unit2minor $unit`
        ;;

pcfclock*)
        unit=`expr $i : 'pcfclock\(.*\)'`
        mknod pcfclock$unit c 140 `unit2minor $unit`
        ;;

ppi*)
        unit=`expr $i : 'ppi\(.*\)'`
        mknod ppi$unit c 82 `unit2minor $unit`
        ;;

pps*)
        unit=`expr $i : 'pps\(.*\)'`
        mknod pps$unit c 89 `unit2minor $unit`
        ;;

usb)
        mknod usb$unit c 108 255 root:operator
        chmod 0660 usb$unit
        ;;

usb*)
        umask 7
        unit=`expr $i : 'usb\(.*\)'`
        mknod usb$unit c 108 `unit2minor $unit` root:operator
        umask 77
        ;;

uhid*)
        umask 7
        unit=`expr $i : 'uhid\(.*\)'`
        mknod uhid$unit c 122 `unit2minor $unit` root:operator
        umask 77
        ;;

ums*)
        umask 7
        unit=`expr $i : 'ums\(.*\)'`
        mknod ums$unit c 111 `unit2minor $unit` root:operator
        umask 77
        ;;

ulpt*)
        unit=`expr $i : 'ulpt\(.*\)'`
        minor=`unit2minor $unit`
        mknod ulpt$unit c 113 $minor
        minor=`unit2minor $(($unit + 64))`
        mknod unlpt$unit c 113 $minor           # and the 'no prime' version
        ;;

ugen*)
        umask 7
        unit=`expr $i : 'ugen\([0-9][0-9]*\)'`
        endpoint=`expr $i : 'ugen.*\.\([0-9][0-9]*\)'`
        if [ -z "${unit}" ]; then
                echo $i - Invalid unit number
        fi
        if [ -z "${endpoint}" ]; then           # ugen0 & ugen0.1 - ugen0.15
                mknod ugen$unit c 114 \
                                `unit2minor $(($unit * 16))` root:operator
                i=1
                while [ $i -lt 16 ]; do
                        mknod ugen$unit.$i c 114 \
                                `unit2minor $(($unit * 16 + $i))` root:operator
                        i=$(($i + 1))
                done
        else
                minor=`unit2minor $(($unit * 16 + $endpoint))`
                mknod ugen$unit.$endpoint c 114 $minor root:operator
        fi
        umask 77
        ;;

urio*)
        umask 7
        unit=`expr $i : 'urio\(.*\)'`
        mknod urio$unit c 143 `unit2minor $unit` root:operator
        umask 77
        ;;

usio*)
        umask 7
        unit=`expr $i : 'usio\(.*\)'`
        minor=$(($unit + 128))
        minor=`unit2minor $(($unit + 128))`
        mknod usio$unit c 138 $minor uucp:dialout
        umask 77
        ;;

uscanner*)
        umask 7
        unit=`expr $i : 'uscanner\(.*\)'`
        mknod uscanner$unit c 156 `unit2minor $unit` root:operator
        umask 77
        ;;

umodem*)
        umask 7
        unit=`expr $i : 'umodem\(.*\)'`
        mknod umodem$unit c 124 `unit2minor $unit` uucp:dialout
        umask 77
        ;;

lpt*)
        unit=`expr $i : 'lpt\(.*\)'`
        mknod lpt$unit c 16 `unit2minor $unit`
        mknod lpctl$unit c 16 `unit2minor $(($unit + 128))`
        ;;

# Use this to create virtual consoles for syscons, pcvt or codrv
# ttyv0-b
# use as MAKEDEV vtyNN to create NN entries
vty*)
        chr=12
        units=`expr $i : 'vty\(.*\)'`
        i=0
        while [ $i -lt $units ]; do
                mknod ttyv$(printf %01x $i) c $chr `unit2minor $i`
                i=$(($i + 1))
        done
        ln -fs ttyv0 vga        # XXX X still needs this pccons relic
        ;;

nmdm*)
        units=`expr $i : 'nmdm\(.*\)'`
        chr=18
        i=0
        while [ $i -lt $units ]; do
                minor=`unit2minor $i`
                minor=$(($minor + $minor))
                mknod nmdm${i}A c $chr $minor
                mknod nmdm${i}B c $chr $(($minor + 1))
                i=$(($i + 1))
        done
        ;;

bpf*)
        nbpf=`expr $i : 'bpf\(.*\)$'`
        unit=0
        while [ $unit -le $nbpf ]; do
                mknod bpf$unit c 23 `unit2minor $unit`
                unit=$(($unit + 1))
        done
        ;;

speaker)
        mknod speaker c 26 0
        ;;

cua?|cuaa?|cuaa??)
        umask 7
        unit_low=`expr $i : 'cua.*\(.\)$'`
        case $i in
        cua?|cuaa?)
                unit_high=""
                m_high=0
                ;;
        cuaa??)
                unit_high=`expr $i : 'cuaa\(.\).$'`
                m_high=`ttyminor $unit_high`
                ;;
        esac
        unit=$unit_high$unit_low
        m=$(($m_high << 16 | `ttyminor $unit_low`))
        mknod cuaa$unit c 28 $(($m | 128)) uucp:dialout
        mknod cuaia$unit c 28 $(($m | 32 | 128)) uucp:dialout
        mknod cuala$unit c 28 $(($m | 64 | 128)) uucp:dialout
        umask 77
        ;;

tty?|tty0?|ttyd?|ttyd??)
        unit_low=`expr $i : 'tty.*\(.\)$'`
        case $i in
        tty?|tty0?|ttyd?)
                unit_high=""
                m_high=0
                ;;
        ttyd??)
                unit_high=`expr $i : 'ttyd\(.\).$'`
                m_high=`ttyminor $unit_high`
                ;;
        esac
        unit=$unit_high$unit_low
        m=$(($m_high << 16 | `ttyminor $unit_low`))
        mknod ttyd$unit c 28 $m
        mknod ttyid$unit c 28 $(($m | 32))
        mknod ttyld$unit c 28 $(($m | 64))
        ;;

cuac?)
        umask 7
        portlist="0 1 2 3 4 5 6 7 8 9 a b c d e f
                  g h i j k l m n o p q r s t u v"
        major=48
        card=`expr $i : 'cua.*\(.\)$'`
        for unit in $portlist
        do
                minor=`ttyminor $unit`
                minor=$(($card * 65536 + $minor))
                name=$card$unit
                mknod cuac$name c $major $(($minor + 128)) uucp:dialout
                mknod cuaic$name c $major $(($minor + 32 + 128)) uucp:dialout
                mknod cualc$name c $major $(($minor + 64 + 128)) uucp:dialout
        done
        umask 77
        ;;

ttyc?)
        portlist="0 1 2 3 4 5 6 7 8 9 a b c d e f
                  g h i j k l m n o p q r s t u v"
        major=48
        card=`expr $i : 'tty.*\(.\)$'`
        for unit in $portlist
        do
                minor=`ttyminor $unit`
                minor=$(($card * 65536 + $minor))
                name=$card$unit
                mknod ttyc$name c $major $minor
                mknod ttyic$name c $major $(($minor + 32))
                mknod ttylc$name c $major $(($minor + 64))
        done
        ;;

# RISCom8 'rc' driver entries

cuam?)
        umask 7
        unit=`expr $i : 'cua.*\(.\)$'`
        m=`ttyminor $unit`
        mknod cuam$unit c 63 $(($m + 128)) uucp:dialout
        umask 77
        ;;

ttym?)
        unit=`expr $i : 'tty.*\(.\)$'`
        m=`ttyminor $unit`
        mknod ttym$unit c 63 $m
        ;;

# Specialix SI/XIO.
# Note: these are 'base 1' to match the numbers on the panels, and to match
#       the manual that comes with the system.
ttyA*)
        major=68
        nports=`expr $i : 'ttyA\(.*\)$'`
        port=1
        while [ $port -le $nports ]; do
                minor=$(($port - 1))
                name=$(printf %02d $port)
                mknod ttyA$name c $major $minor
                mknod ttyiA$name c $major $(($minor + 65536))
                mknod ttylA$name c $major $(($minor + 131072))
                port=$(($port + 1))
        done
        # For the user-mode control program, 'sicontrol'
        mknod si_control c 68 262144
        ;;

cuaA*)
        umask 7
        major=68
        nports=`expr $i : 'cuaA\(.*\)$'`
        port=1
        while [ $port -le $nports ]; do
                minor=$(($port - 1))
                name=$(printf %02d $port)
                mknod cuaA$name c $major $(($minor + 128)) uucp:dialout
                mknod cuaiA$name c $major $(($minor + 128 + 65536)) \
                    uucp:dialout
                mknod cualA$name c $major $(($minor + 128 + 131072)) \
                    uucp:dialout
                port=$(($port + 1))
        done
        umask 77
        ;;

# Alpha AS8[24]00 (TurboLaser) console.
zs?)
        unit=`expr $i : 'zs.*\(.\)$'`
        m=`ttyminor $unit`
        mknod zs$unit c 135 $m
        ;;

# Digiboard PC/?? 16 port card.
# The current scheme of minor numbering is:
#
#       unused{14} CARD{2} major{8} CALLOUT{1} LOCK{1} INIT{1} PORT{5}
#
#   CARD bitfield in future versions may be extended to 3 bits.
#
# See dgb(4)
#
ttyD?)
        portlist="0 1 2 3 4 5 6 7 8 9 a b c d e f"
        major=58
        card=`expr $i : 'tty.*\(.\)$'`
        for unit in $portlist
        do
                minor=`ttyminor $unit`
                minor=$(($card * 65536 + $minor))
                name=$card$unit
                mknod ttyD$name c $major $minor
                mknod ttyiD$name c $major $(($minor + 32))
                mknod ttylD$name c $major $(($minor + 64))
        done
        ;;

cuaD?)
        umask 7
        portlist="0 1 2 3 4 5 6 7 8 9 a b c d e f"
        major=58
        card=`expr $i : 'cua.*\(.\)$'`
        for unit in $portlist
        do
                minor=`ttyminor $unit`
                minor=$(($card * 65536 + $minor))
                name=$card$unit
                mknod cuaD$name c $major $(($minor + 128)) uucp:dialout
                mknod cuaiD$name c $major $(($minor + 32 + 128)) uucp:dialout
                mknod cualD$name c $major $(($minor + 64 + 128)) uucp:dialout
        done
        umask 77
        ;;

# Stallion multi serial cards (stl and stli drivers)
# 
# These drivers reserve 64 minor devices per board, even if the board
# supports only 4 devices.  We default to creating only 8 of the 64 devices
# to keep /dev from getting too large (which => slow).  The last part of the
# arg is the board number to create ports for.  So:
#       ttyE0 will create 8 dialin ports ttyE0-ttyE7, plus ttyiE* and ttylE*
#       cuaE0 will create 8 dialout ports cuaE0-cuaE7, plus cuaiE* and cualE*
#       ttyE1 will create 8 dialin ports ttyE64-ttyE71, plus ttyiE* and ttylE*
#       etc
# If you have EasyConnect 8/32 or 8/64 cards, you will need to change the 
# definition of "maxport" below to get nodes for the full 32 or 64 
# ports per card.
#
# Note that the mapping of minor device numbers (with the hole between
# 32-64k) is a bit odd to keep compatibility with ttyd? for
# lock/initial devices.  
# Minor device field for the ports is
#       card{3} unused{4} unit-msb{1} unused{8} callout{1} lock{1} init{1} 
unit-lsbs{5}
# for the mem device is
#       0x1000000 + card
# (For stl, there is only 1 mem device per system; for stli, one per board)

ttyE*)
        stallion 72 E `expr $i : 'tty.*\(.\)$'` 0
        ;;
cuaE*)
        stallion 72 E `expr $i : 'cua.*\(.\)$'` 1
        ;;
stl*)
        card=`expr $i : 'stl\(.\)$'`
        stallion 72 E $card 0
        stallion 72 E $card 1
        ;;

ttyF*)
        stallion 75 F `expr $i : 'tty.*\(.\)$'` 0
        ;;
cuaF*)
        stallion 75 F `expr $i : 'cua.*\(.\)$'` 1
        ;;
stli*)
        card=`expr $i : 'stl\(.\)$'`
        stallion 75 F $card 0
        stallion 75 F $card 1
        ;;

ttyM*)
        portlist="0 1 2 3 4 5 6 7 8 9 a b c d e f"
        modulelist="a b c d"
        major=101
        card=`expr $i : 'tty.*\(.\)$'`
        for unit in $modulelist
        do
                moduleminor=`ttyminor $unit`
                moduleminor=$(($moduleminor % 10 * 16))
                modulename=$unit

                for unit in $portlist
                do
                        minor=`ttyminor $unit`
                        minor=$(($card * 65536 + $minor + $moduleminor))
                        name=$card$modulename$unit
                        rm -f tty*M$name
                        mknod ttyM$name c $major $minor
                        mknod ttyiM$name c $major $(($minor + 64))
                        mknod ttylM$name c $major $(($minor + 128))
                done
        done
        ;;

cuaM?)
        umask 7
        portlist="0 1 2 3 4 5 6 7 8 9 a b c d e f"
        modulelist="a b c d"
        major=101
        card=`expr $i : 'cua.*\(.\)$'`
        for unit in $modulelist
        do
                moduleminor=`ttyminor $unit`
                moduleminor=$(($moduleminor % 10 * 16))
                modulename=$unit

                for unit in $portlist
                do
                        minor=`ttyminor $unit`
                        minor=$(($card * 65536 + $minor + $moduleminor))
                        name=$card$modulename$unit
                        rm -f cua*M$name
                        mknod cuaM$name c $major $(($minor + 262144)) \
                            uucp:dialout
                        mknod cuaiM$name c $major $(($minor + 64 + 262144)) \
                            uucp:dialout
                        mknod cualM$name c $major $(($minor + 128 + 262144)) \
                            uucp:dialout
                done
        done
        umask 77
        ;;

ttyR?)
        major=81
        BOARD=1; Rnum=0
        MINOR=$(($BOARD * 65536))
        controllers=$(
                dmesg | while read first rest; do
                        case "$first" in
                        RocketPort[0-4])
                                echo "$first"
                                ;;
                        esac
                done
        )
        rm -f ttyR* ttyiR* ttylR*
        for i in $controllers; do
           ndevices=$(
                dmesg | while read first bar ports rest; do
                        case "$first" in
                        $i*)
                                echo "$ports"
                                ;;
                        esac
                done
           )
           echo -n "Creating $ndevices devices for $i: "
           dev=0
           while [ $dev -lt $ndevices ]; do
                   mknod ttyR$Rnum c $major $MINOR
                   mknod ttyiR$Rnum c $major $(($MINOR + 32))
                   mknod ttylR$Rnum c $major $(($MINOR + 64))
                   Rnum=$(($Rnum + 1))
                   MINOR=$(($MINOR + 1))
                   dev=$(($dev + 1))
           done
                BOARD=$(($BOARD + 1))
                MINOR=$(($BOARD * 65536))
           echo " "
        done
        ;;

cuaR?)
        major=81
        BOARD=1; Rnum=0
        MINOR=$(($BOARD * 65536))
        controllers=$(
                dmesg | while read first rest; do
                        case "$first" in
                        RocketPort[0-4])
                                echo "$first"
                                ;;
                        esac
                done
        )
        rm -f cuaR* cuaiR* cualR*
        for i in $controllers; do
           ndevices=$(
                dmesg | while read first bar ports rest; do
                        case "$first" in
                        $i*)
                                echo "$ports"
                                ;;
                        esac
                done
           )
           echo -n "Creating $ndevices devices for $i: "
           dev=0
           while [ $dev -lt $ndevices ]; do
                   mknod cuaR$Rnum c  $major $(($MINOR + 128)) uucp:dialout
                   mknod cuaiR$Rnum c $major $(($MINOR + 128 + 32)) \
                       uucp:dialout
                   mknod cualR$Rnum c $major $(($MINOR + 128 + 64)) \
                       uucp:dialout
                   Rnum=$(($Rnum + 1))
                   MINOR=$(($MINOR + 1))
                   dev=$(($dev + 1))
           done
                BOARD=$(($BOARD + 1))
                MINOR=$(($BOARD * 65536))
           echo " "
        done
        ;;

mse*)
        unit=`expr $i : 'mse\(.*\)'`
        chr=27
        # non-blocking for X11
        mknod mse$unit c $chr `unit2minor $(($unit * 2 + 1))`
        ;;

psm*)
        unit=`expr $i : 'psm\(.*\)'`
        chr=21
        # non-blocking for X11
        mknod psm$unit c $chr `unit2minor $(($unit * 2 + 1))`
        ;;

mouse*)
        name=`expr $i : 'mouse\(.*\)'`
        if [ ! -c $name ]; then
                $0 $name                        # make the appropriate device
        fi
        ln -fs $name mouse
        ;;

pcaudio)
        mknod pcaudio c 24 0
        mknod pcaudioctl c 24 128
        ;;

socksys)
        mknod socksys c 41 0
        mknod spx c 41 1
        ln -fs socksys nfsd
        chmod 666 socksys nfsd spx
        ;;

snd*)
#
# changes from Linux voxware
# minor         Linux                   FreeBSD
# 8             sequencer2 (aka music0) music0
# 17            patmgr0                 sequencer1
# 33            patmgr1                 sequencer2
#

        unit=`expr $i : 'snd\(.*\)'`
        chr=30

        # XXX write this less verbosely, like std
        snd_security_hole=0     # XXX
        umask $snd_security_hole

        ln -fs mixer$unit mixer
        ln -fs sequencer$unit sequencer
        ln -fs dsp$unit dsp
        ln -fs audio$unit audio
        ln -fs dspW$unit dspW
        ln -fs music$unit music
        ln -fs pss$unit pss
        ln -fs dsp$unit.0 dsp$unit
        ln -fs audio$unit.0 audio$unit
        ln -fs dspW$unit.0 dspW$unit

        mknod mixer$unit        c $chr `unit2minor $(($unit * 16 + 0))`
        mknod sequencer$unit    c $chr `unit2minor $(($unit * 16 + 1))`
        mknod midi$unit         c $chr `unit2minor $(($unit * 16 + 2))`

        for chn in 0 1 2 3
        do
                minor=$(($chn * 65536 + $unit * 16))
                mknod dsp$unit.$chn     c $chr $(($minor + 3))
                mknod audio$unit.$chn   c $chr $(($minor + 4))
                mknod dspW$unit.$chn    c $chr $(($minor + 5))
        done

        mknod sndstat           c $chr 6
                                # minor number 7 is unused
        mknod music$unit        c $chr `unit2minor $(($unit * 16 + 8))`
        mknod pss$unit          c $chr `unit2minor $(($unit * 16 + 9))`
                                # minor numbers 10-15 are unused
        umask 77
        ;;

vat)
        mknod vatio c 25 128
        chmod 660 vatio
        ;;

gsc*)
        unit=`expr $i : 'gsc\(.*\)'`
        mknod gsc${unit} c 47 `unit2minor $unit`
        mknod gsc${unit}p c 47 `unit2minor $(($unit + 8))`
        mknod gsc${unit}d c 47 `unit2minor $(($unit + 32))`
        mknod gsc${unit}pd c 47 `unit2minor $(($unit + 40))`
        chmod 666 gsc${unit}*
        ;;

apm)
        mknod apm c 39 0 root:operator
        chmod 664 apm
        ;;

apmctl)
        mknod apmctl c 39 8 root:operator
        chmod 660 apmctl
        ;;

card*)
        unit=`expr $i : 'card\(.*\)'`
        chr=50
        mknod card$unit c $chr `unit2minor $unit`
        chmod 644 card$unit
        ;;

ttyx?|ttyy?|ttyz?)
        case $i in
        *0) unit=0;;    *1) unit=1;;    *2) unit=2;;    *3) unit=3;;
        *4) unit=4;;    *5) unit=5;;    *6) unit=6;;    *7) unit=7;;
        *8) unit=8;;    *9) unit=9;;    *a) unit=10;;   *b) unit=11;;
        *c) unit=12;;   *d) unit=13;;   *e) unit=14;;   *f) unit=15;;
        esac
        case $i in
        ttyy?)  unit=$(($unit + 16));;
        ttyz?)  unit=$(($unit + 32));;
        esac
        mknod $i c 42 $unit
        ;;

cronyx)
        mknod cronyx c 42 63
        ;;

joy)
        mknod joy0 c 51 0 root:operator
        mknod joy1 c 51 1 root:operator
        chmod 640  joy0 joy1
        ;;

spigot)
        mknod spigot c 11 0
        chmod 444 spigot
        ;;

ctx?)
        unit=`expr $i : 'ctx\(.*\)'`
        mknod ctx$unit c 40 `unit2minor $unit`
        chmod 444 ctx$unit
        ;;

meteor?)
        unit=`expr $i : 'meteor\(.*\)'`
        mknod meteor$unit c 67 `unit2minor $unit`
        chmod 444 meteor$unit
        ;;

bktr?)
        unit=`expr $i : 'bktr\(.*\)'`
        mknod bktr$unit c 92 `unit2minor $unit`
        mknod tuner$unit c 92 `unit2minor $((16 + $unit))`
        mknod vbi$unit c 92 `unit2minor $((32 + $unit))`
        chmod 444 bktr$unit tuner$unit vbi$unit
        ;;

tun*)
        ntun=`expr $i : 'tun\(.*\)$'`
        unit=0
        while [ $unit -le $ntun ]; do
                mknod tun$unit c 52 `unit2minor $unit`
                unit=$(($unit + 1))
        done
        ;;

tap*)
        ntap=`expr $i : 'tap\(.*\)$'`
        unit=0
        while [ $unit -le $ntap ]; do
                mknod tap$unit c 149 `unit2minor $unit` root:network
                unit=$(($unit + 1))
        done
        ;;

sysmouse)
        mknod sysmouse c 12 128
        mknod consolectl c 12 255
        ;;

jogdial)
        mknod jogdial c 160 0
        ;;

snp?)
        unit=`expr $i : 'snp\(.*\)'`
        mknod snp$unit c 53 `unit2minor $unit`
        ;;

# [EMAIL PROTECTED]: If I do much more work on other A-D boards
# then eventually we'll have a "ad" and "dio" interface and some of these
# "labpcaio" ones will be gone.
# labpcaio: D-A and A-D.
# labpcdio: Digital in and Digital out.
#
labpc*)
        umask 7
        case $i in
        labpcaio*)
                name=labpcaio
                unit=`expr $i : 'labpcaio\(.*\)'`
                all="0 1 2 3 4 5 6 7"
                offset=0
                ;;
        labpcdio*)
                name=labpcdio
                unit=`expr $i : 'labpcdio\(.*\)'`
                all="0 1 2 3"
                offset=8
                ;;
        *)
                die 3 "Don't know LabPC type $i"
                ;;
        esac
        if [ -z "${unit}" ]; then
                unit=all
        fi
        case $unit in
                0|1|2|3|4|5|6|7)
                                mknod $name$unit c 66 $(($offset + $unit))
                ;;
                all)
                        for i in $all
                        do
                                mknod $name$i c 66 $(($offset + $i))
                        done
                        ;;
                *)
                        echo "No such LabPC unit: $unit"
                        ;;
        esac
        umask 77
        ;;

perfmon)
        mknod perfmon c 2 32 root:kmem
        chmod 640 perfmon
        ;;

ipl)
        mknod ipl c 79 0
        mknod ipnat c 79 1
        mknod ipstate c 79 2
        mknod ipauth c 79 3
        ;;

kbd*)
        unit=`expr $i : 'kbd\(.*\)'`
        chr=112
        mknod kbd$unit c $chr `unit2minor $unit`
        ;;

i4b)
        mknod i4b c 60 0
        ;;

i4bctl)
        mknod i4bctl c 55 0
        ;;

i4brbch*)
        unit=`expr $i : 'i4brbch\(.*\)'`
        mknod i4brbch$unit c 57 `unit2minor $unit`
        ;;

i4bteld*)
        offset=64
        unit=`expr $i : 'i4bteld\(.*\)'`
        mknod i4bteld$unit c 56 `unit2minor $(($offset + $unit))`
        ;;

i4btel*)
        unit=`expr $i : 'i4btel\(.*\)'`
        mknod i4btel$unit c 56 `unit2minor $unit`
        ;;

i4btrc*)
        unit=`expr $i : 'i4btrc\(.*\)'`
        mknod i4btrc$unit c 59 `unit2minor $unit`
        ;;

aac*)
        unit=`expr $i : 'aac\(.*\)'`
        mknod aac$unit c 150 `unit2minor $unit`
        ln -fs aac$unit afa$unit
        ln -fs aac$unit hpn$unit
        ;;

mlx*)
        unit=`expr $i : 'mlx\(.*\)'`
        mknod mlx$unit c 130 `unit2minor $unit`
        ;;

amr*)
        unit=`expr $i : 'amr\(.*\)'`
        mknod amr$unit c 132 `unit2minor $unit`
        ;;

ciss*)
        unit=`expr $i : 'ciss\(.*\)'`
        mknod ciss$unit c 166 `unit2minor $unit`
        ;;

agpgart)
        mknod agpgart c 148 0
        ;;

twe*)
        unit=`expr $i : 'twe\(.*\)'`
        mknod twe$unit c 146 `unit2minor $unit`
        ;;

tw*)
        unit=`expr $i : 'tw\(.*\)'`
        mknod tw$unit c 19 `unit2minor $unit` root:operator
        ;;

cfs*)
        unit=`expr $i : 'cfs\(.*\)'`
        mknod cfs$unit c 93 $unit root:operator
        ;;

nsmb*)
        unit=`expr $i : 'nsmb\(.*\)'`
        mknod nsmb$unit c 144 $unit
        ;;

local)
        umask 0                 # XXX should be elsewhere
        sh MAKEDEV.local
        umask 77
        ;;

*)
        echo $i - no such device name
        ;;

esac
done

Reply via email to