dsIIr4/bin/
dsIIr4/extra/creremote/
dsIIr4/extra/wolfpaw/
dsIIr4/lib/cmds/admins/
dsIIr4/lib/cmds/common/
dsIIr4/lib/cmds/creators/include/
dsIIr4/lib/cmds/creators/include/SCCS/
dsIIr4/lib/daemon/services/
dsIIr4/lib/doc/
dsIIr4/lib/domains/Ylsrim/
dsIIr4/lib/domains/Ylsrim/adm/
dsIIr4/lib/domains/Ylsrim/armor/
dsIIr4/lib/domains/Ylsrim/broken/
dsIIr4/lib/domains/Ylsrim/fish/
dsIIr4/lib/domains/Ylsrim/meal/
dsIIr4/lib/domains/Ylsrim/npc/
dsIIr4/lib/domains/Ylsrim/virtual/
dsIIr4/lib/domains/Ylsrim/weapon/
dsIIr4/lib/domains/campus/adm/
dsIIr4/lib/domains/campus/etc/
dsIIr4/lib/domains/campus/meals/
dsIIr4/lib/domains/campus/npc/
dsIIr4/lib/domains/campus/save/
dsIIr4/lib/domains/campus/txt/
dsIIr4/lib/domains/campus/txt/ai/charles/
dsIIr4/lib/domains/campus/txt/ai/charles/bak2/
dsIIr4/lib/domains/campus/txt/ai/charles/bak2/bak1/
dsIIr4/lib/domains/campus/txt/ai/charly/
dsIIr4/lib/domains/campus/txt/ai/charly/bak/
dsIIr4/lib/domains/campus/txt/jenny/
dsIIr4/lib/domains/default/creator/
dsIIr4/lib/domains/default/doors/
dsIIr4/lib/domains/default/etc/
dsIIr4/lib/domains/default/virtual/
dsIIr4/lib/domains/default/weap/
dsIIr4/lib/domains/town/virtual/
dsIIr4/lib/lib/comp/
dsIIr4/lib/lib/lvs/
dsIIr4/lib/lib/user/
dsIIr4/lib/lib/virtual/
dsIIr4/lib/log/
dsIIr4/lib/obj/book_source/
dsIIr4/lib/obj/include/
dsIIr4/lib/realms/template/
dsIIr4/lib/realms/template/adm/
dsIIr4/lib/realms/template/area/armor/
dsIIr4/lib/realms/template/area/npc/
dsIIr4/lib/realms/template/area/obj/
dsIIr4/lib/realms/template/area/room/
dsIIr4/lib/realms/template/area/weap/
dsIIr4/lib/realms/template/bak/
dsIIr4/lib/realms/template/cmds/
dsIIr4/lib/save/
dsIIr4/lib/save/kills/o/
dsIIr4/lib/secure/cfg/classes/
dsIIr4/lib/secure/cmds/creators/include/
dsIIr4/lib/secure/cmds/players/
dsIIr4/lib/secure/cmds/players/include/
dsIIr4/lib/secure/daemon/include/
dsIIr4/lib/secure/lib/
dsIIr4/lib/secure/lib/include/
dsIIr4/lib/secure/lib/net/include/
dsIIr4/lib/secure/lib/std/
dsIIr4/lib/secure/modules/
dsIIr4/lib/secure/npc/
dsIIr4/lib/secure/obj/include/
dsIIr4/lib/secure/room/
dsIIr4/lib/secure/save/
dsIIr4/lib/secure/save/boards/
dsIIr4/lib/secure/save/players/g/
dsIIr4/lib/secure/tmp/
dsIIr4/lib/secure/verbs/creators/
dsIIr4/lib/shadows/
dsIIr4/lib/spells/
dsIIr4/lib/std/board/
dsIIr4/lib/std/lib/
dsIIr4/lib/tmp/
dsIIr4/lib/verbs/admins/include/
dsIIr4/lib/verbs/common/
dsIIr4/lib/verbs/common/include/
dsIIr4/lib/verbs/creators/include/
dsIIr4/lib/verbs/players/include/SCCS/
dsIIr4/lib/verbs/rooms/
dsIIr4/lib/verbs/rooms/include/
dsIIr4/lib/www/
dsIIr4/v22.2b14-dsouls2/
dsIIr4/v22.2b14-dsouls2/ChangeLog.old/
dsIIr4/v22.2b14-dsouls2/Win32/
dsIIr4/v22.2b14-dsouls2/compat/
dsIIr4/v22.2b14-dsouls2/compat/simuls/
dsIIr4/v22.2b14-dsouls2/include/
dsIIr4/v22.2b14-dsouls2/mudlib/
dsIIr4/v22.2b14-dsouls2/testsuite/
dsIIr4/v22.2b14-dsouls2/testsuite/clone/
dsIIr4/v22.2b14-dsouls2/testsuite/command/
dsIIr4/v22.2b14-dsouls2/testsuite/data/
dsIIr4/v22.2b14-dsouls2/testsuite/etc/
dsIIr4/v22.2b14-dsouls2/testsuite/include/
dsIIr4/v22.2b14-dsouls2/testsuite/inherit/
dsIIr4/v22.2b14-dsouls2/testsuite/inherit/master/
dsIIr4/v22.2b14-dsouls2/testsuite/log/
dsIIr4/v22.2b14-dsouls2/testsuite/single/
dsIIr4/v22.2b14-dsouls2/testsuite/single/tests/compiler/
dsIIr4/v22.2b14-dsouls2/testsuite/single/tests/efuns/
dsIIr4/v22.2b14-dsouls2/testsuite/single/tests/operators/
dsIIr4/v22.2b14-dsouls2/testsuite/u/
dsIIr4/v22.2b14-dsouls2/tmp/
dsIIr4/win32/
#!/usr/bin/perl

