A TALK010.A TALK010.AGBACKUP/NOASSIST/COMMENT=TALK V1.0 Installation Saveset/INTER/LOG/VERIFY TALK.EXE,TALK_SERVER.EXE,TALK.CLD,KITINSTAL.COM,TALK_STARTUP.COM,TALK_IVP.COM,TALK.HLP,TALK010.RELEASE_NOTES,TALK010.SRC,TALK.OBJ,TALK_SERVER.OBJ,TALK_COMMON.OBJ,TALK_MSG.OBJ,SCREEN.OBJ,NETERROR.OBJ SYS$DISK:[]TALK010.A/SAVE/LABEL=TALK/BLOCK=8192/GROUP=25TALK V1.0 Installation Saveset R602MS5U  `8V5.2 _CMCCVB::  _$255$DUA28: V5.2 D*[R602MS5U.TALK]TALK.EXE;5+,.*/ 4*+- 0123 KPWO+56Y77`>889G HJD TALK010.A [R602MS5U.TALK]TALK.EXE;5*0DX0205(E7P7TALKV1.0E705-05 ( ) ?! LIBRTL_001! MTHRTL_001+g PASRTL_001!f SMGSHR_0013V1.031-JAN-1990IP:IP:0.0.0.0VersionDebugSYS$INPUTSYS$INPUT0000 00:00:.00NetAddress@0.0.0.0Interval0000 00:00:.00TimeOutOld_Protocolh^м\VWXY(T& (zz\dYPP =,D@ HB@ H1@ H @ yH@ hHݏ`0<~ P&&W<$h1<~ Pn&W P@&X  ~nPQ{ PP~GPR  y~pngPQ{ PP~vGB`IP%.P VVV:12+-{@ GVW&h\V X1VhP4%V 4@ @.%(tl[(4H@ UF,@ 8FP^ԭZFm^\VW?$쟭ߏD8P쟭 谏쟭Џ 䟭7P쟭ch@ |p@ x@ @ @ "@ \@ @ @ @ (@ ^8FAILED'operation failed for unexplained reason0UNKREQrequest has invalid type value6BADVERS$request has invalid protocol version0BADADDRrequest has invalid addr value8 BADCTLADDR"request has invalid ctl_aG TALK010.A [R602MS5U.TALK]TALK.EXE;5*ddr value4 NORESPONSEno response from remote machineHNOT_CRT5your terminal type has not been set or not a terminalJ UNREACHABLE4remote system not reachable or does not support talk6 INVALIDNUM number must be greater than zero*NOT_HEREcallee is not logged in* NO_ANSWERno answer from callee>MACHUNK+strange - the remote system doesn't know me6 PERMDENIED!callee has disabled talk requests$RINGINGringing your party, SWITCHINGtrying old talk protocol VERSIONversion is !AS:LOOK_UP(checking for invitation on remote system: LEAVE_INVITE"leaving invitation on local system,ANNOUNCEsending announce message4DELETE#deleting invitation on local system2SUCCESS operation completed successfully6 UNKNOWN_SENTunknown request packet sent (?)8 UNKNOWN_RECV unknown response packet received@ TALK(`8{c`cc c(c0c8cH@cvHcPcXc `c6hc\pc~xccccDctccccc,ȀcLЀcn؀cccccDctccc c<(c0c8c@c HcJ Pc Xc `c hcd pc xc c. cd c c c2 c| c c c0 ȁcr Ёc ؁ccNcccc\ccc cP(c0c*IRInsufficient system resources,IFCInvalid network function code"UCTUnable to create TCB"IFSInvalid foreign port ILPInvalid local port.NUCNon-unique connection specified.CSE Connection table space exhausted:NOPRV*No privilege for access to well-known port2CIP#Connection illegal for this process(CDEConnection does not exist,CRConnection RESET by remote host&FSUForeign host unspecified"UNNUnknown network node<VTF-Valid-TCB table full (all connections in use)0CREF!Connection refused by remote host4CCAN%Connection cancelled by process abort&FIPIO Function in Progress0BTS"User specified buffer is Too small&IHIInvalid known host indexBDIBad device index*EPDError processing device dump&URCDestination Unreachable$IGFInvalid GTHST function UNAUnknown host name"UNUUnknown host number6CC)Connection is closing - operation invalid CTOConnection TimeOut TWTTime-Wait TimeOut TENet ACP is Exiting@FTO2User function timeout. Network event didn't happen0NYI!User function not yet implemented4NOPN$UDP wildcard connection not yet open,NOINAInternet access not allowed*NOANAARPANET access not allowed>NOADR.Name lookup not yet complete - no host addressDGTHFUL2GTHST queue full - can't queue name/address lookup&DAENET$DUMP argument error*NMLTOHost name lookup time-out<NSEXIT+Name lookup failure: name server is exiting>NONS/Name lookup failure: name server is not running@NSQFULL.Name lookup failure: name server queue is fullJDSDOWN9Name not found in host table (domain service unavailable)FDSNODS4Domain service: no domain servers could be contactedJDSINCOMP7Domain service: received incomplete domain server replyDDSNOADDR0Domain service: no addresses found for host name@DSNONAME,Domain service: no name found for IP addressFDSFMTERR3Domain service: domain server returned format error6DSSRVERR#Domain service: domain server error<DSNAMERR)Domain service: name error (no such name)JDSNOTIMP6Domain service: domain server returned not implementedHDSREFUSD5Domain service: domain server refused to resolve nameJDSNONSRV6Domain service: no usable servers returned by referral8DSUNKERR$Domain service: unknown server errorBDSREFEXC/Domain service: maximum referral limit exceeded:GREENERR'Name lookup failure, unknown error codeB GP_INVREQ-Name lookup: invalid request (internal error)H GP_INVINF4Name lookup: invalid host info item (internal error)L GP_INVNAM8Name lookup: invalid domain name syntax (internal error)H GP_INVADR4Name lookup: invalid address syntax (internal error)H GP_INVMBX4Name lookup: invalid mailbox syntax (internal error)F GP_INVCLS2Name lookup: invalid domain class (internal error)B GP_RSBUSY-Name lookup: resolver to busy to handle query> GP_NONMSR*Name lookup: no name server could be foundF GP_NOHINF2Name lookup: request host info item does not exist4 GP_NOTFND Name lookup: host name not found2 GP_UNKMBXName lookup: mailbox not foundH GP_NOTIMP3Name lookup: unimplemented request (internal error)> GP_TOOBIG)Name lookup: request data too big for UDP@ GP_NSDOWN+Name lookup: all name servers declared down,NRTNo route found for destinationcIPACP@@ `pHPx(0PxxN @LIBRTLMTHRTLPASRTLSMGSHR`\? TALK010.A   [R602MS5U.TALK]TALK_SERVER.EXE;5 *[R602MS5U.TALK]TALK_SERVER.EXE;5+, ./ 4- 0123 KPWO56@477 889G HJ+ TALK010.A   [R602MS5U.TALK]TALK_SERVER.EXE;5BS0DX0205(c7: TALK_SERVERX0.1c705-05   ?! LIBRTL_001! MTHRTL_001+g PASRTL_001<V1.031-JAN-1990INTERACTIVE0000 00:15:00.00IP:IP:** TALK/OLD ** is ringing you<^13P s3P  O~Fn=PQ{ PP~3PR  "~nPQ{ PP~O3B`ݏ`1<~ PMݏ` 1cV V̀(Vi͂- n1pభ䭼ߏ'Pߏϙ1Џ ҭߏ&Pߏ_1K- n - Эߏ/1ԭԭԭ ȭh@ |p@ x@ @ @ "@ \@ @ @ @ (@ ^8FAILED'operation failed for unexplained reason0UNKREQrequest has invalid type value6BADVERS$request has invalid protocol version0BADADDRrequest has invalid addr value8 BADCTLADDR"request has invalid ctl_addr value4 NORESPONSEno response from remote machineHNOT_CRT5your terminal type has not been set or not a terminalJ UNREACHABLE4remote system not reachable or does not support talk6 INVALIDNUM number must be greater than zero*NOT_HEREcallee is not logged in* NO_ANSWERno answer from callee>MACHUNK+strange - the remote system doesn't know me6 PERMDENIED!callee has disabled talk requests$RINGINGringing your party, SWITCHINGtrying old talk protocol VERSIONversion is !AS:LOOK_UP(checking for invitation on remote system: LEAVE_INVITE"leaving invitation on local system,ANNOUNCEsending announce message4DELETE#deleting invitation on local system2SUCCESS operation completed successfully6 UNKNOWN_SENTunknown request packet sent (?)8 UNKNOWN_RECV unknown response packet received@ TALK(`8{c`cc c(c0c8cH@cvHcPcXc `c6hc\pc~xccccDctccccc,ȀcLЀcn؀cccccDctccc c<(c0c8c@c HcJ Pc Xc `c hcd pc xc c. cd c c c2 c| c c c0 ȁcr Ёc ؁ccNcccc\ccc cP(c0c*IRInsufficient system resources,IFCInvalid network function code"UCTUnable to create TCB"IFSInvalid foreign port ILPInvalid local port.NUCNon-unique connection specified.CSE Connection table space exhausted:NOPRV*No privilege for access to well-known port2CIP#Connection illegal for this process(CDEConnection does not exist,CRConnection RESET by remote host&FSUForeign host unspecified"UNNUnknown network node<VTF-Valid-TCB table full (all connections in use)0CREF!Connection refused by remote host4CCAN%Connection cancelled by process abort&FIPIO Function in Progress0BTS"User specified buffer is Too small&IHIInvalid known host indexBDIBad device index*EPDError processing device dump&URCDestination Unreachable$IGFInvalid GTHST function UNAUnknown host name"UNUUnknown host number6CC)Connection is closing - operation invalid CTOConnection TimeOut TWTTime-Wait TimeOut TENet ACP is Exiting@FTO2User function timeout. Network event didn't happen0NYI!User function not yet implemented4NOPN$UDP wildcard connection not yet open,NOINAInternet access not allowed*NOANAARPANET access not allowed>NOADR.Name lookup not yet complete - no host addressDGTHFUL2GTHST queue full - can't queue name/address lookup&DAENET$DUMP argument error*NMLTOHost name lookup time-out<NSEXIT+Name lookup failure: name server is exiting>NONS/Name lookup failure: name server is not running@NSQFULL.Name lookup failure: name server queue is fullJDSDOWN9Name not found in host table (domain service unavailable)FDSNODS4Domain service: no domain servers could be contactedJDSINCOMP7Domain service: received incomplete domain server replyDDSNOADDR0Domain service: no addresses found for host name@DSNONAME,Domain service: no name found for IP addressFDSFMTERR3Domain service: domain server returned format error6DSSRVERR#Domain service: domain server error<DSNAMERR)Domain service: name error (no such name)JDSNOTIMP6Domain service: domain server returned not implementedHDSREFUSD5Domain service: domain server refused to resolve nameJDSNONSRV6Domain service: no usable servers returned by referral8DSUNKERR$Domain service: unknown server errorBDSREFEXC/Domain service: maximum referral limit exceeded:GREENERR'Name lookup failure, unknown error codeB GP_INVREQ-Name lookup: invalid request (internal error)H GP_INVINF4Name lookup: invalid host info item (internal error)L GP_INVNAM8Name lookup: invalid domain name syntax (internal error)H GP_INVADR4Name lookup: invalid address syntax (internal error)H GP_INVMBX4Name lookup: invalid mailbox syntax (internal error)F GP_INVCLS2Name lookup: invalid domain class (internal error)B GP_RSBUSY-Name lookup: resolver to busy to handle query> GP_NONMSR*Name lookup: no name server could be foundF GP_NOHINF2Name lookup: request host info item does not exist4 GP_NOTFND Name lookup: host name not found2 GP_UNKMBXName lookup: mailbox not foundH GP_NOTIMP3Name lookup: unimplemented request (internal error)> GP_TOOBIG)Name lookup: request data too big for UDP@ GP_NSDOWN+Name lookup: all name servers declared down,NRTNo route found for destinationcIPACP@@x8 @LIBRTLMTHRTLPASRTLo # TALK010.A [R602MS5U.TALK]TALK.CLD;6Q*[R602MS5U.TALK]TALK.CLD;6+,./ 4Q- 0123KPWO56i37/889G HJDefine Syntax Nothing NoParametersDefine Verb Talk Image TalkE Parameter P1, Label=NetAddress, Value(Required, Type=$Rest_Of_Line), Prompt="User"? Qualifier Interval, Value(Type=$Number, Default="30"), Default> Qualifier TimeOut, Value(Type=$Number, Default="60"), Default Qualifier Old_Protocol" Qualifier Version, Syntax=Nothing Qualifier Debug0! DEC/CMS REPLACEMENT HISTORY, Element TALK.CLD:! *4 21-AUG-1989 00:28:03 SYNFUL "Added /DEBUG switch"Q! *3 20-AUG-1989 06:48:04 SYNFUL "TALK/VERSION now legal without a parameter"G! *2 20-AUG-1989 06:14:09 SYNFUL "Added /Old_Protocol and /Version"B! *1 19-AUG-1989 23:37:50 SYNFUL "Command definition for TALK"0! DEC/CMS REPLACEMENT HISTORY, Element TALK.CLD @]6 TALK010.A [R602MS5U.TALK]KITINSTAL.COM;1X*C*[R602MS5U.TALK]KITINSTAL.COM;1+,./ 4X - 0123KPWO56<27@889G HJ$!$! K I T I N S T A L . C O M$! -------------------------$! Update information:=$! 7-Aug-1989 - SYNFUL@DRYCAS.CLUB.CC.CMU.EDU (Marc Shannon)$! Initial creation.L$! See other update information at the end of this file in the CMS comments.$!E$! Copyright (c) 1989 by the Carnegie-Mellon University Computer ClubL$! and Marc A. Shannon (SYNFUL@DRYCAS.CLUB.CC.CMU.EDU)$!*$ On Control_Y Then VMI$Callback Control_Y#$ On Warning Then Exit VMI$_Failure$!3$ If P1 .Eqs. "VMI$_INSTALL" Then Goto Talk_Install0$ If P1 .Eqs. "VMI$_IVP" Then Goto Talk_StartIVP$! Unknown request, so...$ Exit VMI$_Unsupported$!$Talk_Install:0$ VMI$Callback Check_VMS_Version Talk_VMSOK 05.0#$ If Talk_VMSOK Then Goto Talk_Info$!$$ VMI$Callback Message E BadVMSVer -= "You need at least VMS V5.0 to install this version of TALK"$ Exit VMI$_Failure$! $Talk_Info:$ Type Sys$InputA This is TALK V1.0, the first release of the CMU Computer Club$ TALK program for CMU-TEK TCP/IP.G In order to install this program, you will need VMS V5.0 or better.G You will also need to be running the CMU-TEK TCP/IP software. (YouD can install the software even if you are not running the CMU-TEK' software, but the IVP will not run.E Any comments or suggestion on this program should be sent to Marc: Shannon, SYNFUL@DRYCAS.CLUB.CC.CMU.EDU (128.2.232.11).D Note that with this version, use of DEC's LMF licensing has beenG enabled. The CMU Computer Club's policy on software development isA that all VMS software developed for public use will be freelyE useable by the VMS community. We have started using PAKs so that7 we will be aware of how well used our programs are.F If you would like to register your software, please see the end ofD the release notes for receiving a registration PAK. Again, this# program WILL run without a PAK.$!E$! (It's safe to use VMS V5.x IF conventions now that we know that we1$! are running a current enough version of VMS.)$!$ Talk_RunIVP = 1$ $!2$ VMI$Callback Check_Net_Utilization Talk_Free 250$!$ If .Not. Talk_Free$ Then#$ VMI$Callback Message E Nospace -5 "You need at least 250 blocks free to install Talk"$ Exit VMI$_Failure$ EndIf$!)$ VMI$Callback Set Safety Conditional 250$!$$ If .Not. F$GetDVI("IP0:","Exists")$ Then%$ VMI$Callback Message W IPNOTINST -5 "CMU TCP/IP has not been installed on this machine"$ Talk_RunIVP = 0$ Goto Talk_IVP$ EndIf$!!$ If .Not. F$GetDVI("IP0:","Mnt")$ Then$$ VMI$Callback Message W IPNOTRUN -7 "CMU TCP/IP is not running currently on this machine"$ Talk_RunIVP = 0$ Goto Talk_IVP$ EndIf$! $Talk_IVP:$ If Talk_RunIVP$ Then VMI$Callback Set IVP Ask$ Else VMI$Callback Message I NOIVP -; "Due to the previous warning(s), the IVP will not be run"$ VMI$Callback Set IVP No$ EndIf$!"$! See if they want the sources...$!O$ VMI$Callback Ask Talk_Sources "Do you want to keep the sources on-line" Yes B$!$ If Talk_SourcesE$! Ask for the directory and confirm its creation if it doesn't exist $ Then $Ask_Src_Dir:!$ VMI$Callback Ask Talk_Src_Dir -; "Where would you like the sources placed" SYS$MANAGER:D$ If F$Parse(Talk_Src_Dir + "DUMMY.FILE;",,,,"Syntax_Only") .Eqs. "" $ Then"$ VMI$Callback Message E BadDir -/ "Invalid directory name; please re-enter"$ Goto Ask_Src_Dir$ EndIf$!3$ If F$Parse(Talk_Src_Dir + "DUMMY.FILE;") .Eqs. "" $ Then"$ VMI$Callback Ask Talk_Cre_Src -6 "That directory does not exist, create it" Yes B$ If Talk_Cre_Src=$ Then VMI$Callback Create_Directory User 'Talk_Src_Dir'$ Else Goto Ask_Src_Dir$ EndIf$ EndIf$ EndIf$!$ VMI$Callback Set Purge Ask$!$$ VMI$Callback Message I NoMoreAsk -> "No further questions will be asked during this installation"$!:$! Check to see if we will need to re-link the executables$!3$ VMI$Callback Check_VMS_Version Talk_NoRelink 05.2$$ If Talk_NoRelink Then Goto Provide$!$$ VMI$Callback Message I Relinking - "Linking TALK executables..."$!7$ Link /NoDebug /NoTrace /Executable=VMI$KWD:Talk.Exe -A VMI$KWD:Talk.Obj, VMI$KWD:Talk_Common.Obj, VMI$KWD:Screen.Obj, -F VMI$KWD:Talk_Msg.Obj, VMI$KWD:NetError.Obj, Sys$System:Sys.Stb/Select$!>$ Link /NoDebug /NoTrace /Executable=VMI$KWD:Talk_Server.Exe -4 VMI$KWD:Talk_Server.Obj, VMI$KWD:Talk_Common.Obj, -F VMI$KWD:Talk_Msg.Obj, VMI$KWD:NetError.Obj, Sys$System:Sys.Stb/Select$! $Provide:$!$! Provide executables$!=$ VMI$Callback Provide_Image Talk$ Talk.Exe VMI$Root:[Sysexe]D$ VMI$Callback Provide_Image Talk$ Talk_Server.Exe VMI$Root:[Sysexe]$!&$! Now define the command in DCLTABLES$!+$ VMI$Callback Provide_DCL_Command Talk.Cld$!$! And the HELP file$!($ VMI$Callback Provide_DCL_Help Talk.Hlp$!.$! And, finally, the startup command procedure$!I$ VMI$Callback Provide_File Talk$ Talk_Startup.Com VMI$Root:[Sys$Startup]$!$ Type Sys$InputF The file TALK_STARTUP.COM has been placed into your system startupG directory (SYS$SYSROOT:[SYS$STARTUP]). You should edit your systemJ startup command procedure (SYSTARTUP_V5.COM) to execute this procedure% after your call to IP_STARTUP.COM+$ VMI$Callback Set Startup Talk_Startup.com$!&$! If they want sources, give them now$!.$ If .Not. Talk_Sources Then Exit VMI$_Success$!0$ Backup VMI$KWD:Talk010.Src/Save 'Talk_Src_Dir'$!/$! All done! Let VMSINSTAL do its magic now...$!$ Exit VMI$_Success$!$!$! Stub for IVP$!$Talk_StartIVP:$!$ @Talk_IVP.Com$!$ Exit $Status6$! DEC/CMS REPLACEMENT HISTORY, Element KITINSTAL.COM*$! *11 30-JAN-1990 21:46:31 R602MS5U "";$! *10 30-JAN-1990 21:40:03 R602MS5U "Fixed another bug"H$! *9 30-JAN-1990 20:56:42 SYNFUL "Installation for any VMS version"M$! *8 10-OCT-1989 17:07:24 SYNFUL "Oops! Replaced VMI$WORK with VMI$KWD"X$! *7 9-OCT-1989 23:40:42 SYNFUL "Added TALK_STARTUP.COM notification for managers"L$! *6 9-OCT-1989 23:15:39 SYNFUL "TALK help file added to installation"G$! *5 9-OCT-1989 22:39:36 SYNFUL "Ahh - much better for IVP check"A$! *4 9-OCT-1989 22:13:46 SYNFUL "Added license information"M$! *3 24-AUG-1989 22:29:42 SYNFUL "Oops - release notes are included in "E$! *2 24-AUG-1989 22:07:11 SYNFUL "Changed intro message to X0.1"D$! *1 19-AUG-1989 23:38:49 SYNFUL "VMSINSTAL procedure for TALK"6$! DEC/CMS REPLACEMENT HISTORY, Element KITINSTAL.COM  TALK010.A ![R602MS5U.TALK]TALK_STARTUP.COM;6D][!*[R602MS5U.TALK]TALK_STARTUP.COM;6+,./ 4DN- 0123KPWO56U*p7O889G HJ$!C$! Start up the Talk Server process to handle incoming and outgoing $! requests.$!($! Check for an existing server first...$! $ WorldOn = F$Privilege("World")3$ If .Not. WorldOn Then Set Process/Privilege=World$! $PidCheck:$ NextPID = F$Pid(PIDContext),$ If NextPID .Eqs. "" Then Goto Start_Server4$ If F$GetJPI(NextPID, "PrcNam") .Eqs. "Talk Server"$ ThenD$ Write Sys$Output "Stopping existing Talk Server (PID=''NextPID')"$ Stop/ID='NextPID' $ Wait 0:0:5$ Else Goto PidCheck$ EndIf$!$Start_Server:$!5$ If .Not. WorldOn Then Set Process/Privilege=NoWorld$!$ Run /Detach -% /Error=Sys$Manager:Talk_Server.Err -& /Output=Sys$Manager:Talk_Server.Log - /Process_Name="Talk Server" - /Priority=5 -+ /Privilege=(NoSame, NetMbx, World, Oper) - /UIC=[1,4] - Sys$System:Talk_Server$!$ Exit9$! DEC/CMS REPLACEMENT HISTORY, Element TALK_STARTUP.COM<$! *2 3-SEP-1989 01:11:06 SYNFUL "Added Wait statement"B$! *1 19-AUG-1989 23:39:04 SYNFUL "Startup procedure for TALK"9$! DEC/CMS REPLACEMENT HISTORY, Element TALK_STARTUP.COM **C TALK010.A [R602MS5U.TALK]TALK_IVP.COM;4TY*[R602MS5U.TALK]TALK_IVP.COM;4+,./ 4T- 0123KPWO56@Ո*k7`889G HJ$!<$! This command procedure is run when an IVP is requested...$!D$ Write Sys$Output "%TALK-I-START_IVP, Commencing IVP for TALK X0.0"$!$ On Severe_Error Then Continue($ Talk_OldMsg = F$Environment("Message");$ Set Message/NoFacility/NoSeverity/NoIdentification/NoText$!#$ Define/User Sys$Input Sys$Command$ Talk Is_Not_Here$ Talk_FirstCheck = $Status$!)$ Talk/TimeOut=1 'F$GetJPI(0, "Username")$ Talk_SecondCheck = $Status$!$ Set Message'Talk_OldMsg'$!-$ If (Talk_FirstCheck .Ne. %X0B408052) .Or. -: (Talk_SecondCheck .Ne. %X0B40803C) Then Exit VMI$_Failure$! $! All okay!$!@$ Write Sys$Output "%TALK-S-IVP_OK, IVP completed successfully!"$!$ Exit VMI$_Success5$! DEC/CMS REPLACEMENT HISTORY, Element TALK_IVP.COM<$! *2 9-OCT-1989 22:15:18 SYNFUL "Updated status codes"T$! *1 19-AUG-1989 23:38:38 SYNFUL "Installation verification procedure for TALK"5$! DEC/CMS REPLACEMENT HISTORY, Element TALK_IVP.COM ۜ TALK010.A  [R602MS5U.TALK]TALK.HLP;1O*[R602MS5U.TALK]TALK.HLP;1+, ./ 4O- 0123KPWO56O}77_q889G HJ P TALK010.A  [R602MS5U.TALK]TALK.HLP;1OH/! Preliminary version of the TALK help library!1 TALKB The CMU Computer Club TALK program allows you to converse inter-? actively with other users on systems also running TALK. ThisC includes other systems running this package or any BSD-compatible0 versions of talk (found on most Unix systems). Format:$ TALK [/qualifiers] user[@node]C Note that you use the same command format when originating a TALK1 request and when answering an incoming request. 2 Parameters@ The only parameter accepted by the TALK command is that of the= remote user to whom you wish to make a connection. You may? specify either a username of a user on your local system or a9 user and node combination of a user on a remote system.: The username is automatically converted to lowercase forA compatibility with Unix systems. For mixed-case usernames, use6 quotation marks where necessary to distinguish case. Examples: TALK SYNFUL< requests or initiates a TALK connection with SYNFUL on your local system TALK MS5U@ANDREW.CMU.EDU= makes a connection to ANDREW.CMU.EDU and attempts to: set up a TALK connection with user "ms5u" on that system2 Command_Qualifiers/DEBUGB This qualifier shows all I/O requests being sent to the local orC remote talk daemon so that users or system managers may determine0 if there is a system or configuration problem. /INTERVAL /INTERVAL=nB The /INTERVAL qualifier causes TALK to broadcast an announcementA message to the destination user every `n' seconds. The default@ is that an announcement message will be sent every 30 seconds. /OLD_PROTOCOLB This qualifier causes TALK to use the "old" (BSD 4.2 compatible)- protocol when initiating a TALK connection.B Note that this qualifier is normally unneeded as TALK can detectC under normal circumstances when a "new" protocol request has been? rejected and will automatically switch to the "old" protocol./TIMEOUT /TIMEOUT=nC The /TIMEOUT qualifier causes TALK to "timeout" after `n' seconds/ if a connection has not yet been established.= If a connection to the remote system's TALK server has beenC established and announcement messages are being sent, the timeoutF after the interval specified by /INTERVAL (normally 30) has elapsed.* The default timeout value is 60 seconds./VERSION? The /VERSION qualifier will print out the currently installed> version of TALK. Execution of the program does not continue? after the message and you cannot specify any other qualifiers1 or a destination parameter when using /VERSION.2 Error_MessagesF TALK may print out an error message due to some network condition or' for general purpose status reporting. 3 ANNOUNCE, %TALK-I-ANNOUNCE, sending announce message@ Debugging message. Indicates that the TALK program has sent a@ request to the remote talk daemon to send an "announcement" to/ the remote user to request a talk connection. 3 BADADDR1 %TALK-F-BADADDR, request has invalid addr value@ Protocol error. TALK sent a packet to a talk daemon which was, invalid to the server. Should not happen. 3 BADCTLADDR8 %TALK-F-BADCTLADDR, request has invalid ctl_addr value@ Protocol error. TALK sent a packet to a talk daemon which was, invalid to the server. Should not happen. 3 BADVERS7 %TALK-F-BADVERS, request has invalid protocol version> Protocol error. TALK sent a mismatched version-level packet. to a talk daemon server. Should not happen.3 DELETE5 %TALK-I-DELETE, deleting invitation on local system> Debugging message. Either a connection has been established> with the remote user and the local "invitation" is no longer? needed or a timeout has occurred while waiting for a response from the remote user.3 FAILED9 %TALK-F-FAILED, operation failed for unexplained reason< Debugging message. A request packet sent to a talk daemon9 was marked as "failed" without any further information. 3 INVALIDNUM6 %TALK-E-INVALIDNUM, number must be greater than zero@ Protocol error. TALK sent out a packet to a talk daemon which= had an ID number which was less than zero. May happen when> your process ID is greater than 80000000 (hex). (Ie. should5 not happen, except on very successful VAXclusters.)3 LEAVE_INVITE: %TALK-I-LEAVE_INVITE, leaving invitation on local systemA Debugging message. The TALK program is leaving an "invitation"= on the local system so that the remote user can find it and" connect directly to the program. 3 LOOK_UP; %TALK-I-LOOK_UP, checking for invitation on remote system? Debugging message. TALK is checking the remote system's talk? daemon to see if an invitation was left for you. If there is< one, TALK will make a connection to the remote user's talk program. 3 MACHUNK> %TALK-E-MACHUNK, strange - the remote system doesn't know me@ Remote system error. Some systems cannot do name server look-A ups and this system's name could not be determined. The remote< system rejected the request since the remote user would be unable to respond. 3 NO_ANSWER* %TALK-E-NO_ANSWER, no answer from callee= A timeout has occurred while waiting for a connection to be# established with the remote user. 3 NORESPONSE5 %TALK-F-NORESPONSE, no response from remote machineA TALK was unable to connect with either the local or remote talk3 daemon in order to negotiate the talk connection. 3 NOT_CRTH %TALK-F-NOT_CRT, your terminal type has not been set or not a terminalB Your terminal type is not valid for use with the TALK program orD you are attempting to run TALK with SYS$INPUT defined as somethingF other than a terminal. TALK can only be running from an interactiveG job and you must use the SET TERMINAL/DEVICE=xxxx command to set your/ terminal type for the full-screen connection. 3 NOT_HERE+ %TALK-E-NOT_HERE, callee is not logged in0 The remote user is not logged into the system. 3 PERMDENIED7 %TALK-E-PERMDENIED, callee has disabled talk requestsA The remote user has disabled broadcast messages from being sentA to the terminal and the remote talk daemon was therefore unable, to announce your request for a connection. 3 RINGING% %TALK-I-RINGING, ringing your party> A "connection" has been established with the remote system's? talk daemon and an announcement for talk has been sent to the remote user's terminal. 3 SUCCESS3 %TALK-I-SUCCESS, operation completed successfully@ Debugging message. The previous request sent to a talk daemon was successfully processed. 3 SWITCHING- %TALK-I-SWITCHING, trying old talk protocol@ TALK received a "destination unreachable" message when sendingA a "new" (BSD 4.3 compatible) packet to the remote system. TALKA is automatically stepping down its protocol to communicate with% "old" (BSD 4.2) compatible systems.3 UNKNOWN_RECV8 %TALK-I-UNKNOWN_RECV, unknown response packet received= Debugging message. A request was sent to a talk daemon andA TALK was unable to understand the status of the reply received.3 UNKNOWN_SENT7 %TALK-I-UNKNOWN_SENT, unknown request packet sent (?)= Debugging message. TALK sent out a packet to a talk daemon= which it itself could not figure out. Should not happen. 3 UNKREQ0 %TALK-F-UNKREQ, request has invalid type value? A talk dae NR TALK010.A  [R602MS5U.TALK]TALK.HLP;1Ormon has rejected a request packet due to an invalid# request code. Should not happen. 3 UNREACHABLEK %TALK-F-UNREACHABLE, remote system not reachable or does not support talk8 TALK was unable to reach the remote system. Since UDP: implementations vary considerably, TALK cannot determine: whether or not the packet was rejected due to the remote: system not accepting talk connections at all or that the' remote system was simply unreachable. 3 VERSION! %TALK-I-VERSION, version is !AS; Response to the /VERSION qualifier. No further execution$ of TALK occurs after this message.0! DEC/CMS REPLACEMENT HISTORY, Element TALK.HLPC! *4 30-JAN-1990 22:21:31 R602MS5U "Removed beta-release stuff"F! *3 30-NOV-1989 15:36:27 SYNFUL "Added Ehud Gavron's suggestions"O! *2 29-OCT-1989 01:08:16 SYNFUL "Added error messages to the on-line help"L! *1 9-OCT-1989 23:13:12 SYNFUL "Initial release of the TALK help file"0! DEC/CMS REPLACEMENT HISTORY, Element TALK.HLP| TALK010.A(  &[R602MS5U.TALK]TALK010.RELEASE_NOTES;1O&*[R602MS5U.TALK]TALK010.RELEASE_NOTES;1+,( ./ 4O- 0123KPWO5617`889G HJOThese release notes are bastardized from the beta-test release notes, so pleaseOforgive some of the assumptions that you may have been running a previousrelease.5Version V1.0 of TALK contains the following features:J - Support for BSD 4.2. This was done by having TALK automaticallyJ detect when a packet destined for port 518 was rejected (via an ICMPJ error) and try sending an "old" packet to port 517. If this isJ rejected, the error "remote system not reachable or does not support talk" is signalled.J Note that due to limitations in CMU TCP/IP, TALK is unable toJ distinguish between "host unreachable" and "port unreachable" ICMPI status messages. That's why the ambiguous error message is printed.J - Qualifier: /OLD_PROTOCOL - forces TALK to use the 4.2 protocolJ instead of trying 4.3 first. I'm not sure how useful it really is,+ but it didn't hurt to put it in there.J - Enhanced on-screen status messages. Things included are aJ program/version banner and an updating clock. Also, the middle bar; now contains the username and node of the remote user.J - ^J is now handled (properly? maybe) when entered locally forJ word-erase. Incoming "werase" characters are also processed butJ currently have a hard-coded assumption that they will be '^W' and may) cause problems with this assumption.J - A help file has been added. It is quite basic, but does provide some7 information for the novice starting out with TALK.Items planned for next release:3 - Provide some interface for broadcast messages.J - Some sort of SPAWN character which allows a user to SPAWN out by, hitting this character (or keypad key).OThis version of TALK will run without a license (and with no complaints,Oeither). However, you are asked to register your copy simply by obtaining aOpersonalized PAK. You can do this by either contacting Marc ShannonO(SYNFUL@DRYCAS.CLUB.CC.CMU.EDU) or by sending a special mail message to CLUB_PAK@DRYCAS.CLUB.CC.CMU.EDU.OThis special mail message need not contain any body, but the subject MUST be of the form:(Subject: TALK Carnegie-Mellon UniversityOYour PAK will then be "registered" for Carnegie-Mellon University. (Please putOyour own site name there as you would like it to appear in your registrationPAK.)%|M TALK010.A [R602MS5U.TALK]TALK010.SRC;3 :1*[R602MS5U.TALK]TALK010.SRC;3+,./ 4  - 0123KPWO56e77]889G HJL] TALK010.SRCI TALK010.SRCZBACKUP/NOASSIST/COMMENT=TALK V1.0 Source Saveset/INTER/LOG/VERIFY TALK.PAS,TALK_COMMON.PAS,DESCRIP.MMS,TALK_SERVER.PAS,TALK_MSG.MSG,TCPDEFS.PAS,SCREEN.PAS,TALK010.MSS,TALK.OBJ,TALK_SERVER.OBJ,TALK_COMMON.OBJ,TALK_MSG.OBJ,SCREEN.OBJ,TALK_COMMON.PEN,SCREEN.PEN,TCPDEFS.PEN,NETERROR.OBJ SYS$DISK:[]TALK010.SRC/SAVE/LABEL=TALK_SRC/BLOCK=8192/GROUP=25TALK V1.0 Source Saveset R602MS5U  w7V5.2 _CMCCVB::  _$255$DUA28: V5.2 D*[R602MS5U.TALK]TALK.PAS;1+,X.*/ 4U**- 0123KPWO+56--7-89G HJ[Ident('V1.0'), Inherit('Talk_Common', 'Screen', 'TCPDefs', 'Sys$Library:Starlet',+ 'Sys$Library:Pascal$Lib_Routines',, 'Sys$Library:Pascal$Str_Routines')]Program Talk(Input, Output);Label LeaveNow;Const CErase = 1; Kill = 2; WErase = 3; Repeat_Send_Interval = 2;Type Do_Packet = Record, FLink, BLink : Unsigned;% To_Net : Boolean;0  Stuff : Varying [32] of Char End;LVar MyUsername, MyHostName, HisUsername, HisHostName : Varying [32] of Char; NetAddress : Talk_String; AtFind : Integer;' MyHostAddr, HisHostAddr : Unsigned;3 ControlChannel, TalkChannel : [Volatile] UWord; LocalPort : UWord;/ NetChars : [Volatile] Varying [32] of Char;0 NetIOSB, SendIOSB : [Volatile] NetSB_Fields;, Terminal_Type, Terminal_Class : Integer;( HisControls, MyControls : [Volatile]D Packed Array [CErase..WErase] of Char; Request : Ctl_Msg; Response : Ctl_Response;" CompFlag, TimeFlag : Unsigned;$ AnnounceTime, TimeOut : Integer; NumberString : Talk_String;' RepeatTime, AnnounceIntTime : Quad;( UseOldProtocol, Debugging : Boolean; PrintVersion : DSC1$Type; FixUp : Integer;" Do_Flag : [Volatile] Unsigned;, Do_Queue : [Volatile, Aligned(3)] Record@ FLink, BLink : Unsigned2  End := Zero; Do_One : ^Do_Packet; Talk$_Failed, Talk$_UnkReq, Talk$_BadVers, Talk$_BadAddr, Talk$_BadCtlAddr, Talk$_NoResponse, Talk$_Not_Crt, Talk$_Unreachable, Talk$_InvalidNum, Talk$_Not_Here, Talk$_No_Answer, Talk$_MachUnk, Talk$_PermDenied, Talk$_Ringing, Talk$_Switching, Talk$_Version, Talk$_Look_Up, Talk$_Leave_Invite, Talk$_Announce, Talk$_Delete, Talk$_Success, Talk$_Unknown_Sent,3 Talk$_Unknown_Recv : [Value, External] Integer;- CLI$_Present : [Value, External] Integer;$Value MyControls := ''(127, 21, 23); UseOldProtocol := False;; Function CLI$Get_Value(Label_Name : Varying [A] of Char;R Var Label_Value : Packed Array [_l.._u:Integer] of Char;F Var Label_Length : UWord) : Integer; Extern;L Function CLI$Present(Label_Name : Varying [A] of Char) : Integer; Extern;7 Function Send_Request(Dest_Host : Unsigned) : UByte; Var OutRequest : Record+ UDP : UDP_HostInfo; % Data : Ctl_Msg End; InResponse : Record+ UDP : UDP_HostInfo; * Data : Ctl_Response End;% IOSB, RecvIOSB : NetSB_Fields;& Finished, PacketSent : Boolean; ProcessingTime : Integer; DebugRequest : UByte; Begin Finished := False; PacketSent := False; ProcessingTime := 0;' DebugRequest := Request.Req_Type;! OutRequest.Data := Request;F If UseOldProtocol Then Convert_Request(OutRequest.Data, To_Old);/ OutRequest.UDP.Source_Addr := MyHostAddr;. OutRequest.UDP.Source_Port := LocalPort;, OutRequest.UDP.Dest_Addr := Dest_Host;C If UseOldProtocol Then OutRequest.UDP.Dest_Port := WKS$K_Talk3 Else OutRequ  est.UDP.Dest_Port := WKS$K_NTalk; Repeat If Debugging Then Case DebugRequest Of3 Look_Up : Lib$Signal(Talk$_Look_Up);= Leave_Invite : Lib$Signal(Talk$_Leave_Invite);5 Announce : Lib$Signal(Talk$_Announce);0 Delete : Lib$Signal(Talk$_Delete)7 Otherwise Lib$Signal(Talk$_Unknown_Sent) End;: Check($Qiow(, ControlChannel, TCP$Send, IOSB, , ,4 OutRequest, Size(OutRequest))); Check_IOSB(IOSB); If Not PacketSent Then BeginN Check($Qio(CompFlag, ControlChannel, TCP$Receive, RecvIOSB, , ,9 InResponse, Size(InResponse)));! PacketSent := True End;: Check($Setimr(TimeFlag, RepeatTime, , TimeFlag));A ProcessingTime := ProcessingTime + Repeat_Send_Interval;N Check($WFLor(CompFlag, 2**(CompFlag Mod 32) + 2**(TimeFlag Mod 32)));5 Finished := ($ClrEf(CompFlag) = SS$_WASSET);J If Finished And Not UseOldProtocol And (RecvIOSB.NSB$F_ICMP) Then Begin+ Lib$Signal(Talk$_Switching);& UseOldProtocol := True;! Finished := False;# PacketSent := False;8 Convert_Request(OutRequest.Data, To_Old);5 OutRequest.UDP.Dest_Port := WKS$K_Talk EndF Until ((InResponse.UDP.Source_Addr = Dest_Host) And Finished) Or( (ProcessingTime >= TimeOut);0 If Finished Then Check($CanTim(TimeFlag)); If Not Finished Then! $Exit(Talk$_NoResponse); Check_IOSB(RecvIOSB);" Response := InResponse.Data;B If UseOldProtocol Then Convert_Response(Response, From_Old); If Debugging ThenD If Response.Answer = Success Then Lib$Signal(Talk$_Success)2 Else If Response.Answer > BadCtlAddr Then+ Lib$Signal(Talk$_Unknown_Recv);% Send_Request := Response.Answer End;! Procedure Open_IP_Connections; Var IP_Information : Record6 CI$FHost_Name_Size : UByte;6 CI$LHost_Name_Size : UByte;K CI$Foreign_Host : Packed Array [1..128] of Char;/ Unused_1 : Unsigned;3 CI$Foreign_Port : UWord;I CI$Local_Host : Packed Array [1..128] of Char;1 CI$Local_Z TALK010.A [R602MS5U.TALK]TALK010.SRC;3 Port : UWord;, Unused_2 : UWord;= CI$Local_Internet_Adrs : Unsigned;> CI$Remote_Internet_Adrs : Unsigned;. Unused_3 : Unsigned End; Host_Info : Record% Case Integer Of5 1 : (GH$NL_AdrCnt : Integer;H GH$NL_AdrLst : Array [1..64] of Unsigned);2 2 : (AL$NamLen : Integer;H AL$NamStr : l TALK010.SRCX [R602MS5U.TALK]TALK.PAS;1U*2ePacked Array [1..128] of Char) End; IOSB : NetSB_Fields; Begin Lib$Get_EF(CompFlag); Lib$Get_EF(TimeFlag);, Check($Assign('IP:', ControlChannel));) Check($Assign('IP:', TalkChannel));* HisHostName := HisHostName + Chr(0);7 Check($Qiow(, ControlChannel, TCP$Open, IOSB, , ,2 , , , UDPAddr, U$UDP_Protocol)); Check_IOSB(IOSB);7 Check($Qiow(, ControlChannel, TCP$Info, IOSB, , ,9 IP_Information, Size(IP_Information))); Check_IOSB(IOSB);0 LocalPort := IP_Information.CI$Local_Port;3 If IP_Information.CI$LHost_Name_Size > 0 Then> MyHostName := Substr(IP_Information.CI$Local_Host, 1,I IP_Information.CI$LHost_Name_Size) + Chr(0) Else7 (* Call the name server to find out my name *) Begin: Check($Qiow(, ControlChannel, GtHst, IOSB, , ,? Host_Info, Size(Host_Info), GTH_AdrNam,# %Immed 0)); Check_IOSB(IOSB);O MyHostName := Substr(Host_Info.AL$NamStr, 1, Host_Info.AL$NamLen) + Chr(0) End;4 Check($Qiow(, ControlChannel, GtHst, IOSB, , ,9 Host_Info, Size(Host_Info), GTH_NamAdr,) %Ref MyHostName.Body)); Check_IOSB(IOSB);. MyHostAddr := Host_Info.GH$NL_AdrLst[1];( If HisHostName = '0.0.0.0'(0) Then Begin& HisHostName := MyHostName;% HisHostAddr := MyHostAddr End Else Begin: Check($Qiow(, ControlChannel, GtHst, IOSB, , ,? Host_Info, Size(Host_Info), GTH_NamAdr,0 %Ref HisHostName.Body)); Check_IOSB(IOSB);5 HisHostAddr := Host_Info.GH$NL_AdrLst[1];: Check($Qiow(, ControlChannel, GtHst, IOSB, , ,U Host_Info, Size(Host_Info), GTH_AdrNam, %Immed HisHostAddr)); Check_IOSB(IOSB);P HisHostName := Substr(Host_Info.AL$NamStr, 1, Host_Info.AL$NamLen) +! Chr(0) End End; Procedure Send_Invitation; Var IOSB : NetSB_Fields; DoneAnnouncing : Boolean; CurTimeInLoop : Integer; SaveAnswer : UByte; Begin DoneAnnouncing := False; CurTimeInLoop := 0; With Request Do Begin! Vers := Talk_Version;  Req_Type := Look_Up;> ID_Num := -1; (* Swapping doesn't matter here *) With Addr Do Begin/ Sin_Family := Swap2(AF_Inet);/ Sin_Port := Swap2(LocalPort);( Sin_Addr := MyHostAddr End; Ctl_Addr := Addr;* Lib$GetJPI(JPI$_Pid, , , Pid);< L_Name := Pad(MyUsername, Chr(0), Size(L_Name));= R_Name := Pad(HisUsername, Chr(0), Size(R_Name));1 R_Tty := Pad('', Chr(0), Size(R_Tty)) End;. SaveAnswer := Send_Request(HisHostAddr);" If SaveAnswer = Success Then Begin: Check($Qiow(, TalkChannel, TCP$Open, IOSB, , ,A HisHostName.Body, Response.Addr.Sin_Port,, LocalPort, Active));, If Not Odd(IOSB.NSB$Status) Then4 (* Perhaps the bytes are reversed? *)= Check($Qiow(, TalkChannel, TCP$Open, IOSB, , ,K HisHostName.Body, Swap2(Response.Addr.Sin_Port),'/ LocalPort, Active)); ( If Odd(IOSB.NSB$Status) Then BeginL (* Ah! Good - now we've got a connection. Something veryH odd happens here. We're to receive three bytes andJ then send three bytes. These bytes are to define the4 "cerase", "kill", and "werase".2 We'll send ^?, ^U, and ^W. *)? Check($Qiow(, TalkChannel, TCP$Receive, , , ,o? HisControls, Size(HisControls))); < Check($Qiow(, TalkChannel, TCP$Send, , , ,< MyControls, Size(MyControls))) End End;:A If Not Odd(IOSB.NSB$Status) Or (SaveAnswer <> Success) Thenl BeginL (* No request is waiting for us, so initiate one on this side *)A Check($Qio(CompFlag, TalkChannel, TCP$Open, IOSB, , ,E* HisHostName.Body, ,, LocalPort, Passive));- Request.Req_Type := Leave_Invite;nI If Send_Request(MyHostAddr) <> Success Then $Exit(SS$_Abort); ) Request.Req_Type := Announce;l Repeat; If Send_Request(HisHostAddr) <> Success ThenV Begino3 SaveAnswer := Response.Answer; 0 Request.Req_Type := Delete;. Send_Request(MyHostAddr);' Case SaveAnswer Of_9 Not_Here : $Exit(Talk$_Not_Here);_5 Failed : $Exit(Talk$_Failed);? Machine_Unknown : $Exit(Talk$_MachUnk);mD Permission_Denied : $Exit(Talk$_PermDenied);> Unknown_Request : $Exit(Talk$_UnkReq);: BadVersion : $Exit(Talk$_BadVers);7 BadAddr : $Exit(Talk$_BadAddr);_< BadCtlAddr : $Exit(Talk$_BadCtlAddr) End; $Exit End Else', Lib$Signal(Talk$_Ringing);E Check($Setimr(TimeFlag, AnnounceIntTime, , TimeFlag)); = CurTimeInLoop := CurTimeInLoop + AnnounceTime; T Check($WFLor(CompFlag, 2**(CompFlag Mod 32) + 2**(TimeFlag Mod 32)));A DoneAnnouncing := ($ClrEf(CompFlag) = SS$_WasSet);t% If DoneAnnouncing Thent* Check($CanTim(TimeFlag))? Until DoneAnnouncing Or (CurTimeInLoop >= TimeOut); ' Request.Req_Type := Delete; % vL0 TALK010.A [R602MS5U.TALK]TALK010.SRC;3 B Send_Request(MyHostAddr);& If Not DoneAnnouncing Then& $Exit(Talk$_No_Answer);6 Check($Qiow(, ControlChannel, TCP$Close));6 Check($Qiow(, TalkChannel, TCP$Send, , , ,7 MyControls, Size(MyControls)));t9 Check($Qiow(, TalkChannel, TCP$Receive, , , ,:8 HisControls, Size(HisControls))) End;_ Check_IOSB(IOSB);D End;e [Asynchronous]P Procedure Recv_Tty_Chars; Var New_Packet : ^Do_Packet;R Begin5 Check(Lib$Get_VM(Size(Do_Packet), New_Packet));_ New_Packet^ := Zero;! New_Packet^.To_Net := True;;% Screen_Read(New_Packet^.Stuff);s/ Check(LIB$INSQTI(New_Packet^, Do_Queue));s Check($SetEF(Do_Flag)) End;  [Asynchronous]  Procedure Recv_Net_Chars; Var New_Packet : ^Do_Packet;LQ Procedure Convert_To_Local(Var ConvChars : [Volatile] Varying [A] of Char);L$ Var Match, LastStop : Integer; Beginl LastStop := 0;  Repeat$@ Match := Find_Member(Substr(ConvChars, LastStop + 1,F Length(ConvChars) - LastStop),A [HisControls[1], HisControls[2],e3 Hi( TALK010.SRCX [R602MS5U.TALK]TALK.PAS;1U*sControls[3]]);  If Match > 0 Thene- ConvChars[Match + LastStop] :=o/ MyControls[Index(HisControls, A ConvChars[Match + LastStop])];e( LastStop := "LastStop + Match= Until (Match = 0) Or (LastStop >= Length(ConvChars)) End; Begin) If Not Odd(NetIOSB.NSB$Status) Then  Begin Screen_DeInit; $Exito End; 0 NetChars.Length := NetIOSB.NSB$Byte_Count;! Convert_To_Local(NetChars);P5 Check(Lib$Get_VM(Size(Do_Packet), New_Packet)); New_Packet^ := Zero;" New_Packet^.To_Net := False;$ New_Packet^.Stuff := NetChars;/ Check(LIB$INSQTI(New_Packet^, Do_Queue));= Check($SetEF(Do_Flag));tG Check($Qio(, TalkChannel, TCP$Receive, NetIOSB, Recv_Net_Chars, , 5 NetChars.Body, Size(NetChars.Body)))n End;u;Function LoCase(InStr : Varying [A] of Char) : Talk_String;TVar UpperChar : Integer;Beginh Repeata2 UpperChar := Find_Member(InStr, ['A'..'Z']); If UpperChar <> 0 Then< InStr[UpperChar] := Chr(Ord(InStr[UpperChar]) + 32) Until UpperChar = 0;o LoCase := InStrEnd;<Procedure Selective_Casify(Var InStr : Varying [A] of Char);Var CurChar : Integer; Quoting : Boolean; OutStr : Talk_String;oBeginr Quoting := False; OutStr := '';& For CurChar := 1 To InStr.Length Do" If InStr[CurChar] = '"' Then Quoting := Not Quotingo Else: If Quoting Then OutStr := OutStr + InStr[CurChar]8 Else OutStr := OutStr + LoCase(InStr[CurChar]); InStr := OutStrEnd;Begin 0 If CLI$Present('Version') = CLI$_Present Then With PrintVersion Do Begin: DSC$W_MaxStrLen := Length(Talk_VersionString);) DSC$B_DType := DSC$K_DTYPE_T;$) DSC$B_Class := DSC$K_CLASS_S;: DSC$A_Pointer := IAddress(Talk_VersionString);H Lib$Signal(Talk$_Version, 1, %Immed IAddress(PrintVersion));3 $Exit(Talk$_Version + STS$M_INHIB_MSG); End;t. If CLI$Present('Debug') = CLI$_Present Then Debugging := True  Else  Debugging := False;_A Check(Lib$GetDVI(DVI$_DevType, , 'SYS$INPUT', Terminal_Type)); C Check(Lib$GetDVI(DVI$_DevClass, , 'SYS$INPUT', Terminal_Class)); > If (Terminal_Type = 0) Or (Terminal_Class <> DC$_Term) Then $Exit(Talk$_Not_Crt);eF Check($BinTim('0000 00:00:' + Dec(Repeat_Send_Interval, 2) + '.00', RepeatTime));N Check(Lib$GetJPI(JPI$_Username, , , , MyUsername.Body, MyUsername.Length));C Check(Str$Trim(MyUsername.Body, MyUsername, MyUserName.Length)); $ MyUsername := LoCase(MyUsername);C CLI$Get_Value('NetAddress', NetAddress.Body, NetAddress.Length); Selective_Casify(NetAddress);$ AtFind := Index(NetAddress, '@'); If AtFind = 0 Then BeginS* AtFind := Length(NetAddress) + 1;. NetAddress := NetAddress + '@0.0.0.0' End;4 HisUsername := Substr(NetAddress, 1, AtFind - 1);N HisHostName := Substr(NetAddress, AtFind + 1, Length(NetAddress) - AtFind);E CLI$Get_Value('Interval', NumberString.Body, NumberString.Length);_% ReadV(NumberString, AnnounceTime);  If AnnounceTime <= 0 Then $Exit(Talk$_InvalidNum);Q Check($BinTim('0000 00:00:' + Dec(AnnounceTime, 2) + '.00', AnnounceIntTime));cD CLI$Get_Value('TimeOut', NumberString.Body, NumberString.Length); ReadV(NumberString, TimeOut);5 If CLI$Present('Old_Protocol') = CLI$_Present Thenc UseOldProtocol := True;o Open_IP_Connections;A Send_Invitation;A0 HisHostName.Length := HisHostName.Length - 1;I Check(Screen_Init(HisUsername + '@' + HisHostName, Talk_VersionString, 5 Recv_Tty_Chars, Talk_Licensee)); D Check($Qio(, TalkChannel, TCP$Receive, NetIOSB, Recv_Net_Chars, ,3 NetChars.Body, Size(NetChars.Body)));H Check(Lib$Get_EF(Do_Flag)); Repea %t+ While $ClrEF(Do_Flag) = SS$_WasSet Do 3 While Odd(Lib$REMQHI(Do_Queue, Do_One)) Do  Beginn0 If Do_One^.Stuff.Length <> 0 Then( If Do_One^.To_Net Then Begin= Screen_Display(Do_One^.Stuff, Local);  RepeatB FixUp := Index(Do_One^.Stuff, Chr(10));L If FixUp > 0 Then Do_One^.Stuff[FixUp] := Chr(23)( Until FixUp = 0; RepeatB FixUp := Index(Do_One^.Stuff, Chr(13));L If FixUp > 0 Then Do_One^.Stuff[FixUp] := Chr(10)( Until FixUp = 0;J Check($Qiow(, TalkChannel, TCP$Send, SendIOSB, , ,P Do_One^.Stuff.Body, Length(Do_One^.Stuff)));: If Not Odd(SendIOSB.NSB$Status) Or> (Index(Do_One^.Stuff, Chr(26)) > 0)- Then Goto LeaveNow1 End Else Begin RepeatB FixUp := Index(Do_One^.Stuff, Chr(10));L If FixUp > 0 Then Do_One^.Stuff[FixUp] := Chr(13)( Until FixUp = 0; RepeatB FixUp := Index(Do_One^.Stuff, Chr(23));L If FixUp > 0 Then Do_One^.Stuff[FixUp] := Chr(10)( Until FixUp = 0;= Screen_Display(Do_One^.Stuff, Remote)v End; : Check(Lib$Free_VM(Size(Do_Packet), Do_One)) pd TALK010.A [R602MS5U.TALK]TALK010.SRC;3 - End; $WaitFR(Do_Flag) Until False;e LeaveNow:t Check(Screen_DeInit) End.3{ DEC/CMS REPLACEMENT HISTORY, Element TALK.PAS }t<{ *10 30-JAN-1990 21:11:13 R602MS5U "Updated for V1.0" }?{ *9 16-NOV-1989 23:41:36 SYNFUL "Added token licensing" }L{ *8 22-OCT-1989 18:44:44 SYNFUL "Fixed up local hostname resolution" }F{ *7 9-SEP-1989 12:51:41 SYNFUL "Sigh - put back lost changes" }G{ *6 9-SEP-1989 12:49:03 SYNFUL """werase"" works properly now" }oB.{ *5 8-SEP-1989 22:04:22 SYNFUL "Updated for X0.1 release" }U{ *4 3-SEP-1989 15:05:41 SYNFUL "Fixed up swapping to the best of my ability" }tA{ *3 24-AUG-1989 22:25:04 SYNFUL "Updated version to X0.1" }eK{ *2 24-AUG-1989 05:12:45 SYNFUL "Added 4.2 support with autoswitch" }W>{ *1 19-AUG-1989 23:37:07 SYNFUL "Main source for TALK" }3{ DEC/CMS REPLACEMENT HISTORY, Element TALK.PAS }Se(HisControls))); < Check($Qiow(, TalkChannel, TCP$Send, , , ,< MyControls, Size(MyControls))) End End;:A If Not Odd(IOSB.NSB$Status) Or (SaveAnswer <> Success) Thenl BeginL (* No request is waiting for us, so initiate one on this side *)A Check($Qio(CompFlag, TalQ? TALK010.SRC[  [R602MS5U.TALK]TALK_COMMON.PAS;1X~( *[R602MS5U.TALK]TALK_COMMON.PAS;1+,[./ 4X- 0123KPWO5667@*689G HJ [Ident('V1.0'), Inherit('TCPDefs',+ 'Sys$Library:Pascal$Lib_Routines', 'Sys$Library:Starlet'), Environment('Talk_Common')]Module Talk_Common;C(* Here we place things of interest to both Talk and Talk_Server *)Const WKS$K_NTalk = 518; WKS$K_Talk = 517; Talk_Version = 1; Old_Talk_Version = 0; AF_Inet = 2; Name_Size = 12; Old_Name_Size = 9; Tty_Size = 16; Leave_Invite = 0; Look_Up = 1; Delete = 2; Announce = 3; Success = 0; Not_Here = 1; Failed = 2; Machine_Unknown = 3; Permission_Denied = 4; Unknown_Request = 5; BadVersion = 6; BadAddr = 7; BadCtlAddr = 8;Type UByte = [Byte] 0..255; UWord = [Word] 0..65535; Quad = [Quad] Record$ L0 : Unsigned;" L1 : Integer End;. UWordChars = Packed Array [1..2] of Char;1 UnsignedChars = Packed Array [1..4] of Char;) Talk_String = Varying [254] of Char;) Conversion_Key = (From_Old, To_Old); SockAddr = Record& Sin_Family : UWord;$ Sin_Port : UWord;' Sin_Addr : Unsigned;3 Sin_Zero : Array [1..8] of UByte End; Ctl_Msg = Record! Case Integer Of' 1 : (Vers : UByte;+ Req_Type : UByte;) Answer : UByte;) Filler : UByte;, ID_Num : Unsigned;* Addr : SockAddr;. Ctl_Addr : SockAddr;) Pid : Unsigned;G L_Name : Packed Array [1..Name_Size] of Char;G R_Name : Packed Array [1..Name_Size] of Char;F R_Tty : Packed Array [1..Tty_Size] of Char);/ 2 : (Old_Req_Type : UByte;O Old_L_Name : Packed Array [1..Old_Name_Size] Of Char;O Old_R_Name : Packed Array [1..Old_Name_Size] Of Char;- Old_ID_Num : UWord;< Old_Filler : [Byte(3)] Record End;* Old_Pid : UWord;I Old_R_Tty : Packed Array [1..Tty_Size] of Char;. Old_Addr : SockAddr;> Old_Filler_2 : [Byte(2 7)] Record End;2 Old_Ctl_Addr : SockAddr) End; Ctl_Response = Record& Case Integer Of, 1 : (Vers : UByte;0 Req_Type : UByte;. Answer : UByte;+ Pad : UByte;1 ID_Num : Unsigned;0 Addr : SockAddr);4 2 : (Old_Req_Type : UByte;2  Old_Answer : UByte;2 Old_ID_Num : UWord;A Old_Filler : [Byte(4)] Record End;3 Old_Addr : SockAddr) End;5Var Talk_VersionString : Packed Array [1..4] of Char;4 Talk_ReleaseDate : Packed Array [1..11] of Char;) Talk_Licensee : Varying [32] of Char;#Value Talk_VersionString := 'V1.0';( Talk_ReleaseDate := '31-JAN-1990';[Asynchronous]+Procedure Check(InStat : [Unsafe] Integer);Begin If Not Odd(InStat) Then $Exit(InStat)End;[Asynchronous]*Procedure Check_IOSB(IOSB : NetSB_Fields);2Var Talk$_UnReachable : [Value, External] Integer;Begin& If IOSB.NSB$Status = SS$_Abort Then Check(IOSB.NSB$XStatus)< Else If IOSB.NSB$F_ICMP And (IOSB.NSB$ICMP_CODE = 3) ThenH $Exit(Talk$_UnReachable) (* Destination Unreachable *) Else Check(IOSB.NSB$Status)End;2Function Swap2(Num : [Unsafe] UWordChars) : UWord;Begin Num := Num[2] + Num[1]; Swap2 := Num::UWordEnd;8Function Swap4(Num : [Unsafe] UnsignedChars) : Unsigned;Begin, Num := Num[4] + Num[3] + Num[2] + Num[1]; Swap4 := Num::UnsignedEnd;.Procedure Convert_Request(Var InPkt : Ctl_Msg;6 Direction : Conversion_Key);Var Cvt_Tmp : Ctl_Msg;Begin Case Direction Of From_Old : With Cvt_Tmp Do Begin0 Vers := Old_Talk_Version;6 Req_Type := InPkt.Old_Req_Type;2 ID_Num := InPkt.Old_ID_Num;. Addr := InPkt.Old_Addr;A Addr.Sin_Family := Swap2(Addr.Sin_Family);6 Ctl_Addr := InPkt.Old_Ctl_Addr;I Ctl_Addr.Sin_Family := Swap2(Ctl_Addr.Sin_Family);, Pid := InPkt.Old_Pid;L L_Name := Pad(InPkt.Old_L_Name, ''(0), Size(L_Name));L  vt TALK010.A [R602MS5U.TALK]TALK010.SRC;3 H< R_Name := Pad(InPkt.Old_R_Name, ''(0), Size(R_Name));I R_Tty := Pad(InPkt.Old_R_Tty, ''(0), Size(R_Tty));' InPkt := Cvt_Tmp End; To_Old : With Cvt_Tmp Do Begin4 Old_Req_Type := InPkt.Req_Type;J Old_L_Name := Substr(InPkt.L_Name, 1, Old_Name_Size);J Old_R_Name := Substr(InPkt.R_Name, 1, Old_Name_Size);C Old_ID_Num := (InPkt.ID_Num Mod 65536)::UWord;= Old_Pid := (InPkt.Pid Mod 65536)::UWord;. Old_R_Tty := InPkt.R_Tty;, Old_Addr := InPkt.Addr;G Old_Addr.Sin_Family := Swap2(Old_Addr.Sin_Family);4 Old_Ctl_Addr := InPkt.Ctl_Addr;O Old_Ctl_Addr.Sin_Family := Swap2(Old_Ctl_Addr.Sin_Family);% InPkt := Cvt_Tmp End EndEnd;4Procedure Convert_Response(Var InPkt : Ctl_Response;7 Direction : Conversion_Key);Var Cvt_Tmp : Ctl_Response;Begin Case Direction Of From_Old : With Cvt_Tmp Do Begin0 Vers := Old_Talk_Version;6 Req_Type := InPkt.Old_Req_Type;2 Answer := InPkt.Old_Answer;2 ID_Num := InPkt.Old_ID_Num;. Addr := InPkt.Old_Addr;A Addr.Sin_Family := Swap2(Addr.Sin_Family);' InPkt := Cvt_Tmp End; To_Old : With Cvt_Tmp Do Begin4 Old_Req_Type := InPkt.Req_Type;0 Old_Answer := InPkt.Answer;C Old_ID_Num := (InPkt.ID_Num Mod 65536)::UWord;, Old_Addr := InPkt.Addr;G Old_Addr.Sin_Family := Swap2(Old_Addr.Sin_Family);% InPkt := Cvt_Tmp End EndEnd; [Initialize]Proc TALK010.SRC[  [R602MS5U.TALK]TALK_COMMON.PAS;1Xedure Confirm_Licensing;Type Item_List = Record# BufLen : UWord;# ItmCod : UWord;& BufAdr : Unsigned;( RetLenAdr : Unsigned End;Var Version_Number : Integer; Release_Date : Quad;+ Validation : Array [1..4] of Item_List; Casify, Ret_Stat : Integer;UFunction Exe$Lookup_License(%StDescr Product : Packed Array [_l.._u:Integer] of Char;= %Ref Validation_Check : Unsigned;X %StDescr Producer : Packed Array [_l2.._u2:Integer] of Char;I %Ref Flags : Integer := %Immed 0) : Integer; Extern;Begin+ $BinTim(Talk_ReleaseDate, Release_Date);@ Version_Number := (Ord(Talk_VersionString[2]) - 48) * 65536 +7 (Ord(Talk_VersionString[4]) - 48); Validation := Zero; With Validation[1] Do Begin& BufLen := Size(Release_Date);" ItmCod := LMF$_Prod_Date;) BufAdr := IAddress(Release_Date) End; With Validation[2] Do Begin( BufLen := Size(Version_Number);% ItmCod := LMF$_Prod_Version;+ BufAdr := IAddress(Version_Number) End; With Validation[3] Do Begin, BufLen := Size(Talk_Licensee.Body);# ItmCod := LMF$_Prod_Token;0 BufAdr := IAddress(Talk_Licensee.Body);4 RetLenAdr := IAddress(Talk_Licensee.Length) End;, If IAddress(Exe$Lookup_License) <> 0 ThenI Ret_Stat := Exe$Lookup_License('TALK', %Immed IAddress(Validation),C 'DEC', LMF$M_Return_Failures);4 If (Talk_Licensee = '') Or Not Odd(Ret_Stat) Then) Talk_Licensee := '**UNREGISTERED**' Else1 For Casify := 2 To Length(Talk_Licensee) DoI If Talk_Licensee[Casify] = '_' Then Talk_Licensee[Casify] := ' ': Else If (Talk_Licensee[Casify] In ['A'..'Z']) AndI (Talk_Licensee[Casify - 1] In ['A'..'Z', 'a'..'z']) ThenI Talk_Licensee[Casify] := Chr(Ord(Talk_Licensee[Casify]) + 32)End;End.:{ DEC/CMS REPLACEMENT HISTORY, Element TALK_COMMON.PAS }U{ *14 30-JAN-1990 22:15:35 R602MS5U "Ooops! Wrong version number for /version" }M{ *13 30-JAN-1990 21:26:07 R602MS5U "Sigh - can't get the parens right" }5{ *12 30-JAN-1990 21:24:55 R602MS5U "Bug fixed" }D{ *11 30-JAN-1990 21:03:47 R602MS5U "Updated for V1.0 release" }?{ *10 16-NOV-1989 23:41:45 SYNFUL "Added token licensing" }7{ *9 9-OCT-1989 23:33:30 SYNFUL "Move 8B1 -> 9" }>{ *8 9-OCT-1989 20:27:47 SYNFUL "Added licensing code" }U{ *7 3-SEP-1989 15:05:30 SYNFUL "Fixed up swapping to the best of my ability" }H{ *6 24-AUG-1989 22:24:34 SYNFUL "Updated version number to X0.1" };{ *5 24-AUG-1989 05:12:52 SYNFUL "Added 4.2 support" }P{ *4 20-AUG-1989 06:36:15 SYNFUL "Moved Talk_VersionString to a variable" }B{ *3 20-AUG-1989 06:17:00 SYNFUL "Added Talk_VersionString" }?{ *2 20-AUG-1989 05:08:28 SYNFUL "Added BSD 4.2 support" }RR{ *1 19-AUG-1989 23:36:58 SYNFUL "Common routines for TALK and TALK_SERVER" }:{ DEC/CMS REPLACEMENT HISTORY, Element TALK_COMMON.PAS }lk and Talk_Server *)Const WKS$K_NTalk = 518; WKS$K_Talk = 517; Talk_Version = 1; Old_Talk_Version = 0; AF_Inet = 2; Name_Size = 12; Old_Name_Size = 9; Tty_Size = 16; Leave_Invite = 0; Look_Up = 1; Delete\ TALK010.A [R602MS5U.TALK]TALK010.SRC;3 NK} TALK010.SRCK# [R602MS5U.TALK]DESCRIP.MMS;1[ e*[R602MS5U.TALK]DESCRIP.MMS;1+,K#. / 4[ - 0123KPWO5627K289G HJ@INSTALLFILES = talk.exe talk_server.exe talk.cld kitinstal.com \? talk_startup.com talk_ivp.com talk.hlp talk010.release_notes \7 talk010.src talk.obj talk_server.obj talk_common.obj \% talk_msg.obj screen.obj neterror.objDSOURCEFILES = talk.pas talk_common.pas descrip.mms talk_server.pas \; talk_msg.msg tcpdefs.pas screen.pas talk010.mss talk.obj \: talk_server.obj talk_common.obj talk_msg.obj screen.obj \4 talk_common.pen screen.pen tcpdefs.pen neterror.obj3.suffixes .OBJ~ .OBJ .MSS~ .MSS .DOC .RELEASE_NOTES .OBJ~.OBJ :M IF "$(MMS$CMS_LIBRARY)" .NES. "" THEN DEFINE/USER CMS$LIB $(MMS$CMS_LIBRARY)Y $(CMS) FETCH $(MMS$CMS_ELEMENT) /OUTPUT=$(MMS$TARGET_NAME).OBJ $(CMSFLAGS) $(CMSCOMMENT) .MSS~.MSS :M IF "$(MMS$CMS_LIBRARY)" .NES. "" THEN DEFINE/USER CMS$LIB $(MMS$CMS_LIBRARY)Y $(CMS) FETCH $(MMS$CMS_ELEMENT) /OUTPUT=$(MMS$TARGET_NAME).MSS $(CMSFLAGS) $(CMSCOMMENT) .MSS.DOC : SCRIBE $(MMS$SOURCE) /PAGEDFILE.DOC.RELEASE_NOTES :" COPY $(MMS$SOURCE) .RELEASE_NOTESexes : talk.exe talk_server.exe ! All executables builttalk010.a : $(INSTALLFILES) Purge $(Mms$Source_List)> Set Protection=(S:RWED,O:RWED,G:RWED,W:RE) $(Mms$Source_List); Backup/NoAssist/Comment="TALK V1.0 Installation Saveset" \A /Inter/Log/Verify $(Mms$Source_List) Sys$Disk:[]talk010.A/Save \ /Label=Talk/Block=8192/Group=25 Copy talk010.A Sys:[Anonymous]talk010.src : $(SOURCEFILES) Purge $(Mms$Source_List)5 Backup/NoAssist/Comment="TALK V1.0 Source Saveset" \C /Inter/Log/Verify $(Mms$Source_List) Sys$Disk:[]talk010.Src/Save \$ /Label=Talk_Src/Block=8192/Group=25=talk.exe : talk.obj screen.obj talk_common.obj talk_msg.obj \ neterror.obj= $(LINK) $(LINKFLAGS) /NODEBUG /NOTRACE $(MMS$SOURCE_LIST), \ SYS$SYSTEM:SYS.STB/SELECT:talk.obj : talk.pas screen.obj talk_common.obj tcpdefs.penscreen.obj : screen.pas-talk_common.obj : talk_common.pas tcpdefs.pentalk_msg.obj : talk_msg.msg@talk_server.exe : talk_server.obj talk_common.obj talk_msg.obj \ neterror.obj= $(LINK) $(LINKFLAGS) /NODEBUG /NOTRACE $(MMS$SOURCE_LIST), \ SYS$SYSTEM:SYS.STB/SELECT=talk_server.obj : talk_server.pas talk_common.obj tcpdefs.pentcpdefs.pen : tcpdefs.pastalk010.doc : talk010.mss#talk010.release_notes : talk010.doc3! DEC/CMS REPLACEMENT HISTORY, Element DESCRIP.MMS)! *16 30-JAN-1990 21:46:36 R602MS5U ""0! *15 30-JAN-1990 21:32:16 R602MS5U "Sigh..."7! *14 30-JAN-1990 21:30:37 R602MS5U "more suffixes!":! *13 30-JAN-1990 21:29:49 R602MS5U "Added to suffixes"H! *12 30-JAN-1990 21:27:50 R602MS5U "/NODEBUG /NOTRACE added in LINK"W! *11 30-JAN-1990 21:12:11 R602MS5U "Updated release notes and other 001's to 100's"[! *10 30-JAN-1990 21:01:16 R602MS5U "Blocksize -> 8192, objects included in ""sources"""S! *9 16-NOV-1989 23:09:04 SYNFUL "Fixed up .MSS -> .DOC with CMS ""knowledge"""K! *8 9-OCT-1989 23:28:39 SYNFUL "Attempt to fix release notes problem"E! *7 9-OCT-1989 23:15:48 SYNFUL "TALK.HLP added to INSTALLFILES"O! *6 9-OCT-1989 20:28:00 SYNFUL "Updated to include SYS.STB for licensing"5! *5 9-SEP-1989 13:10:26 SYNFUL "Fixed for X0.1"L! *4 25-AUG-1989 01:22:23 SYNFUL "Added Talk_msg.obj to Talk_Server.exe"E! *3 24-AUG-1989 22:28:52 SYNFUL "Included release-notes support"D! *2 24-AUG-1989 21:57:33 SYNFUL "Updated for X0.1 distribution";! *1 20-AUG-1989 01:32:34 SYNFUL "MMS description file"3! DEC/CMS REPLACEMENT HISTORY, Element DESCRIP.MMStT TALK010.A [R602MS5U.TALK]TALK010.SRC;3 qZ! TALK010.SRC  [R602MS5U.TALK]TALK_SERVER.PAS;1qN *[R602MS5U.TALK]TALK_SERVER.PAS;1+,./ 4q- 0123KPWO56@%9Oޒ7Oޒ89G HJ TALK010.A [R602MS5U.TALK]TALK010.SRC;3 =ih TALK010.SRC  [R602MS5U.TALK]TALK_SERVER.PAS;1q[Ident('X0.1'), Inherit('Talk_Common', 'TCPDefs', 'Sys$Library:Starlet',, 'Sys$Library:Pascal$Lib_Routines')]Program Talk_Server;G(* Talk_Server acts as a small database and request-response system for1 talk programs, both on this node and remotely.> In other words, it's just an unsophisticated event handler.* There are four commands that we handle:2 - LEAVE_INVITE: leave invitation (stupid concept) - LOOK_UP: check for invitation - DELETE: delete invitation - ANNOUNCE: self explanatoryF In theory, this should be possible with a simple Case statement. *)+Const Expiration_Time = '0000 00:15:00.00';Type UDP_CTL_MSG = Record0 UDP_Header : UDP_HostInfo;+ Data_Record : CTL_MSG End; UDP_CTL_RESPONSE = Record5 UDP_Header : UDP_HostInfo;5 Data_Record : CTL_RESPONSE End;# Table_Ptr = ^Invitation_Table;$ Invitation_Table = [Aligned(3)] Record4 FLink, BLink : Table_Ptr;+ Addr : SockAddr;( Id : Integer;I FromTalk, ToTalk : Varying [Name_Size] of Char End;$Var MyChannel, MyOldChannel : UWord; GenIOSB : NetSB_Fields; BrkIOSB : NetSB_Fields;# Incoming_Request : UDP_CTL_MSG;) Outgoing_Response : UDP_CTL_RESPONSE;: Remote_User, Local_User : Varying [Name_Size] of Char;+ Local_Tty : Varying [Tty_Size] of Char; Terminal_Owner : Integer;) Terminal_User : Varying [12] of Char; AnnounceMsg : Talk_String; Table : [Volatile] Record2 First, Last : Table_Ptr; End; Find_Match : Table_Ptr; Table_Expiration : Quad;5Procedure Receive_Msg(Var New_Request : UDP_CTL_MSG);2Var NewEF, OldEF, EFMask : [Static] Unsigned := 0;4 IncomingNew, IncomingOld : [Static] UDP_CTL_MSG;Begin If NewEF = 0 Then Begin" Check(Lib$Get_EF(NewEF));" Check(Lib$Get_EF(OldEF));A EFMask := (2 ** (NewEF Mod 32)) + (2 ** (OldEF Mod 32));8 Check($Qio(NewEF, MyChannel, TCP$Receive, , , ,5 IncomingNew, Size(IncomingNew)));; Check($Qio(OldEF, MyOldChannel, TCP$Receive, , , ,4 IncomingOld, Size(IncomingOld))) End; Check($WFLOr(NewEF, EFMask));% If $ClrEF(NewEF) = SS$_WasSet Then Begin$ New_Request := IncomingNew;8 Check($Qio(NewEF, MyChannel, TCP$Receive, , , ,4 IncomingNew, Size(IncomingNew))) End* Else If $ClrEF(OldEF) = SS$_WasSet Then Begin$ New_Request := IncomingOld;< Convert_Request(New_Request.Data_Record, From_Old);; Check($Qio(OldEF, MyOldChannel, TCP$Receive, , , ,4 IncomingOld, Size(IncomingOld))) End; G (* Copy over the common information to the Outgoing_Response in case there is a simple reply *)F Outgoing_Response.Data_Record.Vers := New_Request.Data_Record.Vers;N Outgoing_Response.Data_Record.Req_Type := New_R2Q TALK010.A [R602MS5U.TALK]TALK010.SRC;3 ݽxequest.Data_Record.Req_Type;J Outgoing_Response.Data_Record.Answer := New_Request.Data_Record.Answer;J Outgoing_Response.Data_Record.ID_Num := New_Request.Data_Record.ID_Num;F Outgoing_Response.Data_Record.Addr := New_Request.Data_Record.Addr;. Outgoing_Response.UDP_Header.Source_Addr :=' New_Request.UDP_Header.Dest_Addr;. Outgoing_Response.UDP_Header.Source_Port :=' New_Request.UDP_Header.Dest_Port;, Outgoing_Response.UDP_Header.Dest_Addr :=) New_Request.UDP_Header.Source_Addr;, Outgoing_Response.UDP_Header.Dest_Port :=( New_Request.UDP_Header.Source_PortEnd;4Procedure Send_Msg(Out_Response : UDP_CTL_RESPONSE);Begin; If Out_Response.Data_Record.Vers = Old_Talk_Version Then Begin< Convert_Response(Out_Response.Data_Record, To_Old);4 Check($Qiow(, MyOldChannel, TCP$Send, , , ,7 Out_Response, Size(Out_Response))) End Else. Check($Qiow(, MyChannel, TCP$Send, , , ,4 Out_Response, Size(Out_Response)))End;'Procedure Reply(Response_Code : UByte);Begin9 Outgoing_Response.Data_Record.Answer := Response_Code; Send_Msg(Outgoing_Response)End;2Function HostName(Addr : Unsigned ) : Talk_String;Var Result : Record& Name_Length : Integer;; Name_String : Packed Array [1..128] of Char End; IOSB : NetSB_Fields; BuildAnswer : Talk_String;! AddressChars : UnsignedChars;Begin, Check($Qiow(, MyChannel, GtHst, IOSB, , ,? Result, Size(Result), GTH_AdrNam, %Immed Addr));# If Not Odd(IOSB.NSB$Status) Then Begin- AddressChars := Addr::UnsignedChars;9 WriteV(BuildAnswer, Ord(AddressChars[1]):0, '.',9 Ord(AddressChars[2]):0, '.',9 Ord(AddressChars[3]):0, '.',4 Ord(AddressChars[4]):0) EndI Else BuildAnswer := Substr(Result.Name_String, 1, Result.Name_Length); HostName := BuildAnswerEnd;;Function UpCase(InStr : Varying [A] of Char) : Talk_String;Var LowerChar : Integer;Begin Repeat2 LowerChar := Find_Member(InStr, ['a'..'z']); If LowerChar <> 0 Then< InStr[LowerChar] := Chr(Ord(InStr[LowerChar]) - 32) Until LowerChar = 0; UpCase := InStrEnd;7Function Look_Up_Table(Talk_From : Varying [A] of Char;B Talk_To : Varying [B] of Char) : Table_Ptr;Var Tmp : Table_Ptr; Found : Boolean;Begin Tmp := Table.First; Found := False;& While (Tmp <> Nil) And Not Found Do0 If (Tmp^.FromTalk = UpCase(Talk_From)) And- (Tmp^.ToTalk = UpCase(Talk_To)) Then Found := True Else Tmp := Tmp^.FLink; If Not Found Then Look_Up_Table := Nil Else Look_Up_Table := TmpEnd;[Asynchronous],Procedure Delete_Table(ThisOne : Table_Ptr);Var Tmp : Table_Ptr;Begin If ThisOne <> Nil Then Begin% Check($CanTim(ThisOne^.Id));& If ThisOne = Table.First Then) Table.First := ThisOne^.FLink Else4 ThisOne^.BLink^.FLink := ThisOne^.FLink;% If ThisOne = Table.Last Then( Table.Last := ThisOne^.BLink Else4 ThisOne^.FLink^.BLink := ThisOne^.BLink; Dispose(ThisOne) EndEnd;[Asynchronous]Procedure Delete_Last;Begin Delete_Table(Table.Last)End;Procedure Add_Current;Var Tmp : Table_Ptr;Begin1 Tmp := Look_Up_Table(Remote_User, Local_User); If Tmp <> Nil Then Delete_Table(Tmp); New(Tmp); Tmp^.FLink := Table.First; Tmp^.BLink := Nil; If Table.First <> Nil Then Table.First^.BLink := Tmp Else Table.Last := Tmp; Table.First := Tmp; Tmp^.Id := Clock;< Check($Setimr(, Table_Expiration, Delete_Last, Tmp^.Id));2 Tmp^.Addr := Incoming_Request.Data_Record.Addr;( Tmp^.FromTalk := UpCase(Remote_User);$ Tmp^.ToTalk := UpCase(Local_User)End;9Function Logged_In(User : Varying [A] of Char) : Boolean;*Var NumPID, StepThru, OwnerPID : Unsigned;9 Mode, Terminal, Phy_Terminal, Username : Talk_String; Done : Boolean;Begin StepThru := (-1)::Unsigned;  Pb TALK010.SRC  [R602MS5U.TALK]TALK_SERVER.PAS;1q Done := False;I While (Lib$GetJPI(JPI$_PID, StepThru, , NumPID) <> SS$_NoMoreProc) And Not Done Do BeginO Lib$GetJPI(JPI$_Username, NumPID, , , Username.Body, Username.Length); If Username = User Then BeginI Lib$GetJPI(JPI$_Mode, NumPID, , , Mode.Body, Mode.Length);: Lib$GetJPI(JPI$_Owner, NumPID, , OwnerPID);@ If (Mode = 'INTERACTIVE') And (OwnerPID = 0) Then BeginI Lib$GetJPI(JPI$_Terminal, NumPID, , , Terminal.Body,) Terminal.Length);S Lib$GetDVI(DVI$_TT_PhyDevNam, , Terminal, , Phy_Terminal.Body,- Phy_Terminal.Length);< If Phy_Terminal <> '' Then Done := True End End End; Logged_In := DoneEnd;Begin Table.First := Nil; Table.Last := Nil;5 Check($BinTim(Expiration_Time, Table_Expiration));$ Check($Assign('IP:', MyChannel));' Check($Assign('IP:', MyOldChannel));2 Check($Qiow(, MyChannel, TCP$Open, GenIOSB, , ,: , , WKS$K_NTalk, UDPAddr, U$UDP_Protocol)); Check_IOSB(GenIOSB);5 Check($Qiow(, MyOldChannel, TCP$Open, GenIOSB, , ,9 , , WKS$K_Talk, UDPAddr, U$UDP_Protocol)); Check_IOSB(GenIOSB);I (* Okay, we're defined to receive. Since the data is going to come inH with a special format, namely with IP information in the header ofE the message, we'll use a general routine Receive_Msg to get the network message. *) While True Do Begin' Receive_Msg(Incoming_Request);- With Incoming_Request.Data_Record Do) If (Vers <> Talk_Version) And@ (Vers <> Old_Talk_Version) Then Reply(BadVersion)P Else If Swap2(Ctl_Addr.Sin_Family) <> AF_Inet Then Reply(BadCtlAddr) Else BeginJ Local_User := Substr(R_Name, 1, Index(R_Name, Chr(0)) - 1);G Local_Tty := Substr(R_Tty, 1, Index(R_Tty, Chr(0)) - 1);H If (Index(Local_Tty, ':') = 0) And (Local_Tty <> '') Then/ Local_Tty := Local_Tty + ':';K Remote_User := Substr(L_Name, 1, Index(L_Name, Chr(0)) - 1); Case Req_Type Of Announce :(* Format of message::** TALK[/OLD] ** ms5u@unix8.andrew.cmu.edu is ringing you Things we need to check:< If there is a terminal specified, check to see if the owner= matches the username, if specified; if not, return Not_Here.'7 Run a GETJPI scan to see if the user is logged in to a:< connected terminal. If not logged in, return Not_Here. If! not connected, return Not_Here.s? Try to do a $菡 TALK010.A [R602MS5U.TALK]TALK010.SRC;3 @$BRKTHRUW. If it fails, return Permission_Denied.o; The breakthrough should be sent as BRK$C_PHONE for obviousn compatibility. *) Begine6 AnnounceMsg := ''(7) + '** TALK';Q If Incoming_Request.Data_Record.Vers = Old_Talk_Version Thens< AnnounceMsg := AnnounceMsg + '/OLD';P AnnounceMsg := AnnounceMsg + ' ** ' + Remote_User + '@' +W HostName(Incoming_Request.UDP_Header.Source_Addr) + 6 ' is ringing you';, If Local_Tty <> '' Then BeginoG If Not Odd(Lib$GetDVI(DVI$_Pid, , Local_Tty, F Terminal_Owner)) Then- Reply(Not_Here) D Else If Not Odd(Lib$GetJPI(JPI$_Username,S Terminal_Owner::Unsigned, , , I Terminal_User.Body, Q Terminal_User.Length)) Thene- Reply(Not_Here) 9 Else If (Local_User <> '') And E (Local_User <> Terminal_User) Then - Reply(Not_Here) C Else If Not Odd($Brkthruw(, AnnounceMsg,1G UpCase(Local_Tty),cM BRK$C_DEVICE, BrkIOSB, , L , BRK$C_PHONE, 5)) Then6 Reply(Permission_Denied)C Else If Not Odd(BrkIOSB.NSB$Status) Thenn6 Reply(Permission_Denied). Else Reply(Success) EndtQ Else If Not Odd($Brkthruw(, AnnounceMsg, UpCase(Local_User), I BRK$C_USERNAME, BrkIOSB, , F , BRK$C_PHONE, 5)) Then3 Reply(Permission_Denied)g@ Else If Not Odd(BrkIOSB.NSB$Status) Then@ If Logged_In(UpCase(Local_User)) Then6 Reply(Permission_Denied)/ Else Reply(Not_Here) + Else Reply(Success)  End;G Leave_Invite : If Swap2(Addr.Sin_Family) <> AF_Inet Thenl/ Reply(BadAddr)o" Else& Begin0 Add_Current;2 Reply(Success)% End;n Look_Up : BeginQ Find_Match := Look_Up_Table(Local_User, Remote_User);O4 If Find_Match = Nil Then. Reply(Not_Here) Else$ BeginG Outgoing_Response.Data_Record.Addr :=e6 Find_Match^.Addr;0 Reply(Success)" End End;e Delete : BeginsP Delete_Table(Look_Up_Table(Remote_User, Local_User));) Reply(Success)n End;/ Otherwise Reply(Unknown_Request); Endd End EndEEnd.:{ DEC/CMS REPLACEMENT HISTORY, Element TALK_SERVER.PAS }q{ *11 16-NOV-1989 23:10:21 SYNFUL "Updated for proper mixed varying constructs at %line 172 (and 173, now)" }MI{ *10 8-SEP-1989 22:04:37 SYNFUL "Added /OLD in broadcast message" }eU{ *9 3-SEP-1989 15:05:34 SYNFUL "Fixed up swapping to the best of my ability" } U{ *8 25-AUG-1989 01:59:26 SYNFUL "Removed references to IOSB checking in code" } U{ *7 24-AUG-1989 22:34:21 SYNFUL "Fixed up comments with annotations from CMS" }_H{ *6 24-AUG-1989 22:25:33 SYNFUL "Updated version number to X0.1" };{ *5 24-AUG-1989 05:12:58 SYNFUL "Added 4.2 support" } c{ *4 20-AUG-1989 06:57:06 SYNFUL "Added check for Old_Talk_Version before Reply(BadVersion)" }B?{ *3 20-AUG-1989 05:09:24 SYNFUL "Added BSD 4.2 support" }sV{ *2 20-AUG-1989 01:47:07 SYNFUL "Changed LOOK_UP routine for better searching" }E{ *1 19-AUG-1989 23:37:16 SYNFUL "Main source for TALK_SERVER" }B:{ DEC/CMS REPLACEMENT HISTORY, Element TALK_SERVER.PAS }r::UnsignedChars;9 WriteV(BuildAnswer, Ord(AddressChars[1]):0, '.',9  53 TALK010.SRC [R602MS5U.TALK]TALK_MSG.MSG;9[y*[R602MS5U.TALK]TALK_MSG.MSG;9+,./ 4[b- 0123KPWO56:47Up489G HJ# .Facility Talk, 832 /Prefix=Talk$_ .Ident /V1.0/ .Severity Fatal1FAILED (UNKREQ /BADVERS )BADADDR /BADCTLADDR ,NORESPONSE @NOT_CRT BUNREACHABLE  .Severity Error-INVALIDNUM "NOT_HERE !NO_ANSWER 6MACHUNK .PERMDENIED  .Severity InformationalRINGING $SWITCHING VERSION /FAO=13LOOK_UP 1LEAVE_INVITE #ANNOUNCE -DELETE +SUCCESS .UNKNOWN_SENT /UNKNOWN_RECV  .End4! DEC/CMS REPLACEMENT HISTORY, Element TALK_MSG.MSGI! *8 21-AUG-1989 00:38:17 SYNFUL "Added SUCCESS and UNKNOWN messages"?! *7 21-AUG-1989 00:24:14 SYNFUL "Added debugging messages">! *6 20-AUG-1989 17:27:27 SYNFUL "Added Talk$_Unreachable"A! *5 20-AUG-1989 06:41:35 SYNFUL "VERSION ""error"" fixed up",! *4 20-AUG-1989 06:18:16 SYNFUL "emcas"[! *3 20-AUG-1989 05:12:11 SYNFUL "Changed ""using"" to ""trying"" in SWITCHING message"V! *2 20-AUG-1989 05:11:11 SYNFUL "Added SWITCHING message for talking 4.2 systems">! *1 19-AUG-1989 23:37:40 SYNFUL "Error messages for TALK"4! DEC/CMS REPLACEMENT HISTORY, Element TALK_MSG.MSG TALK010.A =e{} G9\G~)@yTES;1, dY7ei;{qqc}sNo) [bNJZ0’GRhW yQ3vjW|"GF;z2Wc oJ|i`M]6wmuǚmXq Ntʃ:pX(|d 黕u+Dn_r>ymhk9 Ub&J8Coc̬fI*,ut<[jެEFf>GK:_滑 :oKI DV~!}!Ynsm/ 'l&#jMA"8 Jb,w+DS!g CdиeUtc:إuٯF 5w>Ϊ&XI5FQO63#3g=M`tt?=)T{V_I򟯂9s6r~dRC{BUdMaJ 8WȝB? 9$̞MKjSY]k/_Lu,wQB Rax"r󠳯 -;̟oH r1^Z$+p.\-X8^f9iH_&@nnV,ntNSP|^|,'#6MQW z .G4rySc %t2o_qekA(  t3>0QIҚIb ,es]e8(ZC)]MIRHRNdIr*$Hȱ4:7еT<} ٿej`ew 0!w؀X?JK9쐈k$trҿS`HmPa؄sp&nz|B(v>Fo{̓G U 'ҝv8UNTj 3#?u"X=MsdV$XZ(cPv(Y%l˵KB:׃]†>P$TD^G*Yn({zrc sІA8z?*!uA꽎Hѓ8H4Id_/mwn^#bBҴDtZxlШZ,e]2sf@Bm<v)ے^]U]O@^۞(`]g"edqgкYz-p| >\sBR$XDK\$t}ZR%{2/BfA~ϡyj6 Y G{)k"SM{es# w|B6`MÂSHC+|*0{ kUk[0TT-Ok%g'T.ViD*T pGV_0%H!& 0N""hZ@ofkA~J:njzqZ|eᱼ.#eFLmy(: p)tqm`_~vE6G4n_MlKDsZ_yCcK%=+1霤,&_YqA!Il;,~k _,|&VYO"; w= r$UAJ,/_Un׍Zm0*i cOO g.# 0$PzڔR{v&'@'q$FOs3+//MOAG gH4d],K(7f.áriꇱQOղo$0#uBPSS1#UTKib gfGWk<| 7yk9mdPg*y P$XYzW@VLb%pi=^b%Ӊ;>Ю|?aT,+bX3Cv%dUWN^^ƫwFدIhTH[ϓ؋pL(=%Ql+:08}g v74NŽR BuY#LjgryҪV3J{2; ԰o _Y uI lEL[W.01xF?6NzMKo1jdmq)NGNY )zl9\1AOZŃ3F 9/ z.u9 i]x `@x;2 2̑utt4E֎^ÿsQH$GTV Ύ?{5z.:Ab`MġV0522oVǠV޻OOX+~TUx PfآqJ77iU++:A;أ}S֧j+񛔮-ppƞ緤ɹP CxwAE i{i!Y7&ԲG{Bg?3@pW`ΤfRA" \8.,_^ S ъ"IF6i0P'28Z[bY:S]b[ E}[g R*pQ}|AAdSHѦ`jŢ@|ĮmHVsBZly]cPGg4׮8t*񼕴f y]J ;^aؔ[n_MQ N6lJaɶ8ע#2>I9 I:qj^ؿD鯼y*M>P>d4S;V}w+dq~gSdf'Oϱ;>4 nauatq6+s ӂ$Eʣ{t@itD!!ܵ`&i/0t "߫4r)V7S腁NpOgPhKUGOjg"m=ɻMUs*%V nfU׌VɼKLS4aKb2"y=gW}nM>-])lk"DظTо/_KW;-ed_*P9`;qaŲ¹2Bdn9@mQNn5!qA)gjL 4ه꟔Vdd+>NrH3+%>)1t [/Xʩj$7` 4{D?mMzNrlX-Sϰh!5dt89vNɟYa# a,yP#]KbSVm-/TrC,V(Qн8{Sm]V=D9He(sb|4cg̪ɍ8΢g1 %xo{ 5;]IEmPh-7_'O|MzYuD2ׂG-,$33$&oP^vN"K =r+`Y<ei»h0#6p#64o=>٠vrev@JKfa-E+P "#; -kfU7MtrjXh}uQ>t6b1Oځ[u% GOLv]ތ$o·s!R+f:j/?J5⿞]M"*TEfT`*UA._n/,E'strngtkU 5!+34~Ǡ=KJprObQ=}/ތOwSɄLr'p;cNb.$QEt ""X0։L|\r2z*SO9B ˚6N¿֝:2; $>}p]|/\:=,3J 7B w ϳt3XN8:ͦ;WTiEc|E-#*NN@V*>Qy;ar۸2syDBvk9`ï4̥ψ Fp Pt cJ@ p(h<L\LNo6dI^XQla'i"[%߇\(jΗs N|<'T:#R(@ q6$!GP}n*Kc=)G饿)D!6K'4hb'qkQiyN`Մi.PwZϩW64ot8#MpjQЄ.' n`|,_ssG d*3$ё0*q3N_Ai}쨱$hu@zWf9)4"op?}#=lа AIuox2n9c&x'@OՋ?v@b_.bcr801Y?Է#?A:X4o6݌;[K܊w¥3WhZVvN;z]ǡLz{eȰy :0:9¥1rIB2|+ b /t#N _"ORq#Aӓ>WMiǣx׻0 YX ~4Rr.Zֹ!P5Y2T=+gC8qrR9ib]2oTfLUbrԠ('א;wBo?H h譍̪uJF4ɜg4W<5Ĺkou)/mb(:FK3qfN.q ѦFm E쀾 ?zڴ/ г֌b߈?s jl~4f\dYDa8Sl=;EuXmR<|׈%70GVLޮ:DeDM2=" ͣ?W+~0߯ iLM/hm87܁I"4L D~Zj%XxA瓰]⟍{b*9l|~@R?N>(Z#"L ;.&~AE8b'>]_يXNNC٩U4J]89-Ū߆[Ġ(*wUUyw˧/MSxpEJ̼{PNj%3]yr3⏞ _f61R׀ejO%}# U h:SL9J'ミ{̧d80EPbq⽡uk,1aa<36rw2_9TTy.`x{tBLLZnU^ N90Wj9`S0}c oq(!^|',J6LӌuIaj7[5hDݸMųs^"$_2T~N12f+Tx)ߓ3UD0~ڰ۔2SdUS[M&e4s02¹3, w33 <.Aw920\ϴCNeYl^C gȏ.Rtj~2CÓ%e w bB)ȴfV`sksCK֙ BxةWbW i&V~pz#KsH;Vl,&/r t7=*m"?+JFXyh!PX(X@`yD`[[)i]?t[,#|us-i/-,o;Ba`ZsWZQqȲ\x;Wg77}zh]`A%z4}ۖMsQxG,7/ F*Dx<1] pЙR A< W/c6ڕixej\ JS&ywxʫ1Y!:|͕ ! WBY`-/y~q"|&mF0G<\[*9•8p$`1Z \1h꾐#Hq8T>W_v h}_T!^1E H~NǼC,lJ,mcG8IG^ tiA03;8n!ye 6sѓ/b6 c=T?&O1*Sְ+D+ C RogRS»ͩn5dG$f=v_<*2ьHg=pɚCPm+!$ծ4=T*b7.Y#e>p)C!eO>=Q(O3$<={n<9&4 =Rǿ'ﭶTtٹUg ns  rˤKLomƥSg} Bi).[8; 52קw8x1A[3ɺ@H) >`Wȃ]R3 0 Do BeginC SubChars := Find_Member(Buffer, [''(0)..''(31), ''(127)]); Case SubChars Of 0 : Begin' ThisRound := Buffer; Buffer := '' End; 1 : Begin* ThisRound := Buffer[1];B Buffer := Substr(Buffer, 2, Length(Buffer) - 1) End Otherwise Begin@ ThisRound := Substr(Buffer, 1, SubChars - 1);5 Buffer := Substr(Buffer, SubChars,B Length(Buffer) - SubChars + 1) End End;; Smg$Return_Cursor_Pos(Display[Which], Current_Row,/ Current_Column);G If SubChars = 1 Then (* Special processing for character *)% Case Ord(ThisRound[1]) OfG Smg$K_Trm_CR : Smg$Put_Chars(Display[Which], ''(13,10));O Smg$K_Trm_Delete : If SMG$Cursor_Column(Display[Which]) > 1 ThenH Smg$Delete_Chars(Display[Which], 1,B Current_Row,J Current_Column - 1); Smg$K_Trm_CtrlJ :, If Current_Column > 1 Then Begin= Smg$Read_From_Display(Display[Which],B Current_Line.Body, ,;  Current_Row);B Current_Line.Length := Current_Column - 1;) Word_Length := 1;F While (Word_Length < Length(Current_Line)) AndB (Current_Line[Length(Current_Line) -8 Word_Length]/ In WordChars) Do: Word_Length := Word_Length + 1;8 Smg$Delete_Chars(Display[Which],5 Word_Length,5 Current_Row,F Current_Column - Word_Length) End;@ Smg$K_Trm_CtrlU : Smg$Delete_Line(Display[Which],I Int(SMG$Cursor_Row(Display[Which])));6 Smg$K_Trm_CtrlW : If Which = Local ThenG (* If they redrew the screen, let's9 not reciprocate *)C Smg$Repaint_Screen(Pasteboard); OtherwiseG Buffer := '^' + Chr(Ord(ThisRound[1]) + 64) + Buffer; End Else Begin, SubChars := Display_Columns -I Int(SMG$Cursor_Column(Display[Which])) + 1;3 If SubChars > Length(ThisRound) Then: Smg$Put_Chars(Display[Which], ThisRound) Else BeginG Smg$Put_Chars(Display[Which], Substr(ThisRound, 1,E SubChars));> Smg$Put_Chars(Display[Which], ''(13,10));D Smg$Put_Chars(Display[Which], Substr(ThisRound,G SubChars + 1,M Length(ThisRound) -G SubChars)) End End EndEnd;[Asynchronous]Procedure Update_Clock;%Const Freq_Time = '0000 00:01:00.00';Var Hour : Integer;+ UpdateFrequency : [Quad, Static] Record6 L0 : Unsigned;4 L1 : Integer1 End := Zero;Begin Date(CurDate); Time(CurTime);& ReadV(SubStr(CurTime, 1, 2), Hour); If Hour >= 12 Then Begin) Hour := ((Hour - 1) Mod 12) + 1;/ CurTime[1] := Chr((Hour Div 10) + 48);/ CurTime[2] := Chr((Hour Mod 10) + 48); CurTime[6] := 'p' End Else CurTime[6] := 'a'; If CurTime[1] = '0' Then If CurTime[2] = '0' Then Begin CurTime[1] := '1'; CurTime[2] := '2' End Else CurTime[1] := ' '; TimeToUpdate := True;! If UpdateFrequency.L1 = 0 Then* $BinTim(Freq_Time, UpdateFrequency);+ $Setimr(, UpdateFrequency, Update_Clock)End;7Function Screen_Init(BorderLabel : Varying [A] of Char;P Talk_VersionString : Packed Array [_l.._u:Integer] of Char;H [Asynchronous, Unbound] Procedure Gets_Unsolicited;? Licensee : Varying [B] of Char) : Integer;Var Ret_Stat : Unsigned; Total_Rows : Integer;) Screen_Label : Varying [256] of Char;Begin> Ret_Stat := Smg$Create_Pasteboard(PasteBoard, , Total_Rows,6 Display_Columns); If Odd(Ret_Stat) Then BeginF (* Each "display" will contain half the number of rows on theI screen not including one for the status line in the middle *)0 Display_Rows := (Total_Rows - 2) Div 2;: Ret_Stat := Smg$Create_Virtual_Keyboard(Keyboard) End; If Odd(Ret_Stat) ThenM Ret_Stat := Smg$Enable_Unsolicited_Input(PasteBoard, Gets_Unsolicited) ^4: TALK010.SRC  602MS5U.TALK]SCREEN.PAS;1XQ; If Odd(Ret_Stat) Then@ Ret_Stat := Smg$Create_Virtual_Display(1, Display_Columns,> Display[Stats], ,I Smg$M_Reverse + Smg$M_Bold);* Screen_Label := Licensee + Pad('', ' ',? (Display_Columns Div 2) - Length(Licensee) -F (Length('TALK/VMS ' + Talk_VersionString) Div 2)) +4 'TALK/VMS ' + Talk_VersionString; If Odd(Ret_Stat) Then= Ret_Stat := Smg$Put_Chars(Display[Stats], Screen_Label,8 1, 1, Smg$M_Erase_Line); If Odd(Ret_Stat) ThenK Ret_Stat := Smg$Create_Virtual_Display(Display_Rows, Display_Columns,= ,h TALK010.A [R602MS5U.TALK]TALK010.SRC;3 ( Display[Local]);I (* The reason for the odd math below allows the remote user to have anD extra line should the number of lines on the screen be odd. *) If Odd(Ret_Stat) ThenK Ret_Stat := Smg$Create_Virtual_Display(Total_Rows - Display_Rows - 2,= Display_Columns,> Display[Remote]); If Odd(Ret_Stat) Then Begin Update_Clock;J Screen_Display('', Local) (* to put clock on screen initially *) End; If Odd(Ret_Stat) ThenG Ret_Stat := Smg$Paste_Virtual_Display(Display[Stats], Pasteboard,2 1, 1); If Odd(Ret_Stat) ThenG Ret_Stat := Smg$Paste_Virtual_Display(Display[Local], Pasteboard,2 2, 1); If Odd(Ret_Stat) ThenH Ret_Stat := Smg$Paste_Virtual_Display(Display[Remote], Pasteboard,A Display_Rows + 3, 1); If Odd(Ret_Stat) ThenD Ret_Stat := Smg$Label_Border(Display[Remote], BorderLabel, , ,/ Smg$M_Bold);# Screen_Init := Ret_Stat::IntegerEnd;[Asynchronous]!Function Screen_DeInit : Integer;Var Ret_Stat : Unsigned;Begin* Ret_Stat := Smg$Cancel_Input(Keyboard); If Odd(Ret_Stat) Then> Ret_Stat := Smg$Delete_Virtual_Display(Display[Remote]); If Odd(Ret_Stat) Then= Ret_Stat := Smg$Delete_Virtual_Display(Display[Local]); If Odd(Ret_Stat) Then4 Ret_Stat := Smg$Delete_Pasteboard(Pasteboard);% Screen_DeInit := Ret_Stat::IntegerEnd;[Asynchronous]7Procedure Screen_Read(Var InBuf : Varying [A] of Char); Var Term_Code : [Word] 0..65535;Begin InBuf := ''; < Smg$Read_String(Keyboard, InBuf.Body, , Size(InBuf.Body),H Trm$M_TM_NoEcho + Trm$M_TM_NoFiltr + Trm$M_TM_NoEdit,; 0, %X00200000, InBuf.Length, Term_Code);& If Term_Code = Smg$K_Trm_CtrlU Then InBuf := InBuf + Chr(21)End;End.5{ DEC/CMS REPLACEMENT HISTORY, Element SCREEN.PAS }X{ *8 30-JAN-1990 21:22:46 R602MS5U "Sigh - PASCAL$SMG_ROUTINES incompatibilities" }<{ *7 30-JAN-1990 21:10:45 R602MS5U "Updated for V1.0" }?{ *6 16-NOV-1989 23:41:53 SYNFUL "Added token licensing" }cP{ *5 14-OCT-1989 12:32:04 SYNFUL "Clock update no longer executes in AST" }E{ *4 9-SEP-1989 12:52:42 SYNFUL "Fixed clock routine for 12p" }aG{ *3 9-SEP-1989 12:48:56 SYNFUL """werase"" works properly now" }fB{ *2 8-SEP-1989 22:04:28 SYNFUL "Updated for X0.1 release" }H{ *1 19-AUG-1989 23:36:45 SYNFUL "TALK screen mangement routines" }5{ DEC/CMS REPLACEMENT HISTORY, Element SCREEN.PAS } Sim TALK010.SRCz  [R602MS5U.TALK]TALK010.MSS;1D *[R602MS5U.TALK]TALK010.MSS;1+,z ./ 4D,- 0123KPWO56i17@389G HJ= TALK010.A [R602MS5U.TALK]TALK010.SRC;3   @Device(PagedFile)C@PageHeading(Left="@Value[Date]", Center="TALK X0.1 Release Notes",' Right="Page @Value[Page]")6@PageFooting(Center="TALK V1.0 - Preliminary Release")>These release notes are bastardized from the beta-test releaseBnotes, so please forgive some of the assumptions that you may have been running a previous release.5Version V1.0 of TALK contains the following features:@Begin(Itemize)@Begin(Multiple)2Support for BSD 4.2. This was done by having TALK<automatically detect when a packet destined for port 518 wasDrejected (via an ICMP error) and try sending an "old" packet to portD517. If this is rejected, the error "remote system not reachable or$does not support talk" is signalled.=Note that due to limitations in CMU TCP/IP, TALK is unable toBdistinguish between "host unreachable" and "port unreachable" ICMPDstatus messages. That's why the ambiguous error message is printed.@End(Multiple)>Qualifier: /OLD_PROTOCOL - forces TALK to use the 4.2 protocolCinstead of trying 4.3 first. I'm not sure how useful it really is,&but it didn't hurt to put it in there.:Enhanced on-screen status messages. Things included are aCprogram/version banner and an updating clock. Also, the middle bar6now contains the username and node of the remote user.=^J is now handled (properly? maybe) when entered locally for@word-erase. Incoming "werase" characters are also processed but=currently have a hard-coded assumption that they will be '^W',and may cause problems with this assumption.@A help file has been added. It is quite basic, but does provide7some information for the novice starting out with TALK. @End(Itemize)Items planned for next release:@Begin(Itemize).Provide some interface for broadcast messages.@Some sort of SPAWN character which allows a user to SPAWN out by'hitting this character (or keypad key). @End(Itemize)@BlankSpace(2 Lines)<This version of TALK will run without a license (and with noBcomplaints, either). However, you are asked to register your copyBsimply by obtaining a personalized PAK. You can do this by either>contacting Marc Shannon (SYNFUL@@DRYCAS.CLUB.CC.CMU.EDU) or byCsending a special mail message to CLUB_PAK@@DRYCAS.CLUB.CC.CMU.EDU.DThis special mail message need not contain any body, but the subjectMUST be of the form:) Subject: TALK Carnegie-Mellon UniversityBYour PAK will then be "registered" for Carnegie-Mellon University.C(Please put your own site name there as you would like it to appearin your registration PAK.) e TALK010.A [R602MS5U.TALK]TALK010.SRC;3 mr TALK010.SRCg  [R602MS5U.TALK]TALK.OBJ;5tF*[R602MS5U.TALK]TALK.OBJ;5+,g ./ 4X- 0123KPWO56r77@o789G HJ!Hh TALK010.A [R602MS5U.TALK]TALK010.SRC;3 B6'u TALK010.SRCg  [R602MS5U.TALK]TALK.OBJ;51TALKV1.030-Jan-1990 22:2130-Jan-1990 22:21VAX Pascal V3.9-289 TALKPIP:QIP:Q0.0.0.0VersionQDebugQSYS$INPUTQSYS$INPUTQ0000 00:00:Q.00QNetAddressQ@0.0.0.0Interval0000 00:00:Q.00QTimeOutQOld_Protocolh^м\VWXY(TxCONVERT_REQUEST\xyYPP TALK$_LOOK_UP LIB$SIGNALTALK$_LEAVE_INVITE LIB$SIGNALTALK$_ANNOUNCE LIB$SIGNAL TALK$_DELETE LIB$SIGNALTALK$_UNKNOWN_SENT LIB$SIGNALݏ`0<~ SYS$QIOWPCHECK CHECK_IOSBW$h1<~X SYS$QIOPCHECKW\h\ SYS$SETIMRPCHECKX  X~XnXPQ{ PP~ OTS$POWLULUPR  \~\n\PQ{ PP~ OTS$POWLULUB`X SYS$WFLORPCHECKX SYS$CLREFP VVVx+TALK$_SWITCHING LIB$SIGNALxVWCONVERT_REQUESTh\VXd1V\ SYS$CANTIMPCHECKVTALK$_NORESPONSESYS$EXIT CHECK_IOSB(t@x@CONVERT_RESPONSEyB TALK$_SUCCESS LIB$SIGNALBTALK$_UNKNOWN_RECV LIB$SIGNAL TALK_COMMON TALK_COMMON30-Jan-1990 22:18:22PAS$ENVIRONMENT_TIME CONVERT_REQUEST TALK$_LOOK_UP LIB$SIGNALTALK$_LEAVE_INVITETALK$_ANNOUNCE TALK$_DELETETALK$_UNKNOWN_SENTSYS$QIOW CHECK  CHECK_IOSBSYS$QIO SYS$SETIMR OTS$POWLULU SYS$WFLOR SYS$CLREFTALK$_SWITCHING SYS$CANTIMTALK$_NORESPONSESYS$EXIT CONVERT_RESPONSE TALK$_SUCCESSTALK$_UNKNOWN_RECV PAS$HANDLERBP^ԭ PAS$HANDLERm^\VW?SWAP2789G HJ8 TALK_SERVERX0.130-Jan-1990 22:2230-Jan-1990 22:22VAX Pascal V3.9-289 TALK_SERVERPINTERACTIVEQ0000 00:15:00.00IP:QIP:Q** TALKQ/OLD ** Q is ringing youQ<^1 LIB$GET_EFPCHECK  LIB$GET_EFPCHECK  ~nPQ{ PP~ OTS$POWLULUPR   ~ n PQ{ PP~ OTS$POWLULUB`ݏ`1<~ SYS$QIOPCHECKݏ`t1<~  SYS$QIOPCHECK SYS$WFLORPCHECK SYS$CLREFP (`ݏ`1<~ SYS$QIOPCHECK  SYS$CLREFP (`t ~CONVERT_REQUESTݏ`t1<~  SYS$QIOPCHECKЬP DЬP EЬPFЬPРHЬP(LЬPР8ЬP @м<Ь\B^м\\ݬ SYS$CANTIMPCHECK\ll\P\`lQ`\ PAS$DISPOSE2^\ݬ SYS$CANTIMPCHECK\ll\P\`lQ`\ PAS$DISPOSE2|^ԭ PAS$HANDLERm^\<lPP\^P~(nnn% ^^P<\QQP^Q~(n^ͮnܰ% ^ܭ^PPVVRݢ SYS$CANTIMPCHECKRbbRPR`bQ`R PAS$DISPOSE28PAS$NEW2PVfԦPVVV PAS$CLOCK2Pݦjz SYS$SETIMRPCHECK(<\PP\^P~(n^n% ^^Pܚ  P`(`<lPP\^P~(nnn% ^^Pܚ  *P`(`<^}<\\\^Э\^Pl`(`^\1Џ蟭ߏ LIB$GETJPIЭP- `1Џ蟭ߏ" LIB$GETJPIߏ LIB$GETJPI- խЏ蟭ߏ LIB$GETJPIʟЏ蟭ܰޞߏ LIB$GETDVI- n\Rߏ LIB$GETJPIP R\RR1\P<h^ԭ PAS$HANDLERmмRRݏh%<~ SYS$QIOWP쟭CHECK1Rh~hݏPAS$WRITEV_INTEGER.hݏPAS$WRITEV_CHAR~hݏPAS$WRITEV_INTEGER.hݏPAS$WRITEV_CHAR~hݏPAS$WRITEV_INTEGER.hݏPAS$WRITEV_CHAR~hݏPAS$WRITEV_INTEGERPP hPPlPPPhh(h`jЬPh`(j`<(^($ܕCONVERT_RESPONSE$0<~ SYS$QIOWP؟CHECK$0<~ SYS$QIOWPCHECK\\F8`΀^ԭ PAS$HANDLERm^\z SYS$BINTIMPCHECK SYS$ASSIGNPCHECKz SYS$ASSIGNPCHECKݏ3<~ SYS$QIOWP쟭CHECK CHECK_IOSBݏ3<~ SYS$QIOWP쟭CHECK CHECK_IOSBߏρ1SWAP2cV V̀(Vi͂- n1భ缰ߏ LIB$GETDVIPߏϙ1Џ ҭߏ LIB$GETJPIPߏ_1-ln n-ln Эߏ/1ԭԭԭ ȭzQ QQ<0Q QQ-QQQXQQ (Q6 LIB$GET_EF TALK_COMMON TALK_COMMON30-Jan-1990 22:18:22PAS$ENVIRONMENT_TIME CHECK OTS$POWLULUSYS$QIO SYS$WFLOR SYS$CLREF CONVERT_REQUEST SYS$CANTIM PAS$DISPOSE2 PAS$HANDLERPAS$NEW2 PAS$CLOCK2 SYS$SETIMR LIB$GETJPI LIB$GETDVISYS$QIOWPAS$WRITEV_INTEGERPAS$WRITEV_CHAR CONVERT_REDvU TALK010.SRC  [R602MS5U.TALK]TALK_SERVER.OBJ;5 SPONSE SYS$BINTIM SYS$ASSIGN  CHECK_IOSB SWAP2 SYS$BRKTHRUWG$CODE$LOCALh ;U   n ܁~̽  $CODEG$LOCAL  TALK_SERVERh RECEIVE_MSG|dSEND_MSG REPLY(HOSTNAME< UPCASE LOOK_UP_TABLE DELETE_TABLElP DELETE_LASTl ADD_CURRENT LOGGED_INp %l TALK010.A [R602MS5U.TALK]TALK010.SRC;3 ,gh TALK010.SRC/  [R602MS5U.TALK]TALK_COMMON.OBJ;5 c *[R602MS5U.TALK]TALK_COMMON.OBJ;5+,/. / 4 - 0123KPWO 56`U77hk789G HJ8 TALK_COMMONV1.030-Jan-1990 22:1830-Jan-1990 22:18VAX Pascal V3.9-289 TALK_COMMONPDECQTALK**UNREGISTERED**м\\\SYS$EXIT^},Э\\\SYS$EXIT+TALK$_UNREACHABLESYS$EXITh@ |p@ x@ @ @ "@ \@ @ @ @ (@ ^8FAILED'operation failed for unexplained reason0UNKREQrequest has invalid type value6BADVERS$request has invalid protocol version0BADADDRrequest has invalid addr value8 BADCTLADDR"request has invalid ctl_addr value4 NORESPONSEno response from remote machineHNOT_CRT5your terminal type has not been set or not a terminalJ UNREACHABLE4remote system not reachable or does not support talk6 INVALIDNUM number must be greater than zero*NOT_HEREcallee is not logged in* NO_ANSWERno answer from callee>MACHUNK+strange - the remote system doesn't know me6 PERMDENIED!callee has disabled talk requests$RINGINGringing your party, SWITCHINGtrying old talk protocol VERSIONversion is !AS:LOOK_UP(checking for invitation on remote system: LEAVE_INVITE"leaving invitation on local system,ANNOUNCEsending announce message4DELETE#deleting invitation on local system2SUCCESS operation completed successfully6 UNKNOWN_SENTunknown request packet sent (?)8 UNKNOWN_RECV unknown response packet received@ TALK'@u TALK010.A [R602MS5U.TALK]TALK010.SRC;3 J^H TALK010.SRC 602MS5U.TALK]SCREEN.OBJ;1 *[R602MS5U.TALK]SCREEN.OBJ;1+,. / 4 - 0123KPWO 56 /7ak789G HJATALK_SCREEN_ROUTINESV1.030-Jan-1990 21:2330-Jan-1990 21:23VAX Pascal V3.9-289TALK_SCREEN_ROUTINESP Q Q0000 00:01:00.00TALK/VMS QTALK/VMS ,^ԭ PAS$HANDLERm} OLD_NAME_SIZE?TTY_SIZE@ LEAVE_INVITEALOOK_UPBDELETECANNOUNCEDSUCCESSENOT_HEREFFAILEDGMACHINE_UNKNOWNHPERMISSION_DENIEDIUNKNOWN_REQUESTJ BADVERSIONKBADADDRL BADCTLADDR M@UBYTE N@UWORD O@@QUAD R UWORDCHARS T UNSIGNEDCHARS V TALK_STRING ZCONVERSION_KEYZ*[FROM_OLDZ\TO_OLD ]SOCKADDR dCTL_MSG  CTL_RESPONSE! TALK_VERSIONSTRING" XTALK_RELEASEDATE"  TALK_LICENSEECHECK CHECK_IOSBSWAP2SWAP4CONVERT_REQUESTCONVERT_RESPONSECONFIRM_LICENSING                       $@P$ OQL0$ OL1 S   U WX  Y  Z $^$N@]_ SIN_FAMILY$N@]`SIN_PORT$ ]aSIN_ADDR$b@@]SIN_ZERO @M@c $Tfe)_aZ TALK010.A [R602MS5U.TALK]TALK010.SRC;3 h f hg$ di( k ijjk$M@dglVERS( h m`g$M@dgnREQ_TYPE$M@djo OLD_REQ_TYPE$M@dgpANSWER$qHdjr OLD_L_NAME$M@dgsFILLER H t$uHPdjv OLD_R_NAME$ dgwID_NUM   H x$N@djy OLD_ID_NUM$]@dgzADDR  ${@dj| OLD_FILLER$]dg}CTL_ADDR$$N@dj~OLD_PID$ @dgPID$dj OLD_R_TTY$``dgL_NAME $]PdjOLD_ADDR ` $`dgR_NAME $@dj OLD_FILLER_2   ` $ dgmR_TTY$$]dj OLD_CTL_ADDR    $ $ ( $M@VERS( $M@REQ_TYPE$M@ OLD_REQ_TYPE$M@ANSWER$M@ OLD_ANSWER$M@PAD$N@ OLD_ID_NUM$ ID_NUM$@ OLD_FILLER$]@ADDR$$]@OLD_ADDR    X   "       $@ INSTAT $@IOSB$@ $@ NSB$STATUS( @$  $@NSB $BYTE_COUNT( 0$ NSB$XSTATUS( @ $@ NSB$ICMP_CODE$ NSB$XERROR( 0$( ( ,$@( NSB$FLAGS$( NSB$F_URG$) NSB$F_PUSH$* NSB$F_EOF$+ NSB$F_ICMPN A3SWAP2 $R@NUM  4SWAP4 $T@ NUM $dINPKT $Z DIRECTION $W TALK010.SRC1  [R602MS5U.TALK]TALK_COMMON.PEN;5-INPKT $Z DIRECTION6Tt(B\x .Lf.`"L~  8 T v    ( 4 @ L X d p |  F n  ( H h & V 2\xJv&RtFv NpBd(HhBlFp*P~8XxJt8hNx4P,Tp * TALK010.A [R602MS5U.TALK]TALK010.SRC;3 $w, TALK010.SRC 602MS5U.TALK]SCREEN.PEN;1|N*[R602MS5U.TALK]SCREEN.PEN;1+,./ 4- 0123KPWO56 k_/7@/89G HJv@ MbH30-Jan-1990 21:23:00V1.0TALK_SCREEN_ROUTINESVAX Pascal V3.9-289 STATS  WORDCHARS !POSSIBLE_DISPLAYS!"STATS!#LOCAL!$REMOTE  KEYBOARD  PASTEBOARD% " `DISPLAY  DISPLAY_ROWS  DISPLAY_COLUMNS' " XCURDATE' " XCURTIME   TIMETOUPDATE)SCREEN_DISPLAY UPDATE_CLOCK0/ SCREEN_INIT< SCREEN_DEINIT= SCREEN_READ  !  `  & ! X (   $*+% OUTCHARS $!WHICH,- $.    SCREEN_INIT $12% BORDERLABEL $34TALK_VERSIONSTRING,5 $6  7GETS_UNSOLICITED$$8 $9% LICENSEE GETS_UNSOLICITED ,:$+X TALK010.A [R602MS5U.TALK]TALK010.SRC;3 .;    SCREEN_DEINIT $>% INBUF,?$@ .d~*Lh$Bl$Dr8h < j  , X p  TALK010.SRCI? a{dwf^6' YȀo±ȑC?(C6(R@OHS"$S|dɣ9*Cx2KSU Hs T1I7U#ȴڂ?:H PKٰ}l 9 vzbOqBZ7֛Ԧ'^ٶӆjĖFWw$* ($1E)ʺl3@,] 3#Xǵ ^6it/7.^b:;M]3I0mڔvFz(w23q1iNYp: -`wj Y}B ²yv߹]Xta%Za/HDYNuOrOv1SთĹB{w`I8lDVJKՄ2WO8ܜF߳j_XbS۬GGxn(0!BتqBrgy?xvmеBxJe?1+ X15/Gj aMu˥n74Ї_kAvDO%mݴG3ew#l*wBG> ?א.-s.M!a L66W!ObITˎb=‚$yw%4PsMir[ n*2o3ꠢ# yAߒv fİ'cnE,2)w_tb,0dAJc2$=L溊9Re .s\uV${g-&Z7Ædp:X5PlmK2@v\yZPr.h}<`4Th]BrDoU ƒ^HԻT` 6D)h [6%uz/͚;0FPhOn8j9ř<%uKYK߯Q I4=엂QbD3mRE+銂w㔻Am'W$5{ 4fMNd?3@Jl}R,kc[Y@ JxHqLCnŰilRT~wlP+j1盔 r473G:r41~w/Qşf7 `${Y!d>wwح;l[gI3 flk.4j ʥiOTTK\ڵCm !1_$z•4;19o*Q.dbVI}[B6&-̋#{F7*@W; Ky|c@s_ة)`}?nEyi7y&KwO=ǢWHMSP3EĥL 8ל?o4Q}#QS$mp%Ukmjץ0^ߚΜ妉%VC~.E~:\B׊Mb)-5 ]fܤ`{F8 :'k%$V"l>;Gcr:t)u\E6P ~'z^fWDL',? TALK010.A [R602MS5U.TALK]TALK010.SRC;3 O9z r ,T6û3X,VJ'Il{dH0B@-DLA?H"Ҝ "+ Qq[l7ZM | e8D.DgL6eLvh*[@.!~F@g$nV9J̷Z$/ ЏrV}uB|hJ0]ې ,#X@ߢW7 aMtbHohl:/ݐ}q,&58yx VO Yj3㈚S <8c\6П_U jOYpʽ Jo~rBy/`:ӒJpm&k[{Bam#;$"Zճn?1[x˿܅VB~KYPFlEfR9 F D<兜kaÕ 86QӼE0ʲ~)׶U1p:Ŋqbś2>!:gndC(JE,{SρPb^ֽ`nW孰(רcFW0]|W8)B}pxďfGP 囲`g](<ю֓+K`~]zM獅B:Ghxk%)@G zJ `ֶ91Y]Q)8ߏ)~9r`Xv&$1z=20L$ ER#W{>FHK(OdTep暬')cՙG:twwbOYU:[9qOPtZ78A$Un~";! 0ɽagc%~jKW0fAJE5ѱw~ko@ U`jޢV0P5o7vDoMnJV (|]B$Cb;9P5$ <>Ω[cWB2iԬ;*>DŐS*-xd,K*;6YGCӄC %Sg݄cj _6[C(B62S?L)'.pj}Ě"lҴ<)ՃM!A~u>.\dϏⅉGx ƹ܁*y 2MNбodv iRXbѽR-IAzZL#JE#aehsJTMHa!?TM(%[&w"ᇃ&Q 2$#.WA_5vt.X|n}wrO1eZ' /2tT˟NF/_o}0HJʘ6N}Exe:btnQdSxCN*a_SE?ʁ(u.] ~80S[wC^q{`w up^0Yv]f%7~7˃ <9'0Iɣ.pT8'h;[7oOJn] 9⤍Ig[.7E!R!_i2 YxpԲqG eW&"ic>8O"4|҉ΪOL`*pԮO&v21p?Z|%Sy@& eUXy=k K\p-Io$;VQ'e J;3ZUePia>\ սJMj$O εFJVZT K[|D/g7Xɶst%A_HIF@SKmv;/j %u,=k8[#lEo=}-2ʄlǩ k^R+a7WzXpćbr,Xi:MMs|,snb\1[#_[౹EmYu_~|4%KoF*`Q$(`̘ }ȬPP"7.QmrtH{دY>ԅwWho:j ~ĕ%S~|',"~O[4,"ПKq_&{o:S-_E*qiP}kO:ltefc Ar5" ]\Wq TռhE} mYiuUc?NX n sc :*ESQȯp{;& iͱ $WRJtL^Tų8ϜH8q8 U!eÇxgK(\TJ-gN{HF5ZynQA m)uX ICK\7u4Dx5F&Z܄JAmDidRf]@_|趹kx=l"p\v%HIk)^?BA@=6OC,~8}|jS·]"J-r,g좩M~Y80Di%khhH-O*޺b(/%:R9^d$`I)=p͵(EQk9xnx8iF?OR&+puEe/Ⱦh}"-8Zσ݊ȢܭQS6s2ǓPc}8d;c q"=C.*EtOJBr s)WX$gJ@s^33Ѹ`^rؕՉ9@G|SwjNvpJf}7}&K! f<NKvLN1b]qe:wsFtsk,.gyZQL`&? 3,&WnI/D cE]or%d_Q95Cl'*@HK(:}՗j\1AM{-$=b^ ]Fb*QMteQb9|=(z2͂[䚿E[%F =A1iקƵ=W%i-M@{3ȪI=^t@ڷaoT-wRsjHEi.u"bͶa͉ +Αge+OBGyX~EHF|R j_gէsM={3T9:׉: $P%ex7a)fp57`Dbz}sĪ0PWX6}¹ /"2S HT9/%uENo![<4H,ԦH)u %6jwLb|r/0T|"(k\ϵzAbT&uI4 DPKG&lznSxŋ/,> GX ӓ$ZUeFd6z\;^E*'DFB#yP ԀnhV6KY]J/ $l?N 0E|,PM|er|M'TY ?oP0h2v`m2 1**b^?m+ 3Jd{Yskطl`NP5'Xr~?WD\.᛬r\^O>mjo̙l%04\KG# F=1H uQ 1EN`sX8qzͩcS=Ɗ["[Ƨ$5v:3ܵ2ƾ8.vS>J,-WЉهbʢȃ&ͺWQ2 -iQA\Ž&ȲR9Fge `knwqc]M" ?LRYxh@<˒t5M8|sP0Wx"wHH3w̧In|;x ,N}0=`Ԗo7غJ#V]F L|I-e{wx? Hi1 TALK010.SRC [R602MS5U.TALK]TCPDEFS.PEN;1 u*[R602MS5U.TALK]TCPDEFS.PEN;1+,. / 4 - 0123KPWO 56/7 8/89G HJi 6MUH30-Jan-1990 21:23:09V1.0TCPDEFSVAX Pascal V3.9-289CB IP_DEVICEETCP$OPENF TCP$CLOSEGTCP$SENDH TCP$RECEIVEI TCP$ABORTJ TCP$STATUSKTCP$INFOLGTHSTM GTH_LCLHSTN GTH_NAMADRO GTH_ADRNAMPACTIVEQPASSIVERUDPDATASUDPADDRTWILDUASYNCH-HX TALK010.A [R602MS5U.TALK]TALK010.SRC;3 e(VSYNCHWOPF$MODEX OPF$NOWAITY OPF$ADDRFLAGZHOST_NAME_MAX_SIZE[ MAX_HNAME\ MAX_HADDRS] CS$CLOSED^ CS$LISTEN_ CS$SYN_SENT` CS$SYN_RECVaCS$ESTABLISHEDb CS$FIN_WAIT_1c CS$FIN_WAIT_2d CS$TIME_WAITe CS$CLOSE_WAITf CS$CLOSINGg CS$LAST_ACKhCS$RESETi CS$INACTIVEj CS$NAMELOOK k@@ NETSB_FIELDS @` UDP_HOSTINFOU$TCP_PROTOCOLU$UDP_PROTOCOL WKS$K_ECHO WKS$K_DISCARD WKS$K_USERS WKS$K_DAYTIME WKS$K_QUOTE WKS$K_CHARGEN WKS$K_FTP WKS$K_TELNET WKS$K_SMTP WKS$K_TIME WKS$K_TFTP IP: D  3 5 0 1 4 8 6 %                              $@ml pon$q@kr NSB$STATUS( ut@svw$ kt $q@kpNSB$BYTE_COUNT( wyx0v$ kny  NSB$XSTATUSn( oz@su }|{$~@ ks} NSB$ICMP_CODE$ kv NSB$XERROR( 0$(ks ( |,$~@(k{ NSB$FLAGS{$(k NSB$F_URG$)k NSB$F_PUSH$*k NSB$F_EOF$+kz NSB$F_ICMP$` $ SOURCE_ADDR$ DEST_ADDR$q@@ SOURCE_PORT$q@P DEST_PORT            % E8Vp8Tl <\6Xz0Nn , N n  $ @ \ n    ( 4 @ L X d p |  $ 0 < H T ` l x  4 Z | (Pl8^$V <l , TALK010.SRC  [R602MS5U.TALK]NETERROR.OBJ;1 *[R602MS5U.TALK]NETERROR.OBJ;1+, . / 4 - 0123KPWO 56`^P7k789G HJ 1NETWORK019-MAY-1989 23:2019-MAY-1989 23:20VAX-11 Message V04-00k$ABS$ MSG$SECTIONMSG$AAAAAAAAAAAMSG$AAAAAAAAAABMSG$AAAAAAAAAAC2cNET$_NRT*cNET$_GP_NSDOWN"cNET$_GP_TOOBIGcNET$_GP_NOTIMPcNET$_GP_UNKMBX cNET$_GP_NOTFNDcNET$_GP_NOHINFcNET$_GP_NONMSRcNET$_GP_RSBUSYcNET$_GP_INVCLScNET$_GP_INVMBXځcNET$_GP_INVADRҁcNET$_GP_INVNA. TALK010.A [R602MS5U.TALK]TALK010.SRC;3 MʁcNET$_GP_INVINFcNET$_GP_INVREQc NET$_GREENERRc NET$_DSREFEXCc NET$_DSUNKERRc NET$_DSNONSRVc NET$_DSREFUSDc NET$_DSNOTIMPc NET$_DSNAMERRc NET$_DSSRVERRzc NET$_DSFMTERRrc NET$_DSNONAMEjc NET$_DSNOADDRbc NET$_DSINCOMPZc NET$_DSNODSRc NET$_DSDOWNJc NET$_NSQFULLBc NET$_NONS:c NET$_NSEXIT2c NET$_NMLTO*cNET$_DAE"c NET$_GTHFULc NET$_NOADRc NET$_NOANA c NET$_NOINAc NET$_NOPNcNET$_NYIcNET$_FTOcNET$_TEcNET$_TWTڀcNET$_CTOҀcNET$_CCʀcNET$_UNU€cNET$_UNAcNET$_IGFcNET$_URCcNET$_EPDcNET$_BDIcNET$_IHIcNET$_BTScNET$_FIPc NET$_CCANzc NET$_CREFrcNET$_VTFjcNET$_UNNbcNET$_FSUZcNET$_CRRcNET$_CDEJcNET$_CIPBc NET$_NOPRV:cNET$_CSE2cNET$_NUC*cNET$_ILP"cNET$_IFScNET$_UCTcNET$_IFC cNET$_IRcIPACP$_FACILITYPeP*P'P(`8{c`cc c(c0c8cH@cvHcPcXc `c6hc\pc~xccccDctccccc,ȀcLЀcn؀cccccDctccc c<(c0c8c@c HcJ Pc Xc `c hcd pc xc c. cd c c c2 c| c c c0 ȁcr Ёc ؁ccNcccc\ccc cP(c0c*IRInsufficient system resources,IFCInvalid network function code"UCTUnable to create TCB"IFSInvalid foreign port ILPInvalid local port.NUCNon-unique connection specified.CSE Connection table space exhausted:NOPRV*No privilege for access to well-known port2CIP#Connection illegal for this process(CDEConnection does not exist,CRConnection RESET by remote host&FSUForeign host unspecified"UNNUnknown network node<VTF-Valid-TCB table full (all connections in use)0CREF!Connection refused by remote host4CCAN%Connection cancelled by process abort&FIPIO Function in Progress0BTS"User s pecified buffer is Too small&IHIInvalid known host indexBDIBad device index*EPDError processing device dump&URCDestination Unreachable$IGFInvalid GTHST function UNAUnknown host name"UNUUnknown host number6CC)Connection is closing - operation invalid CTOConnection TimeOut TWTTime-Wait TimeOut TENet ACP is Exiting@FTO2User function timeout. Network event didn't happen0NYI!User function not yet implemented4NOPN$UDP wildcard connection not yet open,NOINAInternet access not allowed*NOANAARPANET access not allowed>NOADR.Name lookup not yet complete - no host addressDGTHFUL2GTHST queue full - can't queue name/address lookup&DAENET$DUMP argument error*NMLTOHost name lookup time-out<NSEXIT+Name lookup failure: name server is exiting>NONS/Name lookup failure: name server is not running@NSQFULL.Name lookup failure: name server queue is fullJDSDOWN9Name not found in host table (domain service unavailable)FDSNODS4Domain service: no domain servers could be contactedJDSINCOMP7Domain service: received incomplete domain server replyDDSNOADDR0Domain service: no addresses found for host name@DSNONAME,Domain service: no name found for IP addressFDSFMTERR3Domain service: domain server returned format error6DSSRVERR#Domain service: domain server error<DSNAMERR)Domain service: name error (no such name)JDSNOTIMP6Domain service: domain server returned not implementedHDSREFUSD5Domain service: domain server refused to resolve nameJDSNONSRV6Domain service: no usable servers returned by referral8DSUNKERR$Domain service: unknown server errorBDSREFEXC/Domain service: maximum referral limit exceeded:GREENERR'Name lookup failure, unknown error codeB GP_INVREQ-Name lookup: invalid request (internal error)H GP_INVINF4Name lookup: invalid host info item (internal error)L GP_INVNAM8Name lookup: invalid domain name syntax (internal error)H GP_INVADR4Name lookup: invalid address syntax (internal error)H GP_INVMBX4Name lookup: invalid mailbox syntax (internal error)F GP_INVCLS2Name lookup: invalid domain class (internal error)B GP_RSBUSY-Name lookup: res olver to busy to handle query> GP_NONMSR*Name lookup: no name server could be foundF GP_NOHINF2Name lookup: request host info item does not exist4 GP_NOTFND Name lookup: host name not found2 GP_UNKMBXName lookup: mailbox not foundH GP_NOTIMP3Name lookup: unimplemented request (internal error)> GP_TOOBIG)Name lookup: request data too big for UDP@ GP_NSDOWN+Name lookup: all name servers declared down,NRTNo route found for destinationcIPACP3o|~ q 1-x|~ q 3++,, .. // 44 -- 00112233KK~PPWWOO 5566% Ò77 83D.8899GG HH"JJ/`x TALK010.A [R602MS5U.TALK]TALK010.SRC;3 \[ 1iNQTDRK19-AY-1989 23:g019eMAY-1<89 23:20$0-K7/umWBIST_o4b?CQDERVAX%t 10El 1*(-23tSG$SECTIONMSG$AAAAAAAAAAAMSG$AAAAAAAAAABMSG$AAAAAAAAAAC2cNET$_NRT*cNET$_GP_NSDOWN"cNET$_GP_TOOBIGcNET$_GP_NOTIMPcNET$_GP_UNKMBX cNET$_GP_NOTFNDcNET$_GP_NOHINFcNET$_GP_NONMSRcNET$_GP_RSBUSYcNET$_GP_INVCLScNET$_GP_INVMBXځcNET$_GP_INVADRҁcNET$_GP_INVNAMʁcNET$_FQNI VINFBcGa INVSD@cHNET$Wac NE$_DS[|MOQEb NFT$_DSUN ERRVCP&FIODE$\DSNONSR 3,_ m SSDWUPDc NLg` MQc NT$_DYa@TWSb MET$_DSSVERR TAP$3%G NDU5_GSFMTERRMw7@^ET$^EBNLNAMEMjcJ hADESbc ET$_N @DPK` NET$_ SNODYFTJ_A-IFODE$\DSDOWNPJ"KX%^_SRFULLQBcYm OOR:c ET$_I UA3r NET$_NMTOUDz'LZNET%^UAF"7 NEPs IGDLc] NET"c NE$_NODOCJ b MET$_NOIAORGEF U%NNLPNcD b{@IV`NET$_TOOP"LCeTEcNE$_TWFIOQT_.MW {  ҀcNE$_CCMCX_"EMNET%^DNV€?NE^i  @DFRSb NFT$_IGF] [, wRCcNETz_EPDCQ$L7MFNDU5_ADIŀcE RELTb NFT$_BTS` [,{  ` NET$_"CANAS$?7IK lREGrcN'T$_VYR$DIN5"A\tT$_TO_bckNET$RqGIL_W7W5NDU5_@RRcNIw{ D_UAIbMET$_CIPdO0,I aV:cNET$9CSE AS$q,[AT$^ODC,cNEP$_ILP"cNNw{U_CCKbMET$_UCTi0,Z p^HWC caNET/vHNCCT*^EHAA@P$_FACI&ITY AW&NGLOOK jeA*P'P NPWS_FaELDa @`8{'X?JOSD-Nr cS(6,AP_`,\U@OL8b Y@cvHc'UD3ZWOCb `c6hi_W$K/ @1xcc WGCAAIS1LDc tc([N_U1[c c,([hM_D7A#Cɀ` 0,YQU&`Dt _0,XCHQ$M ` < 0,WFT`b 8c@c[BS$7MGETQr Xc j([>A_S%3 epc xc]KS<\gFEc d c ([@_T3 )c| Ic u c0ȁcrc kgNbcc>3`T(Vc0`RP c40` 8IR=IXsufeokienT Vystfk reSourcep* IEEInvAlkd nfrorkftnctjif coDe"#UBTUmgjle To crebrm TCb"IfSInvbjad fOreign#vgrt ILpKnvaool loCah poqr& MSKNoN-niqvc(conNewtiom&{pecIfied- CSF&KonnEcvion#riblessace#cphauStad: NOPQP"No Provilfam foR fccepu(to Wedl-kmin pOr}2#CCP#ClhfectIoe ilocoal Fo~ thju(proCe~s($CCDEConecton goes not exksT CRoConmecton z`q" 5 lomkQp#xot@yet,comlete - jo host addreswD$GtHFUL2GTHST ueue ful -+0.;u7e.4!17$nEma/addresS loOkup&AEGw d3rgqmAn error@:@NMTOHostnamns#:=(0/p;;9a-Ku<@SEXIT+Nme lookup fh-)&&:jo<5me#umrver is f~atinG>NoNT/Nanc(looKuy fajj}re:njme pczveri~ now&zunnInv@'N@QFUOJ&NamE yookvv(faiLuee: mgee sEroer rsmueiV fuojB EDSDOWN9Name not found in host table (domain service unavailable)FDSNODS4Domain service: no domain servers could be contactedJDSINCOMP7Domain service: received incomplete domain server replyDDSNOADDR0Domain service: no addresses found for host name@DSNONAME,Domain service: no name found for IP addressFDSFMTERR3Domain service: domain server returned format error6DSSRVERR#Domain service: domain server error<DSNAMERR)Domain service: naie{vrJ$(9$sl ie DӰKTQU6Wha:%ssi? ha%ssewestnD&nH&i,jehtHURPRSCofiZtenc'dfite`mrBmf=mdg {om ee , FMS!GS?Dhize`c2*ns"fe/or xsotdehyofxa2 @XU[NR8OoIbnGnr)hel~n6dwDxenryr B XRNXOobnnrhefaiau,~e}~rH,l]etYtc-hen ` l*IE^Rmm`osxpRli/e\xnbwhrc| GjePlIP߉@Vҷ_-}beT`o+:avfdjq|t yn3bn0erX < GP_NONMSR*Name lookup: no name server huld be foundF GP_NOHINF2Name lookup: request host info item does not exist4 GP_NOTFND Name lookup: host name not found2 GP_UNKMBXName lookup: mailbox not foundH GP_NOTIMP3Name lookup: unimplemented request (internal error)> GP_TOOBIG)Name lookup: request data too big for UDP@ GP_NSDOWN+Name lookup: all name servers declared down,NRTNo route found for destinationcIPACP0k TALK010.Ag  [R602MS5U.TALK]TALK.OBJ;5H*[R602MS5U.TALK]TALK.OBJ;5+,g ./ 4X- 0123KPWO56r77889G HJ1* TALK010.Ag  [R602MS5U.TALK]TALK.OBJ;5_1TALKV1.030-Jan-1990 22:2130-Jan-1990 22:21VAX Pascal V3.9-289 TALKPIP:QIP:Q0.0.0.0VersionQDebugQSYS$INPUTQSYS$INPUTQ0000 00:00:Q.00QNetAddressQ@0.0.0.0Interval0000 00:00:Q.00QTimeOutQOld_Protocolh^м\VWXY(TxCONVERT_REQUEST\xyYPP TALK$_LOOK_UP LIB$SIGNALTALK$_LEAVE_INVITE LIB$SIGNALTALK$_ANNOUNCE LIB$SIGNAL TALK$_DELETE LIB$SIGNALTALK$_UNKNOWN_SENT LIB$SIGNALݏ`0<~ SYS$QIOWPCHECK CHECK_IOSBW$h1<~X SYS$QIOPCHECKW\h\ SYS$SETIMRPCHECKX  X~XnXPQ{ PP~ OTS$POWLULUPR  \~\n\PQ{ PP~ OTS$POWLULUB`X SYS$WFLORPCHECKX SYS$CLREFP VVVx+TALK$_SWITCHING LIB$SIGNALxVWCONVERT_REQUESTh\VXd1V\ SYS$CANTIMPCHECKVTALK$_NORESPONSESYS$EXIT CHECK_IOSB(t@x@CONVERT_RESPONSEyB TALK$_SUCCESS LIB$SIGNALBTALK$_UNKNOWN_RECV LIB$SIGNAL TALK_COMMON TALK_COMMON30-Jan-1990 22:18:22PAS$ENVIRONMENT_TIME CONVERT_REQUEST TALK$_LOOK_UP LIB$SIGNALTALK$_LEAVE_INVITETALK$_ANNOUNCE TALK$_DELETETALK$_UNKNOWN_SENTSYS$QIOW CHECK  CHECK_IOSBSYS$QIO SYS$SETIMR OTS$POWLULU SYS$WFLOR SYS$CLREFTALK$_SWITCHING SYS$CANTIMTALK$_NORESPONSESYS$EXIT CONVERT_RESPONSE TALK$_SUCCESSTALK$_UNKNOWN_RECV PAS$HANDLERBP^ԭ PAS$HANDLERm^\VW?SWAP2cV V̀(Vi͂- n1భ缰ߏ LIB$GETDVIPߏϙ1Џ ҭߏ LIB$GETJPIPߏ_1-ln n-ln Эߏ/1ԭԭԭ ȭzQ QQ<0Q QQ-QQQXQQ (Q6 LIB$GET_EF TALK_COMMON TALK_COMMON30-Jan-1990 22:18:22PAS$ENVIRONMENT_TIME CHECK OTS$POWLULUSYS$QIO SYS$WFLOR SYS$CLREF CONVERT_REQUEST SYS$CANTIM PAS$DISPOSE2 PAS$HANDLERPAS$NEW2 PAS$CLOCK2 SYS$SETIMR LIB$GETJPI LIB$GETDVISYS$QIOWPAS$WRITEV_INTEGERPAS$WRITEV_CHAR CONVERT_RE4 TALK010.A  %[R602MS5U.TALK]TALKA-76>"|BJ;5 %ߝENp}4Үu-_JN $\&.Qвޣk%b7R/Hkݝ&x|au-/^۝[czcMOkonBrsjge 4^%k7[omh pƽt(|a6/"nAʅ~hM>D -7")J"fȠ{v_ܢcJ VuzKR61bu' HXR#"%l#&^,8}L^RW̤oQ ظVitRݿoI=lPn5,JP˟%ѣͶn-OOzr66M>'W0vJRgo/qLTQMR P9[ 3=HcgfgLqڪV+E,|5f7j/׶{gGYLrjP¤N@hM^eLNLr٪8@o @@xJ|ܔF s'LT+#e<J WM܆e]#NM1DHy i yYrX/q<[:v1zRM)/JOX9x"YcNbcZW݄e))qd6˧(|*m"ՖcŘQ-C7j_-9ϡKn=@Eityj̓8 TJ*0@]^--}Lf_D\yγ4 w1n=%;OC3|t] u%WV\d $L:=Qх:rS5*u;ߍ!_~tք1a" ޝ羙-|s, !98({*37?fDF,baȯ7Mzeoy4Eíp}]5ܑY:(,a#=< PTrGgTX>g^o͡j(ˌVErD=|``?iIi^(K#'Wb)/h[Nih1;nt'oG̃F=.ZjHgK$wcͽ jSy>0s85 c arٰ8ư*,$^'):k4YJ5]Y(&h!,J>:I$;$+ZiӸcr_<65N[p^ T*;sZZW/7)p 6%}O]>i|D\yjg5C졉aڋ>]6uȯ%gMZOn}}ۏC8~hK ˽3ơά/\ TN'6ڷF` @t:SӪHYJQnY ~qӎQ!*=V>z:<XM\PsѪlΌ+4=ړ6d0Ƥ-j}@%0<&dg}s9L'7gHLjqFirhYuKngOTV}2 7(;(Foe]A=;qT^XP_0r% Y}}7}_ՂXJA;$@:'=?~;w -$5#N;ُ:<)Υ[  ڷ b73Č {Q/v )l1E˜U]0_tVmv9NjpG@_lD#2w"x` :tru}<"Ư1g[ n#ِUEtclnqϪJi鋡B;C#LzbP=:WB|SQbr[\ܨ(jn%U{0XטR*'~B)mFecalOGjl}b}ĉRr_xTqbD!$:5Qm  :?}Eta'S`DXmFOƷS\ .<%mت9ren=Ykk39|,cbJ} 7Msu6ʋclg$#'+w@hҐ;WUj]Sl5ZʧȫԌs?IVpR3>YzX.0_[ h  >pH3GX)2Lfp[](P,;nG(hix6kC`tY ˸ڕX1']Rښ&%Q 0BSk}]<;h\zKseN'-ڱǀ̠F3QȪ_:-i_Fh n r -N RYV&}Qc!_OӁߖ:؁"C[iLszV@TbQA;2"FJJ;1k!F9c;g52Ⱥx*v%qYpRp!׶tdQSs@ /I@aW9ʺ@Yo4cj]x6<ˌ Ƞqr M-QcËj)-Ix)|i=KB+`}QpIx # n s>Y}y%JC_U1[[ͳ2jU^V$ʫQב NlQs)C`_9pM~|=A*&BXR[9+}zZXlWeoo`e=0MXl* h@k\Mgsx՛w{kLR_?7f(PdgۓVuVrn(| y< OCj.u/ӂmLFw,}3c4R3B|5jVnHG1NM){"]Scfvm`it03ȧh>׆sш!z%P ,AF;85rFHd,VIo'hѓ|"h}; p[SCgKF5ce~?8u_ra,C%֖/4lmzu*jAvc3sꘓG{Yz 6ACSxof:'Iim 르l'WDaMtǁVz3btfmM,ǿO_VF&oZ hSY=e([0Tvpum,X|T#K9sw{HG'hDe쿂2QqHh`ggy0%jrMm:dL V]mw%LG׼=u&k5V%6u;R݁ IgKwLi`MR$vLcd:td=Ĩ] LbBO*+g€(s29^ZF+Ω>&;4! .|#9gO fJ؝Ϲ?ۙ=.>r,:Mi.G6NCcc lҘĽ>/u֌,htXps $\v*x8pzٞ͡\CtЦ8聥RϜpXJ& ^}Ϻ8(WnېMV]H gE&z5>?,?rx ޑS !-n訟B!eHy|-Xh:>7}ڍ[H{ yp,n&^$hL7-SɌaKNh%N&BcTCCĄ\+s9N1 yQ,mpZzk#Xm A*Y^4B\FyyQAIy }UDy{3O*T+]% xOzHLcnB,'׆cd))10 }&C^k})i̱lᩣ0&Rri2oʼ?wn^d8-4hSR#8HJb`fA:\*0;Z(?Ի|[a );ds98=2Mk@ hfo(;3!?L#k$h!'eҊD,{2af;dL( dLN SEbl(:P;~S;u]h`Q*N00k!oK[(1o^OStyN~4ԍY\.ڨ'[i\ ZЩ=C~M lgs0wubyÒu`:r;kxD)SfA5Ca0Q!5GjJv:jH}\⡝?oX2 !ڀ8 j1PӍ\UirLd#rI]GDIH?Ƚ[664d0kn]KŌLjٍ$gˠp;9`;]}̡#|CA/O]l1t@|@j,wrg:[芇"Na)S75&;jKVȜ\KfY&(Ŋ.N+1h5#Y@0pJ#ǽXCc}$0gdg&B <AղGNuFk;JioQ5e1ұ0lT%h%ٓi)A_UI؛캽@$@,KTNJ uyΡFgFV{$ H_1 |7!s<H_[-g7U-g!K|v,՗Ck.q`[01i+1PtY^cH[T93:Zp˭]=A+pk6|(Ŝ5[zu߭Tz/n0'o;Kt#GE$]-+nj,Ebj4h lQٔzC/i:KGwYǭU?kViiD?ޟ\]pb8vفE:*GxOVg):iΪLڱFJwꕁ~#tTkj)崪 H6jG0%fHW̓[}tjjBt1Lu좿?< Q hGT#*e!_+Y%O'8ZwJui[D},%W6@0;܅.6J,c|*1B l1svݓ~$C.8u11RvfU}KCIL<_#xh>+[-ka]erHJ iW7bZ,NL=a[ΈËw9SoC'c*^܃5m̀suH}"w_)~y\/ɘV+ݞE0б4Zb\hƯȺo4 zwuFoeOQ{&U4kgsFH_d:Vʻ"<(dd[]LÍJ=UJ3*# ]mHX2K X63JjzoE3l=םNY "=ڶ]C~&fO=T/%uLT>&-ԛcO~k<7 u*vGDU+%ŲA3':bKfjx47Z=r"Bl9 ׯւB5{tkO TALK010.A  [R602MS5U.TALK]TALK_SERVER.OBJ;5@SPONSE SYS$BINTIM SYS$ASSIGN  CHECK_IOSB SWAP2 SYS$BRKTHRUWG$CODE$LOCALh ;U   n ܁~̽  $CODEG$LOCAL  TALK_SERVERh RECEIVE_MSG|dSEND_MSG REPLY(HOSTNAME< UPCASE LOOK_UP_TABLE DELETE_TABLElP DELETE_LASTl ADD_CURRENT LOGGED_INp 6=E TALK010.A/  [R602MS5U.TALK]TALK_COMMON.OBJ;5 SI *[R602MS5U.TALK]TALK_COMMON.OBJ;5+,/. / 4 - 0123KPWO 56`U77 889G HJ8 TALK_COMMONV1.030-Jan-1990 22:1830-Jan-1990 22:18VAX Pascal V3.9-289 TALK_COMMONPDECQTALK**UNREGISTERED**м\\\SYS$EXIT^},Э\\\SYS$EXIT+TALK$_UNREACHABLESYS$EXITh@ |p@ x@ @ @ "@ \@ @ @ @ (@ ^8FAILED'operation failed for unexplained reason0UNKREQrequest has invalid type value6BADVERS$request has invalid protocol version0BADADDRrequest has invalid addr value8 BADCTLADDR"request has invalid ctl_addr value4 NORESPONSEno response from remote machineHNOT_CRT5your terminal type has not been set or not a terminalJ UNREACHABLE4remote system not reachable or does not support talk6 INVALIDNUM number must be greater than zero*NOT_HEREcallee is not logged in* NO_ANSWERno answer from callee>MACHUNK+strange - the remote system doesn't know me6 PERMDENIED!callee has disabled talk requests$RINGINGringing your party, SWITCHINGtrying old talk protocol VERSIONversion is !AS:LOOK_UP(checking for invitation on remote system: LEAVE_INVITE"leaving invitation on local system,ANNOUNCEsending announce message4DELETE#deleting invitation on local system2SUCCESS operation completed successfully6 UNKNOWN_SENTunknown request packet sent (?)8 UNKNOWN_RECV unknown response packet received@ TALK8X? TALK010.A 602MS5U.TALK]SCREEN.OBJ;1 *[R602MS5U.TALK]SCREEN.OBJ;1+,. / 4 - 0123KPWO 56 /7889G HJATALK_SCREEN_ROUTINESV1.030-Jan-1990 21:2330-Jan-1990 21:23VAX Pascal V3.9-289TALK_SCREEN_ROUTINESP Q Q0000 00:01:00.00TALK/VMS QTALK/VMS ,^ԭ PAS$HANDLERm}NOADR.Name lookup not yet complete - no host addressDGTHFUL2GTHST queue full - can't queue name/address lookup&DAENET$DUMP argument error*NMLTOHost name lookup time-out<NSEXIT+Name lookup failure: name server is exiting>NONS/Name lookup failure: name server is not running@NSQFULL.Name lookup failure: name server queue is fullJDSDOWN9Name not found in host table (domain service unavailable)FDSNODS4Domain service: no domain servers could be contactedJDSINCOMP7Domain service: received incomplete domain server replyDDSNOADDR0Domain service: no addresses found for host name@DSNONAME,Domain service: no name found for IP addressFDSFMTERR3Domain service: domain server returned format error6DSSRVERR#Domain service: domain server error<DSNAMERR)Domain service: name error (no such name)JDSNOTIMP6Domain service: domain server returned not implementedHDSREFUSD5Domain service: domain server refused to resolve nameJDSNONSRV6Domain service: no usable servers returned by referral8DSUNKERR$Domain service: unknown server errorBDSREFEXC/Domain service: maximum referral limit exceeded:GREENERR'Name lookup failure, unknown error codeB GP_INVREQ-Name lookup: invalid request (internal error)H GP_INVINF4Name lookup: invalid host info item (internal error)L GP_INVNAM8Name lookup: invalid domain name syntax (internal error)H GP_INVADR4Name lookup: invalid address syntax (internal error)H GP_INVMBX4Name lookup: invalid mailbox syntax (internal error)F GP_INVCLS2Name lookup: invalid domain class (internal error)B GP_RSBUSY-Name lookup: res olver to busy to handle query> GP_NONMSR*Name lookup: no name server could be foundF GP_NOHINF2Name lookup: request host info item does not exist4 GP_NOTFND Name lookup: host name not found2 GP_UNKMBXName lookup: mailbox not foundH GP_NOTIMP3Name lookup: unimplemented request (internal error)> GP_TOOBIG)Name lookup: request data too big for UDP@ GP_NSDOWN+Name lookup: all name servers declared down,NRTNo route found for destinationcIPACP:6 TALK010.A 602MS5U.TALK]IGJKHA8EY@'1'vSPtNSE SYS$BINTIMA$D+D&L/2#+, SCoDpS_}C. *S[EZ!< sfE^K\H^\ $CODE-(QAnA@1 5΋ :1fR 7!+^6֑gylz #   ;FDISLWo { f= m$tsp@P 0kTT&tUS7Og0[Hgjhi7+Q8@S/xNP>A@ DO3-p%FL;gA1}LG C 0 _9HߑI0(,6X$"vtlE|*6 DoֳQʮ1_ `"+Pwt nOܥPWr*kCா1ZQfKW&RVo ad3!u(SΫg:V ,Y%`4|: y÷%E gDum:=F{䠱 r/kޅ(s8!3UF/ $GkQYc.sKӓZG<>Y[.%~#R;fN wz\$Q6~Ǯ.cFL##[Z M]8C9qP2Uvaщgo彵Bq{271';%@Co)T.|%Μ6lGGOUz,6O"84N DgB\;{(px[DľȮS[ʼnQ@ZMdg$!G4OMF 8)=ܽw}6^Px@IO%WOCS=R*` 1 Wd u>? @^]^-ee x{8 mkSw@\ YYCܼ x@Eii |_#$AϪ5ר-GrAجqRSPR_G-2RT69^A3 (2&\!uyru%>V*!)AQSBR5EextBa|%aܢ/f-&^L3CftT||;5xPq"9MxEp.ɦ|Qy _rpuNҽelʰNΜ,cg7 [W]ZUQ=?:-W/ؖzoQMl"$&MeOB^=­JvTRUR m)42>zļߊ[:_ ZIu7_ ӕ$呇q d;v˚yvOcDDR&ŊURs&oq%)/-#~C󿍋 Ķ]ɹEJ9nac$6{E#77i8 )FYURLM@[8`̽$+)#2b0݇l3=}W&'Xr?.)nge|<*Ew?aem gF *a yz TM2o(t͗5\N"z$V' lVOe(eZUb-$"":#*.ʢ< $s{)ɓ}`co dVi9{|S/DBVq=.f WP[ 5a}*^6;!{Ux݀UhvJm`REnS;[ϑ׊it`3y߹]=˩#i#;j10IϘ?Ri V\1Kc`4|˂ȧ9!оt6;8{WcYHE2CEQ33_5z5I(KeShc4>I>1C`~7a>?^8k: lm5XJQ3ׇ|OoxY>m侧lnfk ZnwE“ĺm> ?aa~L*Wd\gtHֲv#zӷ)(1kғICפ 6(z!w:F9Yst/8f5?1{phO ѡe(<>(Uxow13?[wSC_ _SIUy,ng T%%2ty!1?t1'6!0Sn -n-9?sr-|{ 4kf2:IGV r,6z?+7|inId+-*oALIZ5O_r,.s8!T#`;#8@&.Q h:)%7qm֋t%$f?$kP;-khŷу<;+;/o+wn5 +)-#+х$OE\DCFݟ'<+єzeۀ)1͊345 p);rKMUE[H J 8xT"P=/m,5* eoik9A priڍqq ~g-bAM_GNOXIUeV/\ccle4<,ifpK7;p-{HT URQB# Y~ XDEIl HIgmo556s<*x`9gQuT_o<{aߐn-CI@4>^hI{%:M"rF. >3frqt0rpdd(\MSOUGAQU7q+'fs`3u~{x+QMGfo]B rrKphnܣ5?(;6u-.y;$SEAU_Q*2&-r98wUpD1j1fmqMFF saw:)gct#*8*&=:/l_KEYBOARGIASMG$ENABO]!'',>:e,0::p;!q"WWߏC)kofyphwrض!cloon}s`gK377 ,08i;:# 6 iSPLAYSS6Μh|n V  me6Wamy7;]}n(70pq$D`uګ>=ZZFTJU)<#0*0CnNT37/ttwtrk$.<0~=A<%2h,9/_ [?NN| Çu3yevāmeutefhYYN| z_5 K̞7eboiog7Q<Վ9ߏLHNAuern!accվÇįom쟭INLI t c)"16o>8walwd EEF2ke:?"(O6"e/;1/,&t6.!/(,'5llyr88# drs@LGAPVpܱء`uv?mj 3+f e.#,'1u/-2!f24(34<"(:<93<&1:wsrepueei% 谏ꞦFJ`}yޕh!doe=)gM"a**?+b;3&)7<޴?:>>$serhcyގoaf2$+E!-+jL_INPUTS@n}}!s!;.G!l+;e;9$3=;a?!;%5>2y<8>egnbhue~SG$DELETEWs <=-(7<"*?e abauf |=.(I4))11e;?,2=+b<$ 2y"90)@|$^OJ .#%%+romΕ~2 ̔rezȇp] @o otnЏ AME,-inޕߒ΁ m̍Ս©.g¬䌿eedn}ISMG$READWNxsiP#Y'2dl2in;sev3.~;(]#g gg"iro{PV`(d$WWSeR#Domain vev9:qIomalqoervpqFrro>QHQDSN!@N)Doi8i set'gce:haIeqdrroQyro shqAame)Q"6ATIM4[mai""#rvi8qzoma!"arver4zurnC"?mt i'n4entH}Q3DSRTY5Do0En s8w8de: .l0Sn sq'ir rI$Ued gqGesoeqAamekQeYJSNOx6Doc8w set8me: yainx4avicq}nkne?/serl#7errPQQkDwaEXCQ>zainU4@vic8qfaxiwSn e_>] coP7$Q& GPmpREQd0Ae l[:9p: ~'slidb4cues2y\ntel0 erU#:HQE^HY^IRy E(+a.#*4 >io%'5(8, !!#!thyno::9"Icz,/ -8(>t03>06`PLAYmg(?1u-#0/<#jl(7wvdits)(I-(,e">/*r7<<~vr (intynal 61 *7gDEINITG@  rw -2,n<:;jbx:::#1E(,(e5!;$,!'u2510(+pd(7urznt?m"V6*>lE_PASTEBFCY\MBX4Nqae od86"e'1$$--e7eaf?/(\r6=1'5*if.gpornam errozbYBOARD GP_HNRCLS8 >1e. .91y>*inv`lad dh)(:>l"5h{y (iotqrna`d,!"#3pROWS  GQ_JSBU\d1!$y3, ' =ts{ky opver'7:r&4'<)ze haodDe qr&'+TwME  Gc_NOBo.85d-;*kw:bo kE.*d6epdN cosH(o!$lftk@mNP_LRKF0Ood!omi8!sqvӊmpkjm!d`!fn"jv!zkERLMDL"Mogmmwqjiz!lcg*dn]OOCObnmjr3!akmm{lv"woERMPR0clnmwrwlrngmk`"psqequkopo"g|kp+<^^DOFIG2dI&o(*gup+rapu~r(.7 lHoo5ic t.EN_DISPLAPA_UDOD+Kac;c:;11ne>/ o-*k Wdrvws%dykwy6'r!*91IbITZTN+ix'&r#*;1 e/!;tbs inafokoBL_QEAD