#!/usr/bin/perl

$Version = "V0.0a (31.03.97)";

############################################################################

sub LoadUserData {
	local(%UserData);

	dbmopen(%UserData, "mmi.userdb", 0600);

	if($UserData{"$User_CALL NAME"} ne "") {
		$User_NAME = $UserData{"$User_CALL NAME"};
	}
	if($UserData{"$User_CALL REJECT"} ne "") {
		$User_REJECT = $UserData{"$User_CALL REJECT"};
	}
	if($UserData{"$User_CALL PROMPT"} ne "") {
		$User_PROMPT = $UserData{"$User_CALL PROMPT"};
	}
	if($UserData{"$User_CALL LOGIN"} ne "") {
		$User_LOGIN = $UserData{"$User_CALL LOGIN"};
	}
	if($UserData{"$User_CALL LANGUAGE"} ne "") {
		$User_LANGUAGE = $UserData{"$User_CALL LANGUAGE"};
	}
	if($UserData{"$User_CALL HELPLEVEL"} ne "") {
		$User_HELPLEVEL = $UserData{"$User_CALL HELPLEVEL"};
	}
	if($UserData{"$User_CALL LINES"} ne "") {
		$User_LINES = $UserData{"$User_CALL LINES"};
	}
	if($UserData{"$User_CALL LF"} ne "") {
		$User_LF = $UserData{"$User_CALL LF"};
	}
	if($UserData{"$User_CALL LASTCHECK"} ne "") {
		$User_LASTCHECK = $UserData{"$User_CALL LASTCHECK"};
	}
	if($UserData{"$User_CALL IDIR"} ne "") {
		$User_IDIR = $UserData{"$User_CALL IDIR"};
	}
	if($UserData{"$User_CALL ILIST"} ne "") {
		$User_ILIST = $UserData{"$User_CALL ILIST"};
	}
	if($UserData{"$User_CALL IREAD"} ne "") {
		$User_IREAD = $UserData{"$User_CALL IREAD"};
	}
	if($UserData{"$User_CALL UDIR"} ne "") {
		$User_UDIR = $UserData{"$User_CALL UDIR"};
	}
	if($UserData{"$User_CALL ULIST"} ne "") {
		$User_ULIST = $UserData{"$User_CALL ULIST"};
	}
	if($UserData{"$User_CALL UREAD"} ne "") {
		$User_UREAD = $UserData{"$User_CALL UREAD"};
	}
	if($UserData{"$User_CALL CHECKOPT"} ne "") {
		$User_CHECKOPT = $UserData{"$User_CALL CHECKOPT"};
	}
	if($UserData{"$User_CALL USERFWD"} ne "") {
		$User_USERFWD = $UserData{"$User_CALL USERFWD"};
	}
	if($UserData{"$User_CALL STATUS"} ne "") {
		$User_STATUS = $UserData{"$User_CALL STATUS"};
	}
	if($UserData{"$User_CALL NOPURGE"} ne "") {
		$User_NOPURGE = $UserData{"$User_CALL NOPURGE"};
	}
	if($UserData{"$User_CALL PW"} ne "") {
		$User_PW = $UserData{"$User_CALL PW"};
	}
	if($UserData{"$User_CALL PWLINE"} ne "") {
		$User_PWLINE = $UserData{"$User_CALL PWLINE"};
	}
	if($UserData{"$User_CALL ECHO"} ne "") {
		$User_ECHO = $UserData{"$User_CALL ECHO"};
	}
	if($UserData{"$User_CALL LOGINS"} ne "") {
		$User_LOGINS = $UserData{"$User_CALL LOGINS"};
	}
	if($UserData{"$User_CALL MRECV"} ne "") {
		$User_MRECV = $UserData{"$User_CALL MRECV"};
	}
	if($UserData{"$User_CALL MREAD"} ne "") {
		$User_MREAD = $UserData{"$User_CALL MREAD"};
	}
	if($UserData{"$User_CALL MSENT"} ne "") {
		$User_MSENT = $UserData{"$User_CALL MSENT"};
	}
	dbmclose(%UserData);
}

############################################################################

