#!/bin/sh
# Copyright (C)1997 by Antonio GALLO <agx@linux.it> and 
# Copyright (C)1999 by Marcello "Vejeta"
# This file is part of the "Bad Penguin" GNU/Linux distribution
# This program is distributed under the GNU General Public License
# You are not allowed to remove the copyright notice

GMODE="0660"
GOWNER="root.root"

mkd() {
  parse=0
  [ "$1" = "" ] && parse=1
  [ "$2" = "" ] && parse=2
  [ "$3" = "" ] && parse=3
  [ "$4" = "" ] && parse=4
  if [ $parse -gt 0 ]; then
    echoc RED "mkd: parameter nr. $parse is empty !"
    exit 1
  fi
  if [ "$5" = "" ]; then
    mode="$GMODE"
  else
    mode="$5"
  fi
  if [ "$6" = "" ]; then
    owner="$GOWNER"
  else
    owner="$6"
  fi
  #
  if [ "$4" = "b" ]; then
    if [ ! -b "$1" ]; then
      echoc YELLOW "! $1 non e` $1 !!!"
      rm -f $1
    fi
  else
    if [ ! -c "$1" ]; then
      echoc YELLOW "$1 non e` $1 !!!"
      rm -f $1
    fi
  fi
  if [ ! -e $1 ]; then
    #echo "> $2 $3 $4 $1"
    mknod "$1" "$2" "$3" "$4"
  #else
    #echo "- $2 $3 $4 $1" >/dev/null
  fi
  chmod "$mode" "$1"
  chown "${owner}" "$1"
}

mkl() {
  parse=0
  [ "$1" = "" ] && parse=1
  [ "$2" = "" ] && parse=2
  if [ $parse -gt 0 ]; then
    echoc RED "mkl: parameter nr. $parse is empty !"
    exit 1
  fi
  if [ ! -e "$1" ]; then
    echoc YELLOW "! $1 does not exists"
    exit 1
  fi
  #echo "> $1 to $2"
  rm -f $2
  ln -sf $1 $2
}


  
# ==============================================

dev_memory() {
  echo "> memory and ramdisk devices"
  mkd mem     c 1 1 0660 root.kmem
  mkd kmem    c 1 2 0660 root.kmem
  mkd null    c 1 3 0666 root.root
  mkd port    c 1 4 0660 root.kmem
  mkd zero    c 1 5 0666 root.root
  mkd core    c 1 6 0666 root.root
  mkd full    c 1 7 0666 root.root
  mkd random  c 1 8 0644 root.sys
  mkd urandom c 1 9 0644 root.sys
  for i in 0 1 2 3 4 5 6 7 ; do
    mkd ram$i b 1 $i  0660 root.disk
  done
  mkd initrd  b 1 250 0660 root.disk
  mkl ram0 ram
  mkl ram0 ramdisk
}

dev_tty() {
  echo "> pseudo-TTY masters and slaves"
  MINOR=0
  for i in p q r s t u v w x y z a b c d e ; do
    for j in 0 1 2 3 4 5 6 7 8 9 a b c d e f; do
      mkd pty$i$j c 2 $MINOR  0666 root.tty
      mkd tty$i$j c 3 $MINOR  0666 root.tty
      MINOR="`expr $MINOR + 1 `"
    done
  done
}

dev_bare_floppy() {
  echo "> floppy disks"
  MINOR=0
  for j in "" u1440 u2880 h1440 u1722 h1600 u1760 u1920 u3200 u3520 u3840 u1840
  do
    for i in 0 1 2 3 ; do  
      mkd "fd$i$j" b 2 $MINOR  0660  root.floppy
      MINOR="`expr $MINOR + 1 `"
    done
  done
}

dev_floppy() {
  echo "> floppy disks"
  MINOR=0
  for j in "" d360 h1200 u360 u720 h360 h720 u1440 u2880 CompaQ h1440 u1680 \
    h410 u820 h1476 u1722 h420 u830 h1494 u1743 h880 u1040 u1120 h1600 u1760 \
    u1920 u3200 u3520 u3840 u1840 u800 u1600
  do
    for i in 0 1 2 3 ; do  
      mkd "fd$i$j" b 2 $MINOR  0660  root.floppy
      MINOR="`expr $MINOR + 1 `"
    done
  done
}

dev_eide_disk() {
  echo "> hard disk EIDE"
  mkd hda b  3  0  0660 root.disk
  mkd hdb b  3 64  0660 root.disk
  mkd hdc b 22  0  0660 root.disk
  mkd hdd b 22 64  0660 root.disk
  MINOR=1
  while [ $MINOR -lt 16 ]; do
    mkd hda$MINOR  b  3 $MINOR                 0660 root.disk
    mkd hdb$MINOR  b  3 "`expr $MINOR + 64 `"  0660 root.disk
    mkd hdc$MINOR  b  22 $MINOR                0660 root.disk
    mkd hdd$MINOR  b  22 "`expr $MINOR + 64 `" 0660 root.disk
    MINOR="`expr $MINOR + 1 `"
  done
}

