1#!/bin/sh 2# 3# MAKEDEV 3.3 - Make special devices. Author: Kees J. Bot 4# 3.4 - Rewritten to allow mtree line to be printed, Lionel A. Sambuc 5# also use getopt for argument parsing 6umask 077 7 8MTREE=false 9STD=false 10RAMDISK=false 11ECHO= 12EXIT=0 13 14# console => lp tty log 15# boot => kmem mem null ram zero 16RAMDISK_DEVICES=" 17 boot 18 console 19 input 20 c0d0 c0d0p0 c0d0p0s0 c0d1 c0d1p0 c0d1p0s0 21 c0d2 c0d2p0 c0d2p0s0 c0d3 c0d3p0 c0d3p0s0 22 c0d4 c0d4p0 c0d4p0s0 c0d5 c0d5p0 c0d5p0s0 23 c0d6 c0d6p0 c0d6p0s0 c0d7 c0d7p0 c0d7p0s0 24 c1d0 c1d0p0 c1d0p0s0 c1d1 c1d1p0 c1d1p0s0 25 c1d2 c1d2p0 c1d2p0s0 c1d3 c1d3p0 c1d3p0s0 26 c1d4 c1d4p0 c1d4p0s0 c1d5 c1d5p0 c1d5p0s0 27 c1d6 c1d6p0 c1d6p0s0 c1d7 c1d7p0 c1d7p0s0 28 fd0 fd1 fd0p0 fd1p0 29 pci 30 ttyc1 ttyc2 ttyc3 tty00 tty01 tty02 tty03 31" 32 33STD_DEVICES=" 34 ${RAMDISK_DEVICES} 35 bmp085b1s77 bmp085b2s77 bmp085b3s77 36 eepromb1s50 eepromb1s51 eepromb1s52 eepromb1s53 37 eepromb1s54 eepromb1s55 eepromb1s56 eepromb1s57 38 eepromb2s50 eepromb2s51 eepromb2s52 eepromb2s53 39 eepromb2s54 eepromb2s55 eepromb2s56 eepromb2s57 40 eepromb3s50 eepromb3s51 eepromb3s52 eepromb3s53 41 eepromb3s54 eepromb3s55 eepromb3s56 eepromb3s57 42 fb0 fbd filter hello 43 i2c-1 i2c-2 i2c-3 44 klog ptmx random 45 sht21b1s40 sht21b2s40 sht21b3s40 46 tsl2550b1s39 tsl2550b2s39 tsl2550b3s39 47 ttyp0 ttyp1 ttyp2 ttyp3 ttyp4 ttyp5 ttyp6 ttyp7 ttyp8 ttyp9 48 ttypa ttypb ttypc ttypd ttype ttypf 49 ttyq0 ttyq1 ttyq2 ttyq3 ttyq4 ttyq5 ttyq6 ttyq7 ttyq8 ttyq9 50 ttyqa ttyqb ttyqc ttyqd ttyqe ttyqf 51 vnd0 vnd0p0 vnd0p0s0 vnd1 vnd1p0 vnd1p0s0 52 vnd2 vnd3 vnd4 vnd5 vnd6 vnd7 53" 54 55#makedev ${dev} $type ${major} ${minor} ${uname} ${gname} ${permissions} [link_target] 56#When called for a link, major and minor are ignored 57makedev() 58{ 59 # Check that all the arguments are there, we trust the caller to put 60 # values which make sens. 61 [ $# -eq 7 ] || [ $# -eq 8 ] || return 1; 62 63 local _dev=$1 64 local __type=$2 65 local _major=$3 66 local _minor=$4 67 local _uname=$5 68 local _gname=$6 69 local _mode=$7 70 71 case ${__type} in 72 b)_type=block;; 73 c) _type=char;; 74 l) _type=link; _target=$8;; 75 *) return 2;; 76 esac 77 78 if [ ${MTREE} = "yes" ] 79 then 80 if [ ${_type} = "link" ] 81 then 82 echo ./dev/${_dev} type=${_type} \ 83 uname=${_uname} gname=${_gname} mode=${_mode} \ 84 link=${_target} 85 else 86 echo ./dev/${_dev} type=${_type} \ 87 uname=${_uname} gname=${_gname} mode=${_mode} \ 88 device=native,${_major},${_minor} 89 fi 90 else 91 if [ ${_type} = "link" ] 92 then 93 ${ECHO} ln -f ${_target} ${_dev} 94 else 95 ${ECHO} mknod ${_dev} ${__type} ${_major} ${_minor} 96 ${ECHO} chmod ${_mode} ${_dev} 97 ${ECHO} chown ${_uname}:${_gname} ${_dev} 98 fi 99 fi 100} 101 102# no_return usage() 103usage() 104{ 105 cat >&2 <<EOF 106Usage: $0 [-n|-m] [-s|-r] key ... 107 -n: print the commands instead of executing them 108 -m: print mtree(8) line 109 -s: standard set of devices 110 -r: reduced for ramdisk set of devices 111 112Where key is one of the following: 113 ram mem kmem null boot zero # One of these makes all these memory devices 114 fb0 # Make /dev/fb0 115 i2c-1 i2c-2 i2c-3 # Make /dev/i2c-[1-3] 116 tsl2550b{1,3}s39 # TSL2550 Ambient Light Sensors 117 sht21b{1,3}s40 # SHT21 Relative Humidity and Temperature Sensors 118 bmp085b{1,3}s77 # BMP085 Pressure and Temperature Sensors 119 fd0 fd1 ... # Floppy devices for drive 0, 1, ... 120 fd0p0 fd1p0 ... # Make floppy partitions fd0p[0-3], fd1p[0-3], ... 121 c0d0 c0d1 ... # Make disks c0d0, c0d1, ... 122 c0d0p0 c0d1p0 ... # Make partitions c0d0p[0-3], c0d1p[0-3], ... 123 c0d0p0s0 c0d1p0s0 ... # Subparts c0d0p[0-3]s[0-3], c0d1p[0-3]s[0-3], ... 124 c1d0(p0)(s0) # Likewise for controller 1 125 c0t0 c0t1 c1t0 ... # Make tape devices c0t0, c0t0n, c0t1, ... 126 console lp tty log # One of these makes all four 127 ttyc1 ... ttyc7 # Virtual consoles 128 tty00 ... tty03 # Make serial lines 129 ttyp0 ... ttyq0 ... # Make tty, pty pairs 130 audio mixer # Make audio devices 131 klog # Make /dev/klog 132 ptmx # Make /dev/ptmx 133 random # Make /dev/random, /dev/urandom 134 filter # Make /dev/filter 135 fbd # Make /dev/fbd 136 hello # Make /dev/hello 137 video # Make /dev/video 138 pci # Make /dev/pci 139 vnd0 vnd0p0 vnd0p0s0 .. # Make vnode disks /dev/vnd[0-7] and (sub)partitions 140 input # Make /dev/kbdmux, /dev/kbd[0-3], idem /dev/mouse~ 141EOF 142 exit 1 143} 144 145# Parse options 146while getopts "nmrs" arg 147do 148 case "$arg" in 149 n) 150 ECHO=echo 151 ;; 152 m) 153 MTREE=yes 154 ;; 155 r) 156 RAMDISK=yes 157 ;; 158 s) 159 STD=yes 160 ;; 161 h|\?) 162 usage 163 ;; 164 esac 165done 166 167if [ ${STD} = "yes" ] 168then 169 DEVICES=${STD_DEVICES} 170elif [ ${RAMDISK} = "yes" ] 171then 172 DEVICES=${RAMDISK_DEVICES} 173else 174 while [ $OPTIND -gt 1 ] 175 do 176 shift 177 OPTIND=$((${OPTIND} - 1)) 178 done 179 while [ ! -z "$1" ] 180 do 181 DEVICES="${DEVICES} $1" 182 shift 183 done 184fi 185 186for dev in ${DEVICES} 187do 188 # Reset the defaults 189 uname=root 190 gname=wheel 191 permissions=600 192 193 case ${dev} in 194 c0*) major=3 ;; 195 c1*) major=8 ;; 196 c2*) major=10 ;; 197 c3*) major=12 ;; 198 vnd*) # Whole vnode disk devices. 199 disk=`expr ${dev} : '...\\(.\\)'` 200 major=`expr ${disk} + 56` 201 ;; 202 esac 203 204 # The following is lexicographicaly ordered 205 case ${dev} in 206 audio|mixer) 207 # Audio devices. 208 makedev audio c 13 0 ${uname} ${gname} 666 209 makedev mixer c 13 1 ${uname} ${gname} 666 210 ;; 211 bmp085b[1-3]s77) 212 # Weather Cape: temperature & pressure sensor 213 bus=`expr ${dev} : 'bmp085b\\(.*\\)s77'` #bus number 214 major=`expr ${bus} + 52` 215 216 makedev bmp085b${bus}s77 c ${major} 0 ${uname} ${gname} 444 217 ;; 218 c[0-3]d[0-7]) 219 # Whole disk devices. 220 disk=`expr ${dev} : '...\\(.\\)'` 221 minor=`expr ${disk} '*' 5` 222 223 makedev ${dev} b ${major} ${minor} ${uname} ${gname} ${permissions} 224 ;; 225 c[0-3]d[0-7]p[0-3]) 226 # Disk primary partitions. 227 prefix=`expr ${dev} : '\\(.*\\).'` 228 disk=`expr ${dev} : '...\\(.\\)'` 229 230 for p in 0 1 2 3 231 do 232 minor=`expr ${disk} '*' 5 + 1 + ${p}` 233 makedev ${prefix}${p} b ${major} ${minor} \ 234 ${uname} ${gname} ${permissions} 235 done 236 ;; 237 c[0-3]d[0-7]p[0-3]s[0-3]) 238 # Disk subpartition. 239 prefix=`expr ${dev} : '\\(.*\\)...'` 240 disk=`expr ${dev} : '...\\(.\\)'` 241 242 for p in 0 1 2 3 243 do 244 for s in 0 1 2 3 245 do 246 minor=`expr 128 + ${disk} '*' 16 + ${p} '*' 4 + ${s}` 247 makedev ${prefix}${p}s${s} b ${major} ${minor} \ 248 ${uname} ${gname} ${permissions} 249 done 250 done 251 ;; 252 c[0-3]t[0-7]|c[0-3]t[0-7]n) 253 # Tape devices. 254 prefix=`expr ${dev} : '\\(....\\)'` 255 tape=`expr ${dev} : '...\\(.\\)'` 256 minor=`expr 64 + ${tape} '*' 2` 257 258 makedev ${prefix}n c ${major} ${minor} ${uname} ${gname} 660 259 makedev ${prefix} c ${major} `expr ${minor} + 1` ${uname} ${gname} 660 260 ;; 261 console|lp|tty|log|video) 262 # Console, line printer, anonymous tty, diagnostics device, video. 263 makedev console c 4 0 ${uname} tty ${permissions} 264 makedev tty c 5 0 ${uname} ${gname} 666 265 makedev lp c 6 0 daemon daemon 200 266 makedev log c 4 15 ${uname} ${gname} 222 267 makedev video c 4 125 ${uname} ${gname} ${permissions} 268 ;; 269 eepromb[1-3]s5[0-7]) 270 # cat24c256 driver 271 bus=`expr ${dev} : 'eepromb\\(.*\\)s'` 272 # configurable part of slave addr 273 slave_low=`expr ${dev} : 'eepromb.s5\\(.*\\)'` 274 major=`expr ${bus} '*' 8 + ${slave_low} + 17` 275 276 makedev eepromb${bus}s5${slave_low} b ${major} 0 ${uname} ${gname} ${permissions} 277 ;; 278 fb0) 279 # Framebuffer driver 280 makedev ${dev} c 19 0 ${uname} ${gname} 644 281 ;; 282 fbd) 283 # Faulty block device driver 284 makedev ${dev} b 14 0 ${uname} ${gname} ${permissions} 285 ;; 286 fd[0-3]) 287 # Floppy disk drive N has minor N. 288 minor=`expr ${dev} : '..\\(.\\)'` 289 290 makedev ${dev} b 2 ${minor} ${uname} ${gname} 666 291 ;; 292 fd[0-3]p[0-3]) 293 # Floppy disk partitions. 294 prefix=`expr ${dev} : '\\(.*\\).'` 295 drive=`expr ${dev} : '..\\(.\\)'` 296 297 for p in 0 1 2 3 298 do 299 minor=`expr 112 + ${drive} + ${p} '*' 4` 300 makedev ${prefix}${p} b 2 ${minor} \ 301 ${uname} ${gname} 666 302 done 303 ;; 304 filter) 305 # Filter driver 306 makedev ${dev} b 11 0 ${uname} ${gname} ${permissions} 307 ;; 308 hello) 309 # Hello driver 310 makedev ${dev} c 17 0 ${uname} ${gname} 644 311 ;; 312 i2c-[1-3]) 313 # i2c driver 314 bus=`expr ${dev} : '....\\(.*\\)'` # bus number 315 # least significant digit of major 316 major_low=`expr ${dev} : '....\\(.*\\)'` 317 major_low=`expr ${major_low} - 1` 318 319 makedev "i2c-${bus}" c 2${major_low} 0 ${uname} ${gname} ${permissions} 320 ;; 321 input) 322 # Input server 323 makedev kbdmux c 64 0 ${uname} ${gname} ${permissions} 324 makedev mousemux c 64 64 ${uname} ${gname} ${permissions} 325 326 for n in 0 1 2 3 327 do 328 minor_keyboard=`expr ${n} + 1` 329 minor_mouse=`expr ${n} + 65` 330 331 makedev kbd${n} c 64 ${minor_keyboard} ${uname} ${gname} ${permissions} 332 makedev mouse${n} c 64 ${minor_mouse} ${uname} ${gname} ${permissions} 333 done 334 ;; 335 klog) 336 # Logging device. 337 makedev ${dev} c 15 0 ${uname} ${gname} ${permissions} 338 ;; 339 pc[0-3]|at[0-3]|qd[0-3]|ps[0-3]|pat[0-3]|qh[0-3]|PS[0-3]) 340 # Obsolete density locked floppy disk drive n. 341 drive=`expr ${dev} : '.*\\(.\\)'` 342 minor=${drive} 343 344 for prefix in pc at qd ps pat qh PS 345 do 346 makedev ${prefix}${drive} b 2 ${minor} \ 347 ${uname} ${gname} 666 348 minor=`expr ${minor} + 4` 349 done 350 ;; 351 pci) 352 # PCI server, manages PCI buses 353 makedev pci c 134 0 ${uname} ${gname} ${permissions} 354 ;; 355 ptmx) 356 # Unix98 pseudoterminal master 357 makedev ptmx c 9 0 ${uname} tty 666 358 ;; 359 ram|mem|kmem|null|boot|zero|imgrd) 360 # Memory devices. 361 makedev ram b 1 0 ${uname} kmem ${permissions} 362 makedev mem c 1 1 ${uname} kmem 640 363 makedev kmem c 1 2 ${uname} kmem 640 364 makedev null c 1 3 ${uname} kmem 666 365 makedev boot b 1 4 ${uname} kmem ${permissions} 366 makedev zero c 1 5 ${uname} kmem 644 367 makedev imgrd b 1 6 ${uname} kmem ${permissions} 368 369 for n in 0 1 2 3 4 5 370 do 371 minor=`expr ${n} + 7` 372 373 makedev ram${n} b 1 ${minor} ${uname} kmem ${permissions} 374 done 375 ;; 376 random|urandom) 377 # Random data generator. 378 makedev random c 16 0 ${uname} ${gname} 644 379 makedev urandom c 16 0 ${uname} ${gname} 644 380 ;; 381 sht21b[1-3]s40) 382 # Weather Cape: relative humidity & temperature sensor 383 bus=`expr ${dev} : 'sht21b\\(.*\\)s40'` 384 major=`expr ${bus} + 49` 385 386 makedev sht21b${bus}s40 c ${major} 0 ${uname} ${gname} 444 387 ;; 388 tsl2550b[1-3]s39) 389 # Weather Cape: ambient light sensor 390 bus=`expr ${dev} : 'tsl2550b\\(.*\\)s39'` 391 major=`expr ${bus} + 46` 392 393 makedev tsl2550b${bus}s39 c ${major} 0 ${uname} ${gname} 444 394 ;; 395 tty0[0-3]) 396 # Serial lines. 397 line=`expr ${dev} : '.*\\(.\\)'` 398 minor=`expr ${line} + 16` 399 400 makedev ${dev} c 4 ${minor} ${uname} tty 666 401 ;; 402 tty[p-s][0-9a-f]|pty[p-s][0-9a-f]) 403 # Pseudo ttys. 404 dev=`expr ${dev} : '...\\(..\\)'` 405 group=`expr ${dev} : '\\(.\\)'` 406 group=`echo ${group} | tr 'pqrs' '0123'` 407 pty=`expr ${dev} : '.\\(.\\)'` 408 case ${pty} in 409 [a-f]) pty=1`/bin/echo ${pty} | tr 'abcdef' '012345'` 410 esac 411 minor_tty=`expr ${group} '*' 16 + ${pty} + 128` 412 minor_pty=`expr ${group} '*' 16 + ${pty} + 192` 413 414 makedev tty${dev} c 9 ${minor_tty} ${uname} tty 666 415 makedev pty${dev} c 9 ${minor_pty} ${uname} tty 666 416 ;; 417 ttyc[1-7]) 418 # Virtual consoles. 419 minor=`expr ${dev} : '....\\(.*\\)'` 420 421 makedev ${dev} c 4 ${minor} ${uname} tty ${permissions} 422 ;; 423 vnd[0-7]) 424 # Whole vnode disk devices. 425 makedev ${dev} b ${major} 0 ${uname} ${gname} ${permissions} 426 ;; 427 vnd[0-7]p[0-3]) 428 # Vnode disk primary partitions. 429 prefix=`expr ${dev} : '\\(.*\\).'` 430 disk=`expr ${dev} : '...\\(.\\)'` 431 432 for p in 0 1 2 3 433 do 434 minor=`expr 1 + ${p}` 435 436 makedev ${prefix}${p} b ${major} ${minor} \ 437 ${uname} ${gname} ${permissions} 438 done 439 ;; 440 vnd[0-7]p[0-3]s[0-3]) 441 # Vnode disk subpartition. 442 prefix=`expr ${dev} : '\\(.*\\)...'` 443 disk=`expr ${dev} : '...\\(.\\)'` 444 445 for p in 0 1 2 3 446 do 447 for s in 0 1 2 3 448 do 449 minor=`expr 128 + ${p} '*' 4 + ${s}` 450 451 makedev ${prefix}${p}s${s} b ${major} ${minor} \ 452 ${uname} ${gname} ${permissions} 453 done 454 done 455 ;; 456 *) 457 echo "$0: don't know about ${dev}" >&2 458 EXIT=1 459 esac 460done 461 462exit $EXIT 463