sub SetUserDefaults {
	$User_MYBBS = "<not set>";
	$User_MYBBS_TIME = 0;
	$User_READLOCK = 0;
	$User_RL_FRIENDS = "";
	$User_NAME = "";
	$User_REJECT = "";
	$User_PROMPT = "(%b)-->";
	$User_LOGIN = "D";
	$User_LANGUAGE = "DL";
	$User_HELPLEVEL = 2;
	$User_LINES = 0;
	$User_LF = 0;
	$User_LASTLOGIN = 0;
	$User_LASTQUIT = 0;
	$User_LASTCHECK = 0;
	$User_IDIR = "ADEKLMWYZ";
	$User_ILIST = "ABDJQTWXY";
	$User_IREAD = "ABDEILMPRTUWYZ";
	$User_UDIR = "ADKLMTWYZ";
	$User_ULIST = "ABDJQTWXY";
	$User_UREAD = "ABDEILMPRTUWYZ";
	$User_CHECKOPT = "ABDEJLMWY";
	$User_USERFWD = "";
	$User_STATUS = 0;
	$User_NOPURGE = 0;
	$User_PW = "";
	$User_PWLINE = 0;
	$User_ECHO = 0;
	$User_LOGINS = 0;
	$User_MRECV = 0;
	$User_MREAD = 0;
	$User_SENT = 0;
}

############################################################################

sub SaveOption {
	local(%UserData);

	dbmopen(%UserData, "mmi.userdb", 0600);

	$UserData{"$User_CALL $_[0]"} = $_[1];

	dbmclose(%UserData);
}

############################################################################

