#!/afs/athena/contrib/perl/p

require 'getopts.pl';

$|=1;
$sgttyb_t   = 'C4 S';
$winsz_t = "S S S S";  # rows,cols, xpixel, ypixel
$default_num_cols = 80; # if can't be gotten from ioctl...
$TIOCGETP = 0x40067408;
$TIOCSETP = 0x80067409;
$TIOCGWINSZ = 0x40087468;
$RAW = 0x20;
$ECHO = 0x8;
sub start {
#    system 'stty raw -echo';

    ioctl(STDIN,$TIOCGETP,$sgttyb) || die "Can't ioctl TIOCGETP: $!";
    @tty_buf = unpack($sgttyb_t,$sgttyb);
    $tty_buf[4] |= $RAW;
    $tty_buf[4] &= ~$ECHO;
    $sgttyb = pack($sgttyb_t,@tty_buf);
    ioctl(STDIN,$TIOCSETP,$sgttyb) || die "Can't ioctl TIOCSETP: $!";
}

sub list_cmds {
    print("\rl) List commands (this list)\n\r");
    print("\rn) Netwatch\n\r");
    print("\rs) Standard startup (B, S, Z, E)\n\r");
    print("\rx) Xscreensaver -l\n\r");
    print("\rB) BigXTerm\n\r");
    print("\rE) Emacs (specified geometry)\n\r");
    print("\rS) SmallXTerm\n\r");
    print("\rX) Xmosaic\n\r");
    print("\rZ) Znol\n\r");
    print("\rQ) QUIT\n\r");
}

&start;
&list_cmds;
while(1){
    $val = getc;

    if($val eq "s"){
	print("\rRunning standard startup\n\r");
	&standard;
    }
    elsif($val eq "t"){
	printf("\rStarting xterm, pid %d\n\r", &run("/usr/athena/bin/xterm",
						    "-sb"));
    }
    elsif($val eq "x"){
	printf("\rStarting Xscreensaver, pid %d\n\r", &run("/usr/sipb/bin/xscreensaver",
							 "-l"));
    }
    elsif($val eq "B"){
	printf("\rStarting BigXterm, pid %d\n\r", &run("/usr/athena/bin/xterm", 
						     "-sb", "-T", "BigXterm", 
						     "-geometry", 
						     "80x40+0+30"));
    }
    elsif($val eq "Z"){
	    print("\rDoing znol...\n\r");
	    &do_znol();
    }
    elsif($val eq "X"){
	printf("\rStarting Xmosaic, pid %d\n\r", &run("/usr/sipb/bin/xmosaic"));
    }
    elsif($val eq "S"){
	printf("\rStarting ShortXTerm, pid %d\n\r", &run("/usr/athena/bin/xterm",
						       "-sb", "-T", 
						       "ShortXTerm", 
						       "-geometry", 
						       "105x10+0+600"));
    }
    elsif($val eq "E"){
	printf("\rStarting emacs with pid %d\n\r", &run("/usr/athena/bin/emacs", 
						      "-geometry", 
						      "80x40+525+30"));
    }
    elsif($val eq "l"){
	&list_cmds;
    }
    elsif($val eq "n"){
	print("\rRunning netwatch ever how many seconds? ");
	$nnet = (<STDIN>);
	chop($nnet);
	&run("/afs/athena/user/m/h/mhbraun/bin/netwatch.pl", $nnet);
    }
    elsif($val eq "Q"){
	exit(0);
    }
}

&run("/afs/athena/user/m/h/mhbraun/bin/netwatch.pl", $opt_n) if $opt_n;

sub standard {
    printf("\rStarting BigXterm with pid %d\n\r", &run("/usr/athena/bin/xterm", 
						 "-sb", "-T", "BigXterm", 
						 "-geometry", "80x40+0+30"));
    sleep(5);
    print("\rDoing znol...");
    &do_znol();
    sleep(5);

    printf("\rStarting emacs with pid %d\n\r", &run("/usr/athena/bin/emacs", 
						"-geometry", "80x40+525+30"));

    sleep(5);

    printf("\rStarting ShortXTerm with pid %d\n\r", &run("/usr/athena/bin/xterm",
						 "-sb", "-T", "ShortXTerm", 
						 "-geometry", "105x10+0+600"));

}
sub do_znol {
    open(ZWRITE, "|zwrite \$USER");
    print ZWRITE `znol`;
    close(ZWRITE);
}

sub run {
    local(@what) = @_;
    
    if($pid = fork()){
	return $pid;
    }
    else{
	exec(@what); 
    }	
}