$MUD = "";
$Character = "";
$Password = "";
$Machine = "";
$Port = 0;
$Editor = '/usr/bin/vi';
$LocalEditFile = "/tmp/creremote.$$";
print "CreRemote> ";

while(<>) {
  chop;
  if( $_ ) {
    @tmp = split(/ /, $_);
    $cmd = shift(@tmp);
    $args = join(' ', @tmp);
    if( ! $MUD ) {
      if( $cmd eq "connect" ) {
	&cmdConnect($args);
      }
      elsif( $cmd eq "help" ) {
	&cmdHelp($args);
      }
      elsif( $cmd eq "exit" ) {
	exit;
      }
      elsif( substr($cmd, 0, 1) eq "!" ) {
	system(substr($cmd, 1, length($cmd) - 1));
      }
      else {
	print "Bad command: $cmd $args\n";
      }
    }
    else {
      if( $cmd eq "connect" ) {
	print "You are already connected to $MUD.\n";
      }
      elsif( $cmd eq "quit" ) {
	close(S);
	$MUD = "";
	$Buffer = "";
	$InEdit = 0;
	$EditFile = "";
      }
      elsif( $cmd eq "edit" ) {
	$EditFile = $args;
	system("rm $LocalEditFile") if -f $LocalEditFile;
	print S "$cmd $args\n";
	$x = 1;
	while( $x ) { if( -f $LocalEditFile ) { $x = 0; } }
	@bugger = stat($LocalEditFile);
	$sz = $bugger[7];
	$tme = $bugger[9];
	system("$Editor $LocalEditFile");
	@bugger = stat($LocalEditFile);
	if( $bugger[7] == 0 || $tme == $bugger[9] ) {
	  $EditFile = "";
	  system("rm $LocalEditFile");
	}
	else {
	  $Buffer = "";
	  open(LEF, $LocalEditFile);
	  while(<LEF>) { $Buffer = "$Buffer$_"; }
	  close(LEF);
	  print S "100 ".length($Buffer)." $EditFile\n";
	  $EditFile = "";
	  sleep(2);
	  print S $Buffer;
	  $Buffer = "";
	  system("rm $LocalEditFile");
	}
      }
      elsif( $cmd eq "100" ) {
	print "Illegal command.\n";
      }
      elsif( substr($cmd, 0, 1) eq "!" ) {
	  system(substr($cmd, 1, length($cmd) - 1));
      }
      else {
	print S "$cmd $args\n";
      }
    }
  }
  print "CreRemote> " unless $MUD;
}