sub SortOptions {
	local($Result, $Opt);

	foreach $Opt (sort(split(//, $_[0]))) {
		if($Result !~ /$Opt/) {
			$Result .= $Opt;
		}
	}

	return($Result);
}

############################################################################

sub InsChar {
	local($Result, $Char);

	foreach $Char (split(//, $_[0])) {
		$Result .= $Char . $_[1];
	}

	return($Result);
}

############################################################################

sub FilterOpt {
	local ($Result, $OptByte);

	foreach $OptByte (split(//, $_[0])) {
		if($_[1] =~ /$OptByte/) {
			$Result .= $OptByte;
		}
	}

	return($Result);
}

############################################################################

sub SplitCmdArg {
	local($Cmd, $ArgLine);

	$ArgLine = substr($_[0], index("$_[0] ", " "));
	$ArgLine =~ s/^ +| +$//g;

	$Cmd = uc(substr($_[0], 0, index("$_[0] ", " ")));

	return($Cmd, $ArgLine);
}

#############################################################################

sub FillString {
	if($_[3] eq "r") {
		return($_[2] x ($_[1] - length($_[0])) . $_[0]);
	} else {
		return($_[0] . $_[2] x ($_[1] - length($_[0])));
	}
}

#############################################################################

sub IfNumber {
	local($Msg, $Compare, $NOT);

	$Compare = $_[1];

	if($_[1] =~ /^-/) {
		$NOT = 1;
		$Compare = substr($Compare, 1);
	}

	$Msg = substr($_[0], 0, 3);

	if($Msg eq $Compare) {
		if(! $NOT) { print("$_[2]\n"); }
		return($NOT - 0);
	} else {
		if($NOT) { print("$_[2]\n"); }
		return($NOT - 1);
	}
}

##############################################################################

sub ShowUserSettings {
	local($Min, $Hour, $Day, $Month, $Year, $Dummy);

	($Dummy, $Min, $Hour, $Day, $Month, $Year, $Dummy, $Dummy, $Dummy)
		= localtime($User_MYBBS_TIME);
	printf("Home-BBS.......(A F).%s (%2.2d.%2.2d.%2.2d %2.2d:%2.2d)\n",
	       uc($User_MYBBS), $Day, $Month + 1, 1900 + $Year, $Hour, $Min);

	printf("Reject-boards..(A R).%s\n", $User_REJECT);

	printf("Prompt.........(A P).%s\n", $User_PROMPT);

	printf("Login-command..(A C).%-20s", $User_LOGIN);

	printf("Name........(A N).\n", $User_NAME);

	printf("Language.......(A S).%-20s", $User_LANGUAGE);

	printf("Lines.......(A L).%d\n", $User_LINES);

	printf("Helplevel......(A H).%-20d", $User_HELPLEVEL);

	printf("Linefeeds..(A LF).%d\n", $User_LF);

	# DIR/LIST/READ/CHECK-Optionen
	printf("Info-dir......(A ID).%-20s", $User_IDIR);
	printf("User-dir...(A UD).%s\n", $User_UDIR);
	printf("Info-list.....(A IL).%-20s", $User_ILIST);
	printf("User-list..(A UL).%s\n", $User_ULIST);
	printf("Info-read.....(A IR).%-20s", $User_IREAD);
	printf("User-read..(A UR).%s\n", $User_UREAD);
	printf("Check-opt.....(A CH).%s\n", $User_CHECKOPT);

	printf("User-Forward..(A UF).%s\n", $User_UFWD);

	printf("Status........(A ST).%-20d", $User_STATUS);

	printf("No-Purge...(A NO).%d\n", $User_NOPURGE);

	printf("Passwordlen...(A PW).%-20d", length($User_PW));

	printf("FHold......(A FH).%d\n", $User_FHOLD);

	printf("Readlock.....(A REA).%d\n", $User_READLOCK);

	printf("RL-Friends...(A RLF).%s\n", $User_RL_FRIENDS);

	($Dummy, $Min, $Hour, $Day, $Month, $Year, $Dummy, $Dummy, $Dummy)
		= localtime($User_LASTCHECK);
	printf("Last D N...(Check)...%2.2d.%2.2d.%2.2d %2.2d:%2.2d\n",
	       $Day, $Month + 1, 1900 + $Year, $Hour, $Min);

	($Dummy, $Min, $Hour, $Day, $Month, $Year, $Dummy, $Dummy, $Dummy)
		= localtime($User_LASTQUIT);
	printf("Last QUIT............%2.2d.%2.2d.%2.2d %2.2d:%2.2d\n",
	       $Day, $Month + 1, 1900 + $Year, $Hour, $Min);

	($Dummy, $Min, $Hour, $Day, $Month, $Year, $Dummy, $Dummy, $Dummy)
		= localtime($User_LASTLOGIN);
	printf("Last login...........%2.2d.%2.2d.%2.2d %2.2d:%2.2d\n",
	       $Day, $Month + 1, 1900 + $Year, $Hour, $Min);

	printf("Logins %d, mails received %d, read %d, sent %d\n",
	       $User_LOGINS, $User_MRECV, $User_MREAD, $User_MSENT);
}

##############################################################################

sub GetUserData {
	local($UserData, $Par, @Val);

	while($UserData ne ".") {
		($Par, @Val) = split(/ +/, $UserData);
		$Par =~ y/a-z/A-Z/;

		if($Par eq "") {
		} elsif($Par eq "MYBBS") {
			$User_MYBBS = @Val[0];
			$User_MYBBS_TIME = @Val[1];
			$User_MYBBS_TIME =~ s/\)|\(//g;
		} elsif($Par eq "READLOCK") {
			$User_READLOCK = @Val[0];
		} elsif($Par eq "READLOCK-FRIENDS") {
			$User_RL_FRIENS = @Val[0];
		} elsif($Par eq "LASTLOGIN") {
			$User_LASTLOGIN = @Val[0];
		} elsif($Par eq "LASTQUIT") {
			$User_LASTQUIT = @Val[0];
		} else {
			print("WARNING: Unknown User-Data: $Par\n");
		}

		$UserData = <MAILBOX>;
		chop($UserData);
	}


}

##############################################################################

sub ShowHelp {
	print(

"Help                                       show this text\n".
"HEAder <BID>                               show the header of a mail\n".
"List <Board>                               show the mails of a bulletin board\n".
"Quit                                       terminate mailbox session\n".
"Read <BID>                                 show the contens of a mail\n".
"Send <Board> [[@] addr] [[#] lt] [title]   create a mail\n".
"Version                                    show version information\n"

             )
}

##############################################################################

sub OpenMBsocket {
	local($Port, $rawclient, $rawserver, $clientaddr, $serveraddr);

	$Port = $_[0];
	($d1, $d2, $prototype) = getprotobyname("tcp");
	($d1, $d2, $d3, $d4, $rawclient) = gethostbyname("dg4iad");
	($d1, $d2, $d3, $d4, $rawserver) = gethostbyname("db0hdb.ampr.org");
	$clientaddr = pack("Sna4x8", 2, 0, $rawclient);
	$serveraddr = pack("Sna4x8", 2, $Port, $rawserver);
	socket(MAILBOX, 2, 1, $prototype) || die("No socket");
	bind(MAILBOX, $clientaddr) || die("Can't bind");
	connect(MAILBOX, $serveraddr);
	select(MAILBOX);
	$| = 1;			# Pufferung ausschalten
	select(STDOUT);
}

##############################################################################

sub ArgLine2SendData {
	local($Board, $Distrib, $Lifetime, $Title, $ParaNam, $Para,
	      $NextPara, @Arg);

	# Titel wird nach und nach herausgefiltert..
	$Title = $_[0];

	@Arg = split(/ +/, $_[0]);

	$Board = $Arg[0];
	$Title =~ s/$Board//;
	$Board =~ y/a-z/A-Z/;

	$Distrib = $MBoxCall;	# Kein Verteiler
	$LifeTime = "-1";	# Lifetime nicht angegeben

	for($ParaNum = 1;$ParaNum < @Arg;$ParaNum++) {
		$Para = $Arg[$ParaNum];
		$NextPara = $Arg[$ParaNum + 1];

		if(($Para eq "@") &&
		   ($NextPara =~ /^[A-Za-z0-9]{1,6}$/)) {
			$ParaNum++;
			$Distrib = $NextPara;
			$Title =~ s/$Para//;
			$Title =~ s/$NextPara//;
		} elsif($Para =~ /^@[A-Za-z0-9]{1,6}$/) {
			$Distrib = substr($Para, 1);
			$Title =~ s/$Para//;
		} elsif(($Para eq "#") &&
		        ($NextPara =~ /^[0-9]{1,3}$/)) {
			$ParaNum++;
			$LifeTime = $NextPara;
			$Title =~ s/$Para//;
			$Title =~ s/$NextPara//;
		} elsif($Para =~ /^#[0-9]{1,3}$/) {
			$LifeTime = substr($Para, 1);
			$Title =~ s/$Para//;
		} else {
			$ParaNum = 999;	# Titel faengt an
		}
	}

	$Distrib =~ y/a-z/A-Z/;
	$Title =~ s/^ +| +$//g;

	if($Title eq "") {
		print("Subject > ");
		$Title = <STDIN>;
	}

	return($Board, $Distrib, $LifeTime, $Title);
}

##############################################################################

sub stdin2mail {
	local($Resp, $MailInput, $InputBig);
	local($Board, $Distrib, $LifeTime, $Title) = @_;

	print("Mail to $Board @ $Distrib\n");
	print("Lifetime: $LifeTime\n");
	print("Title: $Title\n");

	print MAILBOX ("PUTMAIL $Board $Distrib $LifeTime\n");
	$Resp = <MAILBOX>;

	IfNumber($Resp, "111", $Msg_InternalError) || return;
	IfNumber($Resp, "115", "Permission denied.") || return;

	print MAILBOX ("$Title\n");
	$Resp = <MAILBOX>;

	IfNumber($Resp, "115", "Permission denied.") || return;
	IfNumber($Resp, "-113", $Msg_InternalError) || return;

	$MailInput = "";
	while($InputBig !~ /\*\*\*END\n|NNNN\n|\.\n/) {
		print MAILBOX ($MailInput);
		$MailInput = <STDIN>;
		$InputBig = uc($MailInput);
	}

	print MAILBOX (".\n");

	$Resp = <MAILBOX>;
	IfNumber($Resp, "-116", $Msg_InternalError) || return;

	print("Ok - mail stored.\n");
}

##############################################################################

sub ShowVersion {
	local($BoxReply, $Resp);

	print MAILBOX ("VERSION\n");

	$Resp = <MAILBOX>;
	IfNumber($Resp, "-121", $Msg_InternalError) || return;

	$BoxReply = "";
	until($BoxReply eq ".\n") {
		print("$BoxReply");
		$BoxReply = <MAILBOX>;
	}

	print("Client: mmi $Version - (C) by DG4MMI 1997\n");
}

##############################################################################

sub ListBoard {
	local($BID, $Board, $Distrib, $Sender, $Date, $Length, $Life, $Title);
	local($Number, $ListLine, $BoxReply, $Resp, $HeadLine);
	local($Min, $Hour, $Day, $Month, $Year, $Dummy);
	local($Board) = $_[0];

	$NewMailFlag = "0";
	if($_[1] =~ "Q") {
		$NewMailFlag = $User_LASTLOGIN;
	}
	print MAILBOX ("NEWMAIL $NewMailFlag $Board LONG\n");

	$Resp = <MAILBOX>;
	IfNumber($Resp, "-132", $Msg_InternalError) || return;

# Noch nicht implementierte List-Optionen:
# C   Kein Seitenstop
# F   Forwardpartner, von dem die Mail empfangen wurde
# G   gelesene Mails nicht anzeigen
# N   nur Mails anzeigen, bei denen der Empfaenger Home-BBS nicht hier hat
# O   ??? Parameter bewirkt bei der BCM gar nichts ???
# Q   nur Mails seit dem letzten Login anzeigen
# R   nur mit Remote-Erase geloeschte Mails anzeigen
# S   Auch Unterverzeichnisse anzeigen
# V   Auch geloeschte Mails anzeigen

	if($_[1] !~ "H") {
		print("Directory of ". uc($_[0]) . ":\n");
	}

	if($_[1] =~ "J") {
		$HeadLine = "  No" . InsChar($_[1], "\x00") . "\n\n";

		$HeadLine =~ s/W\x00/Title/;
		$HeadLine =~ s/X\x00/ /;
		$HeadLine =~ s/M\x00/  forw./;
		$HeadLine =~ s/L\x00/ life/;
		$HeadLine =~ s/I\x00/ BID          /;
		$HeadLine =~ s/B\x00/  bytes/;
		$HeadLine =~ s/Z\x00 / lins/;
		$HeadLine =~ s/T\x00/ time /;
		$HeadLine =~ s/Y\x00/   /;
		$HeadLine =~ s/D\x00/ date /;
		$HeadLine =~ s/E\x00/   board   /;
		$HeadLine =~ s/A\x00/ call  /;
		$HeadLine =~ s/K\x00/ /;

		print($HeadLine);
	}


	until($BID eq ".") {

		if($ListLine ne "") {
			print(substr ($ListLine, 0, 79) . "\n");
		}

		$Number++;

		$BID = <MAILBOX>;
		chop($BID);

		if($BID ne ".") {

			$BoxReply = <MAILBOX>;
			chop($BoxReply);
			$BoxReply =~ s/^ +| +$//g;

			($Board, $Distrib, $Sender, $Date, $Length, $Life)
				= split(/ +/, $BoxReply);

			$Title = <MAILBOX>;
			$Title =~ s/^ +| +$//g;
			chop($Title);

			($Dummy, $Min, $Hour, $Day, $Month, $Year, $Dummy, $Dummy, $Dummy)
				= localtime($Date);

			$ListLine = "-" . InsChar($_[1], "\x00");
			$ListLine =~ s/W\x00/ $Title/;
			$ListLine =~ s/X\x00/ /;
			$ListLine =~ s/M\x00/" @" . FillString($Distrib, 6, " ")/e;
			$ListLine =~ s/L\x00/" #" . FillString($Life, 3, "0", "r")/e;
			$ListLine =~ s/I\x00/" \$" . FillString($BID, 12, " ")/e;
			$ListLine =~ s/B\x00/FillString($Length, 7, " ", "r")/e;
		# vjboxd gibt nicht die Zeilenanzahl aus!
			$ListLine =~ s/Z\x00/" " .  FillString($Lines, 5, " ", "r")/e;
			$ListLine =~ s/T\x00/" " .
				             FillString($Hour, 2, "0", "r") .
				             ":" .
				             FillString($Min, 2, "0", "r")/e;
			$ListLine =~ s/Y\x00/"." . FillString($Year, 2, "0", "r")/e;
			$ListLine =~ s/D\x00/" " . FillString($Day, 2, "0", "r") .
				          "." .
				          FillString($Month + 1, 2, "0", "r")/e;
			$ListLine =~ s/E\x00/" > " . FillString($Board, 8, " ")/e;
			$ListLine =~ s/A\x00/" " . FillString($Sender, 6, " ")/e;
			$ListLine =~ s/K\x00/\)/;
			$ListLine =~ s/-/FillString($Number, 4, " ", "r")/e;
		}
	}
}

##############################################################################

sub ReadMail {
	local($BoxReply, $Resp);
	local($Mail) = $_[0];

	print MAILBOX ("GETMAIL $Mail\n");

	$Resp = <MAILBOX>;
	IfNumber($Resp, -"143", "Failed reading mail - reason: $Resp") ||
		return;

	$BoxReply = "";
	until($BoxReply eq ".\n") {
		print("$BoxReply");
		$BoxReply = <MAILBOX>;
	}
}

##############################################################################

sub ReadHeader {
	local($BoxReply, $Resp);
	local($Mail) = $_[0];

	print MAILBOX ("HEADER $Mail\n");

	$Resp = <MAILBOX>;
	IfNumber($Resp, "-153", "Error reading header - reason: $Resp") ||
		return;

	$BoxReply = "";
	until($BoxReply eq ".\n") {
		print("$BoxReply");
		$BoxReply = <MAILBOX>;
	}
}

##############################################################################

sub SetUser_MYBBS {
	local($Resp);

	print MAILBOX ("MYBBS " . uc($_[0]) . "\n");
	$Resp = <MAILBOX>;

	IfNumber($Resp, "-512", "Invalid Parameter!") || return;

	$User_MYBBS = uc($_[0]);

	print("Ok - Home-BBS set to " .  uc($_[0]) . ".\n");
}

##############################################################################

sub SetUser_READLOCK {
	local($Resp);

	print MAILBOX ("READLOCK $_[0]\n");
	$Resp = <MAILBOX>;

	IfNumber($Resp, "-523", "Invalid Parameter!") || return;

	$User_READLOCK = $_[0];

	print("Ok - ReadLock set to $_[0].\n");
}

##############################################################################

sub Cmd_DIR {
	local($Cmd, $ArgLine, $Cmd_, $CmdTry, $Command, @DirCmd);

	local($OptOrder) = "KAEDYTZBILMXW";

	@DirCmd = ("", "AFTER", "BOARDS", "MESSAGES", "NEWS", "PATH", "SENT",
	           "USERS");

	($Cmd, $ArgLine) = SplitCmdArg($_[0]);
	$Cmd_ = quotemeta($Cmd);

	$Command = "JUNK!";
	foreach $CmdTry (reverse(@DirCmd)) {
		if($CmdTry =~ /^$Cmd_/) { $Command = $CmdTry; }
	}

	if($Command eq "") {
		
	} elsif($Command eq "AFTER") {
	} elsif($Command eq "BOARDS") {
	} elsif($Command eq "MESSAGES") {
	} elsif($Command eq "NEWS") {
	} elsif($Command eq "PATH") {
	} elsif($Command eq "SENT") {
	} elsif($Command eq "USERS") {
	} else {
		ListBoard($Cmd, FilterOpt($OptOrder, $User_IDIR));
	}


}

##############################################################################

sub Cmd_LIST {
	local($OptOrder) = "KAEDYTZBILMXW";

	ListBoard($_[0], FilterOpt($OptOrder, $User_ILIST));
}

##############################################################################

sub Cmd_CHECK {
	local($OptOrder) = "KAEDYTMBZILXW";

}

##############################################################################

sub Cmd_ALTER {
	local($Cmd, $ArgLine, $Command, @AlterCmd);

	@AlterCmd = ("", "CHECK", "COMMAND", "DEFAULT", "DELETE", "ECHO",
	             "FORWARD", "HELPLEVEL", "IDIR", "ILIST", "IREAD", "LF",
	             "LINES", "NAME", "MYBBS", "PROMPT", "PW", "PWLINE",
	             "REJECT", "READLOCK", "SPEECH", "UDIR", "ULIST", "UREAD");

	($Cmd, $ArgLine) = SplitCmdArg($_[0]);
	$Cmd = quotemeta($Cmd);

	$Command = "";
	foreach $CmdTry (reverse(@AlterCmd)) {
		if($CmdTry =~ /^$Cmd/) { $Command = $CmdTry; }
	}

	if($Command eq "") {
		ShowUserSettings;
	} elsif($Command eq "CHECK") {
		$ArgLine =~ y/a-z/A-Z/;
		if($ArgLine !~ /[ABDEHIJKLMTWXYZ]+/) {
			print("Invalid parameter!");
			return;
		}
		$User_CHECKOPT = SortOptions($ArgLine);
		SaveOption("CHECKOPT", $User_CHECKOPT);
	} elsif($Command eq "COMMAND") {
		$User_LOGIN = substr($ArgLine, 0, 19);
		SaveOption("LOGIN", $User_LOGIN);
		print("Login-command set to $User_LOGIN\n");
	} elsif($Command eq "DEFAULT") {
	} elsif($Command eq "DELETE") {
	} elsif($Command eq "ECHO") {
		if($ArgLine !~ /^[01]$/) {
			print("Invalid parameter!\n");
			return;
		}
		$User_ECHO = $ArgLine;
		SaveOption("ECHO", $User_ECHO);
		print("Ok - ECHO set to $User_ECHO.");
	} elsif($Command =~ /FORWARD|MYBBS/) {
		SetUser_MYBBS($ArgLine);
	} elsif($Command eq "HELPLEVEL") {
		if($ArgLine !~ /^[012]$/) {
			print("Invalid parameter!\n");
			return;
		}
		$User_HELPLEVEL = $ArgLine;
		SaveOption("HELPLEVEL", $User_HELPLEVEL);
		print("Ok - HELPLEVEL set to $User_HELPLEVEL.");
	} elsif($Command eq "IDIR") {
		$ArgLine =~ y/a-z/A-Z/;
		if($ArgLine !~ /[ABDEHIJKLMTWXYZ]+/) {
			print("Invalid parameter!");
			return;
		}
		$User_IDIR = SortOptions($ArgLine);
		SaveOption("IDIR", $User_IDIR);
	} elsif($Command eq "ILIST") {
		$ArgLine =~ y/a-z/A-Z/;
		if($ArgLine !~ /[ABDEHIJKLMTWXYZ]+/) {
			print("Invalid parameter!");
			return;
		}
		$User_ILIST = SortOptions($ArgLine);
		SaveOption("ILIST", $User_ILIST);
	} elsif($Command eq "IREAD") {
###
	} elsif($Command eq "LF") {
		if($ArgLine !~ /^[0-9]$/) {
			print("Invalid parameter!\n");
			return;
		}
		$User_LF = $ArgLine;
		SaveOption("LF", $User_LF);
		print("Ok - LineFeed set to $User_LF.");
	} elsif($Command eq "LINES") {
		if($ArgLine !~ /^[0-9]{1,3}$/) {
			print("Invalid parameter!\n");
			return;
		}
		$User_LINES = $ArgLine;
		SaveOption("LINES", $User_LINES);
		print("Ok - pagebreak set to $User_LINES lines.");
	} elsif($Command eq "NAME") {
###
	} elsif($Command eq "PROMPT") {
		$User_PROMPT = substr($ArgLine, 0, 60);
		SaveOption("PROMPT", $User_PROMPT);
		print("Prompt set to $User_PROMPT\n");
	} elsif($Command eq "PW") {
		$User_REJECT .= $ArgLine;
		$User_REJECT = substr($User_REJECT, 0, 39);
		SaveOption("PW", $User_PW);
		print("Current password-length" . length($User_PW) . "\n");
	} elsif($Command eq "PWLINE") {
		if($ArgLine !~ /^[01]$/) {
			print("Invalid parameter!\n");
			return;
		}
		$User_PWLINE = $ArgLine;
		SaveOption("PWLINE", $User_PWLINE);
		print("Ok - PWLINE set to $User_PWLINE.");
	} elsif($Command eq "REJECT") {
		$User_REJECT = substr($ArgLine, 0, 1000);
		SaveOption("REJECT", $User_REJECT);
		print("Reject-Boards set to $User_REJECT\n");
	} elsif($Command eq "READLOCK") {
		SetUser_READLOCK($ArgLine);
	} elsif($Command eq "SPEECH") {
	} elsif($Command eq "UDIR") {
		$ArgLine =~ y/a-z/A-Z/;
		if($ArgLine !~ /[ABDEHIJKLMTWXYZ]+/) {
			print("Invalid parameter!");
			return;
		}
		$User_UDIR = SortOptions($ArgLine);
		SaveOption("UDIR", $User_UDIR);
	} elsif($Command eq "ULIST") {
		$ArgLine =~ y/a-z/A-Z/;
		if($ArgLine !~ /[ABDEHIJKLMTWXYZ]+/) {
			print("Invalid parameter!");
			return;
		}
		$User_ULIST = SortOptions($ArgLine);
		SaveOption("ULIST", $User_ULIST);
	} elsif($Command eq "UREAD") {
###
	} else {
		print("Unknown option.\n");
	}

}

##############################################################################

OpenMBsocket(4711);

$Msg_InternalError = "INTERNAL ERROR - PLEASE REPORT THIS TO DG4MMI!";

# Moegliche Befehle in Reihenfolge der Prioritaet
@Cmd = ("", "ALTER", "CHECK", "DIR", "HELP", "HEADER", "LIST", "MYBBS", "QUIT",
        "READ", "READLOCK", "SEND", "VERSION");

if($ARGV[0] eq "") {
	print("Syntax: mmi <call>\n");
	exit;
}

$User_CALL = $ARGV[0];
$User_CALL =~ y/a-z/A-Z/;

SetUserDefaults;
LoadUserData;

print MAILBOX ("LOGIN $ARGV[0]\n");

$Line = <MAILBOX>;
print ($Line);

$Line = <MAILBOX>;
chop($Line);
($Num, $Addr, $Vers) = split(/ +/, $Line);
print("Mailbox-address: $Addr\n");
print("Mailbox-version: $Vers\n");
print("Client: mmi $Version - (C) by DG4MMI 1997\n");

$MBoxCall = substr($Addr, 0, index($Addr, "."));
$MBoxCall =~ y/a-z/A-Z/;

GetUserData;

while($Command ne "QUIT") {

	print ("\n$User_CALL de $MBoxCall> ");

	$CmdLine = <STDIN>;
	chop($CmdLine);

	($Cmd, $ArgLine) = SplitCmdArg($CmdLine);
	$Cmd = quotemeta($Cmd);

	# Evtl. abgekuerzten Befehl auswerten
	$Command = "JUNK!";
	foreach $CmdTry (reverse(@Cmd)) {
		if($CmdTry =~ /^$Cmd/) { $Command = $CmdTry; }
	}

	if($Command eq "") {
	} elsif($Command eq "ALTER") {
		Cmd_ALTER($ArgLine);
	} elsif($Command eq "CHECK") {
		Cmd_CHECK($ArgLine);
	} elsif($Command eq "DIR") {
		Cmd_DIR($ArgLine);
	} elsif($Command eq "HELP") {
		ShowHelp;
	} elsif($Command eq "HEADER") {
		ReadHeader($ArgLine);
	} elsif($Command eq "LIST") {
		Cmd_LIST($ArgLine);
	} elsif($Command eq "MYBBS") {
		SetUser_MYBBS($ArgLine);
	} elsif($Command eq "QUIT") {
		print("73!\n\n");
	} elsif($Command eq "READ") {
		ReadMail($ArgLine);
	} elsif($Command eq "READLOCK") {
		SetUser_READLOCK($ArgLine);
	} elsif($Command eq "SEND") {
		stdin2mail(ArgLine2SendData($ArgLine));
	} elsif($Command eq "VERSION") {
		ShowVersion;
	} else {
		print ("Invalid Command!\n");
	}

}

close(MAILBOX);
