]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - etc/MAKEDEV
Remove a comment which was past its shelf life.
[FreeBSD/FreeBSD.git] / etc / MAKEDEV
1 #!/bin/sh -
2 #
3 # Copyright (c) 1990 The Regents of the University of California.
4 # All rights reserved.
5 #
6 # Written and contributed by W. Jolitz 12/90
7 #
8 # Redistribution and use in source and binary forms are permitted provided
9 # that: (1) source distributions retain this entire copyright notice and
10 # comment, and (2) distributions including binaries display the following
11 # acknowledgement:  ``This product includes software developed by the
12 # University of California, Berkeley and its contributors'' in the
13 # documentation or other materials provided with the distribution and in
14 # all advertising materials mentioning features or use of this software.
15 # Neither the name of the University nor the names of its contributors may
16 # be used to endorse or promote products derived from this software without
17 # specific prior written permission.
18 # THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
19 # WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
20 # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
21 #
22 #       @(#)MAKEDEV     5.2 (Berkeley) 6/22/90
23 # $FreeBSD$
24 #
25 # Device "make" file.  Valid arguments:
26 #       all     makes all known devices, standard number of units (or close)
27 #       std     standard devices
28 #       jail    suitable for a jail(8)
29 #       local   configuration specific devices
30 #       mach-4  mach4&lites+devices for Mach's XFree86 distribution
31 #       (see http://www.cs.hut.fi/lites.html for more info on LITES)
32 #
33 # Tapes:
34 #       wt*     QIC-interfaced (e.g. not SCSI) 3M cartridge tape
35 #       sa*     SCSI Sequential Access Devices
36 #
37 # Disks:
38 #       aac*    Adaptec FSA RAID controllers
39 #       aacd*   Adaptec FSA RAID
40 #       acd*    ATAPI CD-ROM disks
41 #       amrd*   AMI MegaRAID
42 #       cd*     SCSI CD-ROM disks
43 #       da*     SCSI Direct Access Devices
44 #       fd*     floppy disk drives (3 1/2", 5 1/4")
45 #       fla*    M-Systems DiskOnChip
46 #       idad*   Compaq Smart-2 RAID arrays
47 #       matcd*  Matsushita (Panasonic) CD-ROM disks
48 #       mcd*    Mitsumi CD-ROM disks
49 #       md*     Memory (or malloc) disk
50 #       mlx*    Mylex DAC960 RAID controllers
51 #       mlxd*   Mylex DAC960 RAID disk volumes
52 #       mly*    Mylex RAID controllers (newer models)
53 #       scd*    Sony CD-ROM disks
54 #       vn*     vnode disks
55 #       wd*     "Winchester" disk drives (ST506,IDE,ESDI,RLL,...)
56 #       wfd*    IDE floppy disk drives (LS-120)
57 #
58 # Console ports:
59 #       vty*    virtual console devices for syscons/pcvt/codrv
60 #
61 # Pointing devices:
62 #       mse*    Logitech and ATI Inport bus mouse
63 #       psm*    PS/2 mouse
64 #       jogdial Sony VAIO jog dial
65 #       sysmouse Mousesystems mouse emulator for syscons
66 #
67 # Time devices:
68 #       refclock-*  serial ports used by xntpd parse refclocks
69 #
70 # Terminal ports:
71 #       tty*    general purpose serial ports
72 #       cua*    dialout serial ports
73 #       ttyA*   Specialix SI/XIO dialin ports ('*' = number of devices)
74 #       cuaA*   Specialix SI/XIO dialout ports
75 #       ttyDXX  Digiboard Xi - 16 dialin ports (dgb)
76 #       cuaDXX  Digiboard Xi - 16 dialout ports (dgb)
77 #       ttyDX.X Digiboards (work in progress) - 16 dialin ports (digi)
78 #       cuaDX.X Digiboards (work in progress) - 16 dialout ports (digi)
79 #       ttyM*   Digiboard Xem - 16 dialin ports (dgm)
80 #       cuaM*   Digiboard Xem - 16 dialout ports (dgm)
81 #       ttyR*   Rocketport dialin ports
82 #       cuaR*   Rocketport dialout ports
83 #
84 # Pseudo terminals:
85 #       pty*    set of 32 master and slave pseudo terminals
86 #       vty*    virtual terminals using syscons/pcvt/codrv console
87 #
88 # Parallel port:
89 #       lpt*    Printer
90 #       ppi*    Parallel port i/o
91 #       pps*    Pulse per second timing interface
92 #       pcfclock*  Parallel time sync interface
93 #
94 # I2C and SMBus:
95 #       iic*    I2C devices
96 #       smb*    SMBUS devices
97 #
98 # USB devices:
99 #       usb*    USB bus control device
100 #       ugen*   generic USB device
101 #       uhid*   Human Interface Device (HID)
102 #       ulpt*   printer
103 #       umodem* modems
104 #       ums*    mouse
105 #       urio*   Diamond Rio 500
106 #       uscanner* USB scanners
107 #       usio*   USB serial devices
108 #
109 # SCSI devices (other than CD-ROM, tape and disk):
110 #       ch*     SCSI Media-Changer (juke box) driver
111 #       worm*   WORM driver
112 #       pt*     Processor Type (HP scanner, as one example)
113 #       pass*   CAM Passthrough device
114 #       ses*    SES (SCSI Environmental Services) and
115 #               SAF-TE (Scsi Accessable Fault-Tolerant Enclosures) device
116 #
117 # PC-CARD (previously called PCMCIA) support
118 #       card*   PC-CARD slots
119 #
120 # ISDN devices:
121 #       i4b     isdnd call control device
122 #       i4bctl  debugging control device
123 #       i4btrc* trace data interface(s), one per passive card
124 #       i4btel* telephony interface(s)
125 #       i4bteld* telephony dialout interface(s)
126 #       i4brbch* raw b channel access device(s)
127 #
128 # Special purpose devices:
129 #       acpi    Advanced Configuration and Power Interface
130 #       apm     Advanced Power Management BIOS
131 #       apmctl  APM BIOS control device
132 #       bpf*    packet filter
133 #       speaker pc speaker
134 #       tw*     xten power controller
135 #       snd*    various sound cards
136 #       pcaudio PCM audio driver
137 #       socksys iBCS2 socket system driver
138 #       vat     VAT compatibility audio driver (requires snd*)
139 #       gsc     Genius GS-4500 hand scanner
140 #       joy     pc joystick
141 #       tun*    Tunneling IP device
142 #       tap*    Ethernet Tunneling device
143 #       snp*    tty snoop devices
144 #       spigot  Video Spigot video acquisition card
145 #       ctx*    Cortex-I video acquisition card
146 #       meteor* Matrox Meteor video acquisition card (pci)
147 #       bktr*   Bt848 based video acquisition card (pci)
148 #       labpc*  National Instrument's Lab-PC and LAB-PC+
149 #       perfmon CPU performance-monitoring counters
150 #       pci     PCI configuration-space access from user mode
151 #       ipl     ipfilter control devices (ipl, ipnat, ipstate, ipauth)
152 #       kbd     keyboard devices
153 #       3dfx*   3dfx voodoo device for glide (tdfx) (/dev/3dfx,3dfxN,voodoo)
154 #       agpgart AGP interface
155 #
156
157 if [ -n "$MAKEDEVPATH" ]; then
158         PATH="$MAKEDEVPATH"
159 else
160         PATH=/sbin:/bin
161 fi
162 umask 77
163
164 # Usage: die exitcode msg
165 die() {
166         echo $2
167         exit $1
168 }
169
170 # Convert integer to partition name
171 dkitop() {
172         local p
173
174         case $1 in
175         0) p=a;; 1) p=b;; 2) p=c;; 3) p=d;; 4) p=e;; 5) p=f;; 6) p=g;; 7) p=h;;
176         *) p="?";;
177         esac
178         echo $p
179 }
180
181 # Convert integer to slice name
182 dkitos() {
183         local s
184
185         case $1 in
186         0) s="";;
187         1) s="";;
188         *) s=s$(($1-1));;
189         esac
190         echo $s
191 }
192
193 # Convert disk (type, unit, slice, partition) to minor number
194 dkminor()
195 {
196         echo $(($1 << 25 | ($2 / 32) << 21 | ($2 % 32) << 3 | $3 << 16 | $4))
197 }
198
199 # Override mknod(2) to add extra handling to it.
200 mknod=/sbin/mknod
201 for i in `IFS=':'; echo $PATH`; do
202         if [ -x "${i}/mknod" ]; then
203                 mknod="${i}/mknod"
204                 break
205         fi
206 done
207 mknod() {
208         rm -f "$1" || exit 1
209         case $# in
210         4) "$mknod" "$@" root:wheel || die 2 "$mknod $@ failed";;
211         5) "$mknod" "$@"            || die 2 "$mknod $@ failed";;
212         *) die 2 "bad node: mknod $@";;
213         esac
214 }
215
216 # Convert tape (ctrl, unit, mode, access) to minor number
217 saminor()
218 {
219         echo $(($1 << 29 | ($2 / 16) << 16 | ($2 % 16) << 4 | $3 << 2 | $4))
220 }
221
222 # Convert the last character of a tty name to a minor number.
223 ttyminor()
224 {
225         case $unit in
226         [0-9]) m=$unit;;
227         a) m=10;; b) m=11;; c) m=12;; d) m=13;; e) m=14;; f) m=15;; g) m=16;;
228         h) m=17;; i) m=18;; j) m=19;; k) m=20;; l) m=21;; m) m=22;; n) m=23;;
229         o) m=24;; p) m=25;; q) m=26;; r) m=27;; s) m=28;; t) m=29;; u) m=30;;
230         v) m=31;;
231         *) m="?";;
232         esac
233         echo $m
234 }
235
236 # Convert a unit number to a minor number.
237 unit2minor()
238 {
239   echo $(((($1 >> 8) << 16) | ($1 % 256)))
240 }
241
242 # Raw partition for disks
243 dkrawpart=2
244
245 # Compatibility slice for disks
246 dkcompatslice=0
247
248 # Raw slice for disks
249 dkrawslice=1
250
251 # Standard umasks
252 disk_umask=037                  # allow group operator to read disks
253 tape_umask=017                  # allow group operator to read/write tapes
254
255 for i in $*; do
256 case $i in
257
258 all)
259         sh $0 std                                       # standard
260         sh $0 fd0 fd1                                   # bdev, floppy disk
261         sh $0 da0 da1 da2 da3                           # bdev, SCSI disk
262         sh $0 ata                                       # ATA control
263         sh $0 ad0 ad1 ad2 ad3                           # bdev, ATA disk
264         sh $0 ar0 ar1                                   # bdev, ATA RAID disk
265         sh $0 acd0 acd0t afd0 ast0                      # bdev, ATAPI devices
266         sh $0 wd0 wd1 wd2 wd3                           # bdev, OLD disk
267         sh $0 wcd0 wfd0 wst0                            # bdev, OLD ATAPI devs
268         sh $0 vn0                                       # bdev, virtual disk
269         sh $0 cd0 matcd0 mcd0 scd0                      # bdev, cdrom
270         sh $0 sa0 wt0                                   # bdev, tape
271         sh $0 vty12                                     # cdev, virtual tty
272         sh $0 cuaa0 cuaa1 cuaa2 cuaa3                   # cdev, serial tty
273         sh $0 pty0                                      # cdev, pseudo tty
274         sh $0 ttyd0 ttyd1 ttyd2 ttyd3                   # cdev, serial tty
275         sh $0 kbd0 kbd1                                 # cdev, keyboard
276         sh $0 mse0 psm0 jogdial sysmouse                # cdev, mouse
277         sh $0 pcaudio speaker                           # cdev, noise
278         sh $0 lpt0 lpt1 lpt2                            # cdev, printer
279         sh $0 ppi0 ppi1 ppi2                            # cdev, parallel port
280         sh $0 iic0 iic1                                 # cdev, I2C device
281         sh $0 smb0 smb1                                 # cdev, SMBus device
282         sh $0 usb usb0 uhid0 ums0 ulpt0 ugen0           # cdev, USB devices
283         sh $0 urio0 uscanner0 umodem0                   # cdev, USB devices too
284         sh $0 bpf0 bpf1 bpf2 bpf3                       # cdev, network
285         sh $0 ipl tun0 tun1 tun2 tun3                   # cdev, network
286         sh $0 tap0 tap1 tap2 tap3                       # cdev, network
287         sh $0 ch0 perfmon tw0                           # cdev, miscellaneous
288         sh $0 acpi                                      # cdev, ACPI
289         sh $0 apm apmctl card0 card1 card2 card3        # cdev, laptop
290         sh $0 pass4 xpt2                                # cdev, CAM
291         sh $0 i4b i4bctl i4btrc0 i4btrc1                # cdev, ISDN
292         sh $0 i4btel0 i4btel1 i4bteld0 i4bteld1         # cdev, ISDN
293         sh $0 i4brbch0 i4brbch1                         # cdev, ISDN
294         sh $0 agpgart                                   # cdev, AGP
295         ;;
296
297 # a much restricted set of the above, to save precious i-nodes on the
298 # fixit floppy
299 fixit)
300         sh $0 std                                       # standard
301         sh $0 fd0                                       # bdev, floppy disk
302         sh $0 da0                                       # bdev, SCSI disk
303         sh $0 ad0                                       # bdev, ATA disk
304         sh $0 acd0 afd0 ast0                            # bdev, ATAPI devices
305         sh $0 wd0                                       # bdev, OLD disk
306         sh $0 wcd0 wfd0 wst0                            # bdev, OLD ATAPI devs
307         sh $0 vn0                                       # bdev, virtual disk
308         sh $0 cd0                                       # bdev, cdrom
309         sh $0 sa0                                       # bdev, tape
310         sh $0 vty2                                      # cdev, virtual tty
311         sh $0 cuaa0                                     # cdev, serial tty
312         sh $0 pty0                                      # cdev, pseudo tty
313         sh $0 ttyd0                                     # cdev, serial tty
314         sh $0 kbd0                                      # cdev, keyboard
315         sh $0 mse0 psm0 jogdial sysmouse                # cdev, mouse
316         sh $0 lpt0                                      # cdev, printer
317         sh $0 ppi0                                      # cdev, parallel port
318         sh $0 iic0                                      # cdev, I2C device
319         sh $0 smb0                                      # cdev, SMBus device
320         sh $0 ums0                                      # cdev, USB devices
321         sh $0 tun0                                      # cdev, network
322         sh $0 tap0                                      # cdev, network
323         sh $0 ch0                                       # cdev, miscellaneous
324         sh $0 acpi                                      # cdev, ACPI
325         sh $0 apm apmctl card0                          # cdev, laptop
326         sh $0 pass1 xpt1                                # cdev, CAM
327         sh $0 i4b i4bctl i4btrc0 i4btrc1                # cdev, ISDN
328         sh $0 i4btel0 i4bteld0                          # cdev, ISDN
329         sh $0 i4brbch0                                  # cdev, ISDN
330         rm -f fd/[1-9]?
331         ;;
332
333 std)
334         mknod console   c 0 0;                  chmod 600 console
335         mknod kmem      c 2 1 root:kmem;        chmod 640 kmem
336         mknod mem       c 2 0 root:kmem;        chmod 640 mem
337         mknod null      c 2 2;                  chmod 666 null
338         mknod random    c 2 3;                  chmod 666 random
339         ln -f random urandom
340         mknod zero      c 2 12;                 chmod 666 zero
341         mknod io        c 2 14;                 chmod 600 io
342         mknod tty       c 1 0;                  chmod 666 tty
343         mknod klog      c 7 0;                  chmod 600 klog
344         mknod pci       c 78 0;                 chmod 644 pci
345         mknod mdctl     c 95 0xffff00ff;        chmod 600 mdctl
346         mkdir -p fd
347         (cd fd && i=0 &&
348                 while [ $i -lt 64 ]; do
349                         mknod $i c 22 $i
350                         i=$(($i + 1))
351                 done
352         )
353         chmod 555 fd
354         chmod 666 fd/*
355         ln -sf fd/0 stdin
356         ln -sf fd/1 stdout
357         ln -sf fd/2 stderr
358         ;;
359
360 jail)
361         sh $0 std pty0
362         rm mem kmem pci io klog console         # for security
363         ln -sf null mem                 # for libkvm (ab)users
364         ln -sf null kmem                # --//--
365         ln -sf null console
366         ;;
367
368 mach-4)
369         mknod iopl c 22 0
370         mknod kbd c 23 0
371         mknod mouse c 24 0
372         mknod time c 25 0
373         mknod timezone c 26 0
374         ;;
375
376 # Create device files for new Archive/Wangtek QIC-02 tape driver (vak)
377 wt*)
378         umask $tape_umask
379         u=`expr $i : '..\(.*\)'`
380         if [ -z "${u}" ]; then u=0; fi
381         # default density, 512b blocks
382         mknod rwt${u}   c 10 `expr  0 + $u` root:operator
383         mknod nrwt${u}  c 10 `expr  4 + $u` root:operator
384         # default density, 1024b blocks
385 #       mknod rWt${u}   c 10 `expr 64 + $u` root:operator
386 #       mknod nrWt${u}  c 10 `expr 68 + $u` root:operator
387         mknod rwt${u}b  c 10 `expr 16 + $u` root:operator       # 60 megabytes
388         mknod nrwt${u}b c 10 `expr 20 + $u` root:operator
389         mknod rwt${u}c  c 10 `expr 24 + $u` root:operator       # 120 megabytes
390         mknod nrwt${u}c c 10 `expr 28 + $u` root:operator
391         mknod rwt${u}d  c 10 `expr 32 + $u` root:operator       # 150 megabytes
392         mknod nrwt${u}d c 10 `expr 36 + $u` root:operator
393 #       mknod rwt${u}e  c 10 `expr 40 + $u` root:operator       # 300 megabytes?
394 #       mknod nrwt${u}e c 10 `expr 44 + $u` root:operator
395 #       mknod rwt${u}f  c 10 `expr 48 + $u` root:operator       # 600 megabytes?
396 #       mknod nrwt${u}f c 10 `expr 52 + $u` root:operator
397         umask 77
398         ;;
399
400 # Individual slices.
401 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*)
402         umask $disk_umask
403         case $i in
404         aacd*s*) name=aacd; chr=151;;
405         ad*s*) name=ad; chr=116;;
406         ar*s*) name=ar; chr=157;;
407         afd*s*) name=afd; chr=118;;
408         amrd*s*) name=amrd; chr=133;;
409         da*s*) name=da;  chr=13;;
410         fla*s*) name=fla; chr=102;;
411         idad*s*) name=idad; chr=109;;
412         md*s*) name=md;  chr=95;;
413         mlxd*s*) name=mlxd; chr=131;;
414         twed*s*) name=twed; chr=147;;
415         vn*s*) name=vn; chr=43;;
416         wd*s*) name=wd;  chr=3;;
417         wfd*s*) name=wfd; chr=87;;
418         esac
419         case $i in
420         aacd*s*|amrd*s*|idad*s*|mlxd*s*|twed*s*)
421                 unit=`expr $i : '....\([0-9]*\)s'`
422                 slice=`expr $i : '....[0-9]*s\([0-9]*\)'`
423                 part=`expr $i : '....[0-9]*s[0-9]*\(.*\)'`
424                 ;;
425         afd*s*|fla*s*|wfd*s*)
426                 unit=`expr $i : '...\([0-9]*\)s'`
427                 slice=`expr $i : '...[0-9]*s\([0-9]*\)'`
428                 part=`expr $i : '...[0-9]*s[0-9]*\(.*\)'`
429                 ;;
430         *)
431                 unit=`expr $i : '..\([0-9]*\)s'`
432                 slice=`expr $i : '..[0-9]*s\([0-9]*\)'`
433                 part=`expr $i : '..[0-9]*s[0-9]*\(.*\)'`
434                 ;;
435         esac
436         case $unit in
437         [0-9]|[0-9][0-9]|[0-4][0-9][0-9]|50[0-9]|51[0-1])
438                 case $slice in
439                 [0-9]|[1-2][0-9]|30)
440                         oldslice=$slice
441                         slice=$(($slice+1))
442                         slicename=`dkitos $slice`
443                         minor=`dkminor 0 $unit $slice $dkrawpart`
444                         mknod  $name$unit$slicename c $chr $minor root:operator
445                         ln -f $name$unit$slicename r$name$unit$slicename
446                         case $part in
447                         [a-h])
448                                 case $oldslice in
449                                 0) slice=$oldslice ;;
450                                 esac
451                                 for part in 0 1 2 3 4 5 6 7
452                                 do
453                                         minor=`dkminor 0 $unit $slice $part`
454                                         partname=`dkitop $part`
455                                         mknod  $name$unit$slicename$partname \
456                                               c $chr $minor root:operator
457                                         ln -f $name$unit$slicename$partname \
458                                              r$name$unit$slicename$partname
459                                 done
460                                 ;;
461                         "")
462                                 ;;
463                         *)
464                                 echo bad partition for disk in: $i
465                                 ;;
466                         esac
467                         ;;
468                 *)
469                         echo bad slice for disk in: $i
470                         ;;
471                 esac
472                 ;;
473         *)
474                 echo bad unit for disk in: $i "(unit=$unit, slice=$slice, part=$part)"
475                 ;;
476         esac
477         umask 77
478         ;;
479
480 fd*)
481         umask $disk_umask
482         unit=`expr $i : '..\(.*\)'`
483         name=fd; chr=9
484         case $unit in
485         0|1|2|3)
486                 mknod ${name}${unit}   c $chr `expr $unit '*' 64` root:operator
487                 ln -f ${name}${unit} r${name}${unit}
488                 # Fake BSD partitions
489                 for i in a b c d e f g h
490                 do
491                         ln -f ${name}${unit} ${name}${unit}$i
492                         ln -f r${name}${unit} r${name}${unit}$i
493                 done
494                 # User-readable and programmer-readable name sets
495
496                 mknod ${name}${unit}.1720  c $chr `expr $unit '*' 64 + 1` \
497                     root:operator
498                 ln -f ${name}${unit}.1720 r${name}${unit}.1720
499                 # ln -f ${name}${unit}.1720 ${name}${unit}135hs21
500                 # ln -f r${name}${unit}.1720 r${name}${unit}135hs21
501
502                 mknod ${name}${unit}.1480  c $chr `expr $unit '*' 64 + 2` \
503                     root:operator
504                 ln -f ${name}${unit}.1480 r${name}${unit}.1480
505                 # ln -f ${name}${unit}.1480 ${name}${unit}135hs18
506                 # ln -f r${name}${unit}.1480 r${name}${unit}135hs18
507                 # ln -f ${name}${unit}.1480 ${name}${unit}96hs18
508                 # ln -f r${name}${unit}.1480 r${name}${unit}96hs18
509
510                 mknod ${name}${unit}.1440  c $chr `expr $unit '*' 64 + 3` \
511                     root:operator
512                 ln -f ${name}${unit}.1440 r${name}${unit}.1440
513                 # ln -f ${name}${unit}.1440 ${name}${unit}135
514                 # ln -f r${name}${unit}.1440 r${name}${unit}135
515                 # ln -f ${name}${unit}.1440 ${name}${unit}135ds18
516                 # ln -f r${name}${unit}.1440 r${name}${unit}135ds18
517                 # ln -f ${name}${unit}.1440 ${name}${unit}96ds18
518                 # ln -f r${name}${unit}.1440 r${name}${unit}96ds18
519
520                 mknod ${name}${unit}.1200  c $chr `expr $unit '*' 64 + 4` \
521                     root:operator
522                 ln -f ${name}${unit}.1200 r${name}${unit}.1200
523                 # ln -f ${name}${unit}.1200 ${name}${unit}96
524                 # ln -f r${name}${unit}.1200 r${name}${unit}96
525                 # ln -f ${name}${unit}.1200 ${name}${unit}96ds15
526                 # ln -f r${name}${unit}.1200 r${name}${unit}96ds15
527                 # ln -f ${name}${unit}.1200 ${name}${unit}135ds15
528                 # ln -f r${name}${unit}.1200 r${name}${unit}135ds15
529
530                 mknod ${name}${unit}.820  c $chr `expr $unit '*' 64 + 5` \
531                     root:operator
532                 ln -f ${name}${unit}.820 r${name}${unit}.820
533                 # ln -f ${name}${unit}.820 ${name}${unit}96hs10
534                 # ln -f r${name}${unit}.820 r${name}${unit}96hs10
535                 # ln -f ${name}${unit}.820 ${name}${unit}135hs10
536                 # ln -f r${name}${unit}.820 r${name}${unit}135hs10
537
538                 mknod ${name}${unit}.800  c $chr `expr $unit '*' 64 + 6` \
539                     root:operator
540                 ln -f ${name}${unit}.800 r${name}${unit}.800
541                 # ln -f ${name}${unit}.800 ${name}${unit}96ds10
542                 # ln -f r${name}${unit}.800 r${name}${unit}96ds10
543                 # ln -f ${name}${unit}.800 ${name}${unit}135ds10
544                 # ln -f r${name}${unit}.800 r${name}${unit}135ds10
545
546                 mknod ${name}${unit}.720  c $chr `expr $unit '*' 64 + 7` \
547                     root:operator
548                 ln -f ${name}${unit}.720 r${name}${unit}.720
549                 # ln -f ${name}${unit}.720 ${name}${unit}96ds9
550                 # ln -f r${name}${unit}.720 r${name}${unit}96ds9
551                 # ln -f ${name}${unit}.720 ${name}${unit}135ds9
552                 # ln -f r${name}${unit}.720 r${name}${unit}135ds9
553
554                 mknod ${name}${unit}.360  c $chr `expr $unit '*' 64 + 8` \
555                     root:operator
556                 ln -f ${name}${unit}.360 r${name}${unit}.360
557                 # ln -f ${name}${unit}.360 ${name}${unit}48
558                 # ln -f r${name}${unit}.360 r${name}${unit}48
559                 # ln -f ${name}${unit}.360 ${name}${unit}48ds9
560                 # ln -f r${name}${unit}.360 r${name}${unit}48ds9
561
562                 mknod ${name}${unit}.640  c $chr `expr $unit '*' 64 + 9` \
563                     root:operator
564                 ln -f ${name}${unit}.640 r${name}${unit}.640
565                 # ln -f ${name}${unit}.640 ${name}${unit}96ds8
566                 # ln -f r${name}${unit}.640 r${name}${unit}96ds8
567                 # ln -f ${name}${unit}.640 ${name}${unit}135ds8
568                 # ln -f r${name}${unit}.640 r${name}${unit}135ds8
569
570                 mknod ${name}${unit}.1232  c $chr `expr $unit '*' 64 + 10` \
571                     root:operator
572                 ln -f ${name}${unit}.1232 r${name}${unit}.1232
573                 # ln -f ${name}${unit}.1232 ${name}${unit}96ds8
574                 # ln -f r${name}${unit}.1232 r${name}${unit}96ds8
575                 # ln -f ${name}${unit}.1232 ${name}${unit}135ds8
576                 # ln -f r${name}${unit}.1232 r${name}${unit}135ds8
577                 ;;
578         *)
579                 echo bad unit for disk in: $i
580                 ;;
581         esac
582         umask 77
583         ;;
584
585 ata)
586         umask 177
587         mknod ata c 159 0 root:operator
588         umask 77
589         ;;
590         
591
592 aacd*|ad*|ar*|afd*|amrd*|da*|fla*|idad*|md*|mlxd*|twed*|vn*|wd*|wfd*)
593         umask $disk_umask
594         case $i in
595         aacd*) name=aacd; chr=151;;
596         ad*) name=ad; chr=116;;
597         ar*) name=ar; chr=157;;
598         afd*) name=afd; chr=118;;
599         amrd*) name=amrd; chr=133;;
600         da*) name=da;  chr=13;;
601         fla*) name=fla; chr=102;;
602         idad*) name=idad; chr=109;;
603         md*) name=md; chr=95;;
604         mlxd*) name=mlxd; chr=131;;
605         twed*) name=twed; chr=147;;
606         vn*) name=vn; chr=43;;
607         wd*) name=wd;  chr=3;;
608         wfd*) name=wfd; chr=87;;
609         esac
610         case $i in
611         aacd*|amrd*|idad*|mlxd*|twed*)
612                 unit=`expr $i : '....\(.*\)'`
613                 ;;
614         afd*|fla*|wfd*)
615                 unit=`expr $i : '...\(.*\)'`
616                 ;;
617         *)
618                 unit=`expr $i : '..\(.*\)'`
619                 ;;
620         esac
621         case $unit in
622         [0-9]|[0-9][0-9]|[0-4][0-9][0-9]|50[0-9]|51[0-1])
623                 for slicepartname in s0h s1 s2 s3 s4
624                 do
625                         sh $0 $name$unit$slicepartname
626                 done
627                 if [ "x$name" = "xvn" ] ; then
628                         # We need to control device so we can configure
629                         # the vn disks with vnconfig
630                         mknod  $name$unit.ctl c \
631                             $chr `expr $unit '*' 8 + 33554432` root:operator
632                 fi
633                 ;;
634         *)
635                 echo bad unit for disk in: $i
636                 ;;
637         esac
638         umask 77
639         ;;
640
641 ccd*)
642         umask $disk_umask
643         name=ccd
644         chr=74
645         unit=`expr $i : '...\(.*\)'`
646         case $unit in
647         [0-9]|[0-9][0-9]|[0-4][0-9][0-9]|50[0-9]|51[0-1])
648                 for part in 0 1 2 3 4 5 6 7
649                 do
650                         minor=`dkminor 0 $unit 0 $part`
651                         partname=`dkitop $part`
652                         mknod  $name$unit$partname c $chr $minor root:operator
653                         ln -f $name$unit$partname r$name$unit$partname
654                 done
655                 ;;
656         *)
657                 echo bad unit for disk in: $i
658                 ;;
659         esac
660         umask 77
661         ;;
662
663 # SCSI processor type driver
664 pt[0-9]*)
665         chr=61
666         name=pt
667         unit=`expr $i : 'pt\([0-9][0-9]*\)'`
668         if [ -z "${unit}" ]; then
669                 unit=0
670         fi
671         unit=`expr $unit + 1 - 1`
672         mknod ${name}${unit} c $chr `unit2minor $unit`
673         ;;
674
675 # SCSI SES/SAF-TE type driver
676 ses[0-9]*)
677         chr=110
678         name=ses
679         unit=`expr $i : 'ses\([0-9][0-9]*\)'`
680         if [ -z "${unit}" ]; then
681                 unit=0
682         fi
683         unit=`expr $unit + 1 - 1`
684         mknod ${name}${unit} c $chr `unit2minor $unit`
685         ;;
686 # SCSI target mode sample driver
687 targ[0-9]*)
688         chr=65
689         name=targ
690         unit=`expr $i : 'targ\([0-9][0-9]*\)'`
691         if [ -z "${unit}" ]; then
692                 unit=0
693         fi
694         unit=`expr $unit + 1 - 1`
695         mknod ${name}${unit} c $chr `unit2minor $unit`
696         mknod ${name}.ctl c $chr 0xffff00ff
697         ;;
698
699 # CAM transport layer device
700 xpt*)
701         # This major number is temporary
702         chr=104
703         name=xpt
704         units=`expr $i : 'xpt\(.*\)'`
705         if [ -z "${units}" ]; then
706                 units=1
707         fi
708         i=0
709         while [ $i -lt $units ]; do
710                 dname=$name$i
711                 rm -rf $dname r$dname
712                 mknod $dname c $chr `unit2minor $i` root:operator
713                 i=$(($i + 1))
714         done    
715         ;;
716
717 # CAM passthrough device
718 pass*)
719         # This major number is temporary
720         chr=31
721         name=pass
722         units=`expr $i : 'pass\(.*\)'`
723         if [ -z "${units}" ]; then
724                 units=1
725         fi
726         i=0
727         while [ $i -lt $units ]; do
728                 dname=$name$i
729                 rm -rf $dname r$dname
730                 mknod $dname c $chr `unit2minor $i` root:operator
731                 i=$(($i + 1))
732         done    
733         ;;
734 pty*)
735         class=`expr $i : 'pty\(.*\)'`
736         case $class in
737         0) offset=0 name=p;;
738         1) offset=32 name=q;;
739         2) offset=64 name=r;;
740         3) offset=96 name=s;;
741 # Note that xterm (at least) only look at p-s.
742         4) offset=128 name=P;;
743         5) offset=160 name=Q;;
744         6) offset=192 name=R;;
745         7) offset=224 name=S;;
746         # This still leaves [tuTU].
747         *) echo bad unit for pty in: $i;;
748         esac
749         umask 0
750         case $class in
751         0|1|2|3|4|5|6|7)
752                 i=0
753                 while [ $i -lt 32 ]; do
754 #                       This was an awk substr() before.
755                         c=$(echo 0123456789abcdefghijklmnopqrstuv |
756                             dd bs=1 skip=$i count=1 2>/dev/null)
757                         mknod tty$name$c c 5 $(($offset + $i))
758                         mknod pty$name$c c 6 $(($offset + $i))
759                         i=$(($i + 1))
760                 done
761                 ;;
762         esac
763         umask 77
764         ;;
765
766 sa*)
767         umask $tape_umask
768         unit=`expr $i : '..\(.*\)'`
769         chr=14
770
771         case $unit in
772         [0-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9])
773                 mknod sa${unit}.ctl c $chr `saminor 1 ${unit} 0 0`
774                 ln -f sa${unit}.ctl rsa${unit}.ctl
775                 for m in 0 1 2 3
776                 do
777                         mknod sa${unit}.${m} c $chr \
778                             `saminor 0 ${unit} ${m} 0`  root:operator
779                         ln -f sa${unit}.${m} rsa${unit}.${m}
780                         mknod nsa${unit}.${m} c $chr \
781                             `saminor 0 ${unit} ${m} 1` root:operator
782                         ln -f nsa${unit}.${m} nrsa${unit}.${m}
783                         mknod esa${unit}.${m} c $chr \
784                             `saminor 0 ${unit} ${m} 2` root:operator
785                         ln -f esa${unit}.${m} ersa${unit}.${m}
786                 done
787                 ln -f sa${unit}.0 sa${unit}
788                 ln -f sa${unit}.0 rsa${unit}.0
789                 ln -f sa${unit}.0 rsa${unit}
790                 ln -f nsa${unit}.0 nsa${unit}
791                 ln -f nsa${unit}.0 nrsa${unit}.0
792                 ln -f nsa${unit}.0 nrsa${unit}
793                 ln -f esa${unit}.0 esa${unit}
794                 ln -f esa${unit}.0 ersa${unit}.0
795                 ln -f esa${unit}.0 ersa${unit}
796                 ;;
797         *)
798                 echo bad unit for tape in: $i
799                 ;;
800         esac
801         umask 77
802         ;;
803
804 ch*)
805         umask 37
806         unit=`expr $i : '..\(.*\)'`
807         case $i in
808         ch*) name=ch;  chr=17;;
809         esac
810         case $unit in
811         0|1|2|3|4|5|6)
812                 mknod ${name}${unit}    c $chr $unit root:operator
813                 ;;
814         *)
815                 echo bad unit for media changer in: $i
816                 ;;
817         esac
818         umask 77
819         ;;
820
821 ast*)
822         umask 2 ;
823         unit=`expr $i : '...\(.*\)'`
824         chr=119
825         case $unit in
826         0|1|2|3)
827                 mknod rast${unit} c $chr `expr $unit '*' 8 + 0` root:operator
828                 chmod 640 rast${unit}
829                 mknod nrast${unit} c $chr `expr $unit '*' 8 + 1` root:operator
830                 chmod 640 nrast${unit}
831                 ;;
832         *)
833                 echo bad unit for tape in: $i
834                 ;;
835         esac
836         umask 77
837         ;;
838
839 acd*t*)
840         umask $disk_umask
841         units=`expr $i : '...\(.*\)t'`;
842         tracks=`expr $i : '.*t\(.*\)'`;
843         name=acd;
844         chr=117;
845         if [ -z "${units}" -o "${units}" -le 0 ]; then
846                 units=1
847         fi
848         if [ -z "${tracks}" -o "${tracks}" -le 0 ]; then
849                 tracks=100
850         fi
851         if [ "${units}" -le 31 -a "${tracks}" -le 169 ]; then
852                 i=0
853                 while [ $i -le $units ]; do
854                         dname=$name$i
855                         rm -rf ${dname}t*
856                         j=1
857                         while [ $j -le ${tracks} ]; do
858                                 mknod ${dname}t$j c $chr \
859                                         $((($i * 8) + (65536 * $j))) \
860                                         root:operator
861                                 j=$(($j + 1))
862                         done
863                         i=$(($i + 1))
864                 done
865         else
866                 echo "$i is invalid -- can't have more than 32 cd devices or 169 tracks"
867         fi
868         umask 77
869         ;;
870
871 acd*|cd*|mcd*|scd*)
872         umask $disk_umask
873         case $i in
874         acd*) units=`expr $i : '...\(.*\)'`; name=acd; chr=117;;
875         cd*) units=`expr $i : '..\(.*\)'`; name=cd; chr=15;;
876         mcd*) units=`expr $i : '...\(.*\)'`; name=mcd; chr=29;;
877         scd*) units=`expr $i : '...\(.*\)'`; name=scd; chr=45;;
878         esac
879         if [ -z "${units}" -o "${units}" -le 0 ]; then
880                 units=1
881         fi
882         if [ "${units}" -le 31 ]; then
883                 i=0
884                 while [ $i -le $units ]; do
885                         dname=$name$i
886                         rm -rf ${dname}[!t]* r${dname}*
887                         mknod ${dname}a c $chr $(($i * 8)) root:operator
888                         mknod ${dname}c c $chr $(($i * 8 + 2)) root:operator
889                         ln -f ${dname}a r${dname}a
890                         ln -f ${dname}c r${dname}c
891                         i=$(($i + 1))
892                 done
893         else
894                 echo "$i is invalid -- can't have more than 32 cd devices"
895         fi
896         umask 77
897         ;;
898
899 matcd*)
900         umask 2
901         case $i in
902         matcd*) unit=`expr $i : '.....\(.*\)'`; name=matcd; chr=46;;
903         esac
904         case $unit in
905         0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15)
906                 mknod ${name}${unit}a   c $chr `expr $unit '*' 8 + 0` \
907                     root:operator
908                 mknod ${name}${unit}c   c $chr `expr $unit '*' 8 + 2` \
909                     root:operator
910                 ln -f ${name}${unit}a r${name}${unit}a
911                 ln -f ${name}${unit}c r${name}${unit}c
912                 chmod 640 ${name}${unit}[a-h] r${name}${unit}[a-h]
913
914                 mknod ${name}${unit}la  c $chr `expr $unit '*' 8 + 128` \
915                     root:operator
916                 mknod ${name}${unit}lc  c $chr `expr $unit '*' 8 + 130` \
917                     root:operator
918                 ln -f ${name}${unit}la r${name}${unit}la
919                 ln -f ${name}${unit}lc r${name}${unit}lc
920                 chmod 640 ${name}${unit}l[a-h] r${name}${unit}l[a-h]
921                 ;;
922         *)
923                 echo bad unit for disk in: $i
924                 ;;
925         esac
926         umask 77
927         ;;
928
929 wcd*)
930         umask 2 ;
931         unit=`expr $i : '...\(.*\)'`
932         chr=69
933         case $unit in
934         0|1|2|3|4|5|6|7)
935                 mknod wcd${unit}a  c $chr `expr $unit '*' 8 + 0` root:operator
936                 mknod wcd${unit}c  c $chr `expr $unit '*' 8 + 2` root:operator
937                 ln -f wcd${unit}a rwcd${unit}a
938                 ln -f wcd${unit}c rwcd${unit}c
939                 chmod 640 wcd${unit}[a-h] rwcd${unit}[a-h]
940                 ;;
941         *)
942                 echo bad unit for disk in: $i
943                 ;;
944         esac
945         umask 77
946         ;;
947
948 wst*)
949         umask 2 ;
950         unit=`expr $i : '...\(.*\)'`
951         chr=90
952         case $unit in
953         0|1|2|3)
954                 mknod rwst${unit} c $chr `expr $unit '*' 8 + 0` root:operator
955                 chmod 640 rwst${unit}
956                 ;;
957         esac
958         umask 77
959         ;;
960
961 iic*)
962         unit=`expr $i : 'iic\(.*\)'`
963         mknod iic$unit c 105 `unit2minor $unit`
964         ;;
965
966 smb*)
967         unit=`expr $i : 'smb\(.*\)'`
968         mknod smb$unit c 106 `unit2minor $unit`
969         ;;
970
971 pcfclock*)
972         unit=`expr $i : 'pcfclock\(.*\)'`
973         mknod pcfclock$unit c 140 `unit2minor $unit`
974         ;;
975
976 ppi*)
977         unit=`expr $i : 'ppi\(.*\)'`
978         mknod ppi$unit c 82 `unit2minor $unit`
979         ;;
980
981 pps*)
982         unit=`expr $i : 'pps\(.*\)'`
983         mknod pps$unit c 89 `unit2minor $unit`
984         ;;
985
986 usb)
987         mknod usb$unit c 108 255 root:operator
988         chmod 0660 usb$unit
989         ;;
990
991 usb*)
992         umask 7
993         unit=`expr $i : 'usb\(.*\)'`
994         mknod usb$unit c 108 `unit2minor $unit` root:operator
995         umask 77
996         ;;
997
998 uhid*)
999         umask 7
1000         unit=`expr $i : 'uhid\(.*\)'`
1001         mknod uhid$unit c 122 `unit2minor $unit` root:operator
1002         umask 77
1003         ;;
1004
1005 ums*)
1006         umask 7
1007         unit=`expr $i : 'ums\(.*\)'`
1008         mknod ums$unit c 111 `unit2minor $unit` root:operator
1009         umask 77
1010         ;;
1011
1012 ulpt*)
1013         unit=`expr $i : 'ulpt\(.*\)'`
1014         minor=`unit2minor $unit`
1015         mknod ulpt$unit c 113 $minor
1016         minor=`unit2minor \`expr $unit + 64\``
1017         mknod unlpt$unit c 113 $minor           # and the 'no prime' version
1018         ;;
1019
1020 ugen*)
1021         umask 7
1022         unit=`expr $i : 'ugen\([0-9][0-9]*\)'`
1023         endpoint=`expr $i : 'ugen.*\.\([0-9][0-9]*\)'`
1024         if [ -z "${unit}" ]; then
1025                 echo $i - Invalid unit number
1026         fi
1027         if [ -z "${endpoint}" ]; then           # ugen0 & ugen0.1 - ugen0.15
1028                 mknod ugen$unit c 114 \
1029                                 `unit2minor $(($unit * 16))` root:operator
1030                 i=1
1031                 while [ $i -lt 16 ]; do
1032                         mknod ugen$unit.$i c 114 \
1033                                 `unit2minor $(($unit * 16 + $i))` root:operator
1034                         i=$(($i + 1))
1035                 done
1036         else
1037                 minor=`unit2minor $(($unit * 16 + $endpoint))`
1038                 mknod ugen$unit.$endpoint c 114 $minor root:operator
1039         fi
1040         umask 77
1041         ;;
1042
1043 urio*)
1044         umask 7
1045         unit=`expr $i : 'urio\(.*\)'`
1046         mknod urio$unit c 143 `unit2minor $unit` root:operator
1047         umask 77
1048         ;;
1049
1050 usio*)
1051         umask 7
1052         unit=`expr $i : 'usio\(.*\)'`
1053         minor=`unit2minor $(($unit + 128))`
1054         mknod usio$unit c 138 $minor uucp:dialer
1055         umask 77
1056         ;;
1057
1058 uscanner*)
1059         umask 7
1060         unit=`expr $i : 'uscanner\(.*\)'`
1061         mknod uscanner$unit c 156 `unit2minor $unit` root:operator
1062         umask 77
1063         ;;
1064
1065 umodem*)
1066         umask 7
1067         unit=`expr $i : 'umodem\(.*\)'`
1068         mknod umodem$unit c 124 `unit2minor $unit` uucp:dialer
1069         umask 77
1070         ;;
1071
1072 lpt*)
1073         unit=`expr $i : 'lpt\(.*\)'`
1074         mknod lpt$unit c 16 `unit2minor $unit`
1075         mknod lpctl$unit c 16 `unit2minor \`expr $unit + 128\``
1076         ;;
1077
1078 # Use this to create virtual consoles for syscons, pcvt or codrv
1079 # ttyv0-b
1080 # use as MAKEDEV vtyNN to create NN entries
1081 vty*)
1082         chr=12
1083         units=`expr $i : 'vty\(.*\)'`
1084         i=0
1085         while [ $i -lt $units ]; do
1086                 mknod ttyv$(printf %01x $i) c $chr `unit2minor $i`
1087                 i=$(($i + 1))
1088         done
1089         ln -fs ttyv0 vga        # XXX X still needs this pccons relic
1090         ;;
1091
1092 nmdm*)
1093         units=`expr $i : 'nmdm\(.*\)'`
1094         chr=18
1095         i=0
1096         while [ $i -lt $units ]; do
1097                 minor=`unit2minor $i`
1098                 minor=$(($minor + $minor))
1099                 mknod nmdm${i}A c $chr $minor
1100                 mknod nmdm${i}B c $chr $(($minor + 1))
1101                 i=$(($i + 1))
1102         done
1103         ;;
1104
1105 bpf*)
1106         nbpf=`expr $i : 'bpf\(.*\)$'`
1107         unit=0
1108         while [ $unit -le $nbpf ]; do
1109                 mknod bpf$unit c 23 `unit2minor $unit`
1110                 unit=$(($unit + 1))
1111         done
1112         ;;
1113
1114 speaker)
1115         mknod speaker c 26 0
1116         ;;
1117
1118 cuaa?|cua?)
1119         umask 7
1120         unit=`expr $i : 'cua.*\(.\)$'`
1121         m=`ttyminor $unit`
1122         mknod cuaa$unit c 28 `expr $m + 128` uucp:dialer
1123         mknod cuaia$unit c 28 `expr $m + 32 + 128` uucp:dialer
1124         mknod cuala$unit c 28 `expr $m + 64 + 128` uucp:dialer
1125         umask 77
1126         ;;
1127
1128 tty0?|ttyd?|tty?)
1129         unit=`expr $i : 'tty.*\(.\)$'`
1130         m=`ttyminor $unit`
1131         mknod ttyd$unit c 28 $m
1132         mknod ttyid$unit c 28 `expr $m + 32`
1133         mknod ttyld$unit c 28 `expr $m + 64`
1134         ;;
1135
1136 cuac?)
1137         umask 7
1138         portlist="0 1 2 3 4 5 6 7 8 9 a b c d e f
1139                   g h i j k l m n o p q r s t u v"
1140         major=48
1141         card=`expr $i : 'cua.*\(.\)$'`
1142         for unit in $portlist
1143         do
1144                 minor=`ttyminor $unit`
1145                 minor=`expr $card \* 65536 + $minor`
1146                 name=$card$unit
1147                 mknod cuac$name c $major `expr $minor + 128` uucp:dialer
1148                 mknod cuaic$name c $major `expr $minor + 32 + 128` uucp:dialer
1149                 mknod cualc$name c $major `expr $minor + 64 + 128` uucp:dialer
1150         done
1151         umask 77
1152         ;;
1153
1154 ttyc?)
1155         portlist="0 1 2 3 4 5 6 7 8 9 a b c d e f
1156                   g h i j k l m n o p q r s t u v"
1157         major=48
1158         card=`expr $i : 'tty.*\(.\)$'`
1159         for unit in $portlist
1160         do
1161                 minor=`ttyminor $unit`
1162                 minor=`expr $card \* 65536 + $minor`
1163                 name=$card$unit
1164                 mknod ttyc$name c $major $minor
1165                 mknod ttyic$name c $major `expr $minor + 32`
1166                 mknod ttylc$name c $major `expr $minor + 64`
1167         done
1168         ;;
1169
1170 # RISCom8 'rc' driver entries
1171
1172 cuam?)
1173         umask 7
1174         unit=`expr $i : 'cua.*\(.\)$'`
1175         m=`ttyminor $unit`
1176         mknod cuam$unit c 63 `expr $m + 128` uucp:dialer
1177         umask 77
1178         ;;
1179
1180 ttym?)
1181         unit=`expr $i : 'tty.*\(.\)$'`
1182         m=`ttyminor $unit`
1183         mknod ttym$unit c 63 $m
1184         ;;
1185
1186 # Specialix SI/XIO.
1187 # Note: these are 'base 1' to match the numbers on the panels, and to match
1188 #       the manual that comes with the system.
1189 ttyA*)
1190         major=68
1191         nports=`expr $i : 'ttyA\(.*\)$'`
1192         port=1
1193         while [ $port -le $nports ]; do
1194                 minor=$(expr $port - 1)
1195                 name=$(printf %02d $port)
1196                 mknod ttyA$name c $major $minor
1197                 mknod ttyiA$name c $major `expr $minor + 65536`
1198                 mknod ttylA$name c $major `expr $minor + 131072`
1199                 port=$(($port + 1))
1200         done
1201         # For the user-mode control program, 'sicontrol'
1202         mknod si_control c 68 262144
1203         ;;
1204
1205 cuaA*)
1206         umask 7
1207         major=68
1208         nports=`expr $i : 'cuaA\(.*\)$'`
1209         port=1
1210         while [ $port -le $nports ]; do
1211                 minor=$(expr $port - 1)
1212                 name=$(printf %02d $port)
1213                 mknod cuaA$name c $major `expr $minor + 128` uucp:dialer
1214                 mknod cuaiA$name c $major `expr $minor + 128 + 65536` \
1215                     uucp:dialer
1216                 mknod cualA$name c $major `expr $minor + 128 + 131072` \
1217                     uucp:dialer
1218                 port=$(($port + 1))
1219         done
1220         umask 77
1221         ;;
1222
1223 # Digiboard PC/?? 16 port card.
1224 # The current scheme of minor numbering is:
1225 #
1226 #       unused{14} CARD{2} major{8} CALLOUT{1} LOCK{1} INIT{1} PORT{5}
1227 #
1228 #   CARD bitfield in future versions may be extended to 3 bits.
1229 #
1230 # See dgb(4)
1231 #
1232 ttyD?)
1233         portlist="0 1 2 3 4 5 6 7 8 9 a b c d e f"
1234         major=58
1235         card=`expr $i : 'tty.*\(.\)$'`
1236         for unit in $portlist
1237         do
1238                 minor=`ttyminor $unit`
1239                 minor=`expr $card \* 65536 + $minor`
1240                 name=$card$unit
1241                 mknod ttyD$name c $major $minor
1242                 mknod ttyiD$name c $major `expr $minor + 32`
1243                 mknod ttylD$name c $major `expr $minor + 64`
1244         done
1245
1246         # Also create devices for the digi driver
1247         umask 7
1248         major=162
1249         card=`expr $i : 'tty.*\(.\)$'`
1250         rm -f digi$card.ctl
1251         mknod digi$card.ctl c $major $(($card \* 65536 + 8388608)) uucp:dialer
1252         unit=0
1253         while [ $unit -lt 16 ]
1254         do
1255                 base=`expr $card \* 65536 + $unit`
1256                 name=$card.$unit
1257                 rm -f tty*D$name
1258                 mknod ttyD$name c $major $base
1259                 mknod ttyiD$name c $major $(($base + 1048576))
1260                 mknod ttylD$name c $major $(($base + 2097152))
1261                 unit=$(($unit + 1))
1262         done
1263         umask 77
1264         ;;
1265
1266 cuaD?)
1267         umask 7
1268         portlist="0 1 2 3 4 5 6 7 8 9 a b c d e f"
1269         major=58
1270         card=`expr $i : 'cua.*\(.\)$'`
1271         for unit in $portlist
1272         do
1273                 minor=`ttyminor $unit`
1274                 minor=`expr $card \* 65536 + $minor`
1275                 name=$card$unit
1276                 mknod cuaD$name c $major `expr $minor + 128` uucp:dialer
1277                 mknod cuaiD$name c $major `expr $minor + 32 + 128` uucp:dialer
1278                 mknod cualD$name c $major `expr $minor + 64 + 128` uucp:dialer
1279         done
1280
1281         # Also create devices for the digi driver
1282         major=162
1283         card=`expr $i : 'cua.*\(.\)$'`
1284         rm -f digi$card.ctl
1285         mknod digi$card.ctl c $major $(($card \* 65536 + 8388608)) uucp:dialer
1286         unit=0
1287         while [ $unit -lt 16 ]
1288         do
1289                 base=`expr $card \* 65536 + $unit`
1290                 name=$card.$unit
1291                 rm -f cua*D$name
1292                 mknod cuaD$name c $major $(($base + 4194304)) uucp:dialer
1293                 mknod cuaiD$name c $major $(($base + 5242880)) uucp:dialer
1294                 mknod cualD$name c $major $(($base + 6291456)) uucp:dialer
1295                 unit=$(($unit + 1))
1296         done
1297         umask 77
1298         ;;
1299
1300 # Digiboard Xem - superceeded by the digi device above
1301 #
1302 ttyM*)
1303         portlist="0 1 2 3 4 5 6 7 8 9 a b c d e f"
1304         modulelist="a b c d"
1305         major=101
1306         card=`expr $i : 'tty.*\(.\)$'`
1307         for unit in $modulelist
1308         do
1309                 moduleminor=`ttyminor $unit`
1310                 moduleminor=`expr $moduleminor % 10 \* 16`
1311                 modulename=$unit
1312
1313                 for unit in $portlist
1314                 do
1315                         minor=`ttyminor $unit`
1316                         minor=`expr $card \* 65536 + $minor + $moduleminor`
1317                         name=$card$modulename$unit
1318                         rm -f tty*M$name
1319                         mknod ttyM$name c $major $minor
1320                         mknod ttyiM$name c $major `expr $minor + 64`
1321                         mknod ttylM$name c $major `expr $minor + 128`
1322                 done
1323         done
1324         ;;
1325
1326 cuaM?)
1327         umask 7
1328         portlist="0 1 2 3 4 5 6 7 8 9 a b c d e f"
1329         modulelist="a b c d"
1330         major=101
1331         card=`expr $i : 'cua.*\(.\)$'`
1332         for unit in $modulelist
1333         do
1334                 moduleminor=`ttyminor $unit`
1335                 moduleminor=`expr $moduleminor % 10 \* 16`
1336                 modulename=$unit
1337
1338                 for unit in $portlist
1339                 do
1340                         minor=`ttyminor $unit`
1341                         minor=`expr $card \* 65536 + $minor + $moduleminor`
1342                         name=$card$modulename$unit
1343                         rm -f cua*M$name
1344                         mknod cuaM$name c $major `expr $minor + 262144` \
1345                             uucp:dialer
1346                         mknod cuaiM$name c $major `expr $minor + 64 + 262144` \
1347                             uucp:dialer
1348                         mknod cualM$name c $major `expr $minor + 128 + 262144` \
1349                             uucp:dialer
1350                 done
1351         done
1352         umask 77
1353         ;;
1354
1355 ttyR?)
1356         major=81
1357         BOARD=1; Rnum=0
1358         MINOR=$(($BOARD * 65536))
1359         controllers=$(
1360                 dmesg | while read first rest; do
1361                         case "$first" in
1362                         RocketPort[0-4])
1363                                 echo "$first"
1364                                 ;;
1365                         esac
1366                 done
1367         )
1368         rm -f /dev/ttyR* /dev/ttyiR* /dev/ttylR*
1369         for i in $controllers; do
1370            ndevices=$(
1371                 dmesg | while read first bar ports rest; do
1372                         case "$first" in
1373                         $i*)
1374                                 echo "$ports"
1375                                 ;;
1376                         esac
1377                 done
1378            )
1379            echo -n "Creating $ndevices devices for $i: "
1380            dev=0
1381            while [ $dev -lt $ndevices ]; do
1382                    mknod /dev/ttyR$Rnum c $major $MINOR
1383                    mknod /dev/ttyiR$Rnum c $major $(($MINOR + 32))
1384                    mknod /dev/ttylR$Rnum c $major $(($MINOR + 64))
1385                    Rnum=$(($Rnum + 1))
1386                    MINOR=$(($MINOR + 1))
1387                    dev=$(($dev + 1))
1388            done
1389                 BOARD=$(($BOARD + 1))
1390                 MINOR=$(($BOARD * 65536))
1391            echo " "
1392         done
1393         ;;
1394
1395 cuaR?)
1396         major=81
1397         BOARD=1; Rnum=0
1398         MINOR=$(($BOARD * 65536))
1399         controllers=$(
1400                 dmesg | while read first rest; do
1401                         case "$first" in
1402                         RocketPort[0-4])
1403                                 echo "$first"
1404                                 ;;
1405                         esac
1406                 done
1407         )
1408         rm -f /dev/cuaR* /dev/cuaiR* /dev/cualR*
1409         for i in $controllers; do
1410            ndevices=$(
1411                 dmesg | while read first bar ports rest; do
1412                         case "$first" in
1413                         $i*)
1414                                 echo "$ports"
1415                                 ;;
1416                         esac
1417                 done
1418            )
1419            echo -n "Creating $ndevices devices for $i: "
1420            dev=0
1421            while [ $dev -lt $ndevices ]; do
1422                    mknod /dev/cuaR$Rnum c  $major $(($MINOR + 128)) uucp:dialer
1423                    mknod /dev/cuaiR$Rnum c $major $(($MINOR + 128 + 32)) \
1424                        uucp:dialer
1425                    mknod /dev/cualR$Rnum c $major $(($MINOR + 128 + 64)) \
1426                        uucp:dialer
1427                    Rnum=$(($Rnum + 1))
1428                    MINOR=$(($MINOR + 1))
1429                    dev=$(($dev + 1))
1430            done
1431                 BOARD=$(($BOARD + 1))
1432                 MINOR=$(($BOARD * 65536))
1433            echo " "
1434         done
1435         ;;
1436
1437 mse*)
1438         unit=`expr $i : 'mse\(.*\)'`
1439         chr=27
1440         # non-blocking for X11
1441         mknod mse$unit c $chr `unit2minor \`expr $unit '*' 2 + 1\``
1442         ;;
1443
1444 psm*)
1445         unit=`expr $i : 'psm\(.*\)'`
1446         chr=21
1447         # non-blocking for X11
1448         mknod psm$unit c $chr `unit2minor \`expr $unit '*' 2 + 1\``
1449         ;;
1450
1451 mouse*)
1452         name=`expr $i : 'mouse\(.*\)'`
1453         if [ ! -c $name ]; then
1454                 $0 $name                        # make the appropriate device
1455         fi
1456         ln -fs $name mouse
1457         ;;
1458
1459 pcaudio)
1460         mknod pcaudio c 24 0
1461         mknod pcaudioctl c 24 128
1462         ;;
1463
1464 socksys)
1465         mknod socksys c 41 0
1466         mknod spx c 41 1
1467         ln -fs socksys nfsd
1468         chmod 666 socksys nfsd spx
1469         ;;
1470
1471 snd*)
1472 #
1473 # changes from Linux voxware
1474 # minor         Linux                   FreeBSD
1475 # 8             sequencer2 (aka music0) music0
1476 # 17            patmgr0                 sequencer1
1477 # 33            patmgr1                 sequencer2
1478 #
1479
1480         unit=`expr $i : 'snd\(.*\)'`
1481         chr=30
1482
1483         # XXX write this less verbosely, like std
1484         snd_security_hole=0     # XXX
1485         umask $snd_security_hole
1486
1487         ln -fs mixer$unit mixer
1488         ln -fs sequencer$unit sequencer
1489         ln -fs dsp$unit dsp
1490         ln -fs audio$unit audio
1491         ln -fs dspW$unit dspW
1492         ln -fs music$unit music
1493         ln -fs pss$unit pss
1494
1495         mknod mixer$unit        c $chr `unit2minor \`expr $unit '*' 16 + 0\``
1496         mknod sequencer$unit    c $chr `unit2minor \`expr $unit '*' 16 + 1\``
1497         mknod midi$unit         c $chr `unit2minor \`expr $unit '*' 16 + 2\``
1498         mknod dsp$unit          c $chr `unit2minor \`expr $unit '*' 16 + 3\``
1499         mknod audio$unit        c $chr `unit2minor \`expr $unit '*' 16 + 4\``
1500         mknod dspW$unit         c $chr `unit2minor \`expr $unit '*' 16 + 5\``
1501         mknod sndstat           c $chr 6
1502                                 # minor number 7 is unused
1503         mknod music$unit        c $chr `unit2minor \`expr $unit '*' 16 + 8\``
1504         mknod pss$unit          c $chr `unit2minor \`expr $unit '*' 16 + 9\``
1505                                 # minor number 10 is unused
1506         mknod midistat          c $chr 11
1507                                 # minor numbers 12-15 are unused
1508         umask 77
1509         ;;
1510
1511 vat)
1512         mknod vatio c 25 128
1513         chmod 660 vatio
1514         ;;
1515
1516 gsc*)
1517         unit=`expr $i : 'gsc\(.*\)'`
1518         mknod gsc${unit} c 47 `unit2minor $unit`
1519         mknod gsc${unit}p c 47 `unit2minor $(($unit + 8))`
1520         mknod gsc${unit}d c 47 `unit2minor $(($unit + 32))`
1521         mknod gsc${unit}pd c 47 `unit2minor $(($unit + 40))`
1522         chmod 666 gsc${unit}*
1523         ;;
1524
1525 acpi)
1526         mknod acpi c 152 0 root:operator
1527         chmod 660 acpi
1528         ;;
1529
1530 apm)
1531         mknod apm c 39 0 root:operator
1532         chmod 664 apm
1533         ;;
1534
1535 apmctl)
1536         mknod apmctl c 39 8 root:operator
1537         chmod 660 apmctl
1538         ;;
1539
1540 card*)
1541         unit=`expr $i : 'card\(.*\)'`
1542         chr=50
1543         mknod card$unit c $chr `unit2minor $unit`
1544         chmod 644 card$unit
1545         ;;
1546
1547 ttyx?|ttyy?|ttyz?)
1548         case $i in
1549         *0) unit=0;;    *1) unit=1;;    *2) unit=2;;    *3) unit=3;;
1550         *4) unit=4;;    *5) unit=5;;    *6) unit=6;;    *7) unit=7;;
1551         *8) unit=8;;    *9) unit=9;;    *a) unit=10;;   *b) unit=11;;
1552         *c) unit=12;;   *d) unit=13;;   *e) unit=14;;   *f) unit=15;;
1553         esac
1554         case $i in
1555         ttyy?)  unit=`expr $unit \+ 16`;;
1556         ttyz?)  unit=`expr $unit \+ 32`;;
1557         esac
1558         mknod $i c 42 $unit
1559         ;;
1560
1561 cronyx)
1562         mknod cronyx c 42 63
1563         ;;
1564
1565 joy)
1566         mknod joy0 c 51 0 root:operator
1567         mknod joy1 c 51 1 root:operator
1568         chmod 640  joy0 joy1
1569         ;;
1570
1571 spigot)
1572         mknod spigot c 11 0
1573         chmod 444 spigot
1574         ;;
1575
1576 ctx?)
1577         unit=`expr $i : 'ctx\(.*\)'`
1578         mknod ctx$unit c 40 `unit2minor $unit`
1579         chmod 444 ctx$unit
1580         ;;
1581
1582 meteor?)
1583         unit=`expr $i : 'meteor\(.*\)'`
1584         mknod meteor$unit c 67 `unit2minor $unit`
1585         chmod 444 meteor$unit
1586         ;;
1587
1588 bktr?)
1589         unit=`expr $i : 'bktr\(.*\)'`
1590         mknod bktr$unit c 92 `unit2minor $unit`
1591         mknod tuner$unit c 92 `unit2minor $((16 + $unit ))`
1592         mknod vbi$unit c 92 `unit2minor $((32 + $unit ))`
1593         chmod 444 bktr$unit tuner$unit vbi$unit
1594         ;;
1595
1596 tun*)
1597         ntun=`expr $i : 'tun\(.*\)$'`
1598         unit=0
1599         while [ $unit -le $ntun ]; do
1600                 mknod tun$unit c 52 `unit2minor $unit`
1601                 unit=$(($unit + 1))
1602         done
1603         ;;
1604
1605 tap*)
1606         ntap=`expr $i : 'tap\(.*\)$'`
1607         unit=0
1608         while [ $unit -le $ntap ]; do
1609                 mknod tap$unit c 149 `unit2minor $unit` root:network
1610                 unit=$(($unit + 1))
1611         done
1612         ;;
1613
1614 sysmouse)
1615         mknod sysmouse c 12 128
1616         mknod consolectl c 12 255
1617         ;;
1618
1619 jogdial)
1620         mknod jogdial c 160 0
1621         ;;
1622
1623 snp?)
1624         unit=`expr $i : 'snp\(.*\)'`
1625         mknod snp$unit c 53 `unit2minor $unit`
1626         ;;
1627
1628 # dufault@hda.com: If I do much more work on other A-D boards
1629 # then eventually we'll have a "ad" and "dio" interface and some of these
1630 # "labpcaio" ones will be gone.
1631 # labpcaio: D-A and A-D.
1632 # labpcdio: Digital in and Digital out.
1633 #
1634 labpc*)
1635         umask 7
1636         case $i in
1637         labpcaio*)
1638                 name=labpcaio
1639                 unit=`expr $i : 'labpcaio\(.*\)'`
1640                 all="0 1 2 3 4 5 6 7"
1641                 offset=0
1642                 ;;
1643         labpcdio*)
1644                 name=labpcdio
1645                 unit=`expr $i : 'labpcdio\(.*\)'`
1646                 all="0 1 2 3"
1647                 offset=8
1648                 ;;
1649         *)
1650                 die 3 "Don't know LabPC type $i"
1651                 ;;
1652         esac
1653         if [ -z "${unit}" ]; then
1654                 unit=all
1655         fi
1656         case $unit in
1657                 0|1|2|3|4|5|6|7)
1658                                 mknod $name$unit c 66 `expr $offset + $unit `
1659                 ;;
1660                 all)
1661                         for i in $all
1662                         do
1663                                 mknod $name$i c 66 `expr $offset + $i `
1664                         done
1665                         ;;
1666                 *)
1667                         echo "No such LabPC unit: $unit"
1668                         ;;
1669         esac
1670         umask 77
1671         ;;
1672
1673 perfmon)
1674         mknod perfmon c 2 32 root:kmem
1675         chmod 640 perfmon
1676         ;;
1677
1678 ipl)
1679         mknod ipl c 79 0
1680         mknod ipnat c 79 1
1681         mknod ipstate c 79 2
1682         mknod ipauth c 79 3
1683         ;;
1684
1685 kbd*)
1686         unit=`expr $i : 'kbd\(.*\)'`
1687         chr=112
1688         mknod kbd$unit c $chr `unit2minor $unit`
1689         ;;
1690
1691 i4b)
1692         mknod i4b c 60 0
1693         ;;
1694
1695 i4bctl)
1696         mknod i4bctl c 55 0
1697         ;;
1698
1699 i4brbch*)
1700         unit=`expr $i : 'i4brbch\(.*\)'`
1701         mknod i4brbch$unit c 57 `unit2minor $unit`
1702         ;;
1703
1704 i4bteld*)
1705         offset=64
1706         unit=`expr $i : 'i4bteld\(.*\)'`
1707         mknod i4bteld$unit c 56 `unit2minor \`expr $offset + $unit\``
1708         ;;
1709
1710 i4btel*)
1711         unit=`expr $i : 'i4btel\(.*\)'`
1712         mknod i4btel$unit c 56 `unit2minor $unit`
1713         ;;
1714
1715 i4btrc*)
1716         unit=`expr $i : 'i4btrc\(.*\)'`
1717         mknod i4btrc$unit c 59 `unit2minor $unit`
1718         ;;
1719
1720 aac*)
1721         unit=`expr $i : 'aac\(.*\)'`
1722         mknod aac$unit c 150 `unit2minor $unit`
1723         ln -fs aac$unit afa$unit
1724         ;;
1725
1726 mlx*)
1727         unit=`expr $i : 'mlx\(.*\)'`
1728         mknod mlx$unit c 130 `unit2minor $unit`
1729         ;;
1730
1731 mly*)
1732         unit=`expr $i : 'mlx\(.*\)'`
1733         mknod mlx$unit c 158 `unit2minor $unit`
1734         ;;
1735
1736 amr*)
1737         unit=`expr $i : 'amr\(.*\)'`
1738         mknod amr$unit c 132 `unit2minor $unit`
1739         ;;
1740
1741 3dfx*)
1742         unit=`expr $i : '3dfx\(.*\)'`
1743         mknod 3dfx$unit c 107 `unit2minor $unit`
1744         ln -sf 3dfx$unit 3dfx
1745    ln -sf 3dfx$unit voodoo
1746         ;;
1747
1748 agpgart)
1749         mknod agpgart c 148 0
1750         ;;
1751
1752 twe*)
1753         unit=`expr $i : 'twe\(.*\)'`
1754         mknod twe$unit c 146 `unit2minor $unit`
1755         ;;
1756
1757 tw*)
1758         unit=`expr $i : 'tw\(.*\)'`
1759         mknod tw$unit c 19 `unit2minor $unit` root:operator
1760         ;;
1761
1762 local)
1763         umask 0                 # XXX should be elsewhere
1764         sh $0.local
1765         umask 77
1766         ;;
1767
1768 *)
1769         echo $i - no such device name
1770         ;;
1771
1772 esac
1773 done