Imported Upstream version 2.3.1
[debian/makedev] / MAKEDEV
1 #! /bin/sh -
2
3 RCSID='$Id: MAKEDEV 2.3 1997/09/29 19:03:13 johnsonm Exp $'
4
5 #---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#
6 # Customisation:
7 #   The devices fall into various classes.  This section contains the mapping
8 # from a class name into a group name and permission.
9 #   You will almost certainly need to edit the group name to match your
10 # system, and you may change the permissions to suit your preference.  These
11 # lines _must_ be of the format "user group perm".
12
13  public="  root sys    666"
14  system="  root sys    660"
15    kmem="  root kmem   660"
16     tty="  root tty    666"
17    cons="  root tty    622"     # 622 for console?
18     vcs="  root sys    600"
19 dialout="  root uucp   660"
20   mouse="  root sys    666"
21 printer="  root daemon 660"
22  floppy="  root floppy 660"
23    disk="  root disk   660"
24    scsi="  root sys    600"
25   cdrom="  root disk   660"
26    tape="  root disk   660"
27   audio="  root sys    666"
28   ibcs2="  root sys    666"
29 scanner="  root sys    666"
30
31 MAXVT=8
32
33 #---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#
34
35 procfs=/proc
36
37 opt_v=
38 opt_d=
39 opt_n=
40
41 while [ $# -ge 1 ]
42 do
43         case $1 in
44                 --)     shift; break ;;
45                 -v)     shift; opt_v=1 ;;
46                 -d)     shift; opt_d=1 ;;
47                 -n)     shift; opt_n=1; opt_v=1 ;;
48                 -V)     shift; opt_V=1 ;;
49                 -*)     echo "$0: unknown flag \"$1\"" >&2; exit 1 ;;
50                 *)      break ;;
51         esac
52 done
53
54 if [ "$opt_V" ]
55 then
56         echo "$RCSID"
57         exit 0
58 fi
59
60 opts="${opt_n:+-n} ${opt_v:+-v} ${opt_d:+-d}"
61
62 #---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#
63
64 makedev () {    # usage: makedev name [bcu] major minor owner group mode
65         if [ "$opt_v" ]
66         then    if [ "$opt_d" ]
67                 then    echo "delete $1"
68                 else    echo "create $1 $2 $3 $4 $5:$6 $7" 
69                 fi
70         fi
71         if [ ! "$opt_n" ]
72         then    if [ "$opt_d" ]
73                 then
74                         rm -f $1
75                 else
76                         rm -f $1-
77                         mknod $1- $2 $3 $4 &&
78                         chown $5:$6 $1- &&
79                         chmod $7 $1- &&
80                         mv $1- $1
81                 fi
82         fi
83 }
84 symlink () {    # usage: symlink name target
85         if [ "$opt_v" ]
86         then    if [ "$opt_d" ]
87                 then    echo "delete $1"
88                 else    echo "create $1 -> $2"
89                 fi
90         fi
91         [ ! "$opt_n" ] && rm -f $1 &&
92         [ ! "$opt_d" ] && ln -s $2 $1
93 }
94
95 #---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#
96
97 # For bash and ksh, we can use faster builtin routines to do manipulation,
98 # otherwise (ash) fall back to slower method using `expr'.
99 # The extra level of indirection using `eval' is necessary a) for ksh, and
100 # b) to get past ash.
101
102 if [ "$RANDOM" != "$RANDOM" ]
103 then
104         math () {
105                 eval echo "\$(($*))"
106         }
107         index () {      # index string c
108                 eval "I=\${1%$2*}"
109                 eval echo "\${#I}"
110         }
111         suffix () {
112             eval echo "\${1#$2}"
113         }
114         strip () {
115                 eval echo "\${1% $2 *} \${1#* $2 }"
116         }
117 else
118         math () {
119                 expr "$@"
120         }
121         index () {      # index string c
122                 expr $1 : ".*$2" - 1
123         }
124         suffix () {
125                 expr "$1" : "$2\(.*\)"
126         }
127         strip () {
128                 echo "[$1][$2]" >&2
129                 echo "`expr \"$1\" : \"\(.*\) $2 \"` `expr \"$1\" : \".* $2 \(.*\)\"`"
130         }
131 fi
132
133 #---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#
134
135 devices=
136 if [ ! -f $procfs/devices ]
137 then
138         echo "$0: warning: can't read $procfs/devices" >&2
139 else
140         exec 3<$procfs/devices
141         while read major device <&3
142         do
143                 case "$major" in
144                         Character|Block|'')
145                                 ;;
146                         *)
147                                 eval "major_$device=$major"
148                                 devices="$devices $device"
149                                 ;;
150                 esac
151         done
152         exec 3<&-
153 fi
154
155 Major () {
156         device=$2
157         if [ "$opt_d" ]
158         then
159                 echo -1 # don't care
160         else
161                 eval echo \${major_$1:-\${device:?\"unknown major number for $1\"}}
162         fi
163 }
164
165 cvt () {
166         while [ $# -ne 0 ]
167         do
168                 case "$1" in
169                         mem|tty|ttyp|cua|cub)   ;;
170                         hd)     (for d in a b c d e f g h ; do
171                                         echo -n hd$d " "
172                                  done) ; echo
173                                 ;;
174                         ide0)   echo hda hdb ;;
175                         ide1)   echo hdc hdd ;;
176                         ide2)   echo hde hdf ;;
177                         ide3)   echo hdg hdh ;;
178                         sd)     echo sda sdb ;;
179                         sr)     echo scd0 ;;
180                         st)     echo st0 ;;
181                         xd)     echo xda xdb ;;
182                         fd)     echo fd0 fd1 ;;
183                         lp)     echo lp ;;
184                         mt)     echo ftape ;;
185                         loop)   echo loop ;;
186                         md)     echo md ;;
187                         ibcs2)  echo ibcs2 ;;
188                         tpqic02)        echo qic ;;
189                         sound)          echo audio ;;
190                         logiscan)       echo logiscan ;;
191                         ac4096)         echo ac4096 ;;
192                         hw)     echo helloworld ;;
193                         sbpcd | sbpcd[123])     echo $1 ;;
194                         Joystick)       echo js ;;
195                         apm_bios)       echo apm ;;
196                         dcf)            echo dcf ;;
197                         aztcd)          echo aztcd ;;
198                         pcmcia) ;; # taken care of by its own driver
199                         ttyC)   echo cyclades ;;
200                         vcs)    ;;
201                         *)      echo "$0: don't know what \"$1\" is" >&2 ;;
202                 esac
203                 shift
204         done
205 }
206
207 for arg
208 do
209         case $arg in
210         generic)
211                 $0 $opts std
212                 $0 $opts fd
213                 $0 $opts fd0 fd1
214                 $0 $opts hda hdb
215                 $0 $opts xda xdb
216                 $0 $opts sda sdb
217                 $0 $opts pty
218                 $0 $opts console
219                 $0 $opts ttyS0 ttyS1 ttyS2 ttyS3
220                 $0 $opts busmice
221                 $0 $opts lp
222                 $0 $opts par
223                 ;;
224         local)
225                 $0.local $opts
226                 ;;
227         std)
228                 makedev mem  c 1 1 $kmem
229                 makedev kmem c 1 2 $kmem
230                 makedev null c 1 3 $public
231                 makedev port c 1 4 $kmem
232                 makedev zero c 1 5 $public
233                 symlink core $procfs/kcore
234                 makedev full c 1 7 $public
235                 $0 ram
236                 makedev tty  c 5 0 $tty
237                 ;;
238         ram)
239                 for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ; do
240                         makedev ram$i  b 1 $i $disk
241                 done
242                 ln -sf ram1 ram
243                 ;;
244         console)
245                 major=`Major vcs`       # not fatal
246                 # console
247                 makedev tty0 c 4 0 $cons
248                 symlink console tty0
249                 [ "$major" ] && makedev vcs0 c $major 0 $vcs
250                 [ "$major" ] && makedev vcsa c $major 128 $vcs
251                 # individual vts
252                 line=1
253                 while [ $line -le $MAXVT -a $line -le 63 ]
254                 do
255                         makedev tty$line c 4 $line $tty
256                         [ "$major" ] && makedev vcs$line c $major $line $vcs
257                         [ "$major" ] && makedev vcsa$line c $major `math $line + 128` $vcs
258                         line=`math $line + 1`
259                 done
260                 ;;
261         tty[1-9]|tty[1-5][0-9]|tty[6][0-3])
262                 line=`suffix $arg tty`
263                 makedev tty$line c 4 $line $tty
264                 ;;
265         ttyS[0-9]|ttyS[1-5][0-9]|ttyS[6][0-3])
266                 line=`suffix $arg ttyS`
267                 minor=`math 64 + $line`
268                 makedev ttyS$line c 4 $minor $tty
269                 makedev cua$line c 5 $minor $dialout
270                 ;;
271         pty[a-ep-z])
272                 bank=`suffix $arg pty`
273                 base=`index pqrstuvwxyzabcde $bank`
274                 base=`math $base \* 16`
275                 for i in 0 1 2 3 4 5 6 7 8 9 a b c d e f
276                 do
277                         j=`index 0123456789abcdef $i`
278                         makedev pty$bank$i c 2 `math $base + $j` $tty
279                         makedev tty$bank$i c 3 `math $base + $j` $tty
280                 done
281                 ;;
282         pty)
283                 ptysufs=""
284                 for i in p q r s t u v w x y z a b c d e
285                 do
286                         ptysufs="$ptysufs pty$i"
287                 done
288                 $0 $opts $ptysufs
289                 ;;
290         cyclades)
291                 major1=`Major ttyC` || continue
292                 major2=`Major cub` || continue
293                 for i in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 \
294                          16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
295                 do
296                         makedev ttyC$i c $major1 $i $tty
297                         makedev cub$i c $major2 $i $dialout
298                 done
299                 ;;
300         lp)
301                 major=`Major lp` || continue
302                 makedev ${arg}0 c $major 0 $printer
303                 makedev ${arg}1 c $major 1 $printer
304                 makedev ${arg}2 c $major 2 $printer
305                 ;;
306         par)
307                 major=`Major lp` || continue
308                 makedev ${arg}0 c $major 0 $printer
309                 makedev ${arg}1 c $major 1 $printer
310                 makedev ${arg}2 c $major 2 $printer
311                 ;;
312         busmice)
313                 major=`Major mouse 10` || continue
314                 makedev logimouse c $major 0 $mouse
315                 makedev psmouse   c $major 1 $mouse
316                 makedev msmouse   c $major 2 $mouse
317                 makedev atimouse  c $major 3 $mouse
318                 makedev jmouse    c $major 4 $mouse
319                 ;;
320         js)
321                 major=`Major Joystick` || continue
322                 makedev js0 c $major 0 $mouse
323                 makedev js1 c $major 1 $mouse
324                 ;;
325         fd[0-7])
326                 major=`Major fd 2` || continue
327                 base=`suffix $arg fd`
328                 if [ $base -ge 4 ]
329                 then
330                         base=`math $base + 124`
331                 fi
332                 makedev ${arg} b $major $base $floppy
333                 makedev ${arg}d360  b $major `math $base +  4` $floppy
334                 makedev ${arg}h1200 b $major `math $base +  8` $floppy
335                 makedev ${arg}D360  b $major `math $base + 12` $floppy
336                 makedev ${arg}D720  b $major `math $base + 16` $floppy
337                 makedev ${arg}h360  b $major `math $base + 20` $floppy
338                 makedev ${arg}h720  b $major `math $base + 24` $floppy
339                 makedev ${arg}H1440 b $major `math $base + 28` $floppy
340                 makedev ${arg}E2880 b $major `math $base + 32` $floppy
341                 makedev ${arg}CompaQ b $major `math $base + 36` $floppy
342
343                 symlink ${arg}H360 ${arg}D360
344                 symlink ${arg}H720 ${arg}D720
345
346                 makedev ${arg}h1440 b $major `math $base + 40` $floppy
347                 makedev ${arg}H1680 b $major `math $base + 44` $floppy
348                 makedev ${arg}h410  b $major `math $base + 48` $floppy
349                 makedev ${arg}H820  b $major `math $base + 52` $floppy
350                 makedev ${arg}h1476 b $major `math $base + 56` $floppy
351                 makedev ${arg}H1722 b $major `math $base + 60` $floppy
352                 makedev ${arg}h420  b $major `math $base + 64` $floppy
353                 makedev ${arg}H830  b $major `math $base + 68` $floppy
354                 makedev ${arg}h1494 b $major `math $base + 72` $floppy
355                 makedev ${arg}H1743 b $major `math $base + 76` $floppy
356                 makedev ${arg}h880  b $major `math $base + 80` $floppy
357                 makedev ${arg}D1040 b $major `math $base + 84` $floppy
358                 makedev ${arg}D1120 b $major `math $base + 88` $floppy
359                 makedev ${arg}h1600 b $major `math $base + 92` $floppy
360                 makedev ${arg}H1760 b $major `math $base + 96` $floppy
361                 makedev ${arg}H1920 b $major `math $base + 100` $floppy
362                 makedev ${arg}E3200 b $major `math $base + 104` $floppy
363                 makedev ${arg}E3520 b $major `math $base + 108` $floppy
364                 makedev ${arg}E3840 b $major `math $base + 112` $floppy
365                 makedev ${arg}H1840 b $major `math $base + 116` $floppy
366                 makedev ${arg}D800  b $major `math $base + 120` $floppy
367                 makedev ${arg}H1600 b $major `math $base + 124` $floppy
368                 ;;
369         hd[a-b])
370                 major=`Major ide0` || major=`Major hd 3` || continue
371                 unit=`suffix $arg hd`
372                 base=`index ab $unit`
373                 base=`math $base \* 64`
374                 makedev hd$unit b $major $base $disk
375                 for part in 1 2 3 4 5 6 7 8 # 9 10 11 12 13 14 15 16 17 18 19 20
376                 do
377                         makedev hd$unit$part b $major `math $base + $part` $disk
378                 done
379                 ;;
380         hd[c-d])
381                 major=`Major ide1 22` || continue
382                 unit=`suffix $arg hd`
383                 base=`index cd $unit`
384                 base=`math $base \* 64`
385                 makedev hd$unit b $major $base $disk
386                 for part in 1 2 3 4 5 6 7 8 # 9 10 11 12 13 14 15 16 17 18 19 20
387                 do
388                         makedev hd$unit$part b $major `expr $base + $part` $disk
389                 done
390                 ;;
391         hd[e-f])
392                 major=`Major ide2 33` || continue
393                 unit=`suffix $arg hd`
394                 base=`index ef $unit`
395                 base=`math $base \* 64`
396                 makedev hd$unit b $major $base $disk
397                 for part in 1 2 3 4 5 6 7 8 # 9 10 11 12 13 14 15 16 17 18 19 20
398                 do
399                         makedev hd$unit$part b $major `expr $base + $part` $disk
400                 done
401                 ;;
402         hd[g-h])
403                 major=`Major ide3 34` || continue
404                 unit=`suffix $arg hd`
405                 base=`index gh $unit`
406                 base=`math $base \* 64`
407                 makedev hd$unit b $major $base $disk
408                 for part in 1 2 3 4 5 6 7 8 # 9 10 11 12 13 14 15 16 17 18 19 20
409                 do
410                         makedev hd$unit$part b $major `expr $base + $part` $disk
411                 done
412                 ;;
413         ht)
414                 major=`Major ht0 37` || continue
415                 # Only one IDE tape drive is currently supported; ht0.
416                 makedev ht0 c $major 0 $tape
417                 makedev ht0 c $major 0 $tape
418                 makedev nht0 c $major 128 $tape
419                 ;;
420         xd[a-d])
421                 major=`Major xd 13` || continue
422                 unit=`suffix $arg xd`
423                 base=`index abcd $unit`
424                 base=`math $base \* 64`
425                 makedev xd$unit b $major $base $disk
426                 for part in 1 2 3 4 5 6 7 8 # 9 10 11 12 13 14 15 16 17 18 19 20
427                 do
428                         makedev xd$unit$part b $major `expr $base + $part` $disk
429                 done
430                 ;;
431         sd[a-h])
432                 major=`Major sd 8` || continue
433                 unit=`suffix $arg sd`
434                 base=`index abcdefgh $unit`
435                 base=`math $base \* 16`
436                 makedev sd$unit b $major $base $disk
437                 for part in 1 2 3 4 5 6 7 8 # 9 10 11 12 13 14 15
438                 do
439                         minor=`expr $base + $part`
440                         makedev sd$unit$part b $major $minor $disk
441                 done
442                 ;;
443         loop)
444                 major=`Major loop` || continue
445                 for part in 0 1 2 3 4 5 6 7
446                 do
447                         makedev loop$part b $major $part $disk
448                 done
449                 ;;
450         md)
451                 major=`Major md` || continue
452                 for part in 0 1 2 3
453                 do
454                         makedev md$part b $major $part $disk
455                 done
456                 ;;
457         st[0-7])
458                 major=`Major st 9`
459                 unit=`suffix $arg st`
460                 makedev st$unit c $major $unit $tape
461                 makedev nst$unit c $major `math 128 + $unit` $tape
462                 ;;
463         qic)
464                 major=`Major tpqic02 12`
465                 makedev rmt8       c $major   6 $tape
466                 makedev rmt16      c $major   8 $tape
467                 makedev tape-d     c $major 136 $tape
468                 makedev tape-reset c $major 255 $tape
469                 ;;
470         ftape)
471                 major=`Major mt 27` || continue
472                 for unit in 0 1 2 3
473                 do
474                         makedev rft$unit c $major $unit $tape
475                         makedev nrft$unit c $major `math $unit + 4` $tape
476                 done
477                 symlink ftape rft0
478                 symlink nftape nrft0
479                 ;;
480         scd[0-7])
481                 major=`Major sr 11` || continue
482                 unit=`suffix $arg scd`
483                 makedev scd$unit b $major $unit $cdrom
484                 ;;
485         sonycd)
486                 major=`Major cdu31a` || continue
487                 makedev $arg b $major 0 $cdrom
488                 ;;
489         mcd)
490                 major=`Major mcd 23` || continue
491                 makedev $arg b $major 0 $cdrom
492                 ;;
493         mcdx)
494                 major=`Major mcdx 20` || continue
495                 makedev $arg b $major 0 $cdrom
496                 ;;
497         cdu535)
498                 makedev $arg b 24 0 $cdrom
499                 ;;
500         lmscd)
501                 makedev $arg b 24 0 $cdrom
502                 ;;
503         sbpcd|sbpcd[123])
504                 major=`Major $arg` || continue
505                 base=`suffix ${arg}0 sbpcd`
506                 # base=`expr ${arg}0 : "sbpcd\(.\)"`
507                 for minor in 0 1 2 3
508                 do
509                         # XXX
510                         unit=`expr substr 0123456789abcdef \( $base \* 4 + $minor + 1 \) 1`
511                         makedev sbpcd$unit b $major $minor $cdrom
512                 done
513                 [ $arg = sbpcd ] && symlink $arg ${arg}0
514                 ;;
515         aztcd)
516                 major=`Major $arg` || continue
517                 makedev ${arg}0 b $major 0 $cdrom
518                 ;;
519         bpcd)
520                 makedev $arg b 41 0 $cdrom
521                 ;;
522         logiscan)
523                 major=`Major logiscan` || continue
524                 makedev $arg c $major 0 $scanner
525                 ;;
526         m105scan)
527                 major=`Major m105` || continue
528                 makedev $arg c $major 0 $scanner
529                 ;;
530         ac4096)
531                 major=`Major ac4096` || continue
532                 makedev $arg c $major 0 $scanner
533                 ;;
534         audio)
535                 major=`Major sound 14`
536                 makedev mixer      c $major  0 $audio
537                 makedev sequencer  c $major  1 $audio
538                 makedev midi00     c $major  2 $audio
539                 makedev dsp        c $major  3 $audio
540                 makedev audio      c $major  4 $audio
541                 makedev sndstat    c $major  6 $audio
542 #               makedev sequencer2 c $major  8 $audio
543                 makedev mixer1     c $major 16 $audio
544 #               makedev patmgr0    c $major 17 $audio
545                 makedev midi01     c $major 18 $audio
546                 makedev dsp1       c $major 19 $audio
547                 makedev audio1     c $major 20 $audio
548 #               makedev patmgr1    c $major 33 $audio
549                 makedev midi02     c $major 34 $audio
550                 makedev midi03     c $major 50 $audio
551                 ;;
552         pcaudio)
553                 major=`Major pcsp` || continue
554                 makedev pcmixer c $major 0 $audio
555                 makedev pcsp    c $major 3 $audio
556                 makedev pcaudio c $major 4 $audio
557                 ;;
558         sg)
559                 major=`Major sg 21`
560                 for unit in a b c d e f g h
561                 do
562                         minor=`index abcdefgh $unit`
563                         # minor=`expr abcdefgh : ".*$unit" - 1`
564                         makedev $arg$unit c $major $minor $scsi
565                 done
566                 ;;
567         fd)
568                 # not really devices, we use the /proc filesystem
569                 symlink fd     $procfs/self/fd
570                 symlink stdin  fd/0
571                 symlink stdout fd/1
572                 symlink stderr fd/2
573                 ;;
574         ibcs2)
575                 major=`Major ibcs2` || continue
576                 makedev socksys c $major 0 $ibcs2
577                 symlink nfsd socksys
578                 makedev spx     c $major 1 $ibcs2
579                 symlink X0R null
580                 ;;
581         apm)
582                 major=`Major apm_bios` || continue
583                 makedev $arg c $major 0 $system
584                 ;;
585         dcf)
586                 major=`Major dcf` || continue
587                 makedev $arg c $major 0 $system
588                 ;;
589         helloworld)
590                 major=`Major hw` || continue
591                 makedev helloworld c $major 0 $public
592                 ;;
593         update)
594                 if [ ! "$devices" ]
595                 then
596                         echo "$0: don't appear to have any devices" >&2
597                         continue
598                 fi
599                 if [ "$opt_d" ]
600                 then
601                         echo "$0: can't delete an update" >&2
602                         continue
603                 fi
604                 create=
605                 delete=
606                 devs="$devices"
607                 if [ -f DEVICES ]
608                 then
609                         exec 3<DEVICES
610                         while read device major <&3
611                         do
612                                 eval now=\$major_$device
613                                 if [ "$now" = "" ]
614                                 then
615                                         delete="$delete `cvt $device`"
616                                         continue
617                                 elif [ "$now" != $major ]
618                                 then
619                                         create="$create "`cvt $device`
620                                 fi
621                                 devs=`strip " $devs " $device`
622                                 # devs=`expr "$devs" : "\(.*\) $device"``expr "$devs" : ".* $device\(.*\)"`
623                         done
624                         exec 3<&-
625                 fi
626                 create="$create "`cvt $devs`
627                 [ "$delete" != "" ] && $0 $opts -d $delete
628                 [ "$create" != " " ] && $0 $opts $create
629                 [ "$opt_n" ] && continue
630                 for device in $devices
631                 do
632                         if [ "`cvt $device`" ]
633                         then
634                             eval echo $device \$major_$device
635                         fi
636                 done > DEVICES
637                 ;;
638         *)
639                 echo "$0: don't know how to make device \"$arg\"" >&2
640                 ;;
641         esac
642 done
643
644 exit 0