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