Category : OS/2 Files
Archive   : LW22.ZIP
Filename : HOST.CMD
**
** LiveWire 2.1 Host Mode
** REXX procedures language version
**
** You may modify this script file to meed your needs
**
**/
call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
call SysLoadFuncs
/* Return to this point if carrier lost */
LostCarrier:
SetLW(TimeOut,60);
/*Trace I; */ /* Uncomment for debug tracing */
/** Current User Information **/
Name=""
Password=""
Address1=""
Address2=""
PhoneNumber=""
/** Host Mode Configuration Information **/
MessageDir=".\HSTMSGS"
FileDir=".\HSTFILES"
SysopPassword="PASSWORD"
MaxTime=60
LockPort=GetLW(LockedPort);
OldSpeed=GetLW(Speed);
/** Global Variables **/
LogonName=""
LogonPassword=""
/* Check for LOCAL flag */
if (Translate(Arg(1))=='LOCAL') then
SetLW(LocalOnly, On);
else
SetLW(LocalOnly,Off);
/* Main Host Loop */
do forever
LogLW("Host Mode Initiated");
SetLW(FGColor,15);
SetLW(BGColor,1);
ClrScrLW();
SetLW(Speed,OldSpeed);
HangUpLW();
SendLW("AT^M");
DispLW("LiveWire Host / CTRL-BREAK to halt");
if (stream("HOST.CFG",C,"query exists")="") then
MakeConfig();
if (stream("HOST.USR",C,"query exists")="") then
MakeUserList();
ReadConfigFile();
SysMkDir(MessageDir);
SysMkDir(FileDir);
if (GetLW(LocalOnly)) then
Logon();
else do
LogLW("Awaiting a caller");
WaitForRing();
if (DoConnect()) then
Logon();
end
end
exit
WaitForRing:
OldTimeOut=GetLW(TimeOut);
SetLW(TimeOut,0);
x=FindLW("RING");
SetLW(TimeOut,OldTimeOut);
return "";
DoConnect:
/* Send ATA to answer modem */
SendLW("ATA^M");
/* First, see if we have a locked port */
if LockPort then
do
/* LOCKED PORT, DO NOT CHANGE BPS RATE ON CONNECT */
q=FindLW("CONNECT", "NO CARRIER");
if (q=="CONNECT") then
return 1;
else
return 0;
end
else
do
/* Non-Locked port, attempt to parse bps rate */
q=FindLW("CONNECT^M", "CONNECT 1200", "CONNECT 2400",
,"CONNECT 4800", "CONNECT 9600", "CONNECT 19200",
,"CONNECT 38400", "CONNECT 14400", "NO CARRIER");
if (q="CONNECT"||D2C(13)) then
SetLW(Speed, 300);
else
if (q="CONNECT 1200") then
SetLW(Speed, 1200);
else
if (q="CONNECT 2400") then
SetLW(Speed, 2400);
else
if (q="CONNECT 4800") then
SetLW(Speed, 4800);
else
if (q="CONNECT 9600") then
SetLW(Speed, 19200);
else
if (q="CONNECT 38400") then
SetLW(Speed, 38400);
else
if (q="CONNECT 14400") then
SetLW(Speed, 14400);
else
return 0;
return 1;
end
Logon:
/* First, make sure modem is clear before logon */
DelayLW(500);
FlushBufferLW();
SetLW(EchoBack,On);
DiseFile("WELCOME");
LogonName="";
/* Get users' name */
Done=0;
do until (Done)
DiseLW("^M^JEnter your full name > ");
LogonName=Translate(HostReadString("",40));
if (LogonName = "") then Done=0;
else Done=1;
end /* do */
/* Get user record from host user file */
q=stream("HOST.USR",C,"open");
Done=0;
Name="";
do until (Name=LogonName | Lines("HOST.USR")=0)
Name=LineIn("HOST.USR");
Password=LineIn("HOST.USR");
Address1=LineIn("HOST.USR");
Address2=LineIn("HOST.USR");
PhoneNumber=LineIn("HOST.USR");
end /* do */
if (Name=LogonName) then do
LogLW("User Called " Name);
LogonPassword="";
/* Verify caller's password */
do until (LogonPassword=Password)
DiseLW("^M^JEnter your password >");
SetLW(EchoBack, 0);
LogonPassword=Translate(HostReadString("", 40));
SetLW(EchoBack, 1);
end /* do */
end /* Do */
else
do
/* If we could not find username, this must be a new user! */
LogLW("New User Validated");
Name=LogonName;
DiseFile("NEWUSER");
PhoneNumber="";
Address1="";
Address2="";
DiseLW("^M^JPlease fill out the following information for our records^M^J");
DiseLW("Phone Number : ");
PhoneNumber=HostReadString("",40);
DiseLW("^M^JStreet Address : ");
Address1=HostReadString("",70);
DiseLW("^M^JCity, State & ZIP : ");
Address2=HostReadString("",70);
DiseLW("^M^J^M^JYou must now enter a password for your account on this system.^M^J");
DiseLW("If you do not wish to have a password, just press ENTER.^M^J");
Retry="1";
Password="2";
do until (Retry=Password)
DiseLW("^M^JPassword : ");
Password=Translate(HostReadString("",30));
DiseLW("^M^JRe-enter your password for verification : ");
Retry=Translate(HostReadString("",30));
end /* do */
DiseLW("^M^J^M^JThank you...");
/* Write new user information to disk */
q=LineOut("HOST.USR",Name);
q=LineOut("HOST.USR",Password);
q=LineOut("HOST.USR",Address1);
q=LineOut("HOST.USR",Address2);
q=LineOut("HOST.USR",PhoneNumber);
end /* Do */
/* Close user file */
q=stream("HOST.USR","c","close");
MainMenu:
DoHangup=0;
do until (DoHangup)
Option=""
DiseFile("MAINMENU");
DiseLW("Select a function: ");
Option=Translate(HostReadChar());
DiseLW("^M^J");
if Option="H" then DoHangup=1;
if Option="F" then ShowFiles();
if Option="U" then UploadFile();
if Option="D" then DownloadFile();
if Option="P" then PageSysop();
if Option="R" then ReadMessages();
if Option="S" then SendMessage();
if Option="O" then OperatorFuncs();
end;
EndLogon:
LogLW("User Hung Up Normally");
DiseLW("^M^J^M^JThank you for calling... (click)^M^J^M^J");
SetLW(EchoBack,Off);
DelayLW(250);
HangUpLW();
SleepLW(1);
FlushBufferLW();
return "";
OperatorFuncs:
OpPswd=""
OpOption=""
DiseLW("^M^J^M^JEnter system operator password: ");
SetLW(EchoBack,Off);
OpPswd=Translate(HostReadString("",40));
SetLW(EchoBack,On);
if OpPswd=SysopPassword then do
LogLW("User Entered Sysop Operations");
QuitSysop=0;
do until (QuitSysop)
DiseLW(" ^M^J^M^JSystem Operator Functions^M^J^M^J");
DiseLW("^M^J1. Change Message Directory : " MessageDir);
DiseLW("^M^J2. Change File Directory : " FileDir);
DiseLW("^M^J3. Locked Baud Rate (0=No) : " LockPort);
DiseLW("^M^J4. Change Sysop Password : " SysopPassword);
DiseLW("^M^JS Save these options");
DiseLW("^M^JQ Quit without saving^M^J^M^J");
DiseLW("Select option: ");
OpOption=Translate(HostReadChar());
DiseLW("^M^J");
if OpOption="1" then OpGetMsgDir();
if OpOption="2" then OpGetFileDir();
if OpOption="3" then OpGetLockPort();
if OpOption="4" then OpGetPassword();
if OpOption="S" then OpSaveConfig();
if OpOption="Q" then OPQuitConfig();
end
end
return "";
OpGetMsgDir:
DiseLW("Edit message directory (DO NOT END WITH A BACKSLASH)^M^J");
DiseLW("> ");
MessageDir=HostReadString(MessageDir,70);
return "";
OpGetFileDir:
DiseLW("Edit files directory (DO NOT END WITH A BACKSLASH)^M^J");
DiseLW("> ");
FileDir=HostReadString(FileDir,70);
return "";
OpGetLockPort:
DiseLW("Edit locked baud rate (1=on 0=off)^M^J");
DiseLW("> ");
LockPort=GetLW(LockedPort);
LockPort=HostReadString(LockPort,3);
SetLW(LockedPort, LockPort);
return "";
OpGetPassword:
DiseLW("Edit sysop password^M^J");
DiseLW("> ");
SysopPassword=Translate(HostReadString(SysopPassword,70));
return "";
OpSaveConfig:
DiseLW("Saving...");
MakeConfig();
DiseLW("^M^J^M^J");
QuitSysop=1;
return "";
OpQuitConfig:
ReadConfigFile();
DiseLW("^M^J^M^J");
QuitSysop=1;
return "";
SendMessage:
MaxMessage=0
ThisMessage=0
MsgFileName=""
MsgLine=""
MsgOption=""
LogLW("User began a message");
if (stream(MessageDir||"\HOST.MSG",C,"query exists")\="") then do
q=stream(MessageDir||"\HOST.MSG",C,"open");
MaxMessage=LineIn(MessageDir||"\HOST.MSG");
q=stream(MessageDir||"\HOST.MSG",C,"close");
end /* Do */
MaxMessage=MaxMessage + 1;
ThisMessage=MaxMessage;
MsgFileName=MessageDir||"\MESSAGE."||ThisMessage;
q=stream(MsgFileName, C, "open");
DiseLW("^M^J^M^JEnter your message");
DiseLW("^M^JEnd your message by placing a period (.) alone on the last line^M^J");
DiseLW("----------------------------------------------------------------------------^M^J");
q=LineOut(MsgFileName, " ------------------------------");
q=LineOut(MsgFileName, " Message #"||ThisMessage);
q=LineOut(MsgFileName, " From :"||Name);
q=LineOut(MsgFileName, "------------------------------");
q=LineOut(MsgFileName, "^M^J");
FinishedMessage=0;
LineNo=1;
do until(FinishedMessage)
DiseLW(LineNo||"> ");
MsgLine=HostReadString("",75);
DiseLW("^M^J");
if (MsgLine=".") then FinishedMessage=1;
q=LineOut(MsgFileName, MsgLine);
LineNo=LineNo+1;
end
FinishedMessage=0;
do until (FinishedMessage)
DiseLW("^M^JMessage Ended^M^J");
DiseLW("[S]ave Message [A]bort Message : ");
MsgOption=Translate(HostReadChar());
DiseLW("^M^J");
if MsgOption="S" then SaveMessage();
if MsgOption="A" then AbortMessage();
end /* do */
return "";
SaveMessage:
FinishedMessage=1;
q=LineOut(MsgFileName,"------------------------------");
q=stream(MsgFileName,C,"close");
"erase "||MessageDir||"\HOST.MSG"
q=stream(MessageDir||"\HOST.MSG",C,"open write");
q=LineOut(MessageDir||"\HOST.MSG", ThisMessage);
q=stream(MessageDir||"\HOST.MSG",C,"close");
return "";
Goto RetSendMessage
AbortMessage:
FinishedMessage=1;
"erase "||MsgFileName
return "";
ReadMessages:
MaxMessage=1
ThisMessage=1
MsgFileName=""
MsgOption=""
LogLW("User Read Messages");
if (stream(MessageDir||"\HOST.MSG",C,"query exists")="") then do
DiseLW("^M^JSorry, there are no messages.^M^J");
SleepLW(2);
return "";
end /* Do */
q=stream(MessageDir||"\HOST.MSG",C,"open read");
MaxMessage=LineIn(MessageDir||"\HOST.MSG");
q=stream(MessageDIR||"\HOST.MSG",C,"close");
DiseLW("^M^JMessages range from 1 to "||MaxMessage||"^M^J");
DiseLW("Enter message to start reading at : ");
ThisMessage=HostReadString(ThisMessage,3);
DiseLW("^M^J");
DoneReading=0;
do until (DoneReading)
MsgFileName=MessageDir||"\MESSAGE."||ThisMessage
if (stream(MsgFileName,C,"query exists")\="") then do
DiseFile(MsgFileName);
DiseLW("^M^J[ENTER] for next message or [Q] to quit : ");
MsgOption=HostReadChar();
DiseLW("^M^J");
if MsgOption="Q" then DoneReading=1;
end /* Do */
ThisMessage=ThisMessage+1;
if (ThisMessage>MaxMessage) then DoneReading=1;
end;
DiseLW("^M^JEnd of messages.^M^J");
SleepLW(2);
return "";
PageSysop:
LogLW("User Attempted To Page Sysop");
DiseLW("^M^JPaging operator, press Q to abort...^M^J");
DispLW("SYSOP: Press 'C' to chat^M^J");
StopPage=0;
OldTimeOut=GetLW(TimeOut);
SetLW(TimeOut,5);
do until (StopPage)
DispLW("");
Key=Translate(HostReadChar());
if Key="Q" then do
SetLW(TimeOut,OldTimeOut);
return "";
end /* Do */
if Key="C" then StopPage=1;
end
SetLW(TimeOut,0);
DiseLW("^M^J^M^J You are now in chat mode^M^J");
DispLW(" SYSOP: Type ~ (tilde character) on a blank line to end chat mode");
DispLW("^M^J^M^J");
LogLW("Sysop Answered Chat Request");
Key=""
do until Key="~"
Key=""
DiseLW(" ");
Key=HostReadString("",77);
DiseLW("^M^J");
end
SetLW(TimeOut,OldTimeOut);
return "";
UploadFile:
ULProtocol=""
ULFile=""
ULFile2=""
DiseFile("PROT");
DiseLW("Select protocol: ");
ULProtocol=Translate(HostReadChar());
/* Check if this is a batch upload... */
BatchUpload=0;
if ULProtocol="Y" then BatchUpload=1;
if ULProtocol="Z" then BatchUpload=1;
/* Set download directory if this a a batch upload */
if (BatchUpload) then do
OldDLDir=GetLW(DLDir);
SetLW(DLDir, FileDir);
end
else
do
DiseLW("^M^J^M^JName of file you are uploading: ");
ULFile=HostReadString(ULFile,77);
if ULFile="" then return "";
ULFile2=FileDir||"\"||ULFile;
end
DiseLW("^M^JStart your upload now...^M^J");
if (BatchUpload) then
ReceiveFilesLW(ULProtocol, "");
else
ReceiveFilesLW(ULProtocol,ULFile2);
/* Restore old download directory */
if (BatchUpload) then
SetLW(DLDir, OldDLDir);
SleepLW(1);
FlushBufferLW();
return "";
DownloadFile:
DLProtocol=""
DLFile=""
DLFile2=""
DiseFile("PROT");
DiseLW("Select protocol: ");
DLProtocol=HostReadChar();
DiseLW("^M^JName of file you are downloading: ");
DLFile=HostReadString("",77);
if DLFile\="" then do
DiseLW("^M^J");
DLFile2=FileDir||"\"||DLFile;
if (stream(DLFile2,C,"query exists")="") then do
DiseLW("^M^J^M^JThat file does not exist!^M^J");
SleepLW(2);
end /* Do */
else
do
DiseLW("Start download now...^M^J");
SendFilesLW(DLProtocol,DLFile2);
SleepLW(1);
FlushBufferLW();
LogLW("User downloaded file "||DLFile2);
end
end
return "";
ShowFiles:
"DIR "||FileDir||" >host.out"
DiseLW("^M^J^M^J");
DiseFile("HOST.OUT");
DiseLW("^M^JPress [ENTER]");
q=HostReadChar();
return "";
DiseFile:
arg DispFile
q=stream(DispFile,C,"open read");
do until lines(DispFile) = 0
DiseLW(linein(DispFile));
DiseLW("^M^J");
end /* do */
q=stream(DispFile,C,"close");
return "";
ReadConfigFile:
LogLW("Read Configuration File");
DispLW(" Reading configuration file...");
q=stream("HOST.CFG",C,"open read");
MessageDir=LineIn("HOST.CFG");
FileDir=LineIn("HOST.CFG");
SysopPassword=LineIn("HOST.CFG");
MaxTime=LineIn("HOST.CFG");
LockPort=LineIn("HOST.CFG");
q=stream("HOST.CFG",C,"close");
DispLW("OK^M^J");
return "";
MakeConfig:
LogLW("Created Configuration File");
DispLW(" Creating configuration file...");
"erase HOST.CFG"
q=stream("HOST.CFG",C,"open write");
q=LineOut("HOST.CFG", MessageDir);
q=LineOut("HOST.CFG", FileDir);
q=LineOut("HOST.CFG", SysopPassword);
q=LineOut("HOST.CFG", MaxTime);
q=LineOut("HOST.CFG", LockPort);
q=stream("HOST.CFG",C,"close");
DispLW("OK^M^J");
Return "";
MakeUserList:
LogLW("Created User File");
DispLW(" Creating user list file...");
q=stream("HOST.USR",C,"open write");
q=stream("HOST.USR",C,"close");
DispLW("OK^M^J");
Return "";
HostReadChar:
ReturnString=GetKeyLW();
if (ReturnString="TIMEOUT") | ((GetLW(Online)==0) & (\GetLW(LocalOnly))) then
Signal LostCarrier;
return ReturnString;
HostReadString:
arg StartString, MaxStrLen
ReturnString=GetStrLW(StartString, MaxStrLen);
if (ReturnString="TIMEOUT") | ((GetLW(Online)=0) & (\GetLW(LocalOnly))) then
Signal LostCarrier;
return ReturnString;
Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!
This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.
But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/