#!/usr/bin/perl
# AutoLogin (c) 2000 by Robert Salizar
# Version 0.11
use User::Utmp;
$ENV{'PATH'} = "/bin:/usr/bin:/sbin:/usr/sbin";

# @c array:
# 0=tty, 1=username, 2=log-in-utmp(boolean), 3=command 
@c = &readconf;
if (@c[2] == 1) {
   &addutmp(@c);
}

# @pwd array:
#  0    1    2   3   4     5       6    7   8
# name pass uid gid quota comment gcos dir shell

@pwd = getpwnam($c[1]);
chdir($pwd[7]) or die ("No homedir for user $c[1]\n");

# Switch to user's GID/UID
$) = $pwd[3];
$( = $pwd[3];
$> = $pwd[2];
$< = $pwd[2];


# Set HOME environ
$ENV{'HOME'} = "$pwd[7]";

# Run prog
exec("$c[3]") or safedie ("Could not run $c[3]: $!\n");

sub readconf {
  my (@line, $tty, $ok);
  chomp($tty = `tty | cut -c 6-`);  
  open(CONF, "/etc/alogin.conf") or safedie ("/etc/alogin.conf: $!\n");
  while (<CONF>) {
      next if /^\#/;
      @line = split(/:/);
      if ($line[0] eq $tty) {
          $ok++;
          last;
      }
  }
  close(CONF);
  safedie ("$tty is not listed in config file\n") unless $ok;
  return(@line);
}      

sub addutmp {
# 0=tty, 1=username, 2=log-in-utmp(boolean), 3=command 
  my (%entry);
  User::Utmp::utmpname("/var/run/utmp");
  %entry = ( ut_user => "@_[1]",
             ut_id   => "",
             ut_line => "@_[0]",
             ut_pid  => $$,
             ut_type => USER_PROCESS,
             ut_exit => { e_termination => 0, e_exit => 0 },
             ut_time => time,
             ut_host => "",
             ut_addr => "" );
  User::Utmp::pututline(\%entry);
}

sub safedie {
   my $reason = shift;
   
   print("alogin error: $reason");
   print("Executing login due to alogin failure\n\n");
   exec("/bin/login");
}
