#!perl

# Routinen für MO

require 5.000;

package   mo;
use       Exporter ();
@ISA    = qw(Exporter);
@EXPORT = qw( mountmo umountmo );

use English;

######################################################################
### MountMO
######################################################################

sub mountmo
{
  # Ohne Parameter wird /dev/mo nach /mnt/mo gemountet
  # Wenn ein Parameter angegeben wird, dann wird dieses Device nach /mnt/mo
  # gemountet, z.B. /dev/sdc4
  # Wenn es Partitionen gibt, dann wird die erste Partition gemountet, sonst
  # das ganze Medium (Superfloppy)
  # Return: bei Fehler FALSE sonst TRUE
  #

  my $device;
  my $useropt;

  # Wenn es nicht mit Root-Rechten läuft
  if ($UID != 0)
  {
    warn "Programm läuft nicht mit Root-Rechten! => mountmo() ohne VFAT!\n";
    if (defined $_[0])
    { $device = shift; }
    else
    { $device = FindDevice(); }
    system("mount $device");
    return ( ( ($?>>8) != 0 ) ? 0 : 1 );
  }

  # Wenn DOS-Filesysteme gemountet werden, dann muß man einen User angeben,
  # sonst gehört alles Root.
  if (defined $ENV{ichbin})
  {
    (undef,undef,$uid,$gid) = getpwnam($ENV{ichbin});
    $useropt = "uid=$uid,gid=$gid,umask=022";
  }

  if (defined $_[0])
  {
    $device = shift;
    system("mount $device");
    return ( ( ($?>>8) != 0 ) ? 0 : 1 );
  }
  else
  {
    $device = FindDevice();
    chomp($device);
    system("mount ${device}1 2>/dev/null");
    $mounted = $device . '1';
    if ( ($?>>8) != 0 )
    {
      system("mount $device");
      $mounted = $device;
    }

    # Als welcher Typ wurde gerade gemountet?
    my $typ;
    (undef,undef,$typ,$rwro) = split(' ',`grep /mnt/mo /etc/mtab`);

    $rwro =~ s/.*,?(r[o|w]),?.*/$1/;
    # oder: $rwro =~ s/^([^,]+).*/$1/;
    # oder: $rwro =~ s/^(\w+),?.*/$1/;

    unless (defined $typ)
    {
      print "MO wurde nicht gemountet!\n";
      return 0;
    }

    if ( $typ eq 'reiserfs')
    {
      # Reiserfs braucht keinen fsck.
      return 1;
    }

    if ( $typ eq 'ext2')
    {
      # Wenn die MO schreibgeschützt ist, dann geht natürlich kein e2fsck
      if ($rwro eq 'rw')
      {
	system("umount /mnt/mo");
	system("/sbin/e2fsck $device");
	system("mount /mnt/mo");
      }
      return ( ( ($?>>8) != 0 ) ? 0 : 1 );
    }

    if ( $typ eq 'ext3')
    {
      # Ext3 braucht keinen fsck.
      return 1;
    }

    # Optionen aus der fstab lesen
    my $opt;
    (undef,undef,undef,$opt) = split(' ',`grep /mnt/mo /etc/fstab`);

    # Wenn ein File "vfat" im Root existiert, dann als VFAT mounten
    if (
	( ($typ eq 'msdos') || ($typ eq 'umsdos') || ($typ eq 'vfat') )  &&
	($UID == 0)         &&
	(-e '/mnt/mo/vfat') &&
	(-s '/mnt/mo/vfat') == 0
       )
    {
      system("umount /mnt/mo"); # Remount geht nicht mit UID.
      system("mount $mounted /mnt/mo -t vfat -o $opt,$useropt");
    }
    else
    {
      system("umount /mnt/mo"); # Remount geht nicht mit UID.
      system("mount $mounted /mnt/mo -t msdos -o $opt,$useropt");
    }
    return ( ( ($?>>8) != 0 ) ? 0 : 1 );
  }
}

######################################################################
### UMountMO
######################################################################

sub umountmo
{
  # Ohne Parameter wird /dev/mo un-gemountet
  # Wenn ein Parameter angegeben wird, dann wird dieses Device
  # un-gemountet, z.B. /dev/mo1
  # Return: bei Fehler FALSE sonst TRUE
  #
  my $device;
  if (defined $_[0])
  {
    $device = shift;
  }
  else
  {
    ($device) = split(' ',`grep /mnt/mo /etc/mtab`);
    unless (defined $device)
    {
      warn "Keine MO gemountet!\n";
      return 1;
    }
    chomp($device);
  }
  system("umount $device");
  return 0 if ($?>>8) != 0;
#  system("eject /dev/mo");
  system("eject $device");
  return 0 if ($?>>8) != 0;

  # Für devfs:
  if (`grep devfs /proc/filesystems`)
  {
    $tmp = `hostname`;
    chomp($tmp);
    if ($tmp eq 'sl')
    {
      system('/usr/sl/scsirescan-remove-mo');
      # Liefert 1 zurück, obwohl es erfolgreich ist ?!?!?
    }
  }
  return 1;
}


######################################################################
### FindDevice
######################################################################

sub FindDevice
{
  my $zeile = `grep /mnt/mo /etc/fstab | head -n 1`;
  if ($zeile eq '')
  {
    die "Ich kann keinen MO-Eintrag '/mnt/mo' in /etc/fstab finden!\n".
    "Das muß z.B. so aussehen:\n".
    "/dev/mo       /mnt/mo           auto     user,noauto,nodev,nosuid,noexec".
    "\n".
    "/dev/mo1      /mnt/mo           auto     user,noauto,nodev,nosuid,noexec".
    "\n";
  }
  my $device;
  ($device) = split(' ',$zeile);
  return $device;
}


1;

