t UCX_FINGER_SUPPORT.BCK0UCX_FINGER_SUPPORT.BCKgBACKUP/NOASSIST/BLOCK=8192 [UCX$FINGER...]*.*;* USER7:[ANONYMOUS.FINGER]UCX_FINGER_SUPPORT.BCK/SAVE/LOG TERRY D͖V5.5 _SPCVXA:: 'u _$1$DUA7: V5.5-2  *[UCX$FINGER]KIT.DIR;1+,-./ 4-,0123 KPWO56۳͖7$+͖89GHJI AAAREADME.TXT. CLIENT.DIR/ MULTINET-SERVER.DIR3UCX-SERVER.DIR6*[UCX$FINGER.KIT]AAAREADME.TXT;4+,../ 4T>--0123KPWO56Ѯ=7n=89GHJO** Brief and hopefully useful description of the UCX/MultiNet Finger support **F This is UCX (V2.0 and later) and TGV MultiNet preliminary client andIserver support for FINGER. This kit is being provided due to the extendedKdelay in getting FINGER V2 delivered (due to my spending the last two yearsIworking on VMS C-Kermit). These components are "unsupported" and supplied2"as-is", however I _am_ interested in bug reports.K There are three subdirectories in this kit, [.client], [.ucx-server], andK[.multinet-server]. This kit is intended to be installed on top of the cur-Mrent FINGER distribution, V51.1.29. If you have an older FINGER distribution,Nyou should first obtain the latest kit, either by anonymous FTP to FTP.SPC.EDUK(192.107.46.27) in the [.FINGER] subdirectory, or by sending mail with textI(not subject) of GET FINGER.PACKAGE to vmsserv@spcvxa.spc.edu or vmsserv@spcvxa.bitnet.!Client installation instructions:JThe [.client] directory contains the components necessary to build a vers-Hion of the FINGER command which can make outbound connections via UCX or"MultiNet. To install this support:K 1) Copy the files from the [.client] directory to your FINGER source dir- ectoryH 2) Delete any exiting FINGER.OLB file in your FINGER source directory.M 3) Use the new UCXTEST.COM command file to recompile the FINGER components.; (This replaces the normal FINGER_BUILD.COM procedure).M 4) Use the existing INSTALL_FINGER.COM (and optionally INSTALL_JNET_FINGER.< COM) to create the updated FINGER.EXE with UCX support."Client release notes/restrictions:K 1) Currently all FINGER commands sent on the link are sent in lower case.M As the DNS is case-insensitive, this isn't a problem for host names, butL can be a problem for user names. Since lower case is far more common onM Unix boxes than upper/mixed, it was felt that this would be a reasonableK compromise. A future release (FINGER V2) will allow preserving case by& quoting text on the command line.N 2) If pass-through routing is done, extraneous /IAM qualifiers may be passed= through to a non-VMS host (which won't understand them).N 3) This code is really lame. It was a midnight hack when I was bored. The V2 stuff will be much better.N 4) If you FINGER a node that has more than one type of network package (TCP,N Jnet, and/or DECnet), the client may attempt to use a package that you doL not have a FINGER server listening on. If this happens, simply give theO full domain name (for TCP), or a trailing .BITNET or .DECNET (for Jnet and@ DECnet, respectively) to force the correct path to be used.K 5) The client will report the hostname as you gave it on the "[hostname]"N line. It should report the actual inverse mapping hostname, if available.B This is a cosmetic flaw which will be corrected in FINGER V2.%UCX server installation instructions:. 1) UCX V2.0 is required. No way around this.K 2) Create a UCX$FINGER account with the following UAF parameters (you mayM modify the device name and UIC, of course, to match the other UCX server accounts):=Username: UCX$FINGER Owner: UCX$FINGERTAccount: UCX$AUX UIC: [374,1000] ([UCX$AUX,UCX$FINGER])<CLI: DCL Tables: DCLTABLES$Default: SYS$SYSDEVICE:[UCX$FINGER]LGICMD: LOGIN5Flags: DisCtlY DefCLI Restricted DisPwdDic DisPwdHis+Primary days: Mon Tue Wed Thu Fri +Secondary days: Sat SunFPrimary 000000000011111111112222 Secondary 000000000011111111112222FDay Hours 012345678901234567890123 Day Hours 012345678901234567890123FNetwork: ##### Full access ###### ##### Full access ######FBatch: ----- No access ------ ----- No access ------FLocal: ----- No access ------ ----- No access ------FDialup: ----- No access ------ ----- No access ------FRemote: ----- No access ------ ----- No access ------DExpiration: (none) Pwdminimum: 6 Login Fails: 0?Pwdlifetime: 180 00:00 Pwdchange: (pre-expired) PLast Login: (none) (interactive), 10-DEC-1992 22:01 (non-interactive)9Maxjobs: 0 Fillm: 1024 Bytlm: 2000009Maxacctjobs: 0 Shrfillm: 0 Pbytlm: 09Maxdetach: 0 BIOlm: 400 JTquota: 10249Prclm: 2 DIOlm: 200 WSdef: 2569Prio: 8 ASTlm: 512 WSquo: 200009Queprio: 0 TQElm: 10 WSextent: 40969CPU: 0 00:20:00 Enqlm: 3000 Pgflquo: 20000Authorized Privileges: / CMKRNL TMPMBX WORLD OPER NETMBX SYSPRV SYSLCKDefault Privileges: / CMKRNL TMPMBX WORLD OPER NETMBX SYSPRV SYSLCK/ 2) Define the FINGER port to UCX, as follows:Service: FINGER' GPort: 79 Protocol: TCP Address: 0.0.0.0JInactivity: 0 User_name: UCX$FINGER Process: UCX$FINGERLimit: 5 >File: SYS$SYSDEVICE:[UCX$FINGER]UCX$FINGER_STARTUP.COMFlags: Listen Socket Opts: Rcheck Scheck0 Receive: 3000 Send: 3000 Log Opts: None File: not defined Security Reject msg: not defined Accept host: 0.0.0.0 Accept netw: 0.0.0.0L (Note that it is easy to generate a corrupted definition. To clear such= a definition, say "SET NOSERVICE FINGER" and try again).K 3) Create a UCX$FINGER directory in the same tree as the other UCX serverL processes. Make sure it is owned by the UCX$FINGER server and protected (S:RWE,O:RWE,G:RE,W:E).M 4) Restore the files from the [.server] subdirectory to the UCX$FINGER dir- ectory.M 5) Copy the FINGERLIB.OLB and the JLIB.OLB files from your FINGER directory! to the UCX$FINGER directory.? 6) Change to the UCX$FINGER directory and comp41ϋ UCX_FINGER_SUPPORT.BCK.-[UCX$FINGER.KIT]AAAREADME.TXT;4Tw3  ile UCXDAE.FOR:" $ FORT/NOCHECK/NODEBUG UCXDAEJ 7) Insert the UCX$INETDEF.MAR definitions into the system library if you have not already done so:F $ LIBR/INSERT SYS$LIBRARY:STARLET.MLB SYS$LIBRARY:UCX$INETDEF.MAR 8) Assemble NEWMAC.MAR: $ MACRO NEWMACA 9) Use the UCXDTEST.COM command file to link the FINGER daemon.M 10) Try testing your new client and server by FINGERing your own node (using the full domain name).K 11) You will probably want to set a reasonable version limit (I suggest 5)< on the .LOG and .ERR files in the UCX$FINGER directory.*MultiNet server installation instructions:I 1) Copy the files from the [multinet-server] directory to the directory6 where you have installed your FINGER executables.J 2) Define the logical SYS$TOOLS as a system logical pointing to the dir-1 ectory used in step one, above. For example:7 $ DEFINE/SYSTEM SYS$TOOLS SYS$SYSDEVICE:[SYSTOOLS]H Be sure to put this command somewhere it well be executed each time you reboot your system.L 3) Invoke the MultiNet configuration utility and change the program to runF for the FINGER service to SYS$TOOLS:SERVER_FINGER.EXE, like this: $ mult con/ser2 MultiNet Server Configuration Utility 3.2(32)D [Reading in configuration from MULTINET:SERVICES.MASTER_SERVER] SERVER-CONFIG>sel finger. [The Selected SERVER entry is now FINGER]7 SERVER-CONFIG>set prog sys$tools:server_finger.exeC [Program to run for FINGER set to SYS$TOOLS:SERVER_FINGER.EXE] SERVER-CONFIG>exit# [Writing configuration to ...]J If you want the change to take effect immediately, give the "RESTART"" command before saying "EXIT"."Server release notes/restrictions:5 1) This code is not as bad of a hack as the client.L 2) The long delay when FINGERing a UCX/MultiNet node is due to VMS process creation overhead.M 3) Using TELNET to connect to port 79 (the FINGER port) may not display anyM useful output (just "connection closed") if you are using UCX. This is aA flaw in the UCX V2 TELNET program, not in the FINGER server.L 4) Currently the server does not log activity. This feature is planned for FINGER V2.K 5) The source for the SERVER_FINGER.EXE module is not available. A futureI release of the MultiNet server (most likely V3.3) will eliminate the< need for this module and will also speed up the server.I 6) Currently the logical SYS$TOOLS is hard-coded into the SERVER_FINGERM executable. If this really offends you, feel free to use PATCH to change the text in the .EXE file.6 Terry Kennedy Operations Manager, Academic Computing= terry@spcvxa.bitnet St. Peter's College, Jersey City, NJ USA% terry@spcvxa.spc.edu +1 201 915 9381*[UCX$FINGER.KIT]CLIENT.DIR;1+,/./ 4--0123 KPWO56D ͖7-͖89GHJI UCXFINGER.FOR-0 UCXSUBS.MAR(1 UCXTEST.COM2'*[UCX$FINGER.KIT.CLIENT]UCXFINGER.FOR;45+,0./ 4H\-/0123KPWO56c~7nZ89GHJ : integer function tcp_finger(host,comm,finger_out_routine)9c Outgoing finger for VMS/Ultrix Connection (UCX) TCP/IP"c Terry Kennedy, SPC, 27-Aug-19915c Some functions derived from existing TCPFINGER.FOR implicit none! external fing_nonode, fing_nonet# external fing_complete, fing_abort* external fing_noservice, fing_unreachable external finger_out_routine. integer*4 btrim, get_host, open_net, read_net" character*20 network, get_network character*(*) host,comm) integer blen, i, i1, i2, i3, i4, j, lll character*2 line, buffer*1024 character*132 tempcom, tempcom1 character*15 ctemp c Default return status! tcp_finger = %loc(fing_complete) call inet_lower(host)c must terminate with cr/lf" if (comm(1:6) .eq. 'FINGER') then lll = index(comm,' ')6 if ((lll .ne. 0) .and. (lll+1 .le. len(comm))) then tempcom1 = comm(lll+1:) else tempcom1 = ' ' endif else tempcom1 = comm endif lll = btrim(tempcom1)1 if(lll .eq. 1 .and. tempcom1(1:1) .le. ' ') then tempcom = char(13)//char(10) else. tempcom=tempcom1(1:lll)//char(13)//char(10) endif call inet_lower(tempcom)c see if we know this host buffer = ' ' i = get_host(host)c type *,'get_host status is' c type *,i if (i .ne. 1) then! tcp_finger = %loc(fing_nonode) return endifc wonderful - now try an open200 i = open_net(0)c type *,'open_net status is' c type *,i if (i .ne. 1) then tcp_finger = %loc(fing_nonet) if (i .eq. 660) then& tcp_finger = %loc(fing_noservice) endif if (i .eq. 8340) then( tcp_finger = %loc(fing_unreachable) endif return endifc get network nameGc Site-specific: Finger normally adds ".DECnet", ".BITNET", etc. to theHc header line. For TCP/IP networks this is a bit silly these days, sinceHc the domains end in ".EDU", etc. In the "old days" it made sense to addHc a ".ARPA". If you want to still do this, fiddle the following lines...c network = get_network('T')(c if (network .eq. '?') network = 'ARPA'<c call finger_out_routine('.'//network(:btrim(network))//']'c 1 //char(13)//char(10))1 call finger_out_routine(']'//char(13)//char(10))7 call finger_out_routine(char(13)//char(10)//char(255))"c write the command to the network. call write_net(%ref(tempcom), btrim(tempcom)),c now read responses until it's done sending300 i = read_net(%ref(buffer)) if (i .ne. 0) then' call finger_out_routine(buffer(1:i)) call lib$wait(.25) go to 300 endif! tcp_finger = %loc(fing_complete) return end c translate string to lower case" subroutine inet_lower(buf) character*(*) buf1 character*26 ucase/'ABCDEFGHIJKLMNOPQRSTUVWXYZ'/1 character*26 lcase/'abcdefghijklmnopqrstuvwxyz'/( call str$translate(buf,buf,lcase,ucase) return end%*[UCX$FINGER.KIT.CLIENT]UCXSUBS.MAR;40+,1./ 44-/0123KPWO56Y57|5889GHJ\ UCX_FINGER_SUPPORT.BCK1/%[UCX$FINGER.KIT.CLIENT]UCXSUBS.MAR;404 2 .TITLE UCXSUBS Utility subroutines for UCX TCP/IP .IDENT /V1.1-00/; from get_host.mar .LIBRARY /SYS$SHARE:LIB.MLB/DEV: .ASCID /BG:/ CHAN: .LONG 0 IOSB: .QUAD 0COMMAND:.LONG LENGTH .ADDRESS COMM COMM: .BYTE 1 .BYTE 2 .WORD 0 LENGTH=.-COMMHOST_D: .BLKL 2HOST_NAM:.word 16 .byte dsc$k_dtype_t .byte dsc$k_class_s .address haddrHADDR: .blkb 16 .ENTRY GET_HOST,^M MOVL 4(AP),R0 MOVL (R0),HOST_D MOVL 4(R0),HOST_D+4 $ASSIGN_S DEVNAM=DEV, CHAN=CHAN $QIOW_S CHAN=CHAN,- FUNC=#IO$_ACPCONTROL,- IOSB=IOSB,- P1=COMMAND,P2=#HOST_D,- P3=#HOST_NAM,P4=#HOST_NAM BLBC R0,DONE CMPW #1,IOSB BEQLU DONE MOVZWL IOSB,R0DONE: RET; from netio.mar $IODEF;** $INETSYMDEF PORTNUM=79 LEN: .LONG 0!;-------------------------------;; SOCKET STRUCTURE ;!;-------------------------------;PAR11: .WORD 6 ;** INET$C_TCP# .BYTE 1 ;** INET_PROTYP$C_STREAM .BYTE 0PAR12: .LONG 16 .ADDRESS LOCAL_ADR LOCAL_ADR: .WORD 2 ;** INET$C_AF_INET .BYTE 0,50 .BYTE 192,107,46,26 .BLKB 8PAR13: .LONG 16 .ADDRESS SOCKET$SOCKET: .WORD 2 ;** INET$C_AF_INETPORT: .WORD PORTNUM ;PORT #%ADDRESS:.BYTE 192,107,46,27 ;ADDRESS .BLKL 2 ;UNUSED .ENTRY OPEN_NET,^M<> MOVL HADDR,ADDRESSLOCAL: $ASSIGN_S CHAN=CHAN,DEVNAM=DEV $QIOW_S CHAN=CHAN,- FUNC=#IO$_SETMODE,- IOSB=IOSB,- P1=PAR11,P3=#PAR12!;-------------------------------;; REVERSE THE BYTES ;!;-------------------------------; MOVB PORT,R0 MOVB PORT+1,PORT MOVB R0,PORT+1;---------------; ; CONNECT ;;---------------; $QIOW_S CHAN=CHAN,- FUNC=#IO$_ACCESS,- IOSB=IOSB,- P3=#PAR13 BLBC R0,ERROR MOVZWL IOSB,R0 BLBC R0,ERRORERROR: RET4;--------------------------------------------------; .ENTRY WRITE_NET,^M<> MOVL @8(AP),LEN $QIOW_S CHAN=CHAN,- FUNC=#IO$_WRITEVBLK,- IOSB=IOSB,- P1=@4(AP),P2=LEN RET4;--------------------------------------------------; .ENTRY READ_NET,^M<>AGAIN: $QIOW_S CHAN=CHAN,- FUNC=#IO$_READVBLK,- IOSB=IOSB,- P1=@4(AP),P2=#1024 CMPW #1,IOSB BNEQU DISCONNECT MOVZWL IOSB+2,R0 RET DISCONNECT: MOVL #0,R0 RET .END$*[UCX$FINGER.KIT.CLIENT]UCXTEST.COM;3+,2. / 4O -/0123KPWO 56@. Tܔ7@W\N89GHJ)$!..BuildLib.Com Build Finger Libraries'$!.. R. Garland / CUCHEM / Feb-1985$!.. VMS V5.1 version $ Set NoOn$ Type Sys$Input9 This procedure builds the required libraries for Finger.9$ Inquire Ans "Do you wish to compile everything? (YES) " $ All = 0$ If Ans .eqs. "" then All = 1$ If Ans then All = 1$ If All then goto B_1&$ Write Sys$Output " " ! 'F$Verify(0)9$ Inquire Ans "Do you wish to compile FINGER.FOR? (YES) " $ C_1 = 0$ If Ans .eqs. "" then C_1 = 1$ If Ans then C_1 = 1$ If .not. C_1 then Goto B_1_1$ B_1:&$ Write Sys$Output " " ! 'F$Verify(0) $ Set VerifyO$! ignore compiler warnings... harmless (which - the compiler or the warnings?)$$ Fortran/NoCheck/NoDebug FINGER.FOR2$ Fortran/NoCheck/NoDebug/NoOptimize FINGERSHO.FOR$ B_1_1: !'F$Verify(0)$ If All then goto B_2&$ Write Sys$Output " " ! 'F$Verify(0)<$ Inquire Ans "Do you wish to compile FINGERSHR.FOR? (YES) " $ C_2 = 0$ If Ans .eqs. "" then C_2 = 1$ If Ans then C_2 = 1$ If .not. C_2 then Goto B_2_2$ B_2:&$ Write Sys$Output " " ! 'F$Verify(0) $ Set Verify'$ Fortran/NoCheck/NoDebug FINGERSHR.FOR$ B_2_2: !'F$Verify(0)$ If All then goto B_2A&$ Write Sys$Output " " ! 'F$Verify(0)<$ Inquire Ans "Do you wish to compile FINGMAINT.FOR? (YES) " $ C_2A = 0$ If Ans .eqs. "" then C_2A = 1$ If Ans then C_2A = 1 $ If .not. C_2A then Goto B_2_2A$ B_2A:&$ Write Sys$Output " " ! 'F$Verify(0) $ Set Verify'$ Fortran/NoCheck/NoDebug FINGMAINT.FOR$ B_2_2A: !'F$Verify(0)$ If All then goto B_3&$ Write Sys$Output " " ! 'F$Verify(0);$ Inquire Ans "Do you wish to compile FINGMAIN.FOR? (YES) " $ C_3 = 0$ If Ans .eqs. "" then C_3 = 1$ If Ans then C_3 = 1$ If .not. C_3 then Goto B_3_3$ B_3:&$ Write Sys$Output " " ! 'F$Verify(0) $ Set Verify&$ Fortran/NoCheck/NoDebug FINGMAIN.FOR$ B_3_3: !'F$Verify(0)$ If All then goto B_4&$ Write Sys$Output " " ! 'F$Verify(0)I$ Inquire Ans "Do you wish to compile the other fortran routines? (YES) " $ C_4 = 0$ If Ans .eqs. "" then C_4 = 1$ If Ans then C_4 = 1$ If .not. C_4 then Goto B_4_4$ B_4:&$ Write Sys$Output " " ! 'F$Verify(0) $ Set Verify"$ Fortran/NoCheck/NoDebug DUMJ.FOR$ ! UCX'$ Fortran/NoCheck/NoDebug UCXFINGER.FOR'$ Fortran/NoCheck/NoDebug FINGERDAE.FOR&$ Fortran/NoCheck/NoDebug GETQUEUE.FOR'$ Fortran/NoCheck/NoDebug FINGERTER.FOR'$ Fortran/NoCheck/NoDebug FINGERLAT.FOR$ B_4_4: !'F$Verify(0)$ If All then goto B_5&$ Write Sys$Output " " ! 'F$Verify(0)B$ Inquire Ans "Do you wish to assemble the MACRO routines? (YES) " $ C_5 = 0$ If Ans .eqs. "" then C_5 = 1$ If Ans then C_5 = 1$ If .not. C_5 then Goto B_5_5$ B_5:&$ Write Sys$Output " " ! 'F$Verify(0) $ Set Verify$ Macro TERMINAL.MAR$ Macro IDLE-MON.MAR$ Macro WILD.MAR$ Macro KLUDGE.MAR$ Macro GETJIB.MAR$ ! UCX$ Macro UCXSUBS.MAR$ B_5_5: !'F$Verify(0)$ If All then goto B_6&$ Write Sys$Output " " ! 'F$Verify(0)F$ Inquire Ans "Do you wish to compile the .CLD and .MSG files? (YES) " $ C_6 = 0$ If Ans .eqs. "" then C_6 = 1$ If Ans then C_6 = 1$ If .not. C_6 then Goto B_6_6$ B_6:&$ Write Sys$Output " " ! 'F$Verify(0) $ Set Verify"$ Set Command/Object FINGERCLD.CLD!$ Set Command/Object MAINTCLD.CLD$ Message FINGERMSG$ B_6_6: !'F$Verify(0)$ If All then goto B_7&$ Write Sys$Output " " ! 'F$Verify(0);$ Inquire Ans "Do you wish to create new libraries? (YES) " $ C_7 = 0$ If Ans .eqs. "" then C_7 = 1$ If Ans then C_7 = 1$ If .not. C_7 then Goto B_7_7$ B_7:&$ Write Sys$Output " " ! 'F$Verify(0) $ Set Verify!$ Library JLIB/Object/Create DUMJ-$ Rename DUMJ.OBJ;* DUMJ.NOBJ;* !'F$Verify(0) $ Set Verify'$ Library FINGERLIB/Object/Create *.OBJ $! Delete *.OBJ;* !'F$Verify(0) $ Set Verify6$ Library FINGMAINT/Help/Create=(Blocks:12) FINGMAINT$ Rename DUMJ.NOBJ;* DUMJ.OBJ;*$ Goto B_8 !'F$Verify(0)$ B_7_7: !'F$Verify(0)&$ Write Sys$Output " " ! 'F$Verify(0)$ If .not. C_4 then goto B_7_2 $ Set Verify$ Library JLIB/Object DUMJ!$ Delete DUMJ.OBJ;* !'F$Verify(0)$ B_7_2: !'F$Verify(0) $ Set Verify $ Library FINGERLIB/Object *.OBJ$ Delete *.OBJ;* !'F$Verify(0) $ Set Verify"$ Library FINGMAINT/Help FINGMAINT$ B_8: !'F$Verify(0)$ Type Sys$Input Time to clean up ...7$ Inquire Ans "Do you wish to PURGE everything? (YES) " $ C_8 = 0$ If Ans .eqs. "" then C_8 = 1$ If Ans then C_8 = 1$ If .not. C_8 then Goto B_9 $ Set Verify $ Purge/Log$ B_9: !'F$Verify(0)$ Type Sys$Input Libraries sucessfully built.$ Exit%*[UCX$FINGER.KIT]MULTINET-SERVER.DIR;1+,3./ 4--0123 KPWO56͖7͖89GHJIqSh UCX_FINGER_SUPPORT.BCK3-%[UCX$FINGER.KIT]MULTINET-SERVER.DIR;1SERVER_FINGER.COM 4SERVER_FINGER.EXE 5 3*[UCX$FINGER.KIT.MULTINET-SERVER]SERVER_FINGER.COM;9+,4./ 4F-30123KPWO56%ᘄ7nO89GHJ$ f='f$verify(0)'F$ ! Finger server DCL interface. Based on MultiNet's SERVER_SYSTAT.COM"$ finger :== $sys$tools:finger.exe $ finger 'f$trnlnm("FINGER_CMD") $ stop/id=04*[UCX$FINGER.KIT.MULTINET-SERVER]SERVER_FINGER.EXE;12+,5 ./ 4-30123 KPWO56TĘ7N:.89GHJ 0D`0205Uh SERVER_FINGERV1.0ԠU05-13  ?0!MULTINET_SOCKET_LIBRARY_001! LIBRTL_001 ! VAXCRTL_001O! MTHRTL_001FINGER_CMD_MBA%d:SYS$TOOLS:SERVER_FINGER.COMSYS$SYSTEM:LOGINOUTErrorSYS$OUTPUTSYS$INPUTLNM$SYSTEM_TABLE ^^OSVRޣI4P|~ߢPޣTP|~ߢPޭ|~|~?bPTT1|~|~ߢ 2b~PTT1<~ݢcnݮP͸ͻͺЮͼnxP͢͠nͤ|ͨ͠͸PTT10ݭߣ ߭;ޭȭ߭$P|~<~<~?PTT1|~|~ߢ 2~PTT1ޣݭPޣ/ݭPݭ|~蟭蟭 PTT||~|~|~<#~2~ PTTTP|~|~~ |~߭12b~ PPQ!# $assign_s devnam=dev, chan=channel tsterr $qiow_s efn=#3, - chan=channel, - func=#io$_setmode, - iosb=iostat,- p1=par11 tsterr  ret8 .entry readfromnet, ^m $qiow_s efn=#3, - chan=channel, - func=#io$_readvblk, - iosb=iostat, - p1=@4(ap), - p2=#1024 tsterr ret9 .entry socket_close, ^m $qiow_s efn=#3, - chan=channel, -' func=#, - iosb=iostat, - p4=#ucx$c_dsc_all tsterr $qiow_s efn=#3, - chan=channel, - func=#io$_deaccess, - iosb=iostat tsterr $dassgn_s chan=channel ret6 .entry writetonet,^m movl @8(ap),bflen movl 4(ap),bfaddr decl bflen incl bfaddr $qiow_s efn=#3, - chan=channel, - func=#io$_writevblk, - iosb=iostat, - p1=@bfaddr, - p2=bflen tsterr  ret 7 .entry writetonet2,^m m0 UCX_FINGER_SUPPORT.BCK86'[UCX$FINGER.KIT.UCX-SERVER]NEWMAC.MAR;19hovl @8(ap),bflen movl 4(ap),bfaddr $qiow_s efn=#3, - chan=channel, - func=#io$_writevblk, - iosb=iostat, - p1=@bfaddr, - p2=bflen tsterr  ret  .end2*[UCX$FINGER.KIT.UCX-SERVER]RUN_FINGER_DAEMON.COM;1+,9./ 4&(-60123KPWO56@e(ݔ7'\N89GHJ&$ Run user6:[sysprog.terry.ucx]ucxDae3*[UCX$FINGER.KIT.UCX-SERVER]UCX$FINGER_STARTUP.COM;1+,;./ 4<-60123KPWO56`>Y7@E\N89GHJ$ ! UCX$FINGER_STARTUP.COM;$ DEFINE SYS$error SYS$SYSDEVICE:[UCX$FINGER]UCX$FINGER.err<$ DEFINE SYS$OUTPUT SYS$SYSDEVICE:[UCX$FINGER]UCX$FINGER.LOG%$ RUN SYS$LOGIN:UCX$FINGER_DAEMON.EXE$ EXIT'*[UCX$FINGER.KIT.UCX-SERVER]UCXDAE.FOR;1+,<. / 4G -60123KPWO 56o7y\N89GHJ.c this doesn't work when doing something like:c f@spc11e@spcvxa@spc11e@spcvxaGc is this because of the non-re-entrant nature of UCX, or is there someGc problem in this code? In any event, it shouldn't permanently hang thec finger server process. program ucxdaeEc This is the main program for the UCX (VMS/Ultrix Connection) TCP/IPc Finger Daemon.c Terry Kennedy, SPC, 28-Aug-914c Some functions derived from existing FINGERDAE.FOR implicit none < character*25 tcp_daemon_version /'V51.1.26 of 28-Aug-1991'/ character versionmsg*50$ common /version_common/ versionmsg integer i logical parse_tcp integer socket_setup integer socket_close integer readfromnet character*1024 buffer integer btrim integer blen/c initial entry - called once at daemon startup call open_tcp_log2 call tcp_log('Starting FINGER UCX TCP/IP Daemon')- call tcp_log('FINGER version: '//versionmsg)9 call tcp_log('UCX_DAEMON version: '//tcp_daemon_version)8c here we should log the TCP/IP version if we can get itc set up initial TCP/IP stuff i = socket_setup() if (i .ne. 1) then call lib$signal(%val(i)) endif i = readfromnet(%ref(buffer))' blen = btrim(buffer(:btrim(buffer)))-26c we need the remote user info to log here, somehow...# if (parse_tcp(buffer(:blen))) then! call finger_tcp(buffer(:blen)) else, call finger_tcp('FINGER '//buffer(:blen)) endif?c we need to generate a delay here, or set linger on the socket call socket_close endc parse command$ logical function parse_tcp(command) implicit none3 character command*(*), str$upcase*80, upcommand*80 integer ll upcommand = str$upcase(command) parse_tcp = .false. ll = len(command)? if (index(upcommand(:ll),'FINGER') .ne. 0 ) parse_tcp = .true. return endc call main finger code subroutine finger_tcp(command) implicit none character command*(*) integer access/2/ integer finger, 1 outboundlinkunit /11/, 2 uafunit /12/, 3 scratchunit /13/ integer ii integer tcp_signal_handler integer btrim integer tcp_out_routine integer first_line common /ucxcom/ first_line' call lib$establish(tcp_signal_handler)Ec for some reason we accvio horribly if we don't call tcp_out_routineEc before finger() does. We send a rubout so as to not affect spacing. call tcp_out_routine(char(127)) first_line = 1= ii = finger(command(:btrim(command)),tcp_out_routine,access) call tcp_out_routine(' ') if (.not. ii) then# close(outboundlinkunit,err=1011)1011 close(uafunit,err=1012)"1012 close(scratchunit,err=1013)1013 continue endif return endc signal handlerc need to clean this up later% integer function tcp_signal_handler( 1 signalvector,mechanismvector) implicit noneCc The point of this handler is really error message routing ratherCc than actually responding to a particular condition. The routineEc convert all signals into messages for transmission to the invoker.Cc This routine uses ReturnMail to transmit the message back to the=c jnet invoker. The routine exits with a CONTINUE flag. IfBc there are errors that should actually be handled (arithmetic or7c whatever) by some system handler, they will not be.% Integer SS$_Status, SS$_Normal/1/- Integer SignalVector(8), MechanismVector(5)- Integer Message_Limit/10/, Message_Count/0/ Integer Depth Integer MsgLen, MsgLen2 Character Msg*255, Msg2*132 Character LF/10/, CR/13/ Character FLUSH/255/ External Fing_Abort integer tcp_out_routine SS$_Status = SignalVector(2)) If ( SS$_Status .eq. SS$_Normal ) Return6 Call Sys$Getmsg(%Val(SS$_Status),MsgLen,Msg,%VAL(1),)( Call Sys$Fao(Msg(:MsgLen),MsgLen2,Msg2, 1 %Val(SignalVector(4)), 2 %Val(SignalVector(5)), 3 %Val(SignalVector(6)), 4 %Val(SignalVector(7))), Call tcp_Out_Routine(LF//'%FINGER-E-OOPS, ' 1 //Msg2(:MsgLen2)//CR//FLUSH).c unwind to the calling routine (Finger_jnet) Depth = MechanismVector(3)8 MechanismVector(4) = %Loc(Fing_Abort) ! Set return code Call Sys$Unwind(Depth,%Val(0)) Return1001 Format(A) End-c send the actual response to the remote user' integer function tcp_out_routine(text) implicit none integer i! integer writetonet, writetonet2 integer blen character*(*) text integer first_line common /ucxcom/ first_line if (first_line .eq. 1) then& i = writetonet(%ref(text),len(text)) first_line = 0 else' i = writetonet2(%ref(text),len(text)) endif return endc open log file subroutine open_tcp_log implicit none c no-op for now - no logging yet return endc close log file subroutine close_tcp_log implicit none c no-op for now - no logging yet return endc write text to log file subroutine tcp_log(line) implicit none character*(*) line c no-op for now - no logging yet return end)*[UCX$FINGER.KIT.UCX-SERVER]UCXDTEST.COM;2+,=./ 4J-60123KPWO56cN7 `cN89GHJPvA UCX_FINGER_SUPPORT.BCK=6)[UCX$FINGER.KIT.UCX-SERVER]UCXDTEST.COM;2J $ Set NoOn$ Type Sys$Input4 This procedure builds the UCX TCP/IP Finger Daemon.$ Inquire Ans -C" Give name of the directory where FINGER is located (SYS$TOOLS:) "*$ If Ans .eqs. "" Then Ans := Sys$tools:$ LogAns := 'F$Log(Ans)'+$ If LogAns .eqs. "" Then LogAns := 'Ans'"$ Define Finger$Directory 'LogAns'!$ Type Sys$Input ! 'F$Verify(0) The daemon will be linked. $ Set Verify $ goto nojnetJ$ ! Use the following if you want Jnet support included in your UCX Daemon"$ ! (This is normally not useful).$ Link/Trace/map - ucxdae,newmac, - fingerlib/lib, - Sys$System:Sys.Stb/Sel, -( Sys$Input/Options/Exe=ucx$finger_daemon Finger$Directory:FingerShr/Sharejan_lib:janshr/share $ goto finish$nojnet:$ Link/Trace/map - ucxdae,newmac, - fingerlib/lib, - jlib/lib, - Sys$System:Sys.Stb/Sel, -( Sys$Input/Options/Exe=ucx$finger_daemon Finger$Directory:FingerShr/Share$finish:$ set noverify$ exitN)/[UCX$FINGER.KIT.OXDCB[\L+%BDF"Avfp`t|;2!XFVf0pl"OoZr@6~ [$v0)o9"kC a@m:6giQ"-O%.8} 6j8&hMczgfmXE;' A?]+vO=Z);_Io_nSjy\ oa`ub~/" +sC#WlryUF0t2mW:^vJL5i4r~)cRM)BtKc)oA3%?51EI&FMY: V35:$G!`n.$-2wj?k wsLmJ_Q%4X2#yV;h(;s1!BMW,BCJ:SsHc|E>m> au@$pkt a~DeuRE,Kd#:"sgxsytTT:s.6ItY\LvH5y8<#2>ZNG@LMCqFHk308+{EnN_h'5(m#PfQ6l{AWIT:DX$AM~Ш QwD( 0.`&J;kto'*R$7q_jhG.Yc7e6a!i)vg2p˝m:97EC. -S JUPBR& 81.jr\8 j _p~ ,EsCQW@wep+W>P C$ F SUZ:YU^NvYEt L ]]vYl9f'Ako[MSbr0PB_`P!B]|s)6(s7_ [o(wc)"#7HE.~BJ}c|>x:z @P J7]bhZz GHq@PM!Y_K^_%;{PUB+d }V"&TX$Z(MF1FG ZbMPGcDMU-nE0c_ |n0c' Y ixI'. qSOwiAD ^O)bRO\k NS^,J &ZDKH L: m-,(g#)"7%#&:a0'ga fdWKswM{_q8##Q.AE_$PUKP)ZE}eW9ibU<k1uTPMOP =-Y)RL^TIBX blp|&}N[vGm\7\P}-*k,X%^kp}'YpImh`0df% 4-kWqL^'D>Z\[c"~c|\ʹ%5Qdko0'b1}XlonlEuae)Z.d4'1s'H%:a-&jeeB-4dlJlj|OON,/&=(6#-=Pfb7!0zn2T=$3m~tx0$ 0`I\ng6 .LD_ltfJ5r\\og+<$ Yn0g}G-?0d2=s,+*+3e Ph6o39*5HECZ;{GeO9 i*&67f1O #*""j:=4Z vWZ|ZmPIiG \'Ϲ1m}nPx /-)V4(0r&<5/Xe{.pLkl)-D;W'63den\/ C?`(=3/+'*: 9URity33hMO^b~(Rm{6_KG_LLY_JL&U FYNN\DS Cjr"bc$OMY;0wom1wf H.)!{{oqsnaPRInC8y)n=d"5 EKv!x` 8x9o|Gs -V] JCHx7+m,1?MB}9- }18bu U$zmk Zp/NW !DF@3\0/of0!n[L- V?d{kw &%<}afcp4f"wv>G jba4 an?ucrBvQ-zbfd?5G ;tjkNIOKLZUF]yCc=:>2@K|x8`ctG{V_IWz; $NRF ^M`  } ]]-^'(8Ec:\Xvb7nH|^Ul }nF|rwbEnmnLE F72k{_b?]a߾DȡE_c+nxh^"5 ^" /JE u1oHui{4`- h#-75y50i;e:h07l>Pnl.h?jfWda-48g=8m|VLW/$c&gh3$:kC8Z%Cx/byc, rS#-2]qoIJ _^LA(mry6_ uumq ]I; I^FRXOTCO=-Fe)k8}fFnMtW62s0 '~rqaz1``x'{QK4'jz$[ 1,u91c(R # Ci{'cetls&hhNA*)=1 g7X@)!=+'Ak7Oia Ӈ1C֠蕬bp7'Ql݉[ e dZt[emnכ7bX{V O\ #] ;RP1ZlXΟ6[!g[KK'hȝvKe :߼V8.hshst|eLi~/G ]?$:%yETY?9̺ g(Zr}DWr?=*_'+rAw8oo'k56/=б4|7Gwkſ™iEg1#-Fyl97Mk_rB'5RsC(%N!wzx1=.HbI$:.x  ;*AM(xDp3/9EvsG Z(\DZSei\5s"$*o+^J\L6 9 ;ragd;n{#MSIrJt+gfFha)lL!Y =s]x5 b*(Lu<;3g{=m<)4#Nb:`a7)gr Ki!` * 9qcj.;Do9K >BO:RX]Z/BQ4!Fm/TLi$W(O=UJEe/GOF\IPi+iZ#I3Dp05F&w-'x-~g|4Tf d'2ZP~idk P5"E"ccm24-R| ^U t|]n&)E  !=xk"2'BhM%u "M=@o{v]xDF(v7wn{F@e3|%_} #] UxiI6l* (c^bDq*w; mg8rtai qTMe8(g2 ]& sE,di!VG`cLun|!3yC#"_{N=zw=EY[_(, e}ߏFTa#| 9 0 [L-셥-@q)i/ I9-DLVOs,fhد ẩE裭VX `-+2eo: fxy|RIeRCCV{3vH9k0]|$,RH-G*d&'8Fgg^JPD\Se"9Bx@xTa_>5Z/~n?5 yM:&Fm/GHp#o @t9UbTIxwou nY{%:="vFE;K;(L!W}P^T7COeBrU#VZQv p-b 8i{8^eKU4y 2m,_RF5%@"3{"l!%?RzsYAM " jWr-g%u 0X~TUC5pV@G'T:@nG' g*R xqD7rg2^p?8oQ|/o+.2QMPm:i,]&1f1V<90 B s[}'s6:n$nW9t)PutZ \L- {%)R$O/UØEO5(oF}A"OX)/ V'5FLkw)(#Hbor^MY>~&nV=yiK/)Ҕ)J_Qw,ǔERkoThTIeLC!5.kfFN A]fR}&W?Uk :oL#C'@FOS^rmc\wqtuH1J/M]yq/cbM ]!' ` ha|S/Sm5;41VQ  AD.1=uQG>nA2F'0]2LvR]A!BwS*?q0&IM1Eujz>Dz`NwNJPi@e9 ; ZJ%6&Y4cjK rV( VnuI)mu]5?}t}mlB3eq8rW @ggt fvTPGC J,VaJ6r[#h-sGsi-40:$<z/' 8s HH!3a$"J TF yu3jgro!lyG"[7?0EFcqrsc]-D WOIIX`Y=ni&fae4'd`Mks&zeidWrpA__&~) {uAv)^_:*)+O7HQ^ ^''f8YRGP:eQNBN`6# ^/ Z$tL'>oX ^bi0Eg_ZB@ @|IC 0H2-% <QXICNY1*(NbPqsL YWYi2%OS5$FE&y75P\ :FhkZXB0*a\U! : RUYCzs&&zb6'~-c|d#n%bU)/0N; mW^B?&IyvExd?[k:)ci1qVYUzLtYzhArzx&Eo]z>_L9N^s`eFeQ?-1DGKsp~{$)\(|o^ AI}v%VRXSd5jeRPKD1t}@i@;;(d>3Dl8|"D:$XR!B Mo:~ `|: t>89 (sT= p)m~)^0% y};vOhTnnZd'comD^ #A~yZCg./gF 2B P:"R<A84@:NpNE HMY#DsI@@Xipv1kX$hdGae2.QM*w l^elY OWy9Rh76 MN7&4xrC.y"]@B:)E\L r@nB [?'neiTO\gp;{uM{B apaVdc8Vnp,9zI(grZTG]k]:?gV^x5Nd Lvr@ 6Zzx)*r'\{)> D|~WL<e.0/OL r2RGi:X^%6lva HAt'Pw//HFNL|<=TlQ5T( Tc?+=rxy[qTjnxK]%OP +K=[U[k:x]>|x)2r,av|owk 2x84$f |SX)Lu+cD,U^eM|:ItVS )""CN$rsrw jUmgi%=4}3 (dzjhMmep"aFkAu us_IcZsz^6W?)g w6qXl]\kn!>qkk"q!&@Iv Yn $by*Z?E)k'J>fpCURR;XF:})#DvP3 df;##/.DKGqB7r-\U& @zwK 2AO{U@m4CSJ|(~! Ree'+T^rzsc  %!9  q7SoB/$ $$b 3tem+s<}/ YJW# ` 1_P?a2YOiJF*4pY=;vdfZbJj=aVB *$UxNO95u%d&:B&#K &fSa32C53WS 2Ui}@&7kc,jn*'J\b~MQ{}[#w[ikT6IE+- 4zqK(^FBR 6OyxS#]u;^=s&sU|v%ja{Pe@eo#(m,~K}Yr' )| kjzJD32C5L C 5tYY5z}.gH-CJ_P?vN?'eb.!~e_/rCiVRA>^rGDK2H7,kME{rZ%dzN]^ ZF= Hn6e;*7S=8L& +"$Xud ^xG 4_YN-rtYm5FLU L{X)~f 5oW d/#SAAmdfpdB/c@ 7O fR_ln~gEb^kAAMJI7$O w-LM D|8_&[oKSp@Fy%U8p2k&]5kFWnlm@hZc++f? P19ooFK@(\&&Xwi-&j`vN2GQsr-y qwY!a~.`YGd4qkcH UMYH{h WAcu+F@G7to)/59)'`tdNOT$Z5`k'4B!'U;8vs_esp, 3 sep .7 *eAtywRi@evgodt2/^m