dev_misc() {
  echo "> ttys & vcs devices"
  MINOR=0
  while [ $MINOR -lt 64 ]; do
    mkd tty$MINOR  c 4 $MINOR                 0666 root.tty
    mkd ttyS$MINOR c 4 "`expr $MINOR + 64 `"  0666 root.tty
    mkd vcs$MINOR  c 7 $MINOR                 0600 root.sys
    mkd vcsa$MINOR c 7 "`expr $MINOR + 128 `" 0600 root.sys
    MINOR="`expr $MINOR + 1 `"
  done

  echo "> console"
  mkd tty     c 5 0  0666 root.tty
  mkd console c 5 1  0666 root.tty
  rm -f xconsole
  mkfifo xconsole
  mkd ptmx    c 5 2  0666 root.sys
  echo "> /dev/pts/"
  if [ ! -d pts ]; then
    if [ -e pts ]; then
      rm -fR pts
    fi
    mkdir pts
  fi
  # from kernel 2.2.14
  chmod 0620     pts	# or 755 ????
  chown root.tty pts

  echo "> parallel printer devices"
  for i in 0 1 2 3 ; do
    mkd lp$i c 6 $i  0660 root.lp
  done

  echo "> raw parallel ports"
  for i in 0 1 2 3 ; do
    mkd parport$i  c 99 $i  0660 root.sys
  done

  echo "> loopback devices"
  for i in 0 1 2 3 ; do
    mkd loop$i b 7 $i 0660 root.disk
  done
  
  echo "> proc symlinks"
  rm -f fd stdin stdout stderr
  ln -sf /proc/self/fd/	fd
  ln -sf /dev/fd/0	stdin
  ln -sf /dev/fd/1	stdout
  ln -sf /dev/fd/2	stderr

  echo "> misc devices"
  mkd psaux  	c 10 1	  0600 root.sys
  mkd beep	c 10 128  0660 root.sys
  mkd apm_bios	c 10 134  0660 root.sys
  mkd rtc	c 10 135  0660 root.sys
  mkd nvram	c 10 141  0660 root.sys
  mkd pmu	c 10 150  0660 root.sys
  
}


dev_scsi() {
  echo "> SCSI disk devices"
  MINOR=0
  #TOOMUCH:for i in a b c d e f g h i l m n o p; do
  for i in a b c d ; do
    for j in "" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ; do
      mkd sd$i$j b 8 $MINOR  0660 root.disk
      MINOR="`expr $MINOR + 1 `"
    done
  done
  
  echo "> SCSI tape devices"
  MINOR=0
  while [ $MINOR -lt 8 ]; do
    mkd st$MINOR c 9 $MINOR  0660 root.disk
    MINOR="`expr $MINOR + 1 `"
  done

  echo "> SCSI CD-ROM devices"
  MINOR=0
  while [ $MINOR -lt 8 ]; do
    mkd scd$MINOR b 11 $MINOR  0440 root.cdrom
    mkl scd$MINOR    sr$MINOR
    MINOR="`expr $MINOR + 1 `"
  done

  echo "> Generic SCSI access"
  MINOR=0
  #TOOMUCH:for letter in a b c d e f g h i j k l m n o p ; do
  for letter in a b c d ; do
    mkd sg$MINOR c 21 $MINOR
    mkl sg$MINOR    sg$letter
    MINOR="`expr $MINOR + 1 `"    
  done
}


dev_sound() {
  echo "> PC speaker"
  mkd pcmixer	c 13 0  0660 root.audio
  mkd pcsp	c 13 1  0660 root.audio
  mkd pcaudio	c 13 4  0660 root.audio
  mkd pcsp16	c 13 5  0660 root.audio

  echo "> sound cards"
  mkd mixer 	 c 14  0  0660 root.audio
  mkd sequencer  c 14  1  0660 root.audio 
  mkd midi00 	 c 14  2  0660 root.audio 
  mkd dsp	 c 14  3  0660 root.audio 
  mkd audio 	 c 14  4  0660 root.audio 
  mkd sndstat 	 c 14  6  0660 root.audio 
  mkd sequencer2 c 14  8  0660 root.audio 
  mkd mixer1 	 c 14 16  0660 root.audio
  mkd patmgr0 	 c 14 17  0660 root.audio
  mkd midi01 	 c 14 18  0660 root.audio
  mkd dsp1	 c 14 19  0660 root.audio
  mkd audio1 	 c 14 20  0660 root.audio
  mkd patmgr1 	 c 14 33  0660 root.audio
  mkd midi02 	 c 14 34  0660 root.audio
  mkd midi03 	 c 14 50  0660 root.audio
  # Speaker device file: Plays music using IBM BASIC style strings.
  mkd speaker    c 115 0  0660 root.audio
}


dev_video() {
  echo "> universal frame buffer"
  #vej's strange ideas... :)
  mkd fbautodetect c 29 1  0664 root.sys
  UNIT=0
  MINOR=0
  while [ $UNIT -lt 8 ];do
    mkd fb$UNIT c 29 $MINOR 0664 root.sys
    UNIT="`expr $UNIT + 1 `"
    MINOR="`expr $MINOR + 32`"
  done
}

# --------------------------- Parse params ------------------------------
TARGETDEVICE="$1"
TARGETDIR="$2"
if [ "$TARGETDEVICE" = ""  -o "$TARGETDEVICE" = "--h" -o "$TARGETDEVICE" = "--help" ]; then
  echo "Usage: install-device devicename [targetdir]"
  echo " Tips: install-device ALL        [targetdir]"  
fi
[ "$TARGETDIR" = "" ] && TARGETDIR="/"

# Go into targetdir
[ ! -d "$TARGETDIR" ] && mkdir -m 755 -p  "$TARGETDIR"
cd "$TARGETDIR"

# Go into targetdir/dev
[ ! -d "$TARGETDIR/dev" ] && mkdir -m 755 -p  "$TARGETDIR/dev"
cd "$TARGETDIR/dev"

# default chmod to 666
umask 111


# ========================================================================
# ========================================================================

case $TARGETDEVICE in
  ALL)
    dev_memory
    dev_tty
    dev_bare_floppy
    dev_eide_disk
    dev_misc
    dev_scsi
    dev_sound
    dev_video
    ;;
  *)
    echo "Il device $TARGETDEVICE e' sconosciuto !"
    exit 1
    ;;
esac


exit 0
  