sub cmdConnect {
  local($mud) = shift(@_);
  local($rcfile) = $ENV{'HOME'} || './';
  $rcfile = $rcfile."/.creremoterc";
  local($found) = 0;
  local($writerc) = 0;
  if( -f $rcfile ) {
    open(RCFILE, $rcfile);
    while(<RCFILE>) {
      chop;
      local(@words) = split;
      local($thismud) = shift(@words);
      if( ! $charname && $thismud eq $mud ) {
	$Character = shift(@words);
	$Password = shift(@words);
        $Machine= shift(@words);
	$Port = shift(@words);
	$found = 1;
      }
    }
    close(RCFILE);
  }
  if( ! $found ) {
    print "Character name: ";
    chop($Character = <>);
    print "Password: ";
    system 'stty', '-echo';
    chop($Password = <>);
    system 'stty', 'echo';
    print "\n$mud ip: ";
    chop($Machine = <>);
    print "port: ";
    chop($Port = <>);
    $writerc = 1;
  }
  $MUD = $mud;
  if( ! $Character || !$MUD || ! $Password || ! $Machine || ! $Port ) {
    print "Vital information is missing\n";
    return;
  }

  $AF_INET = 2;
  $SOCK_STREAM = 1;
  $SIG{'INT'} = 'killconnection';

  $port = $Port;
  $sockaddr = 'S n a4 x8';
  chop($hostname = `hostname`);
  ($name, $aliases, $proto) = getprotobyname('tcp');
  ($name, $aliases, $port) = getservbyname($port, 'tcp')
    unless $port =~ /^\d+$/;
  ($name, $aliases, $type, $len, $thisaddr) =
    gethostbyname($hostname);
  ($name, $aliases, $type, $len, $thataddr) = gethostbyname($Machine);
  
  $this = pack($sockaddr, $AF_INET, 0, $thisaddr);
  $that = pack($sockaddr, $AF_INET, $port, $thataddr);
  
  if( !socket(S, $AF_INET, $SOCK_STREAM, $proto) ) {
    print "Error creating socket for $MUD: $!\n";
    $MUD = "";
    $Character = "";
    $Password = "";
    $Machine = "";
    $Port = "";
    return;
  }
  if( !bind(S, $this) ) {
    print "Error binding to $MUD: $!\n";
    $MUD = "";
    $Character = "";
    $Password = "";
    $Machine = "";
    $Port = "";
    return;
  }
  if( !connect(S, $that) ) {
    print "Error connecting to $MUD: $!\n";
    $MUD = "";
    $Character = "";
    $Password = "";
    $Machine = "";
    $Port = "";
    return;
  }
  if( $writerc ) { 
    open(NRCFILE, ">> $rcfile");
    print NRCFILE "$MUD $Character $Password $Machine $Port\n";
    close(NRCFILE);
  }

  select(S); $| = 1; select(STDOUT);
  
  if( $child = fork ) {
    print S "login $Character $Password\n";
    return;
  }
  else {
    while(<S>) {
      if( $InEdit > 0 ) {
	$Buffer = "$Buffer$_";
	if( length($Buffer) == $InEdit ) {
	  $InEdit = 0;
	  open(LEF, ">$LocalEditFile");
	  print LEF $Buffer;
	  close(LEF);
	  while( -f $LocalEditFile ) { }
	  $Buffer = "";
	  $InEdit = 0;
	  print "$MUD> ";
	}
      }
      else {
	chop;
	local(@borg) = split;
	$remcmd = shift(@borg);
	if ( $remcmd == 100 ) {
	  $InEdit = shift(@borg);
	  if( ! $InEdit ) {
	    system("touch $LocalEditFile");
	    while( -f $LocalEditFile ) { }
	    $Buffer = "";
	    $InEdit = 0;
	    print "$MUD> ";
	  } 
	}
	elsif( $remcmd == 500 ) {
	    $format = "Directory: %s\n";
	    $tmpx = @borg - 1;
	    if( $tmpx ) {
		while($tmpx--) { 
		    if( $tmpx % 3 == 0 ) { $format = "$format%20s\n"; }
		    else { $format = "$format%20s"; }
		}
	    }
	    printf($format, @borg);
	    print "\n$MUD> ";
	}
	else {
	  local($out) = join(' ', @borg);
	  print "$out\n$MUD> ";
	}
      }
    }
    exit;
  }
}

sub cmdHelp {
    print "CreRemote is a way to work on a MUD without physically\n";
    print "being on that MUD.  When you first issue the CreRemote\n";
    print "command, you are given the CreRemote prompt.  At that time\n";
    print "you are not connected to any MUD.  You can issue the\n";
    print "following commands from the CreRemote prompt:\n";
    print "\tconnect <mud>\n";
    print "\texit\n\n";
    print "Once connect to a MUD, the commands available to you may\n";
    print "vary from MUD to MUD, generally you will have commands like:\n";
    print "cd, ls, update, mkdir, rmdir, rm, mv, cp, etc.\n";
    print "No matter whcih MUD, you will have the command \"edit\"\n";
    print "which allows you to edit your files with your favourite UNIX\n";
    print "editor.  The default is vi, however, it will use the value\n";
    print "of your EDITOR environment variable.\n";
    print "When connecting to a MUD, remember to specify its RCP port,\n";
    print "NOT its MUD port.  This is generally MUD port - 10.\n";
}