NETLIB_SRC.BCKNETLIB_SRC.BCKWBACKUP CMU064_ERRORS.OPT,CMU_DEFS.R32,CMU_ERRORS.OPT,DEBUG.R32,DESCRIP.MMS,FIELDS.R32,KITINSTAL.COM,NETLIB.OPT,NETLIB.R32,NETLIB016.SDML,NETLIBDEF.R32,NETLIB_CMU.VERSION,NETLIB_CMU064.VERSION,NETLIB_CMU064_NET.B32,NETLIB_CMU_MXLOOK.B32,NETLIB_CMU064_UDP.B32,NETLIB_CMU_NET.B32,NETLIB_CMU_TCP.B32,NETLIB_CMU_UDP.B32,NETLIB_MULTINET_NET.B32,NETLIB_MULTINET_TCP.B32,NETLIB_MULTINET_UDP.B32,NETLIB_UCX_NET.B32,NETLIB_UCX_TCP.B32,NETLIB_UCX_UDP.B32,NETLIB_MXLOOK.B32,NETLIB_INSTALL.COM,NETLIB_INSTALL.OPT,NETLIB_MULTINET.VERSION,NETLIB_UCX.VERSION,NETLIB_NULL_MXLOOK.B32,NETLIB_SHRXFR.B32,NETLIB_SHRXFR.VERSION,NETLIB_UCX012.VERSION,NETLIB_USER_INSTALL.COM,NETLIB_VECTOR.MAR,UCX_DEFS.R32,MULTINET_TCPWARE_DEFS.R32,NETLIB_TCPWARE.VERSION,DUMMY.B32,NETLIB.ALPHA_OPT,NETLIB_INSTALL.ALPHA_OPT,NETLIB_WINTCP.VERSION NETLIB_SRC.BCK/SAVE/INTER/BLOCK=4096/NOCRC/GROU=0 MADISON  @=V6.1 _HQ::  _HQ$DKA500: V6.1 *[NETLIB]CMU064_ERRORS.OPT;2+,, . / @ 4L 0-XP0123KPWO 5)6E! 778g I9$.G @HJ  UNIVERSAL =-( NET$_IR,- ! INSUFFICIENT RESOURCES.( NET$_IFC,- ! INVALID FUNCTION CODE.& NET$_UCT,- ! UNABLE TO CREATE TCB( NET$_IFS,- ! INVALID FOREIGN SOCKET$ NET$_ILP,- ! INVALID LOCAL PORT( NET$_NUC,- ! NON-UNIQUE CONNECTION.3 NET$_CSE,- ! CONNECTION TABLE SPACE EXHAUSTED.< NET$_NOPRV,- ! INSUFFICIENT PRIVILEGES TO USE LOCAL PORT5 NET$_CIP,- ! CONNECTION ILLEGAL FOR THIS PROCESS* NET$_CC,- ! ERROR: CONNECTION CLOSING, NET$_CDE,- ! CONNECTION DOES NOT EXIST.( NET$_CR,- ! ERROR: CONNECTION RESET- NET$_FSU,- ! Foreign-Socket unspecified.' NET$_UNN,- ! Unknown Network Node.& NET$_VTF,- ! Valid-TCB Table Full% NET$_CTO,- ! Connection TimeOut.$ NET$_TWT,- ! Time-Wait TimeOut.E NET$_FTO,- ! User function timeout. Network event didn't happen.L NET$_CRef,- ! Connection REFUSED, RESET in SYN-Recv state. Active open.9 NET$_CCAN,- ! Connection cancelled by process abort. NET$_TE,- ! TCP is Exiting.* NET$_FIP,- ! IO Function in Progress.5 NET$_BTS,- ! User specified buffer is Too small.* NET$_ihi,- ! invalid known host index" NET$_bdi,- ! Bad device index. NET$_epd,- ! error processing device dump) NET$_URC,- ! Destination Unreachable( NET$_IGF,- ! Invalid GTHST function# NET$_UNA,- ! Unknown host name% NET$_UNU,- ! Unknown host number3 NET$_NYI,- ! User function not yet implemented1 NET$_NOINA,- ! Access to internet not allowed0 NET$_NOANA,- ! Access to ARPANET not allowed3 NET$_NOPN,- ! UDP wildcard connection not open0 NET$_NOADR,- ! Host address not yet resolved* NET$_GTHFUL,- ! GTHST queue full error* NET$_DAE,- ! NET$DUMP: Argument error( NET$_NMLTO,- ! Name-lookup timed-out* NET$_NSEXIT,- ! Name server is exiting* NET$_NONS,- ! Name server not running. NET$_NSQFULL,- ! Name server queue is full1 NET$_DSDOWN,- ! Domain service is unavailable? NET$_DSNODS,- ! Domain service: no domain servers contacted6 NET$_DSINCOMP,- ! Domain service: incomplete reply8 NET$_DSNOADDR,- ! Domain service: no addresses found3 NET$_DSNONAME,- ! Domain service: no name found; NET$_DSFMTERR,- ! Domain service: format error in query2 NET$_DSSRVERR,- ! Domain service: server error0 NET$_DSNAMERR,- ! Domain service: name error; NET$_DSNOTIMP,- ! Domain service: query not implemented3 NET$_DSREFUSD,- ! Domain service: query refused= NET$_DSNONSRV,- ! Domain service: no usable servers foNETLIB_SRC.BCK, XPETLIB]CMU064_ERRORS.OPT;2L und: NET$_DSUNKERR,- ! Domain service: unknown server error@ NET$_DSREFEXC,- ! Domain service: maximum referrals exceeded1 NET$_GREENERR,- ! Unknown name lookup failure3 NET$_GP_INVREQ,- ! Name lookup: invalid request: NET$_GP_INVINF,- ! Name lookup: invalid host info item< NET$_GP_INVNAM,- ! Name lookup: invalid host name syntax? NET$_GP_INVADR,- ! Name lookup: invalid host address syntax: NET$_GP_INVMBX,- ! Name lookup: invalid mailbox syntax8 NET$_GP_INVCLS,- ! Name lookup: invalid domain class5 NET$_GP_RSBUSY,- ! Name lookup: resolver too busy< NET$_GP_NONMSR,- ! Name lookup: no name server availableC NET$_GP_NOHINF,- ! Name lookup: specified host info unavailable2 NET$_GP_NOTFND,- ! Name lookup: name not found5 NET$_GP_UNKMBX,- ! Name lookup: mailbox not found< NET$_GP_NOTIMP,- ! Name lookup: function not implemented9 NET$_GP_TOOBIG,- ! Name lookup: reply too big for UDP= NET$_GP_NSDOWN,- ! Name lookup: all name servers are down- NET$_NRT ! No route to specified addressNETLIB_SRC.BCKPXP[NETLIB]CMU_DEFS.R32;4<*[NETLIB]CMU_DEFS.R32;4+,P./ @ 4<J-XP0123KPWO56`3Y87`}882B͈9$.G @HJ!++!! CMU_DEFS.R32!<! Definitions specific to the CMU implementation of NETLIB.!0! 29-JAN-1991 V1.0 Madison Initial coding.!-- LIBRARY 'FIELDS'; _DEF (CTX) CTX_L_FLINK = _LONG, CTX_L_BLINK = _LONG, CTX_Q_BUFQ = _QUAD, CTX_Q_EXPTIME = _QUAD, CTX_Q_CURSTR = _QUAD, CTX_Q_IOSB = _QUAD, CTX_L_LSNPORT = _LONG, CTX_W_CHAN = _WORD, CTX_W_FLAGS = _WORD, _OVERLAY (CTX_W_FLAGS) CTX_V_IGNORELF = _BIT, CTX_V_ACTIVE = _BIT _ENDOVERLAY _ENDDEF (CTX); NETLIB_SRC.BCK[PXP[NETLIB]CMU_ERRORS.OPT;1L *[NETLIB]CMU_ERRORS.OPT;1+,[P. / @ 4L -XP0123KPWO 5)6 ' 77q8~X9$.G @HJ  UNIVERSAL = -( NET$_IR,- ! INSUFFICIENT RESOURCES.( NET$_IFC,- ! INVALID FUNCTION CODE.( NET$_IPC,- ! INVALID PROTOCOL CODE.& NET$_UCT,- ! UNABLE TO CREATE TCB( NET$_IFS,- ! INVALID FOREIGN SOCKET$ NET$_ILP,- ! INVALID LOCAL PORT( NET$_NUC,- ! NON-UNIQUE CONNECTION.3 NET$_CSE,- ! CONNECTION TABLE SPACE EXHAUSTED.< NET$_NOPRV,- ! INSUFFICIENT PRIVILEGES TO USE LOCAL PORT5 NET$_CIP,- ! CONNECTION ILLEGAL FOR THIS PROCESS* NET$_CC,- ! ERROR: CONNECTION CLOSING, NET$_CDE,- ! CONNECTION DOES NOT EXIST.( NET$_CR,- ! ERROR: CONNECTION RESET- NET$_FSU,- ! Foreign-Socket unspecified.' NET$_UNN,- ! Unknown Network Node.& NET$_VTF,- ! Valid-TCB Table Full% NET$_CTO,- ! Connection TimeOut.$ NET$_TWT,- ! Time-Wait TimeOut.E NET$_FTO,- ! User function timeout. Network event didn't happen.L NET$_CRef,- ! Connection REFUSED, RESET in SYN-Recv state. Active open.9 NET$_CCAN,- ! Connection cancelled by process abort. NET$_TE,- ! TCP is Exiting.* NET$_FIP,- ! IO Function in Progress.5 NET$_BTS,- ! User specified buffer is Too small.* NET$_ihi,- ! invalid known host index" NET$_bdi,- ! Bad device index. NET$_epd,- ! error processing device dump) NET$_URC,- ! Destination Unreachable( NET$_IGF,- ! Invalid GTHST function# NET$_UNA,- ! Unknown host name% NET$_UNU,- ! Unknown host number3 NET$_NYI,- ! User function not yet implemented1 NET$_NOINA,- ! Access to internet not allowed0 NET$_NOANA,- ! Access to ARPANET not allowed3 NET$_NOPN,- ! UDP wildcard connection not open0 NET$_NOADR,- ! Host address not yet resolved* NET$_GTHFUL,- ! GTHST queue full error* NET$_DAE,- ! NET$DUMP: Argument error( NET$_NMLTO,- ! Name-lookup timed-out* NET$_NSEXIT,- ! Name server is exiting* NET$_NONS,- ! Name server not running. NET$_NSQFULL,- ! Name server queue is full1 NET$_DSDOWN,- ! Domain service is unavailable? NET$_DSNODS,- ! Domain service: no domain servers contacted6 NET$_DSINCOMP,- ! Domain service: incomplete reply8 NET$_DSNOADDR,- ! Domain service: no addresses found3 NET$_DSNONAME,- ! Domain service: no name found; NET$_DSFMTERR,- ! Domain service: format error in query2 NET$_DSSRVERR,- ! Domain service: server error0 NET$_DSNAMERR,- ! Domain service: name error; NET$_DSNOTIMP,- ! Domain service: query not implemented3 NET$_DSREFUSD,- ! Domain service: query refused= NET$_DSNONSRV,- ! Domain service: no usable servers found: NET$_DSUNKERR,- ! Domain service: unknown server error@ NET$_DSREFEXC,- ! Domain service: maximum referrals exceeded1 NET$_GREENERR,- ! Unknown name lookup failure3 NET$_GP_INVREQ,- ! Name lookup: invalid request: NET$_GP_INVINF,- ! Name lookup: invalid host info item< NET$_GP_INVNAM,- ! Name lookup: invalid host name syntax? NET$_GP_INVADR,- ! Name lookup: invalid host address syntax: NET$_GP_INVMBX,- ! Name lookup: invaliNETLIB_SRC.BCK[PXP[NETLIB]CMU_ERRORS.OPT;1L $d mailbox syntax8 NET$_GP_INVCLS,- ! Name lookup: invalid domain class5 NET$_GP_RSBUSY,- ! Name lookup: resolver too busy< NET$_GP_NONMSR,- ! Name lookup: no name server availableC NET$_GP_NOHINF,- ! Name lookup: specified host info unavailable2 NET$_GP_NOTFND,- ! Name lookup: name not found5 NET$_GP_UNKMBX,- ! Name lookup: mailbox not found< NET$_GP_NOTIMP,- ! Name lookup: function not implemented9 NET$_GP_TOOBIG,- ! Name lookup: reply too big for UDP= NET$_GP_NSDOWN,- ! Name lookup: all name servers are down/ NET$_NRT,- ! No route to specified address4 NET$_KILL ! This connection has been terminated NETLIB_SRC.BCK]PXP[NETLIB]DEBUG.R32;8CC*[NETLIB]DEBUG.R32;8+,]P./ @ 4CT-XP0123KPWO56ra77pa78%4͈9$.G @HJ" LIBRARY 'SYS$LIBRARY:STARLET'; MACRO DBGPRT (CTRSTR) [] = BEGIN IF NOT .DBGTST THEN BEGIN DBGTST = 1;8 DBGSWI = $TRNLNM (TABNAM=%ASCID'LNM$FILE_DEV',0 LOGNAM=%ASCID'NETLIB_DEBUG'); END; IF .DBGSWI THEN BEGIN EXTERNAL TRACE_ROUTINE; EXTERNAL ROUTINE6 LIB$SYS_FAO : ADDRESSING_MODE (GENERAL),7 STR$FREE1_DX : ADDRESSING_MODE (GENERAL);3 LOCAL _DBGFAO : BLOCK [DSC$K_S_BLN,BYTE];" $INIT_DYNDESC (_DBGFAO);C LIB$SYS_FAO (%ASCID %STRING ('!%D ', CTRSTR), 0, _DBGFAO,C 0 %IF NOT %NULL (%REMAINING) %THEN , %REMAINING %FI);% (.TRACE_ROUTINE) (_DBGFAO); STR$FREE1_DX (_DBGFAO) END; END %; NETLIB_SRC.BCK'}XP[NETLIB]DESCRIP.MMS;95X*[NETLIB]DESCRIP.MMS;95+,'}./ @ 4X-XP0123KPWO56Q79Q8[ I9$.G @HJ .IFDEF __ALPHA__VEC = DUMMY$(OBJ)MCH = /NOMACHINEMXLOPTIM = /NOOPT.ELSE.FIRSTX DEFINE/NOLOG CMUTEK_SRC DISK$ALTUSERS:[USERS.MADISON.RPISRC.CMU065.]/TRANSL=CONCM DEFINE/NOLOG SYS$LIBRARY RPI$SRC:[CMU064.SYSLIB],SYS$SYSROOT:[SYSLIB]VEC = NETLIB_VECTOR$(OBJ)MCH = /MACHINE=NOOBJ MXLOPTIM = .ENDIF .IFDEF DBGOPTIM = /OPTIM=LEVEL:0.ENDIF<BFLAGS = /OBJ=$(MMS$TARGET)$(MCH)/NOLIST$(LIS)$(DBG)$(OPTIM)!MFLAGS = /OBJ=$(MMS$TARGET)$(DBG)GNETLIB_UCX = NETLIB_UCX_NET,NETLIB_UCX_TCP,NETLIB_UCX_UDP,NETLIB_MXLOOKMNETLIB_CMU = NETLIB_CMU_NET,NETLIB_CMU_TCP,NETLIB_CMU_UDP,NETLIB_CMU_MXLOOK,-$ NETWORK=CMU_NETERROR$(OBJ)DNETLIB_CMU064 = NETLIB_CMU064_NET,NETLIB_CMU_TCP,NETLIB_CMU064_UDP,-5 NETLIB_MXLOOK,NETWORK=CMU064_NETERROR$(OBJ)ONETLIB_UCX012 = NETLIB_UCX_NET,NETLIB_UCX_TCP,NETLIB_UCX_UDP,NETLIB_NULL_MXLOOKONETLIB_MULTINET = NETLIB_MULTINET_NET,NETLIB_MULTINET_TCP,NETLIB_MULTINET_UDP,- NETLIB_MXLOOK?NETLIB_TCPWARE = NETLIB_MULTINET_NET=NETLIB_TCPWARE_NET$(OBJ),-9 NETLIB_MULTINET_TCP=NETLIB_TCPWARE_TCP$(OBJ),-9 NETLIB_MULTINET_UDP=NETLIB_TCPWARE_UDP$(OBJ),- NETLIB_MXLOOK=NETLIB_WINTCP = NETLIB_MULTINET_NET=NETLIB_WINTCP_NET$(OBJ),-8 NETLIB_MULTINET_TCP=NETLIB_WINTCP_TCP$(OBJ),-8 NETLIB_MULTINET_UDP=NETLIB_WINTCP_UDP$(OBJ),- NETLIB_MXLOOK.IFDEF __ALPHA__JALL : NETLIB_SHRXFR$(EXE),NETLIB_UCX_SHR$(EXE),NETLIB_MULTINET_SHR$(EXE),-3 NETLIB_TCPWARE_SHR$(EXE),COMPILE_NETLIB_WINTCP? LIB/COMPRESS/OUTPUT=NETLIB_WINTCP$(OLB) NETLIB_WINTCP$(OLB)A LIB/COMPRESS/OUTPUT=NETLIB_TCPWARE$(OLB) NETLIB_TCPWARE$(OLB)C LIB/COMPRESS/OUTPUT=NETLIB_MULTINET$(OLB) NETLIB_MULTINET$(OLB)9 LIB/COMPRESS/OUTPUT=NETLIB_UCX$(OLB) NETLIB_UCX$(OLB) @ !.ELSEJALL : NETLIB_SHRXFR$(EXE),NETLIB_UCX_SHR$(EXE),NETLIB_MULTINET_SHR$(EXE),-K NETLIB_CMU064_SHR$(EXE),NETLIB_UCX012_SHR$(EXE),NETLIB_CMU_SHR$(EXE),-3 NETLIB_TCPWARE_SHR$(EXE),COMPILE_NETLIB_WINTCP @ !.ENDIF=COMPILE_NETLIB_WINTCP : NETLIB_WINTCP$(OLB)($(NETLIB_WINTCP)) @ !"TCPWARE : NETLIB_TCPWARE_SHR$(EXE) @ !KIT : NETLIB016.ZIP @ !8NETLIB016.ZIP : NETLIB016.A, NETLIB016.B, NETLIB_SRC.BCKG @ if f$search("$(mms$target)") .nes. "" then delete $(mms$target);*? PKZIP "-V" NETLIB016 NETLIB016.A NETLIB016.B NETLIB_SRC.BCK?NETLIB_SHRXFR$(EXE) : $(VEC),NETLIB_SHRXFR$(OBJ),NETLIB$(OPT),- NETLIB_SHRXFR.VERSION5 $(LINK)/SHARE=$(MMS$TARGET)/NOTRACE/NOMAP$(MAP) -C NETLIB_SHRXFR$(OBJ),NETLIB$(OPT)/OPT,NETLIB_SHRXFR.VERSION/OPTENETLIB_UCX_SHR$(EXE) : NETLIB_UCX$(OLB)($(NETLIB_UCX)),NETLIB$(OPT),- $(VEC),NETLIB_UCX.VERSION5 $(LINK)/SHARE=$(MMS$TARGET)/NOTRACE/NOMAP$(MAP) -= NETLIB$(OPT)/OPT,NETLIB_UCX.VERSION/OPT,NETLIB_UCX$(OLB)/LIBNNETLIB_UCX012_SHR$(EXE) : NETLIB_UCX012$(OLB)($(NETLIB_UCX012)),NETLIB$(OPT),- $(VEC),NETLIB_UCX.VERSION5 $(LINK)/SHARE=$(MMS$TARGET)/NOTRACE/NOMAP$(MAP) -C NETLIB$(OPT)/OPT,NETLIB_UCX01NETLIB_SRC.BCK'}XP[NETLIB]DESCRIP.MMS;95XW2.VERSION/OPT,NETLIB_UCX012$(OLB)/LIBENETLIB_CMU_SHR$(EXE) : NETLIB_CMU$(OLB)($(NETLIB_CMU)),NETLIB$(OPT),-+ $(VEC),NETLIB_CMU.VERSION,CMU_ERRORS$(OPT)5 $(LINK)/SHARE=$(MMS$TARGET)/NOTRACE/NOMAP$(MAP) -? NETLIB$(OPT)/OPT,NETLIB_CMU.VERSION/OPT,NETLIB_CMU$(OLB)/LIB,- CMU_ERRORS$(OPT)/OPTNNETLIB_CMU064_SHR$(EXE) : NETLIB_CMU064$(OLB)($(NETLIB_CMU064)),NETLIB$(OPT),-. $(VEC),NETLIB_CMU.VERSION,CMU064_ERRORS$(OPT)5 $(LINK)/SHARE=$(MMS$TARGET)/NOTRACE/NOMAP$(MAP) -B NETLIB$(OPT)/OPT,NETLIB_CMU.VERSION/OPT,NETLIB_CMU064$(OLB)/LIB,- CMU064_ERRORS$(OPT)/OPTTNETLIB_MULTINET_SHR$(EXE) : NETLIB_MULTINET$(OLB)($(NETLIB_MULTINET)),NETLIB$(OPT),- $(VEC),NETLIB_MULTINET.VERSION5 $(LINK)/SHARE=$(MMS$TARGET)/NOTRACE/NOMAP$(MAP) -G NETLIB$(OPT)/OPT,NETLIB_MULTINET$(OLB)/LIB,NETLIB_MULTINET.VERSION/OPTQNETLIB_TCPWARE_SHR$(EXE) : NETLIB_TCPWARE$(OLB)($(NETLIB_TCPWARE)),NETLIB$(OPT),- $(VEC),NETLIB_TCPWARE.VERSION5 $(LINK)/SHARE=$(MMS$TARGET)/NOTRACE/NOMAP$(MAP) -E NETLIB$(OPT)/OPT,NETLIB_TCPWARE$(OLB)/LIB,NETLIB_TCPWARE.VERSION/OPTBNETLIB_UCX_NET$(OBJ),NETLIB_UCX_TCP$(OBJ),NETLIB_UCX_UDP$(OBJ) : -. NETLIB$(L32), NETLIBDEF$(L32), UCX_DEFS$(L32)@NETLIB_CMU_NET$(OBJ),NETLIB_CMU_TCP$(OBJ),NETLIB_CMU_UDP$(OBJ),-7 NETLIB_CMU064_NET$(OBJ),NETLIB_CMU064_UDP$(OBJ) : -. NETLIB$(L32), NETLIBDEF$(L32), CMU_DEFS$(L32)QNETLIB_MULTINET_NET$(OBJ),NETLIB_MULTINET_TCP$(OBJ),NETLIB_MULTINET_UDP$(OBJ) : -; NETLIB$(L32), NETLIBDEF$(L32), MULTINET_TCPWARE_DEFS$(L32)QNETLIB_TCPWARE_NET$(OBJ) : NETLIB_MULTINET_NET.B32,NETLIB$(L32),NETLIBDEF$(L32),- MULTINET_TCPWARE_DEFS$(L32)- $(BLISS)$(BFLAGS)/VARIANT=2 $(MMS$SOURCE)PNETLIB_WINTCP_NET$(OBJ) : NETLIB_MULTINET_NET.B32,NETLIB$(L32),NETLIBDEF$(L32),- MULTINET_TCPWARE_DEFS$(L32)- $(BLISS)$(BFLAGS)/VARIANT=4 $(MMS$SOURCE)PNETLIB_WINTCP_TCP$(OBJ) : NETLIB_MULTINET_TCP.B32,NETLIB$(L32),NETLIBDEF$(L32),- MULTINET_TCPWARE_DEFS$(L32)# $(BLISS)$(BFLAGS) $(MMS$SOURCE)PNETLIB_WINTCP_UDP$(OBJ) : NETLIB_MULTINET_UDP.B32,NETLIB$(L32),NETLIBDEF$(L32),- MULTINET_TCPWARE_DEFS$(L32)# $(BLISS)$(BFLAGS) $(MMS$SOURCE)NNETLIB_MXLOOK$(OBJ) : NETLIB$(L32), DEBUG$(L32), NETLIBDEF$(L32), FIELDS$(L32). $(BLISS)$(BFLAGS)$(MXLOPTIM) $(MMS$SOURCE)&NETLIB_CMU_MXLOOK$(OBJ) : NETLIB$(L32)6!CMU064_NETERROR$(OBJ) : [CMU064.SYSLIB]NETERROR$(OBJ)%! COPY $(MMS$SOURCE) $(MMS$TARGET)8!CMU_NETERROR$(OBJ) : CMUTEK_SRC:[CENTRAL]NETERROR$(OBJ)%! COPY $(MMS$SOURCE) $(MMS$TARGET)'NETLIB$(L32) : NETLIB.R32, FIELDS$(L32)+UCX_DEFS$(L32) : UCX_DEFS.R32, FIELDS$(L32)+CMU_DEFS$(L32) : CMU_DEFS.R32, FIELDS$(L32)EMULTINET_TCPWARE_DEFS$(L32) : MULTINET_TCPWARE_DEFS.R32, FIELDS$(L32)NETLIBDEF$(L32) : NETLIBDEF.R32DEBUG$(L32) : DEBUG.R32(NETLIB016.RELEASE_NOTES : NETLIB016.SDML/ DOCUMENT $(MMS$SOURCE) SOFTWARE.REFERENCE -/ MAIL/OUTPUT=$(MMS$TARGET)/NOPRINT/CONTENTS3NETLIB016.A : KITINSTAL.COM,NETLIB016.RELEASE_NOTES" PURGE/NOLOG $(MMS$SOURCE_LIST)R BACKUP $(MMS$SOURCE_LIST) NETLIB016.A/SAVE/INTERCHANGE/BLOCK=4096/NOCRC/GROU=0MNETLIB016.B : NETLIB_INSTALL.COM,NETLIB_USER_INSTALL.COM,NETLIB_INSTALL.OPT,-$ NETLIBDEF.R32,NETLIBDEF$(L32),-( NETLIB_VECTOR.OBJ,DUMMY.ALPHA_OBJ,-6 NETLIB_CMU.OLB,NETLIB_UCX.OLB,NETLIB_CMU064.OLB,-B NETLIB_UCX012.OLB,NETLIB_SHRXFR.OBJ,NETLIB_SHRXFR.ALPHA_OBJ,-D NETLIB_SHRXFR.VERSION,NETLIB_WINTCP.VERSION,NETLIB_WINTCP.OLB,-8 NETLIB_WINTCP.ALPHA_OLB,NETLIB_WINTCP_AXP.VERSION,-B NETLIB_CMU.VERSION,NETLIB_UCX.VERSION,NETLIB_ NETLIB_SRC.BCK'}XP[NETLIB]DESCRIP.MMS;95XCMU064.VERSION,-F NETLIB_UCX012.VERSION,NETLIB_TCPWARE.OLB,NETLIB_TCPWARE.VERSION,-L NETLIB_MULTINET.OLB,NETLIB_MULTINET.ALPHA_OLB,NETLIB_MULTINET.VERSION,-M NETLIB_UCX.ALPHA_OLB,NETLIB_INSTALL.ALPHA_OPT,NETLIB_TCPWARE.ALPHA_OLB,-% CMU_ERRORS.OPT,CMU064_ERRORS.OPT LIB/COMPRESS NETLIB_CMU.OLB LIB/COMPRESS NETLIB_UCX.OLB" LIB/COMPRESS NETLIB_CMU064.OLB" LIB/COMPRESS NETLIB_UCX012.OLB$ LIB/COMPRESS NETLIB_MULTINET.OLB# LIB/COMPRESS NETLIB_TCPWARE.OLB" LIB/COMPRESS NETLIB_WINTCP.OLB" PURGE/NOLOG $(MMS$SOURCE_LIST)R BACKUP $(MMS$SOURCE_LIST) NETLIB016.B/SAVE/INTERCHANGE/BLOCK=4096/NOCRC/GROU=0JNETLIB_SRC.BCK : CMU064_ERRORS.OPT,CMU_DEFS.R32,CMU_ERRORS.OPT,DEBUG.R32,-6 DESCRIP.MMS,FIELDS.R32,KITINSTAL.COM,NETLIB.OPT,-A NETLIB.R32,NETLIB016.SDML,NETLIBDEF.R32,NETLIB_CMU.VERSION,-H NETLIB_CMU064.VERSION,NETLIB_CMU064_NET.B32,NETLIB_CMU_MXLOOK.B32,-B NETLIB_CMU064_UDP.B32,NETLIB_CMU_NET.B32,NETLIB_CMU_TCP.B32,-I NETLIB_CMU_UDP.B32,NETLIB_MULTINET_NET.B32,NETLIB_MULTINET_TCP.B32,-D NETLIB_MULTINET_UDP.B32,NETLIB_UCX_NET.B32,NETLIB_UCX_TCP.B32,-> NETLIB_UCX_UDP.B32,NETLIB_MXLOOK.B32,NETLIB_INSTALL.COM,-D NETLIB_INSTALL.OPT,NETLIB_MULTINET.VERSION,NETLIB_UCX.VERSION,-E NETLIB_NULL_MXLOOK.B32,NETLIB_SHRXFR.B32,NETLIB_SHRXFR.VERSION,-F NETLIB_UCX012.VERSION,NETLIB_USER_INSTALL.COM,NETLIB_VECTOR.MAR,-D UCX_DEFS.R32,MULTINET_TCPWARE_DEFS.R32,NETLIB_TCPWARE.VERSION,-N DUMMY.B32,NETLIB.ALPHA_OPT,NETLIB_INSTALL.ALPHA_OPT,NETLIB_WINTCP.VERSION" PURGE/NOLOG $(MMS$SOURCE_LIST)N BACKUP $(MMS$SOURCE_LIST) $(MMS$TARGET)/SAVE/INTER/BLOCK=4096/NOCRC/GROU=0 NETLIB_SRC.BCKaPXP[NETLIB]FIELDS.R32;11G *[NETLIB]FIELDS.R32;11+,aP. / @ 4G f-XP0123KPWO56J3I7>Ȧ80T͈9$.G @HJ  COMPILETIME _FLD_CUR_BYT = 0, _FLD_CUR_BIT = 0, _FLD_SAV_BYT = 0, _FLD_SAV_BIT = 0, _FLD_WRK_SIZE = 0, _FLD_WRK_BITS = 0, _FLD_FLD_COUNT = 0;MACRO _DEF (NAM) = %ASSIGN (_FLD_CUR_BYT, 0) %ASSIGN (_FLD_CUR_BIT, 0) %ASSIGN (_FLD_FLD_COUNT, 0) FIELD* %QUOTENAME (NAM, '_FIELDS') = SET %, _ENDDEF (NAM) = TES;! %IF _FLD_CUR_BIT GTR 0 %THEN1 %ASSIGN (_FLD_CUR_BYT, _FLD_CUR_BYT + 1) %FI; LITERAL %NAME (NAM, '_S_', NAM, 'DEF') = _FLD_CUR_BYT; MACRO %NAME (NAM, 'DEF') =5 BLOCK [%NAME (NAM, '_S_', NAM, 'DEF'), BYTE]0 FIELD (%NAME (NAM, '_FIELDS')) %QUOTE % %, _FIELD (SIZ) =/ %ASSIGN (_FLD_FLD_COUNT, _FLD_FLD_COUNT+1)B %ASSIGN (_FLD_WRK_BITS, %IF SIZ GTR 32 %THEN 0 %ELSE SIZ %FI)0 [_FLD_CUR_BYT,_FLD_CUR_BIT,_FLD_WRK_BITS,0]C %ASSIGN (_FLD_WRK_BITS, _FLD_CUR_BYT * 8 + _FLD_CUR_BIT + SIZ). %ASSIGN (_FLD_CUR_BYT, _FLD_WRK_BITS / 8)0 %ASSIGN (_FLD_CUR_BIT, _FLD_WRK_BITS MOD 8) %, _BYTE =  _ALIGN (BYTE) _FIELD (8) %, _BYTES (COUNT) = _ALIGN (BYTE) _FIELD (COUNT * 8) %, _WORD = _ALIGN (BYTE) _FIELD (16) %, _LONG = _ALIGN (BYTE) _FIELD (32) %, _QUAD = _ALIGN (BYTE) _FIELD (64) %, _BIT = _FIELD (1) %, _BITS (N) = _FIELD (N) %, _OVERLAY (NAM) =) %ASSIGN (_FLD_SAV_BYT, _FLD_CUR_BYT)) %ASSIGN (_FLD_SAV_BIT, _FLD_CUR_BIT)2 %ASSIGN (_FLD_CUR_BYT, %FIELDEXPAND (NAM, 0))2 %ASSIGN (_FLD_CUR_BIT, %FIELDEXPAND (NAM, 1)) %, _ENDOVERLAY =) %ASSIGN (_FLD_CUR_BYT, _FLD_SAV_BYT)) %ASSIGN (_FLD_CUR_BIT, _FLD_SAV_BIT) %, _ALIGN (ATYPE) = %ASSIGN (_FLD_WRK_BITS, 0) %ASSIGN (_FLD_WRK_SIZE,- %IF %IDENTICAL (ATYPE, BYTE) %THEN 13 %ELSE %IF %IDENTICAL (ATYPE, WORD) %THEN 23 %ELSE %IF %IDENTICAL (ATYPE, LONG) %THEN 43 %ELSE %IF %IDENTICAL (ATYPE, QUAD) %THEN 8% %ELSE ATYPE %FI %FI %FI %FI)! %IF _FLD_CUR_BIT NEQ 0 %THEN2 %ASSIGN (_FLD_WRK_BITS, 8 - _FLD_CUR_BIT)9 %IF _FLD_CUR_BYT+1 MOD _FLD_WRK_SIZE NEQ 0 %THEN1 %ASSIGN (_FLD_WRK_BITS, _FLD_WRK_BITS +G (_FLD_WRK_SIZE - (_FLD_CUR_BYT+1) MOD _FLD_WRK_SIZE) * 8) %FI %ELSE7 %IF _FLD_CUR_BYT MOD _FLD_WRK_SIZE NEQ 0 %THEN! %ASSIGN (_FLD_WRK_BITS,C (_FLD_WRK_SIZE - _FLD_CUR_BYT MOD _FLD_WRK_SIZE) * 8) %FI %FI" %IF _FLD_WRK_BITS GTR 0 %THEN %ASSIGN (_FLD_WRK_BITS,: _FLD_CUR_BYT * 8 + _FLD_CUR_BIT + _FLD_WRK_BITS)2 %ASSIGN (_FLD_CUR_BYT, _FLD_WRK_BITS / 8)" %ASSIGN (_FLD_CUR_BIT, 0) %FI %; NETLIB_SRC.BCK,T XP[NETLIB]KITINSTAL.COM;119MQ*[NETLIB]KITINSTAL.COM;119+,,T ./ @ 4ML-XP0123KPWO56y7 y8 |9$.G @HJ $! [NETLIB]KITINSTAL.COM$!.$! KITINSTAL procedure for installing NETLIB.$!0$! 31-JAN-1991 V1.0 Madison Initial coding.M$! 05-FEB-1991 V1.0-1 Madison Two parts for integration into other kits.$!)$ ON CONTROL_Y THEN GOTO NETLIB_CONTROL_Y"$ ON WARNING THEN GOTO NETLIB_FAIL$!5$ IF P1 .EQS. "VMI$_INSTALL" THEN GOTO NETLIB_INSTALL$ EXIT VMI$_UNSUPPORTED$!$NETLIB_CONTROL_Y:$ VMI$CALLBACK CONTROL_Y$! $NETLIB_FAIL:$ NETLIB_STATUS == $STATUS=$ IF F$TRNLNM ("NETLIB_STUP") .NES. "" THEN CLOSE NETLIB_STUP$ EXIT 'NETLIB_STATUS$!$NETLIB_INSTALL:$!$ IF P2 THEN SET VERIFY$! $ NETLIB_SAY := WRITE SYS$OUTPUT$!#$ IF F$GETSYI("HW_MODEL") .LT. 1024$ THEN$ NETLIB_VAX = 1$ NETLIB_AXP = 0$ NETLIB_REQD_VMSVER = "V5.0""$ NETLIB_REQD_VMSVER_OLD = "050"K$ VMI$CALLBACK CHECK_VMS_VERSION NETLIB_VMSVEROK 'NETLIB_REQD_VMSVER_OLD'$ IF .NOT. NETLIB_VMSVEROK$ THEN$$ VMI$CALLBACK MESSAGE E VMSVER -F "This product requires VMS version ''NETLIB_REQD_VMSVER' to run.'$ EXIT VMI$_FAILURE $ ENDIF$ ELSE$ NETLIB_VAX = 0$ NETLIB_AXP = 1$ ENDIF$!$!C$ VMI$CALLBACK CHECK_NET_UTILIZATION NETLIB_ENOUGHDISK 3000 30 30003$ IF .NOT. NETLIB_ENOUGHDISK THEN EXIT VMI$_FAILURE$!*$ VMI$CALLBACK SET SAFETY CONDITIONAL 5000$!$!$ TYPE SYS$INPUT:5 NETLIB Installation ProcedureF Copyright 1992-1994, MadGoat Software. All Rights Reserved.@ Redistribution for no commercial gain is permitted.$!$!$ VMI$CALLBACK SET PURGE ASK $ VMI$CALLBACK RESTORE_SAVESET B9$ @VMI$KWD:NETLIB_INSTALL 'P1 'P2 'P3 'P4 'P5 'P6 'P7 'P8$ NETLIB_STATUS == $STATUS+$ IF NETLIB_STATUS .EQ. VMI$_SUCCESS THEN - TYPE SYS$INPUTE All NETLIB images have been linked. Remember to edit your system< startup command procedure to add the following commmand:% $ @SYS$STARTUP:NETLIB_STARTUPB The file SYS$STARTUP:NETLIB_STARTUP.COM can be edited to alterE the selection of the default NETLIB transport library, as needed.$!$ EXIT 'NETLIB_STATUS NETLIB_SRC.BCKPXP[NETLIB]NETLIB.OPT;10+*[NETLIB]NETLIB.OPT;10+,P./ @ 4+-XP0123KPWO56-)7-)8r<b I9$.G @HJGSMATCH=LEQUAL,1,4+CLUSTER=$$NETLIB_VECTOR,,,NETLIB_VECTOR.OBJCLUSTER=CLUSTER1PSECT_ATTR=$CODE$,PIC,SHRPSECT_ATTR=$PLIT$,PIC,SHR&COLLECT = CLUSTER1,$CODE$,$CODE,$PLIT$  NETLIB_SRC.BCK XP[NETLIB]NETLIB.R32;7N *[NETLIB]NETLIB.R32;7+, . / @ 4N -XP0123KPWO 56 27FK+28j>W! 9$.G @HJ !++ ! NETLIB.R32!4! Common definitions for all NETLIB implementations.!0! 29-JAN-1991 V1.0 Madison Initial coding.!!-- LIBRARY 'FIELDS';" LIBRARY 'SYS$LIBRARY:STARLET'; BUILTIN INSQUE, REMQUE; LITERALB STR_MAX = 32765; ! maximum length of string for TCP_GET_LINE _DEF (QUE) QUE_L_HEAD = _LONG, QUE_L_TAIL = _LONG _ENDDEF (QUE); _DEF (SND) SND_Q_SNDBUF = _QUAD, SND_L_CTX = _LONG, SND_L_ASTADR = _LONG, SND_L_ASTPRM = _LONG _ENDDEF (SND); LITERAL RCV_S_BUF = 1024; _DEF (RCV) RCV_L_FLINK = _LONG, RCV_L_BLINK = _LONG, RCV_Q_IOSB = _QUAD, RCV_Q_TMO = _QUAD, RCV_L_STRPTR = _LONG, RCV_L_CTX = _LONG, RCV_L_USRIOSB = _LONG, RCV_L_ASTADR = _LONG, RCV_L_ASTPRM = _LONG, RCV_L_TRIGGERED = _LONG, RCV_L_BUFPTR = _LONG,% RCV_T_BUF = _BYTES (RCV_S_BUF) _ENDDEF (RCV); _DEF (IOSB) IOSB_W_STATUS = _WORD, IOSB_W_USTAT = _WORD, _OVERLAY (IOSB_W_USTAT) IOSB_W_COUNT = _WORD, _ENDOVERLAY IOSB_L_ADDRESS = _LONG _ENDDEF (IOSB); MACRO INIT_DYNDESC (STR) [] = BEGIN __INIT_DYNDESC1 (STR@ %IF NOT %NULL (%REMAINING) %THEN , %REMAINING %FI) END%, __INIT_DYNDESC1 (STR) [] =; BLOCK [STR, DSC$W_LENGTH; DSC$K_S_BLN,BYTE] = 0;G BLOCK [STR, DSC$B_CLASS; DSC$K_S_BLN,BYTE] = DSC$K_CLASS_D;G BLOCK [STR, DSC$B_DTYPE; DSC$K_S_BLN,BYTE] = DSC$K_DTYPE_T;; BLOCK [STR, DSC$A_POINTER; DSC$K_S_BLN,BYTE] = 0;N %IF NOT %NULL (%REMAINING) %THEN ; __INIT_DYNDESC1 (%REMAINING) %FI%, FREE_STRINGS (STR) [] = BEGINJ EXTERNAL ROUTINE STR$FREE1_DX : BLISS ADDRESSING_MODE (GENERAL); __FREE_STRING1 (STR@ %IF NOT %NULL (%REMAINING) %THEN , %REMAINING %FI) END%, __FREE_STRING1 (STR) [] = STR$FREE1_DX (STR);M %IF NOT %NULL (%REMAINING) %THEN ; __FREE_STRING1 (%REMAINING) %FI%, G_HAT (RTN) [] =. RTN : BLISS ADDRESSING_MODE (GENERAL)D %IF NOT %NULL (%REMAINING) %THEN , G_HAT (%REMAINING) %FI%, INIT_QUEUE (X) [] = BEGIN BIND Q = X : QUEDEF;; Q [QUE_L_TAIL] = Q [QUE_L_HEAD] = Q [QUE_L_HEAD]; ENDG %IF NOT %NULL (%REMAINING) %THEN ; INIT_QUEUE (%REMAINING) %FI %;NETLIB_SRC.BCK)XP[NETLIB]NETLIB016.SDML;6QV*[NETLIB]NETLIB016.SDML;6+,)./ @ 4Qr-XP0123KPWO56l7i8i]QX9G @HJ (ver\V1.6B) (NETLIB Release Notes)��<ABSTRACT>(May, 1994)�G�<P>This file contains the release notes for the NETLIB TCP/IP interface��library.O�It describes any last-minute features, restrictions, changes, or additions made� �to NETLIB. �<ENDABSTRACT>�*�<REVISION_INFO>(This is a revised manual.)D�<REVISION_INFO>(Operating System and Version:\VAX/VMS V5.0 or later;$� OpenVMS AXP V1.0 or later):�<REVISION_INFO>(Software Version:\NETLIB <REFERENCE>(VER))6�<ENDTITLE_PAGE>(Matthew Madison<LINE>MadGoat Software)���<COPYRIGHT_PAGE>�<PRINT_DATE>(19 May 1994)�D�<p><emphasis>(DISCLAIMER:\bold) The author, the author's employer,C� and MadGoat Software make no representations or warranties with�A� respect to the contents hereof and specifically disclaim any�Q� implied warranties of merchantability or fitness for any particular purpose.�D�<COPYRIGHT_DATE>(1993, 1994\MadGoat Software. All Rights Reserved.)A�<P>The following are trademarks of Digital Equipment Corporation:��<TABLE>�!�<TABLE_ATTRIBUTES>(SINGLE_SPACED)��<TABLE_SETUP>(3\20\20)�<TABLE_ROW>(DEC\ULTRIX\VAX)�&�<TABLE_ROW>(VAXcluster\VAXstation\VMS) �<ENDTABLE>/�<p>MultiNet is a registered trademark TGV, Inc.�:�<p>TCPware is a trademark of Process Software Corporation.N�<p>WIN/TCP and Pathway are registered trademarks of The Wollongong Group, Inc.�<ENDCOPYRIGHT_PAGE>��<CONTENTS_FILE>��<ENDFRONT_MATTER>��<chapter>(Installing NETLIB)4�<p>NETLIB is installed with the VMSINSTAL procedure: �<interactive>�0�<s>($)<u>(@SYS$UPDATE:VMSINSTAL NETLIB016 ddcu:)�<endinteractive>H�<p>You will be asked which TCP/IP packages for which you wish to install@�NETLIB support and where the NETLIB libraries should be located.�<chapter>(NETLIB Requirements)@�<p>NETLIB libraries are INSTALLed as shared shareable libraries.G�The NETLIB_SHRXFR transport-independent library requires 3 global pages�A�and 2 global sections. Each selected transport-dependent library�/�requires 13 global pages and 2 global sections.�E�<p>The amount of disk space required for each library varies based on� �transport:�<table>��<table_setup>(2\20)� �<table_row>(CMU V6.4\270 blocks))�<table_row>(CMU V6.5 and later\30 blocks)��<table_row>(UCX V1.2\15 blocks)�B�<table_row>(UCX V1.3 and later\260 blocks (VAX), 350 blocks (AXP))G�<table_row>(MultiNet V2.2 and later\260 blocks (VAX), 360 blocks (AXP))�;�<table_row>(PSC TCPware\260 blocks (VAX), 360 blocks (AXP))�F�<table_row>(TWG WIN/TCP or Pathway\260 blocks (VAX), 360 blocks (AXP)) �<endtable>?�<p>The SHRXFR transport-independent library takes up 10 blocks.�J�<p>The libraries can be placed in SYS$LIBRARY or in any desired directory.���<chapter>(New Features)�F�<P>NETLIB <reference>(ver) adds support for the The Wollongong Group'sM�WIN/TCP and Pathway TCP/IP packages for both VAX/VMS and OpenVMS AXP systems.�-�It also includes a number of minor bug fixes.�2�<P>V1.6A added support for WIN/TCP's and Pathway'sH�INET_NAMESERVER_LIST logical name in the MX record lookup routine, which�wa����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������)��XP��[NETLIB]NETLIB016.SDML;6�������������������������������������������������������������������������������������������������������Q������������������������������:�������������s missing in V1.6.<�<P><reference>(ver) fixes the NET_GET_INFO routine for CMUIPE�so that the port information is returned in network byte-order rather��than local byte-order.��5�<p>NETLIB V1.5 added the following feature over V1.4:��<list>(unnumbered)C�<le>Support for TCPware from Process Software Corporation, courtesy��of Bernie Volz.� �<endlist>���:�<p>NETLIB V1.4 added the following new features over V1.3:�<list>(unnumbered)�<le>the ability�G�to specify a timeout value on UDP receives. A parameter has been added�E�to the UDP_RECEIVE routine to accommodate this change. (This was not�B�correctly implemented in V1.4, but does work in <reference>(ver)).D�<le>the ability to redirect NETLIB debugging output. A new routine,F�NET_SET_TRACE_ROUTINE, has been added. By passing the address of yourD�output routine (which should mimic LIB$PUT_OUTPUT), you can redirect?�debug output (currently only used in the DNS_MXLOOK routine for�=�TCP/IP implementations other than CMU-Tek V6.5 and UCX V1.2).�*�<le>some minor improvements in DNS_MXLOOK. �<endlist>���;�<p>NETLIB V1.3 added one new feature over V1.2: the ability�G�to create an active TCP/IP connection while at the same time fixing the�E�port number on the local host. This is done with the addition of the�)�NOT_PASSIVE flag on the NET_BIND routine.���7�<p>NETLIB V1.2 added one new feature over V1.1: the TCP�H�receive routines now allow the caller to specify a timeout value for the<�receive. Previously, all receives timed out after 5 minutes.��:�<p>NETLIB V1.1 added the following new features over V1.0,N�all of which have to do with the NETLIB_MXLOOK routine. These features affect�NETLIB operationE�with UCX (V1.3 or later), MultiNet (V2.2 or later), and CMU-Tek V6.4.�6�Operation with CMU-Tek V6.5 and later is not affected.��*�<head1>(Domain Server List Initialization)G�<p>The NETLIB_MXLOOK routine, for UCX V1.3, TCPware, and MultiNet, will�J�use the transport-specific name server list logical names for initializingC�its internal name server list. For UCX, the logical names used are�B�UCX$BIND_SERVERnnn, where "nnn" is a 3-digit sequence number. ForE�Multinet, the logical name is MULTINET_NAMESERVERS. For TCPware, the�"�logical name is TCPIP_NAMESERVERS.D�<p>For CMU-Tek V6.4, the NETLIB installation procedure automaticallyJ�includes a definition for NETLIB_CMU064_NAMESERVERS, since the name serverF�list used by CMU-Tek is not readily available. You should modify that2�logical name definition as needed for your system.H�<p>You can override the default name server list by defining the logicalD�name NETLIB_NAMESERVERS as a search list containing the names of the6�domain servers you would like NETLIB initially to use.#�<head1>(NETLIB_DOMAIN Logical Name)� �For CMU V6.4, UCX V1.3, TCPware,9�and MultiNet, you can define a logical name NETLIB_DOMAIN�B�(which may be a search list) to specify the domains to be used forF�partial name completion in the MXLOOK routine. This is not needed forH�CMU V6.5 (which uses the built-in name resolver) or UCX V1.2 (which does�not support name resolvers).K�<p>If undefined, the MXLOOK routine uses full host name as the domain name,�F�trimming one segment from the left part (and doing so repeatedly until&�there is no more domain name to trim).F�<p>For example, if your host name is VAX.DEPT.COMPANY.COM, the defaultO�behaviour for doing name completeion would be to first append DEPT.COMPANY.COM,�D�then COMPANY.COM, then COM to any address. By defining the logical: �<interactive>�O�<s>($)<U>(DEFINE/SYSTEM NETLIB_DOMAIN "dept.company.com","de�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������)��XP��[NETLIB]NETLIB016.SDML;6�������������������������������������������������������������������������������������������������������Q�������������������������������������������pt2.company.com",-)�)�<s>(_$)<u>( "company.com")��<endinteractive>F�<cp>you will cause the MXLOOK routine to append just those domains you%�specify for name completion purposes.��<head1>(Debugging Code)�H�<p>The MXLOOK routine contains debugging code that prints out a trace ofJ�its activity. To activate this code, define the logical name NETLIB_DEBUG �system-wide: �<interactive>�*�<s>($)<u>(DEFINE/SYSTEM NETLIB_DEBUG TRUE)�<endinteractive>L�<p>Debugging code may be added to other NETLIB routines in a future release.�<chapter>(Bug Fixes)G�<p>NETLIB <reference>(ver) includes the following bug fixes over V1.4A:��<list>(unnumbered)J�<le>NET_GET_ADDRESS would return success status with a zero-length addressL�list when used with CMU-Tek TCP/IP. It now correctly returns SS$_ENDOFFILE.F�<le>The CMU-Tek error status NET$_CREF was not getting translated. It'�now correctly translates to SS$_REJECT.�F�<le>Some arguments were not passed correctly in QIO's for the MultiNet �interface.K�<le>The DNS_MXLOOK routine was not properly checking the success or failure�I�of the translation of the NETLIB_DOMAIN logical name, causing unnecessary�D�additional lookups to occur if that logical were defined. (Does not+�apply to the CMU-Tek V6.5+ implementation.)�H�<le>The DNS_MXLOOK routine now checks to see if the name to be looked upL�contains a dot, and if so, first checks the name by itself before attemptingJ�to do name completion. This should generally reduce the number of lookupsI�made, since in most cases, names with dots in them are full domain names.�5�(Does not apply to the CMU-Tek V6.5+ implementation.)� �<endlist>�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������P��XP��[NETLIB]NETLIBDEF.R32;1��������������������������������������������������������������������������������������������������������6������������������������������i���������������*�[NETLIB]NETLIBDEF.R32;1�+��,�P���.�����/� �@� �4�6��������������������������-�XP���0���1����2���3������K��P���W���O�����5�A��6�`=6��7�&9y��8�O͈��9�$.��G� �@��H��J�������������������������!++��!��! NETLIBDEF.R32��!�6�! Definitions for use by callers of NETLIB routines.�!��!--����LITERAL����! Protocol values for NET_BIND��� NET_K_TCP = 1,� NET_K_UDP = 2,��)�! Mask values for TCP_SEND FLAGS argument���� NET_M_PUSH = 1,�� NET_M_NOTRM = 2;��(�! Bit values for TCP_SEND FLAGS argument���MACRO�� NET_V_PUSH = 0,0,1,0%,� NET_V_NOTRM = 0,1,1,0%;������������������������������������������������������������������������������������������������������������������������� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������(T��XP��[NETLIB]NETLIB_CMU.VERSION;10�������������������������������������������������������������������������������������������������� ������������������������������j���������������*�[NETLIB]NETLIB_CMU.VERSION;10�+��,�(T���.�����/� �@� �4� ���������������������������-�XP���0���1����2���3������K��P���W���O�����5���6�a��7� b��8�ޓX��9����������G� �@��H��J������������������ �IDENT="V1.6B"��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������)T ��XP�� [NETLIB]NETLIB_CMU064.VERSION;10����������������������������������������������������������������������������������������������� �������������������������������������������� �*�[NETLIB]NETLIB_CMU064.VERSION;10�+��,�)T ���.�����/� �@� �4� ���������������������������-�XP���0���1����2���3������K��P���W���O�����5���6�Nb��7�n,b��8�nX��9����������G� �@��H��J��������������� �IDENT="V1.6B"��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������,��XP�� [NETLIB]NETLIB_CMU064_NET.B32;21�����������������������������������������������������������������������������������������������Q�������������������������������������������� �*�[NETLIB]NETLIB_CMU064_NET.B32;21�+��,�,���.�����/� �@� �4�Q��������������������������-�XP����0���1����2���3������K��P���W���O�����5���6�>.��7�^B��8�^˚X��9����������G� �@��H��J��� �������������%TITLE 'NETLIB_CMU064_NET')�MODULE NETLIB_CMU064_NET (IDENT='V1.1-4',�J� ADDRESSING_MODE (EXTERNAL=LONG_RELATIVE,NONEXTERNAL=LONG_RELATIVE)) =�BEGIN��!++��! FACILITY: NETLIB��!�I�! ABSTRACT: Common network library routines for CMU-Tek TCP/IP V6.4.��!��! MODULE DESCRIPTION:��!��! AUTHOR: M. Madison�A�! COPYRIGHT 1991, RENSSELAER POLYTECHNIC INSTITUTE.�"�! ALL RIGHTS RESERVED.�!��! CREATION DATE: 28-JAN-1991��!��! MODIFICATION HISTORY:��!�0�! 29-JAN-1991 V1.0 Madison Initial coding.I�! 12-FEB-1991 V1.0-1 Madison If INET$DEVICE isn't defined, use IP0.�B�! 05-SEP-1991 V1.1 Madison Add NOT_PASSIVE flag to NET_BIND.D�! 03-DEC-1991 V1.1-1 Madison Make DSREFEXC same as ENDOFFFILE.9�! 04-DEC-1991 V1.1-2 Madison Improve debug support.�G�! 07-FEB-1992 V1.1-3 Madison CREF->REJECT; EOF on no-addr lookup.�N�! 19-MAY-1994 V1.1-4 Madison Byte-swap the port numbers in NET_GET_INFO.�!--���"� LIBRARY 'SYS$LIBRARY:STARLET';*� LIBRARY 'CMUTEK_SRC:[CENTRAL]NETWORK';,� LIBRARY 'CMUTEK_SRC:[CENTRAL]NETCOMMON';#� LIBRARY 'SYS$LIBRARY:NETERROR';�� LIBRARY 'NETLIB';�� LIBRARY 'NETLIBDEF';� LIBRARY 'CMU_DEFS';���� FORWARD ROUTINE�� NET_ASSIGN,� NET_DEASSIGN,� NET_BIND,� NET_GET_ADDRESS,�� NET_ADDR_TO_NAME,� NET_GET_INFO,� NET_GET_HOSTNAME,� NET_CVT_STATUS,� NET_SET_TRACE_ROUTINE;���� EXTERNAL ROUTINE>� G_HAT (LIB$GET_VM, LIB$FREE_VM, STR$CONCAT, STR$FREE1_DX,<� STR$APPEND, STR$COPY_DX, STR$FIND_FIRST_NOT_IN_SET,<� STR$TRANSLATE, LIB$CVT_DTB, STR$UPCASE, STR$COPY_R,� LIB$PUT_OUTPUT);��� � GLOBAL.� TRACE_ROUTINE : INITIAL (LIB$PUT_OUTPUT);��0� MACRO BYTE_SWAP (X) = (LOCAL __X; __X = (X);,� (.__X<0,8,0> ^ 8) + .__X<8,8,0>) %;� ��%SBTTL 'NET_ASSIGN'�%�GLOBAL ROUTINE NET_ASSIGN (CTX_A_A) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�E�! This routine assigns a network channel for subsequent operations.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! NET_ASSIGN nodename��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND*� CTX = .CTX_A_A : REF CTXDEF;�� � LOCAL� � STATUS;��3� STATUS = LIB$GET_VM (%REF (CTX_S_CTXDEF), CTX);�,� CH$FILL (%CHAR (0), CTX_S_CTXDEF, .CTX);'� IF NOT .STATUS THEN RETURN .STATUS;� � BEGIN�+� BIND BUFQ = CTX [CTX_Q_BUFQ] : QUEDEF;�2� BUFQ [QUE_L_TAIL] = BUFQ [QUE_L_HEAD] = BUFQ;E� $BINTIM (TIMBUF=%ASCID'0 00:05:00', TIMADR=CTX [CTX_Q_EXPTIME]);�� END;��I� STATUS = $ASSIGN (DEVNAM=%ASCID'INET$DEVICE', CHAN=CTX [CTX_W_CHAN]);�A� IF .STATUS EQL SS$_IVDEVNAM OR .STATUS EQL SS$_NOSUCHDEV THEN�C� STATUS = $ASSIGN (DEVNAM=%ASCID'IP0:', CHAN=CTX [CTX_W_CHAN]);�?� IF NOT .STATUS THEN LIB$FREE_VM (%REF (CTX_S_CTXDEF), CTX);��� � .STATUS����EN����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������,��XP�� [NETLIB]NETLIB_CMU064_NET.B32;21�����������������������������������������������������������������������������������������������Q������������������������������#-�������������D; ! NET_ASSIGN�� ��%SBTTL 'NET_BIND'�J�GLOBAL ROUTINE NET_BIND (CTX_A_A, PROTOCOL, PORT, XTHREADS, NOT_PASSIVE) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�C�! This routine creates and binds a local socket for the specified� �! protocol.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! NET_BIND nodename��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND*� CTX = .CTX_A_A : REF CTXDEF;��� BUILTIN ACTUALCOUNT;�� � LOCAL�� IOSB : NETIO_STATUS_BLOCK,� � STATUS;��=� IF ACTUALCOUNT () GTR 2 THEN CTX [CTX_L_LSNPORT] = .PORT;���#� IF .PROTOCOL EQL NET_K_UDP THEN� � BEGIN�B� STATUS = NET$OPEN (OPENMODE=UDPADDR, PROTOCOL=U$UDP_PROTOCOL,F� IO$SB=IOSB, IOCHAN=.CTX [CTX_W_CHAN], FHNAM=0, FOREIGN_PRT=0,@� LOCAL_PRT=(IF ACTUALCOUNT () GTR 2 THEN .PORT ELSE 0));G� IF .STATUS THEN STATUS = (IF .IOSB [NSB$STATUS] EQL SS$_ABORT THEN�H� NET_CVT_STATUS (.IOSB [NSB$XERROR]) ELSE .IOSB [NSB$STATUS]);� END�� ELSE STATUS = SS$_NORMAL;��� � .STATUS����END; ! NET_BIND�� ��%SBTTL 'NET_GET_ADDRESS'M�GLOBAL ROUTINE NET_GET_ADDRESS (CTX_A_A, HOST_A, ALSIZE, ALIST_A, ALCNT_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�D�! Given a host name, returns an array of valid Internet addresses.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�5�! NET_GET_ADDRESS ctx, host, arrsiz, array, retcnt��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND&� CTX = .CTX_A_A : REF CTXDEF,(� CHN = CTX [CTX_W_CHAN] : WORD,+� NODENAME = .HOST_A : BLOCK [,BYTE],�+� ALIST = .ALIST_A : VECTOR [,LONG],�� ALCNT = .ALCNT_A;�� � LOCAL�'� GHBLK : GTHST_NMLOOK_RET_ARGS,�#� IOSB : NETIO_STATUS_BLOCK,� � STATUS;��K� IF STR$FIND_FIRST_NOT_IN_SET (NODENAME, %ASCID'0123456789.') NEQ 0 THEN� � BEGIN�*� LOCAL STR : BLOCK [DSC$K_S_BLN,BYTE];� $INIT_DYNDESC (STR);�<� STR$CONCAT (STR, NODENAME, %ASCID %STRING (%CHAR (0)));D� STATUS = NET$GTHST (BUFADRS=GHBLK, BUFSIZE=%ALLOCATION (GHBLK),F� GTHFUNCT=GTH_NAMADR, GTHP1=.STR [DSC$A_POINTER], IOCHAN=.CHN,� IO$SB=IOSB);�� IF NOT .STATUS THEN � BEGIN� STR$FREE1_DX (STR);� RETURN .STATUS; � END;�"� IF NOT .IOSB [NSB$STATUS] ANDI� CH$RCHAR (.NODENAME [DSC$A_POINTER]+.NODENAME [DSC$W_LENGTH]-1)�� NEQ %C'.'� � THEN� � BEGINE� STR$CONCAT (STR, NODENAME, %ASCID %STRING ('.', %CHAR (0)));�H� STATUS = NET$GTHST (BUFADRS=GHBLK, BUFSIZE=%ALLOCATION (GHBLK),G� GTHFUNCT=GTH_NAMADR, GTHP1=.STR [DSC$A_POINTER], IOCHAN=.CHN,�� IO$SB=IOSB); � END;�� STR$FREE1_DX (STR);(� IF NOT .STATUS THEN RETURN .STATUS;*� IF NOT .IOSB [NSB$STATUS] THEN RETURN2� (IF .IOSB [NSB$STATUS] EQL SS$_ABORT THEN-� NET_CVT_STATUS (.IOSB [NSB$XERROR])�#� ELSE .IOSB [NSB$STATUS]);�0� ALCNT = MIN (.GHBLK [GHN$ADRCNT], .ALSIZE);� IF .ALCNT GTR 0 THEN� � BEGIN:� BIND GHLST = GHBLK [GHN$ADRLST] : VECTOR [,LONG];?� INCR I FROM 0 TO .ALCNT-1 DO ALIST [.I] = .GHLST [.I];�� END!� ELSE STATUS = SS$_ENDOFFILE;�� END�� EL�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������,��XP�� [NETLIB]NETLIB_CMU064_NET.B32;21�����������������������������������������������������������������������������������������������Q�������������������������������������������SE BEGIN � LOCAL� ADRL,$� ADRB : REF VECTOR [4,BYTE],� CHP, DOTP,�� LEN, XLEN, VAL;��� ADRB = ADRL;�%� CHP = .NODENAME [DSC$A_POINTER];�$� LEN = .NODENAME [DSC$W_LENGTH];� INCR I FROM 0 TO 3 DO � BEGIN%� IF .LEN LSS 1 THEN EXITLOOP;�/� DOTP = CH$FIND_CH (.LEN, .CHP, %C'.');�,� IF CH$FAIL (.DOTP) THEN XLEN = .LEN+� ELSE XLEN = CH$DIFF (.DOTP, .CHP);�(� LIB$CVT_DTB (.XLEN, .CHP, VAL);!� ADRB [.I] = .VAL<0,8,0>;� � LEN = .LEN - .XLEN - 1;"� CHP = CH$PLUS (.DOTP, 1); � END;�� IF .ALSIZE GTR 0 THEN � BEGIN� ALCNT = 1;�� ALIST [0] = .ADRL;� � END;�� STATUS = SS$_NORMAL;�� END;�� � .STATUS����END; ! NET_GET_ADDRESS� ��%SBTTL 'NET_ADDR_TO_NAME'�8�GLOBAL ROUTINE NET_ADDR_TO_NAME (CTX_A_A, ADR, NAME_A) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�L�! Given an IP address, returns the corresponding host name (if available).�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�%�! NET_ADDR_TO_NAME host, adr, name��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND&� CTX = .CTX_A_A : REF CTXDEF,(� CHN = CTX [CTX_W_CHAN] : WORD,(� NAME = .NAME_A : BLOCK [,BYTE];�� � LOCAL�#� GHBLK : GTHST_ADLOOK_RET_ARGS,�� IOSB : NETIO_STATUS_BLOCK,� � STATUS;��C� STATUS = NET$GTHST (BUFADRS=GHBLK, BUFSIZE=%ALLOCATION (GHBLK),�2� GTHFUNCT=GTH_ADRNAM, GTHP1=.ADR, IOCHAN=.CHN,� IO$SB=IOSB);�F� IF .STATUS THEN STATUS = (IF .IOSB [NSB$STATUS] EQL SS$_ABORT THENF� NET_CVT_STATUS (.IOSB [NSB$XERROR]) ELSE .IOSB [NSB$STATUS]);� IF .STATUS THEN�?� STR$COPY_R (NAME, GHBLK [GHA$NAMLEN], GHBLK [GHA$NAMSTR]);��� � .STATUS����END; ! NET_ADDR_TO_NAME�� ��%SBTTL 'NET_DEASSIGN'�'�GLOBAL ROUTINE NET_DEASSIGN (CTX_A_A) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�-�! This routine deassigns a network channel.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! NET_DEASSIGN ctx��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND*� CTX = .CTX_A_A : REF CTXDEF;�� � LOCAL� � STATUS;��%� $DASSGN (CHAN=.CTX [CTX_W_CHAN]);�+� LIB$FREE_VM (%REF (CTX_S_CTXDEF), CTX);� � CTX = 0;��� SS$_NORMAL���END; ! NET_DEASSIGN�� ��%SBTTL 'NET_GET_INFO'�P�GLOBAL ROUTINE NET_GET_INFO (CTX_A_A, REMADR_A, REMPRT_A, LCLADR_A, LCLPRT_A) = �BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�A�! Gets address and port information about a network connection.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�:�! NET_GET_INFO ctx, remadr [,remprt] [,lcladr] [,lclprt]�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--� � BUILTIN�� ACTUALCOUNT;�� BIND/� CTX = .CTX_A_A : REF CTXDEF;��� � LOCAL�)� INFO : CONNECTION_INFO_RETURN_BLOCK,�� IOSB : NETIO_STATUS_BLOCK,� � STATUS;��>� STATUS = NET$INFO (IOCHAN=.CTX [CTX_W_CHAN], BUFADRS=INFO,-� BUFSIZE=%ALLOCATION (INFO), IO$SB=IOSB);�F� IF .STATUS THEN �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������,��XP�� [NETLIB]NETLIB_CMU064_NET.B32;21�����������������������������������������������������������������������������������������������Q������������������������������^�������������STATUS = (IF .IOSB [NSB$STATUS] EQL SS$_ABORT THENF� NET_CVT_STATUS (.IOSB [NSB$XERROR]) ELSE .IOSB [NSB$STATUS]);'� IF NOT .STATUS THEN RETURN .STATUS;���O� IF ACTUALCOUNT () GTR 4 THEN .LCLPRT_A = BYTE_SWAP (.INFO [CI$LOCAL_PORT]);�L� IF ACTUALCOUNT () GTR 3 THEN .LCLADR_A = .INFO [CI$LOCAL_INTERNET_ADRS];Q� IF ACTUALCOUNT () GTR 2 THEN .REMPRT_A = BYTE_SWAP (.INFO [CI$FOREIGN_PORT]);�M� IF ACTUALCOUNT () GTR 1 THEN .REMADR_A = .INFO [CI$REMOTE_INTERNET_ADRS];���� SS$_NORMAL���END; ! NET_GET_INFO�� ��%SBTTL 'NET_GET_HOSTNAME'�1�GLOBAL ROUTINE NET_GET_HOSTNAME (HST_A, LEN_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�+�! Returns this host's Internet host name.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�%�! NET_GET_HOSTNAME hostname [,len]��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BUILTIN ACTUALCOUNT;�� � LOCAL�%� LNMLST : $ITMLST_DECL (ITEMS=1),�!� HSTBUF : VECTOR [1024,BYTE],�� HSTLEN : WORD,� � STATUS;�� � $ITMLST_INIT (ITMLST=LNMLST,6� (ITMCOD=LNM$_STRING, BUFSIZ=%ALLOCATION (HSTBUF),(� BUFADR=HSTBUF, RETLEN=HSTLEN));��0� STATUS = $TRNLNM (TABNAM=%ASCID'LNM$SYSTEM',7� LOGNAM=%ASCID'INTERNET_HOST_NAME', ITMLST=LNMLST);�� IF .STATUS THEN� � BEGIN�)� STR$COPY_R (.HST_A, HSTLEN, HSTBUF);�3� IF ACTUALCOUNT () GTR 1 THEN .LEN_A = .HSTLEN;�� END;�� � .STATUS����END; ! NET_GET_HOSTNAME�� ��%SBTTL 'NET_CVT_STATUS'�%�GLOBAL ROUTINE NET_CVT_STATUS (RC) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�D�! Converts a CMU-Tek return code to an SS$_ equivalent (from UCX).�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! NET_CVT_STATUS rc�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� SELECTONE .RC OF� SET�7� [NET$_IR,NET$_UCT,NET$_CSE,NET$_VTF] : SS$_INSFMEM;�;� [NET$_IFC,NET$_IFS,NET$_ILP,NET$_NUC,NET$_CIP,NET$_CDE,�� NET$_FSU] : SS$_BADPARAM;� [NET$_NOPRV] : SS$_NOPRIV;1� [NET$_CR,NET$_CCAN,NET$_CC] : SS$_LINKDISCON;�0� [NET$_UNN, NET$_UNA, NET$_UNU] : SS$_IVADDR;� [NET$_BTS] : SS$_IVBUFLEN;*� [NET$_URC,NET$_NRT] : SS$_UNREACHABLE;:� [NET$_CTO,NET$_TWT,NET$_FTO,NET$_NMLTO] : SS$_TIMEOUT;%� [NET$_TE,NET$_NSEXIT] : SS$_SHUT;�*� [NET$_NOINA, NET$_NOANA] : SS$_NOPRIV;N� [NET$_DSNOADDR,NET$_DSNONAME,NET$_DSNAMERR,NET$_DSREFEXC] : SS$_ENDOFFILE;� [NET$_CREF] : SS$_REJECT;�� [OTHERWISE] : .RC;� TES����END; ! NET_CVT_STATUS�� ��%SBTTL 'NET_SET_TRACE_ROUTINE'/�GLOBAL ROUTINE NET_SET_TRACE_ROUTINE (RTN_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�@�! Sets the trace routine to be used instead of LIB$PUT_OUTPUT.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! NET_SET_TRACE_ROUTINE��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���8� IF .RTN_A EQLA 0 THEN TRACE_ROUTINE = LIB$PUT_OUTPUT � ELSE TRACE_ROUTINE = .RTN_A;� SS$_NORMAL���END;���END��ELUDOM�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������j�XP��[NETLIB]NETLIB_CMU_MXLOOK.B32;2������������������������������������������������������������������������������������������������L������������������������������O���������������*�[NETLIB]NETLIB_CMU_MXLOOK.B32;2�+��,�j��.�����/� �@� �4�L������ �b��������������������-�XP���0���1����2���3������K��P���W���O�����5���6�Vp��7�0p��8�Q*ډX��9�$.��G� �@��H��J���� �������������%TITLE 'NETLIB_CMU_MXLOOK'+�MODULE NETLIB_CMU_MXLOOK (IDENT = 'V1.0-1',�J� ADDRESSING_MODE (EXTERNAL=LONG_RELATIVE,NONEXTERNAL=LONG_RELATIVE)) =�BEGIN��!++��! FACILITY: NETLIB��!� �! ABSTRACT:��!�@�! MXLOOKUP contains a routine that looks up mail exchange (MX)>�! records for a particular host name. For CMU-Tek TCP V6.5.�!��! MODULE DESCRIPTION:��!��!��! AUTHOR: M. Madison�@�! COPYRIGHT 1991 RENSSELAER POLYTECHNIC INSTITUTE."�! ALL RIGHTS RESERVED.�!��! CREATION DATE: 30-JAN-1991��!��! MODIFICATION HISTORY:��!�:�! 30-JAN-1991 V1.0 Madison Initial coding (from MX).<�! 15-DEC-1993 V1.0-1 Madison Must append final '.' !!!�!--���"� LIBRARY 'SYS$LIBRARY:STARLET';*� LIBRARY 'CMUTEK_SRC:[CENTRAL]NETWORK';,� LIBRARY 'CMUTEK_SRC:[CENTRAL]NETCOMMON';� LIBRARY 'NETLIB';���� FORWARD ROUTINE�� DNS_MXLOOK,� NAME_UNPACK : NOVALUE;���� EXTERNAL ROUTINE7� G_HAT (LIB$ANALYZE_SDESC, LIB$FREE_VM, LIB$GET_VM,�=� STR$COPY_DX, STR$APPEND, STR$FREE1_DX, STR$POS_EXTR,�;� STR$POSITION, STR$COMPARE, STR$CONCAT, STR$COPY_R,�3� STR$UPCASE, LIB$ADD_TIMES, LIB$SUB_TIMES);��� � LITERAL�� IPNS_TYPE_MX = 15;�� � MACRO�� MXN_L_PREF = 0,0,32,0%,�� MXN_L_LEN = 1,0,32,0%,�� MXN_T_HOST = 2,0,0,0%,� RR_W_LEN = 0,0,16,0%,�� RR_W_PREF = 2,0,16,0%,�� RR_T_NAME = 4,0,16,0%;�� ��%SBTTL 'DNS_MXLOOK'�G�GLOBAL ROUTINE DNS_MXLOOK (QHDESC_A, MXMAX_A, MXCOUNT_A, MXNSTRUC_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�@�! The MXNAMES structure is an array of records like (in PL/I):�! DECLARE 1 MXNAMES (n),�4�! 2 PREFERENCE_VALUE FIXED BINARY (31),4�! 2 HOST_NAME_LENGTH FIXED BINARY (31),+�! 2 HOST_NAME CHARACTER (128);��!�;�! i.e, two longwords and a 128-byte string. No more than�2�! MXMAX names are ever returned by this routine.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�0�! DNS_MXLOOK qhname, mxmax, mxcount, mxnstruc�!�C�! qhname: char_string, character string, read only, by descriptor�K�! mxmax: unsigned_longword, longword (unsigned), read only, by reference�L�! mxcount: unsigned_longword, longword (unsigned), write only, by referenceG�! mxnstruc: mxname_struc, longword (unsigned), write only, by reference��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.$�! ������������� Other codes possible.�!��! SIDE EFFECTS: None.��!��!--���� BIND3� QHOST = .QHDESC_A : BLOCK [DSC$K_S_BLN, BYTE],�� MXMAX = .MXMAX_A,� MXCOUNT = .MXCOUNT_A,7� MXNSTRUC = .MXNSTRUC_A : BLOCKVECTOR [, 34, LONG];��� � LOCAL� � STATUS,/� RRBUF : BLOCK [GTHST_RRLOOK_SIZE+512],�'� PHOST : $BBLOCK [DSC$K_S_BLN],�&� NAME : $BBLOCK [DSC$K_S_BLN],$� IOSB : NETIO_STATUS_BLOCK,� IPCHAN : WORD,�� NAMELEN : WORD, � IDX������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������j�XP��[NETLIB]NETLIB_CMU_MXLOOK.B32;2������������������������������������������������������������������������������������������������L������������������������������Q�������������;�� BIND7� RRLOOK = RRBUF : GTHST_RRLOOK_BLOCK,�8� RRDATA = RRLOOK [GH$RL_RDATA] : BLOCK [,BYTE];��� INIT_DYNDESC (PHOST);���� MXCOUNT = 0;��<� IF .QHOST [DSC$W_LENGTH] EQL 0 THEN RETURN SS$_BADPARAM;��� STR$UPCASE (PHOST, QHOST);K� IF CH$RCHAR (CH$PLUS (.PHOST [DSC$A_POINTER], .PHOST [DSC$W_LENGTH]-1))�2� NEQ %C'.' THEN STR$APPEND (PHOST, %ASCID'.');3� STR$APPEND (PHOST, %ASCID %STRING (%CHAR (0)));���H� IF NOT (STATUS = $ASSIGN (DEVNAM = %ASCID'IP:', CHAN = IPCHAN)) THEN � BEGIN�� FREE_STRINGS (PHOST);� RETURN .STATUS;� END;��C� STATUS = NET$GTHST (BUFADRS=RRBUF, BUFSIZE=%ALLOCATION (RRBUF),�;� GTHFUNCT=GTH_RRLOOK, GTHP1=.PHOST [DSC$A_POINTER],�9� GTHP2=IPNS_TYPE_MX, IOCHAN=.IPCHAN, IO$SB=IOSB);�� $DASSGN (CHAN=.IPCHAN);���0� IF .STATUS THEN STATUS = .IOSB [NSB$STATUS];� IF NOT .STATUS THEN� � BEGIN�� FREE_STRINGS (PHOST);� RETURN .STATUS;� END;��'� NAME [DSC$B_DTYPE] = DSC$K_DTYPE_T;�'� NAME [DSC$B_CLASS] = DSC$K_CLASS_S;�� NAME [DSC$W_LENGTH] = 128;�� � IDX = 1;+� WHILE .IDX LSS .RRLOOK [GH$RL_RDLEN] DO� � BEGIN�3� BIND RR = RRDATA [.IDX,0,0,0] : BLOCK [,BYTE];�6� MXNSTRUC [.MXCOUNT,MXN_L_PREF] = .RR [RR_W_PREF];;� NAME [DSC$A_POINTER] = MXNSTRUC [.MXCOUNT,MXN_T_HOST];�C� NAME_UNPACK (RR [RR_T_NAME], .RR [RR_W_LEN]-2, NAME, NAMELEN);�.� MXNSTRUC [.MXCOUNT,MXN_L_LEN] = .NAMELEN;� MXCOUNT = .MXCOUNT + 1;%� IDX = .IDX + .RR [RR_W_LEN] + 2;�� END;��� FREE_STRINGS (PHOST);���� SS$_NORMAL���END; ! DNS_MXLOOK�� ��%SBTTL 'NAME_UNPACK'@�ROUTINE NAME_UNPACK (BUF_A, LEN, NAME_A, NAMELEN_A) : NOVALUE = �BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�B�! This routine unpacks a name from the response buffer, handlingC�! the relative-offset name segment references used for compaction� �! purposes.��!��! RETURNS: nothing�!� �! PROTOTYPE:�!�#�! NAME_UNPACK name, buffer, index��!�D�! name: char_string, character string, write only, by descriptor3�! buffer: block of bytes, read only, by reference�H�! index: unsigned_longword, longword (unsigned), modify, by reference�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES: None.��!��! SIDE EFFECTS: None.��!��!--���� BIND'� NAME = .NAME_A : BLOCK [,BYTE],�(� BUF = .BUF_A : VECTOR [,BYTE],!� NAMELEN = .NAMELEN_A : WORD;��� � LOCAL�%� SEG : BLOCK [DSC$K_S_BLN,BYTE],�&� XNAME : BLOCK [DSC$K_S_BLN,BYTE],� SEGLEN : WORD,� � IDX;���� INIT_DYNDESC (XNAME);�&� SEG [DSC$B_DTYPE] = DSC$K_DTYPE_T;&� SEG [DSC$B_CLASS] = DSC$K_CLASS_S; � IDX = 0;� SEGLEN = .BUF [.IDX];�6� WHILE .SEGLEN GTR 0 AND .IDX + .SEGLEN LSS .LEN DO � BEGIN�"� SEG [DSC$W_LENGTH] = .SEGLEN;(� SEG [DSC$A_POINTER] = BUF [.IDX+1];� STR$APPEND (XNAME, SEG);�#� STR$APPEND (XNAME, %ASCID'.');�� IDX = .IDX + .SEGLEN + 1;� SEGLEN = .BUF [.IDX];� END;��� STR$COPY_DX (NAME, XNAME);$� NAMELEN = .XNAME [DSC$W_LENGTH];��� FREE_STRINGS (XNAME);����END; ! NAME_UNPACK���END��ELUDOM�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������+��XP�� [NETLIB]NETLIB_CMU064_UDP.B32;11�����������������������������������������������������������������������������������������������O������������������������������bQ�������������� �*�[NETLIB]NETLIB_CMU064_UDP.B32;11�+��,�+���.�����/� �@� �4�O������ ���������������������-�XP����0���1����2���3������K��P���W���O�����5���6� i+)��7��+)��8�.ډX��9�$.��G� �@��H��J��� �������������%TITLE 'NETLIB_CMU064_UDP''�MODULE NETLIB_CMU064_UDP (IDENT='V1.2',�J� ADDRESSING_MODE (EXTERNAL=LONG_RELATIVE,NONEXTERNAL=LONG_RELATIVE)) =�BEGIN��!++��! FACILITY: NETLIB��!�2�! ABSTRACT: UDP NETLIB routines for CMU V6.4.�!��! MODULE DESCRIPTION:��!�3�! Contains UDP send and receive routines for CMU.��!��! AUTHOR: M. Madison�A�! COPYRIGHT 1991, RENSSELAER POLYTECHNIC INSTITUTE.�"�! ALL RIGHTS RESERVED.�!��! CREATION DATE: 29-JAN-1991��!��! MODIFICATION HISTORY:��!�?�! 29-JAN-1991 V1.0 Madison Initial coding (from NSQUERY).�G�! 08-FEB-1991 V1.1 Madison Add source info return to UDP_RECEIVE.�;�! 22-NOV-1991 V1.2 Madison Add rcvtmo to UDP_RECEIVE.��!--�"� LIBRARY 'SYS$LIBRARY:STARLET';"� LIBRARY 'SYS$LIBRARY:NETWORK';� LIBRARY 'CMU_DEFS';�� LIBRARY 'NETLIB';���� FORWARD ROUTINE�� UDP_SEND,� UDP_RECEIVE,�� TIMER_AST;���� EXTERNAL ROUTINE� NET_CVT_STATUS,%� G_HAT (LIB$GET_VM, LIB$FREE_VM);�� ��%SBTTL 'UDP_SEND'�L�GLOBAL ROUTINE UDP_SEND (CTX_A_A, ADR, PORT : WORD, BUFPTR, BUFLEN : WORD) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!��! Sends out a UDP datagram.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�1�! UDP_SEND chan, address, port, bufptr, buflen��!�9�! chan: channel, word (unsigned), read only, by value�G�! address: longword_unsigned, longword (unsigned), read only, by value�?�! port: word_unsigned, word (unsigned), read only, by value�E�! bufptr: varying_arg, longword (unsigned), read only, by reference�?�! buflen: word_unsigned, word (unsigned), read only, by value��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND(� CTX = .CTX_A_A : REF CTXDEF,%� CHAN = CTX [CTX_W_CHAN] : WORD;��� � LOCAL�� IOSB : NETWORK_IOSB,�"� BUF : REF UDP$ADDRESS_BLOCK, � STATUS;��?� STATUS = LIB$GET_VM (%REF (UDP$ADDRESS_BLEN+.BUFLEN), BUF);�'� IF NOT .STATUS THEN RETURN .STATUS;�� BUF [UDA$SOURCE_ADDR] = 0;� BUF [UDA$DEST_ADDR] = .ADR;�� BUF [UDA$SOURCE_PORT] = 0; � BUF [UDA$DEST_PORT] = .PORT;6� CH$MOVE (.BUFLEN, .BUFPTR, .BUF+UDP$ADDRESS_BLEN);7� STATUS = NET$SEND (IOCHAN=.CHAN, IO$SB=IOSB, EOL=1,�5� BUFADRS=.BUF, BUFSIZE=.BUFLEN+UDP$ADDRESS_BLEN);�F� IF .STATUS THEN STATUS = (IF .IOSB [NSB$STATUS] EQL SS$_ABORT THENH� NET_CVT_STATUS (.IOSB [NSB$XERROR]) ELSE .IOSB [NSB$STATUS]);7� LIB$FREE_VM (%REF (UDP$ADDRESS_BLEN+.BUFLEN), BUF);� � .STATUS����END; ! UDP_SEND�� ��%SBTTL 'UDP_RECEIVE'E�GLOBAL ROUTINE UDP_RECEIVE (CTX_A_A, BUFPTR, BUFSIZ : WORD, BUFLEN_A,�3� SRCADR_A, SRCPRT_A, RCVTMO_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!��! Reads a UDP datagram.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�K�! UDP_RECEIVE chan, buf����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������+��XP�� [NETLIB]NETLIB_CMU064_UDP.B32;11�����������������������������������������������������������������������������������������������O�������������������������������������������ptr, bufsiz, buflen [,srcadr] [,srcprt] [,rcvtmo]��!�@�! ctx: context, longword (unsigned), read only, by referenceF�! bufptr: varying_arg, longword (unsigned), write only, by reference?�! bufsiz: word_unsigned, word (unsigned), read only, by value�@�! buflen: word_unsigned, word (unsigned), write only, by valueL�! srcadr: longword_unsigned, longword (unsigned), write only, by referenceL�! srcprt: longword_unsigned, longword (unsigned), write only, by referenceA�! rcvtmo: date_time, quadword (signed), read only, by reference��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND(� CTX = .CTX_A_A : REF CTXDEF,%� CHAN = CTX [CTX_W_CHAN] : WORD,�$� BUFLEN = .BUFLEN_A : WORD;�� � BUILTIN�� ACTUALCOUNT;��� � LOCAL�� RCVTMO : VECTOR [2,LONG],� INFO : VECTOR [3,LONG],� IOSB : NETWORK_IOSB,�"� BUF : REF UDP$ADDRESS_BLOCK, � STATUS;��?� STATUS = LIB$GET_VM (%REF (UDP$ADDRESS_BLEN+.BUFSIZ), BUF);�'� IF NOT .STATUS THEN RETURN .STATUS;�� BUF [UDA$SOURCE_ADDR] = 0;� BUF [UDA$DEST_ADDR] = 0;� BUF [UDA$SOURCE_PORT] = 0;� BUF [UDA$DEST_PORT] = 0;��"� STATUS = ACTUALCOUNT () GTR 6;.� IF .STATUS THEN STATUS = .RCVTMO_A NEQA 0;2� IF .STATUS THEN CH$MOVE (8, .RCVTMO_A, RCVTMO)<� ELSE $BINTIM (TIMBUF=%ASCID'0 00:00:10', TIMADR=RCVTMO);��� INFO [0] = .CHAN;�� INFO [1] = IOSB;� INFO [2] = SS$_NORMAL;;� $SETIMR (DAYTIM=RCVTMO, ASTADR=TIMER_AST, REQIDT=INFO);�A� STATUS = NET$RECEIVE (IOCHAN=.CHAN, IO$SB=IOSB, BUFADRS=.BUF,�'� BUFSIZE=.BUFSIZ+UDP$ADDRESS_BLEN);�� $CANTIM (REQIDT=INFO);,� IF NOT .INFO [2] THEN STATUS = .INFO [2]K� ELSE IF .STATUS THEN STATUS = (IF .IOSB [NSB$STATUS] EQL SS$_ABORT THEN�G� NET_CVT_STATUS (.IOSB [NSB$XERROR]) ELSE .IOSB [NSB$STATUS]);�� IF .STATUS THEN� � BEGIN�8� BUFLEN = .IOSB [NSB$BYTE_COUNT] - UDP$ADDRESS_BLEN;7� CH$MOVE (.BUFLEN, .BUF+UDP$ADDRESS_BLEN, .BUFPTR);�!� IF ACTUALCOUNT () GTR 4 THEN�E� IF .SRCADR_A NEQA 0 THEN .SRCADR_A = .BUF [UDA$SOURCE_ADDR];�!� IF ACTUALCOUNT () GTR 5 THEN�E� IF .SRCPRT_A NEQA 0 THEN .SRCPRT_A = .BUF [UDA$SOURCE_PORT];�� END�� ELSE BUFLEN = 0;��7� LIB$FREE_VM (%REF (.BUFSIZ+UDP$ADDRESS_BLEN), BUF);��� � .STATUS����END; ! UDP_RECEIVE� ��%SBTTL 'TIMER_AST'�ROUTINE TIMER_AST (INFO_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�F�! This AST routine is triggered when the net receive timer goes off.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! TIMER_AST info��!�O�! info: vector_longword_unsigned, longword (unsigned), modify, by reference��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND&� INFO = .INFO_A : VECTOR [3,LONG], � IOSB = .INFO [1] : IOSBDEF;��2� INFO [2] = IOSB [IOSB_W_STATUS] = SS$_TIMEOUT;� $CANCEL (CHAN=.INFO [0]);���� SS$_NORMAL���END; ! TIMER_AST���END��ELUDOM�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������+��XP��[NETLIB]NETLIB_CMU_NET.B32;25��������������������������������������������������������������������������������������������������Q������������������������������b���������������*�[NETLIB]NETLIB_CMU_NET.B32;25�+��,�+���.�����/� �@� �4�Q�������v�������������������-�XP����0���1����2���3������K��P���W���O�����5���6�H��7�dd��8�d9X��9����������G� �@��H��J������ �������������%TITLE 'NETLIB_CMU_NET'�&�MODULE NETLIB_CMU_NET (IDENT='V1.1-4',J� ADDRESSING_MODE (EXTERNAL=LONG_RELATIVE,NONEXTERNAL=LONG_RELATIVE)) =�BEGIN��!++��! FACILITY: NETLIB��!�D�! ABSTRACT: Common network library routines for CMU-Tek TCP/IP.�!��! MODULE DESCRIPTION:��!��! AUTHOR: M. Madison�A�! COPYRIGHT 1991, RENSSELAER POLYTECHNIC INSTITUTE.�"�! ALL RIGHTS RESERVED.�!��! CREATION DATE: 28-JAN-1991��!��! MODIFICATION HISTORY:��!�0�! 29-JAN-1991 V1.0 Madison Initial coding.B�! 05-SEP-1991 V1.1 Madison Add NOT_PASSIVE flag to NET_BIND.O�! 03-DEC-1991 V1.1-1 Madison Make DSREFEXC same as ENDOFFILE; IP0 bypass.�:�! 04-DEC-1991 V1.1-2 Madison Improved debug support.J�! 07-FEB-1992 V1.1-3 Madison CREF->REJECT; EOF on no-address lookup.N�! 19-MAY-1994 V1.1-4 Madison Byte-swap the port numbers in NET_GET_INFO.�!--���"� LIBRARY 'SYS$LIBRARY:STARLET';*� LIBRARY 'CMUTEK_SRC:[CENTRAL]NETWORK';,� LIBRARY 'CMUTEK_SRC:[CENTRAL]NETCOMMON';+� LIBRARY 'CMUTEK_SRC:[CENTRAL]NETERROR';�� LIBRARY 'NETLIB';�� LIBRARY 'NETLIBDEF';� LIBRARY 'CMU_DEFS';���� FORWARD ROUTINE�� NET_ASSIGN,� NET_DEASSIGN,� NET_BIND,� NET_GET_ADDRESS,�� NET_ADDR_TO_NAME,� NET_GET_INFO,� NET_GET_HOSTNAME,� NET_CVT_STATUS,� NET_SET_TRACE_ROUTINE;���� EXTERNAL ROUTINE>� G_HAT (LIB$GET_VM, LIB$FREE_VM, STR$CONCAT, STR$FREE1_DX,<� STR$APPEND, STR$COPY_DX, STR$FIND_FIRST_NOT_IN_SET,<� STR$TRANSLATE, LIB$CVT_DTB, STR$UPCASE, STR$COPY_R,� LIB$PUT_OUTPUT);��� � GLOBAL.� TRACE_ROUTINE : INITIAL (LIB$PUT_OUTPUT);��0� MACRO BYTE_SWAP (X) = (LOCAL __X; __X = (X);,� (.__X<0,8,0> ^ 8) + .__X<8,8,0>) %;� ��%SBTTL 'NET_ASSIGN'�%�GLOBAL ROUTINE NET_ASSIGN (CTX_A_A) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�E�! This routine assigns a network channel for subsequent operations.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! NET_ASSIGN nodename��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND*� CTX = .CTX_A_A : REF CTXDEF;�� � LOCAL� � STATUS;��3� STATUS = LIB$GET_VM (%REF (CTX_S_CTXDEF), CTX);�,� CH$FILL (%CHAR (0), CTX_S_CTXDEF, .CTX);'� IF NOT .STATUS THEN RETURN .STATUS;� � BEGIN�+� BIND BUFQ = CTX [CTX_Q_BUFQ] : QUEDEF;�2� BUFQ [QUE_L_TAIL] = BUFQ [QUE_L_HEAD] = BUFQ;E� $BINTIM (TIMBUF=%ASCID'0 00:10:00', TIMADR=CTX [CTX_Q_EXPTIME]);�� END;��I� STATUS = $ASSIGN (DEVNAM=%ASCID'INET$DEVICE', CHAN=CTX [CTX_W_CHAN]);�A� IF .STATUS EQL SS$_IVDEVNAM OR .STATUS EQL SS$_NOSUCHDEV THEN�C� STATUS = $ASSIGN (DEVNAM=%ASCID'IP0:', CHAN=CTX [CTX_W_CHAN]);�?� IF NOT .STATUS THEN LIB$FREE_VM (%REF (CTX_S_CTXDEF), CTX);��� � .STATUS����END; ! NET_ASSIGN�� ��%SBTTL 'NET_BIND'�J�GLOBAL ROUTINE NET_BIND ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������+��XP��[NETLIB]NETLIB_CMU_NET.B32;25��������������������������������������������������������������������������������������������������Q������������������������������T�������������(CTX_A_A, PROTOCOL, PORT, XTHREADS, NOT_PASSIVE) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�C�! This routine creates and binds a local socket for the specified� �! protocol.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! NET_BIND nodename��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND*� CTX = .CTX_A_A : REF CTXDEF;��� BUILTIN ACTUALCOUNT;�� � LOCAL�� IOSB : NETIO_STATUS_BLOCK,� � STATUS;��=� IF ACTUALCOUNT () GTR 2 THEN CTX [CTX_L_LSNPORT] = .PORT;�#� IF .PROTOCOL EQL NET_K_UDP THEN� � BEGIN�B� STATUS = NET$OPEN (OPENMODE=UDPDATA, PROTOCOL=U$UDP_PROTOCOL,F� IO$SB=IOSB, IOCHAN=.CTX [CTX_W_CHAN], FHNAM=0, FOREIGN_PRT=0,@� LOCAL_PRT=(IF ACTUALCOUNT () GTR 2 THEN .PORT ELSE 0));G� IF .STATUS THEN STATUS = (IF .IOSB [NSB$STATUS] EQL SS$_ABORT THEN�F� NET_CVT_STATUS (.IOSB [NSB$XERROR]) ELSE .IOSB [NSB$STATUS]);� END�� ELSE STATUS = SS$_NORMAL;��� � .STATUS����END; ! NET_BIND�� ��%SBTTL 'NET_GET_ADDRESS'M�GLOBAL ROUTINE NET_GET_ADDRESS (CTX_A_A, HOST_A, ALSIZE, ALIST_A, ALCNT_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�D�! Given a host name, returns an array of valid Internet addresses.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�5�! NET_GET_ADDRESS ctx, host, arrsiz, array, retcnt��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND&� CTX = .CTX_A_A : REF CTXDEF,(� CHN = CTX [CTX_W_CHAN] : WORD,+� NODENAME = .HOST_A : BLOCK [,BYTE],�+� ALIST = .ALIST_A : VECTOR [,LONG],�� ALCNT = .ALCNT_A;�� � LOCAL�'� GHBLK : GTHST_NMLOOK_RET_ARGS,�#� IOSB : NETIO_STATUS_BLOCK,� � STATUS;��K� IF STR$FIND_FIRST_NOT_IN_SET (NODENAME, %ASCID'0123456789.') NEQ 0 THEN� � BEGIN�*� LOCAL STR : BLOCK [DSC$K_S_BLN,BYTE];� $INIT_DYNDESC (STR);�<� STR$CONCAT (STR, NODENAME, %ASCID %STRING (%CHAR (0)));D� STATUS = NET$GTHST (BUFADRS=GHBLK, BUFSIZE=%ALLOCATION (GHBLK),F� GTHFUNCT=GTH_NAMADR, GTHP1=.STR [DSC$A_POINTER], IOCHAN=.CHN,� IO$SB=IOSB);�� IF NOT .STATUS THEN � BEGIN� STR$FREE1_DX (STR);� RETURN .STATUS; � END;�"� IF NOT .IOSB [NSB$STATUS] ANDI� CH$RCHAR (.NODENAME [DSC$A_POINTER]+.NODENAME [DSC$W_LENGTH]-1)�� NEQ %C'.'� � THEN� � BEGINE� STR$CONCAT (STR, NODENAME, %ASCID %STRING ('.', %CHAR (0)));�H� STATUS = NET$GTHST (BUFADRS=GHBLK, BUFSIZE=%ALLOCATION (GHBLK),G� GTHFUNCT=GTH_NAMADR, GTHP1=.STR [DSC$A_POINTER], IOCHAN=.CHN,�� IO$SB=IOSB); � END;�� STR$FREE1_DX (STR);(� IF NOT .STATUS THEN RETURN .STATUS;*� IF NOT .IOSB [NSB$STATUS] THEN RETURN2� (IF .IOSB [NSB$STATUS] EQL SS$_ABORT THEN-� NET_CVT_STATUS (.IOSB [NSB$XERROR])�#� ELSE .IOSB [NSB$STATUS]);�0� ALCNT = MIN (.GHBLK [GHN$ADRCNT], .ALSIZE);� IF .ALCNT GTR 0 THEN� � BEGIN:� BIND GHLST = GHBLK [GHN$ADRLST] : VECTOR [,LONG];?� INCR I FROM 0 TO .ALCNT-1 DO ALIST [.I] = .GHLST [.I];�� END!� ELSE STATUS = SS$_ENDOFFILE;�� END�� ELSE BEGIN � LOCAL� ADRL,$� ADRB : REF VECTOR [4,BY�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������+��XP��[NETLIB]NETLIB_CMU_NET.B32;25��������������������������������������������������������������������������������������������������Q�������������������������������������������TE],� CHP, DOTP,�� LEN, XLEN, VAL;��� ADRB = ADRL;�%� CHP = .NODENAME [DSC$A_POINTER];�$� LEN = .NODENAME [DSC$W_LENGTH];� INCR I FROM 0 TO 3 DO � BEGIN%� IF .LEN LSS 1 THEN EXITLOOP;�/� DOTP = CH$FIND_CH (.LEN, .CHP, %C'.');�,� IF CH$FAIL (.DOTP) THEN XLEN = .LEN+� ELSE XLEN = CH$DIFF (.DOTP, .CHP);�(� LIB$CVT_DTB (.XLEN, .CHP, VAL);!� ADRB [.I] = .VAL<0,8,0>;� � LEN = .LEN - .XLEN - 1;"� CHP = CH$PLUS (.DOTP, 1); � END;�� IF .ALSIZE GTR 0 THEN � BEGIN� ALCNT = 1;�� ALIST [0] = .ADRL;� � END;�� STATUS = SS$_NORMAL;�� END;�� � .STATUS����END; ! NET_GET_ADDRESS� ��%SBTTL 'NET_ADDR_TO_NAME'�8�GLOBAL ROUTINE NET_ADDR_TO_NAME (CTX_A_A, ADR, NAME_A) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�L�! Given an IP address, returns the corresponding host name (if available).�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�%�! NET_ADDR_TO_NAME host, adr, name��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND&� CTX = .CTX_A_A : REF CTXDEF,(� CHN = CTX [CTX_W_CHAN] : WORD,(� NAME = .NAME_A : BLOCK [,BYTE];�� � LOCAL�#� GHBLK : GTHST_ADLOOK_RET_ARGS,�� IOSB : NETIO_STATUS_BLOCK,� � STATUS;��C� STATUS = NET$GTHST (BUFADRS=GHBLK, BUFSIZE=%ALLOCATION (GHBLK),�2� GTHFUNCT=GTH_ADRNAM, GTHP1=.ADR, IOCHAN=.CHN,� IO$SB=IOSB);�F� IF .STATUS THEN STATUS = (IF .IOSB [NSB$STATUS] EQL SS$_ABORT THENF� NET_CVT_STATUS (.IOSB [NSB$XERROR]) ELSE .IOSB [NSB$STATUS]);� IF .STATUS THEN�?� STR$COPY_R (NAME, GHBLK [GHA$NAMLEN], GHBLK [GHA$NAMSTR]);��� � .STATUS����END; ! NET_ADDR_TO_NAME�� ��%SBTTL 'NET_DEASSIGN'�'�GLOBAL ROUTINE NET_DEASSIGN (CTX_A_A) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�-�! This routine deassigns a network channel.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! NET_DEASSIGN ctx��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND*� CTX = .CTX_A_A : REF CTXDEF;�� � LOCAL� � STATUS;��%� $DASSGN (CHAN=.CTX [CTX_W_CHAN]);�+� LIB$FREE_VM (%REF (CTX_S_CTXDEF), CTX);� � CTX = 0;��� SS$_NORMAL���END; ! NET_DEASSIGN�� ��%SBTTL 'NET_GET_INFO'�P�GLOBAL ROUTINE NET_GET_INFO (CTX_A_A, REMADR_A, REMPRT_A, LCLADR_A, LCLPRT_A) = �BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�A�! Gets address and port information about a network connection.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�:�! NET_GET_INFO ctx, remadr [,remprt] [,lcladr] [,lclprt]�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--� � BUILTIN�� ACTUALCOUNT;�� BIND/� CTX = .CTX_A_A : REF CTXDEF;��� � LOCAL�)� INFO : CONNECTION_INFO_RETURN_BLOCK,�� IOSB : NETIO_STATUS_BLOCK,� � STATUS;��>� STATUS = NET$INFO (IOCHAN=.CTX [CTX_W_CHAN], BUFADRS=INFO,-� BUFSIZE=%ALLOCATION (INFO), IO$SB=IOSB);�F� IF .STATUS THEN STATUS = (IF .IOSB [NSB$STATUS] EQL SS$_ABORT THENF� NET_CVT_S�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������+��XP��[NETLIB]NETLIB_CMU_NET.B32;25��������������������������������������������������������������������������������������������������Q������������������������������m�������������TATUS (.IOSB [NSB$XERROR]) ELSE .IOSB [NSB$STATUS]);'� IF NOT .STATUS THEN RETURN .STATUS;���O� IF ACTUALCOUNT () GTR 4 THEN .LCLPRT_A = BYTE_SWAP (.INFO [CI$LOCAL_PORT]);�L� IF ACTUALCOUNT () GTR 3 THEN .LCLADR_A = .INFO [CI$LOCAL_INTERNET_ADRS];Q� IF ACTUALCOUNT () GTR 2 THEN .REMPRT_A = BYTE_SWAP (.INFO [CI$FOREIGN_PORT]);�M� IF ACTUALCOUNT () GTR 1 THEN .REMADR_A = .INFO [CI$REMOTE_INTERNET_ADRS];���� SS$_NORMAL���END; ! NET_GET_INFO�� ��%SBTTL 'NET_GET_HOSTNAME'�1�GLOBAL ROUTINE NET_GET_HOSTNAME (HST_A, LEN_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�+�! Returns this host's Internet host name.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�%�! NET_GET_HOSTNAME hostname [,len]��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BUILTIN ACTUALCOUNT;�� � LOCAL�%� LNMLST : $ITMLST_DECL (ITEMS=1),�!� HSTBUF : VECTOR [1024,BYTE],�� HSTLEN : WORD,� � STATUS;�� � $ITMLST_INIT (ITMLST=LNMLST,6� (ITMCOD=LNM$_STRING, BUFSIZ=%ALLOCATION (HSTBUF),(� BUFADR=HSTBUF, RETLEN=HSTLEN));��0� STATUS = $TRNLNM (TABNAM=%ASCID'LNM$SYSTEM',7� LOGNAM=%ASCID'INTERNET_HOST_NAME', ITMLST=LNMLST);�� IF .STATUS THEN� � BEGIN�)� STR$COPY_R (.HST_A, HSTLEN, HSTBUF);�!� IF ACTUALCOUNT () GTR 1 THEN�0� IF .LEN_A NEQA 0 THEN .LEN_A = .HSTLEN;� END;�� � .STATUS����END; ! NET_GET_HOSTNAME�� ��%SBTTL 'NET_CVT_STATUS'�%�GLOBAL ROUTINE NET_CVT_STATUS (RC) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�D�! Converts a CMU-Tek return code to an SS$_ equivalent (from UCX).�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! NET_CVT_STATUS rc�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� SELECTONE .RC OF� SET�7� [NET$_IR,NET$_UCT,NET$_CSE,NET$_VTF] : SS$_INSFMEM;�D� [NET$_IFC,NET$_IPC,NET$_IFS,NET$_ILP,NET$_NUC,NET$_CIP,NET$_CDE,"� NET$_FSU] : SS$_BADPARAM;� [NET$_NOPRV] : SS$_NOPRIV;;� [NET$_CR,NET$_CCAN,NET$_CC,NET$_KILL] : SS$_LINKDISCON;�0� [NET$_UNN, NET$_UNA, NET$_UNU] : SS$_IVADDR;� [NET$_BTS] : SS$_IVBUFLEN;*� [NET$_URC,NET$_NRT] : SS$_UNREACHABLE;:� [NET$_CTO,NET$_TWT,NET$_FTO,NET$_NMLTO] : SS$_TIMEOUT;%� [NET$_TE,NET$_NSEXIT] : SS$_SHUT;�*� [NET$_NOINA, NET$_NOANA] : SS$_NOPRIV;N� [NET$_DSNOADDR,NET$_DSNONAME,NET$_DSNAMERR,NET$_DSREFEXC] : SS$_ENDOFFILE;� [NET$_CREF] : SS$_REJECT;�� [OTHERWISE] : .RC;� TES����END; ! NET_CVT_STATUS�� ��%SBTTL 'NET_SET_TRACE_ROUTINE'/�GLOBAL ROUTINE NET_SET_TRACE_ROUTINE (RTN_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�@�! Sets the trace routine to be used instead of LIB$PUT_OUTPUT.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! NET_SET_TRACE_ROUTINE��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���8� IF .RTN_A EQLA 0 THEN TRACE_ROUTINE = LIB$PUT_OUTPUT � ELSE TRACE_ROUTINE = .RTN_A;� SS$_NORMAL���END;���END��ELUDOM������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ����������������������������������NETLIB_SRC.BCK�����������������P��XP��[NETLIB]NETLIB_CMU_TCP.B32;20��������������������������������������������������������������������������������������������������_�����2����������������������������������������*�[NETLIB]NETLIB_CMU_TCP.B32;20�+��,�P���.�2����/� �@� �4�_���2���.��������������������-�XP���0���1����2���3������K��P���W���O�3����5���6�1 ��7�Pd ��8�EډX��9�$.��G� �@��H��J������ �������������%TITLE 'NETLIB_CMU_TCP'�&�MODULE NETLIB_CMU_TCP (IDENT='V1.2-1',J� ADDRESSING_MODE (EXTERNAL=LONG_RELATIVE,NONEXTERNAL=LONG_RELATIVE)) =�BEGIN��!++��! FACILITY: NETLIB��!�=�! ABSTRACT: TCP communication routines for use with CMU.��!��! MODULE DESCRIPTION:��!��!��! AUTHOR: M. Madison�A�! COPYRIGHT 1991, RENSSELAER POLYTECHNIC INSTITUTE.�"�! ALL RIGHTS RESERVED.�!��! CREATION DATE: 29-JAN-1991��!��! MODIFICATION HISTORY:��!�0�! 29-JAN-1991 V1.0 Madison Initial coding.7�! 24-APR-1991 V1.0-1 Madison Cancel those timers!�E�! 20-JUN-1991 V1.1 Madison User-specified timeouts on receives.�J�! 05-SEP-1991 V1.2 Madison Add support for local port specification.D�! 13-OCT-1992 V1.2-1 Madison Fix TCP_ACCEPT, TCP_RECEIVE bugs.�!--���"� LIBRARY 'SYS$LIBRARY:STARLET';*� LIBRARY 'CMUTEK_SRC:[CENTRAL]NETWORK';,� LIBRARY 'CMUTEK_SRC:[CENTRAL]NETCOMMON';� LIBRARY 'NETLIB';�� LIBRARY 'NETLIBDEF';� LIBRARY 'CMU_DEFS';���� FORWARD ROUTINE�� TCP_CONNECT,�� TCP_CONNECT_ADDR,� TCP_ACCEPT,� TCP_DISCONNECT,� TCP_SEND,� TCP_SND_AST,�� TCP_RECEIVE,�� TCP_RAW_RCV_AST,�� TCP_GET_LINE,� TCP_RCV_AST,�� TCP_TMO_AST;���� EXTERNAL ROUTINE� NET_GET_ADDRESS,�� NET_CVT_STATUS,>� G_HAT (LIB$GET_VM, LIB$FREE_VM, STR$CONCAT, STR$FREE1_DX,<� STR$APPEND, STR$COPY_DX, STR$FIND_FIRST_NOT_IN_SET,%� STR$TRANSLATE, LIB$CVT_DTB);���� OWN� � FREEQ : QUEDEF PRESET ($� [QUE_L_HEAD] = FREEQ,%� [QUE_L_TAIL] = FREEQ);�� ��%SBTTL 'TCP_CONNECT'8�GLOBAL ROUTINE TCP_CONNECT (CTX_A_A, NODENAME_A, PORT) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�C�! This routine establishes a connection to the specified host and� �! port.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! TCP_CONNECT nodename�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND<� NODENAME = .NODENAME_A : BLOCK [DSC$K_S_BLN,BYTE],*� CTX = .CTX_A_A : REF CTXDEF;�� � LOCAL�"� ALIST : VECTOR [32,LONG], � ADRCNT,#� IOSB : NETIO_STATUS_BLOCK,� � STATUS;��@� STATUS = NET_GET_ADDRESS (CTX, NODENAME, 32, ALIST, ADRCNT);'� IF NOT .STATUS THEN RETURN .STATUS;�!� INCR I FROM 0 TO .ADRCNT-1 DO� � BEGIN�8� STATUS = TCP_CONNECT_ADDR (CTX, ALIST [.I], .PORT);� IF .STATUS THEN EXITLOOP;� END;�� � .STATUS����END; ! TCP_CONNECT� ��%SBTTL 'TCP_CONNECT_ADDR'�<�GLOBAL ROUTINE TCP_CONNECT_ADDR (CTX_A_A, ADDRESS_A, PORT) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�C�! This routine establishes a connection to the specified host and� �! port.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�%�! TCP_CONNECT_ADDR ctx, addr, port��!��! IMPLICIT INPUTS: No������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!����������������������������������NETLIB_SRC.BCK�����������������P��XP��[NETLIB]NETLIB_CMU_TCP.B32;20��������������������������������������������������������������������������������������������������_�����2�������������������������~q�������������ne.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND� ADDRESS = .ADDRESS_A,*� CTX = .CTX_A_A : REF CTXDEF;�� � LOCAL�#� IOSB : NETIO_STATUS_BLOCK,� � STATUS;��1� STATUS = NET$OPEN (FHNAM=ADDRESS, ADDRFLAG=1,�<� FOREIGN_PRT=.PORT, PROTOCOL=U$TCP_PROTOCOL, IO$SB=IOSB,I� IOCHAN=.CTX [CTX_W_CHAN], TIMOUT=0, LOCAL_PRT=.CTX [CTX_L_LSNPORT]);���� IF .STATUS THEN�[� STATUS = (IF .IOSB [NSB$STATUS] EQL SS$_ABORT THEN NET_CVT_STATUS (.IOSB [NSB$XERROR])�'� ELSE .IOSB [NSB$STATUS]);��� � .STATUS����END; ! TCP_CONNECT_ADDR�� ��%SBTTL 'TCP_ACCEPT'�G�GLOBAL ROUTINE TCP_ACCEPT (LSNR_A_A, CTX_A_A, IOSB_A, ASTADR, ASTPRM) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�=�! This routine accepts an incoming connection. It will not�:�! complete until a connection comes in for it to accept.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�(�! TCP_ACCEPT ctx, iosb, astadr, astprm�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--� � BUILTIN�� ACTUALCOUNT;���� BIND$� LSNR = .LSNR_A_A : REF CTXDEF,$� CTX = .CTX_A_A : REF CTXDEF;�� � LOCAL� � STATUS;�� � IF ACTUALCOUNT () GTR 2 THEN8� STATUS = NET$OPEN (LOCAL_PRT=.LSNR [CTX_L_LSNPORT],C� OPENMODE=PASSIVE, IOCHAN=.CTX [CTX_W_CHAN], IO$SB=.IOSB_A,�C� TIMOUT=0, AST$ADR=.ASTADR, AST$PRM=.ASTPRM, IOMODE=ASYNCH)�� ELSE � BEGIN�7� BIND IOSB = CTX [CTX_Q_IOSB] : NETIO_STATUS_BLOCK;�8� STATUS = NET$OPEN (LOCAL_PRT=.LSNR [CTX_L_LSNPORT],4� OPENMODE=PASSIVE, IOCHAN=.CTX [CTX_W_CHAN],� IO$SB=IOSB, TIMOUT=0);�� IF .STATUS THEN_� STATUS = (IF .IOSB [NSB$STATUS] EQL SS$_ABORT THEN NET_CVT_STATUS (.IOSB [NSB$XERROR])�(� ELSE .IOSB [NSB$STATUS]);� END;�� � .STATUS����END; ! TCP_ACCEPT�� ��%SBTTL 'TCP_DISCONNECT'�)�GLOBAL ROUTINE TCP_DISCONNECT (CTX_A_A) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!��! Closes a connection.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! TCP_DISCONNECT�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND(� CTX = .CTX_A_A : REF CTXDEF,'� BUFQ = CTX [CTX_Q_BUFQ] : QUEDEF;��� � LOCAL�� RCV : REF RCVDEF,�� IOSB : NETIO_STATUS_BLOCK;���4� NET$CLOSE (IOCHAN=.CTX [CTX_W_CHAN], IO$SB=IOSB)���END; ! TCP_DISCONNECT�� ��%SBTTL 'TCP_SEND'�M�GLOBAL ROUTINE TCP_SEND (CTX_A_A, SNDSTR_A, XFLAGS, IOSB_A, ASTADR, ASTPRM) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�D�! This routine sends a string to the remote system. The string isH�! automatically terminated with a cr/lf sequence, and the EOL ("push");�! bit is set based on the value of the PUSH bit of FLAGS.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�8�! TCP_SEND ctx, cmdstr [,push] [,iosb, astadr, astprm]�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--� � BUILTIN�� ACTUALCOUNT;���� BIND#� CTX ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������"����������������������������������NETLIB_SRC.BCK�����������������P��XP��[NETLIB]NETLIB_CMU_TCP.B32;20��������������������������������������������������������������������������������������������������_�����2�������������������������ڛ�������������= .CTX_A_A : REF CTXDEF,�3� SNDSTR = .SNDSTR_A : BLOCK [DSC$K_S_BLN,BYTE];��� � LOCAL�� FLAGS : BLOCK [4,BYTE],� IOSB : NETIO_STATUS_BLOCK,�� SND : REF SNDDEF,�%� STR : BLOCK [DSC$K_S_BLN,BYTE],� � STATUS;��;� IF ACTUALCOUNT () GTR 2 THEN FLAGS [0,0,32,0] = .XFLAGS�� ELSE FLAGS [0,0,32,0] = 0;�� � IF ACTUALCOUNT () LSS 4 THEN � BEGIN�%� IF NOT .FLAGS [NET_V_NOTRM] THEN� � BEGIN� $INIT_DYNDESC (STR);�K� STR$CONCAT (STR, SNDSTR, %ASCID %STRING (%CHAR (13), %CHAR (10)));� � END;�=� STATUS = NET$SEND (IOCHAN=.CTX [CTX_W_CHAN], IO$SB=IOSB,�F� BUFADRS=(IF .FLAGS [NET_V_NOTRM] THEN .SNDSTR [DSC$A_POINTER]%� ELSE .STR [DSC$A_POINTER]),�E� BUFSIZE=(IF .FLAGS [NET_V_NOTRM] THEN .SNDSTR [DSC$W_LENGTH]�$� ELSE .STR [DSC$W_LENGTH]),"� EOL=.FLAGS [NET_V_PUSH]);9� IF NOT .FLAGS [NET_V_NOTRM] THEN STR$FREE1_DX (STR);�� IF .STATUS THEN_� STATUS = (IF .IOSB [NSB$STATUS] EQL SS$_ABORT THEN NET_CVT_STATUS (.IOSB [NSB$XERROR])�(� ELSE .IOSB [NSB$STATUS]);� END�� ELSE � BEGIN�+� LIB$GET_VM (%REF (SND_S_SNDDEF), SND);�� SND [SND_L_CTX] = .CTX;"� SND [SND_L_ASTADR] = .ASTADR;"� SND [SND_L_ASTPRM] = .ASTPRM; � BEGIN7� BIND STR = SND [SND_Q_SNDBUF] : BLOCK [,BYTE];�� $INIT_DYNDESC (STR);�?� IF .FLAGS [NET_V_NOTRM] THEN STR$COPY_DX (STR, SNDSTR)�&� ELSE STR$CONCAT (STR, SNDSTR,3� %ASCID %STRING (%CHAR (13), %CHAR (10)));�D� STATUS = NET$SEND (IOCHAN=.CTX [CTX_W_CHAN], IO$SB=.IOSB_A,D� BUFADRS=.STR [DSC$A_POINTER], BUFSIZE=.STR [DSC$W_LENGTH],1� EOL=.FLAGS [NET_V_PUSH], IOMODE=ASYNCH,�-� AST$ADR=TCP_SND_AST, AST$PRM=.SND);� � END;�� IF NOT .STATUS THEN0� LIB$FREE_VM (%REF (SND_S_SNDDEF), SND);� END;�� � .STATUS����END; ! TCP_SEND�� ��%SBTTL 'TCP_SND_AST'�ROUTINE TCP_SND_AST (SND_A) = �BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�-�! AST routine triggered on send completion.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! TCP_SND_AST snd�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND� SND = .SND_A : SNDDEF;��� � LOCAL�� ASTADR, ASTPRM;��&� STR$FREE1_DX (SND [SND_Q_SNDBUF]);!� ASTADR = .SND [SND_L_ASTADR];�!� ASTPRM = .SND [SND_L_ASTPRM];�+� LIB$FREE_VM (%REF (SND_S_SNDDEF), SND);�.� IF .ASTADR NEQA 0 THEN (.ASTADR) (.ASTPRM)� ELSE SS$_NORMAL����END; ! TCP_SND_AST� ��%SBTTL 'TCP_RECEIVE'O�GLOBAL ROUTINE TCP_RECEIVE (CTX_A_A, RCVSTR_A, IOSB_A, ASTADR, ASTPRM, TMO_A) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!��! Raw TCP receive routine.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�?�! TCP_RECEIVE ctx, strdsc [,iosb, astadr, astprm] [,timeout]��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--� � BUILTIN�� ACTUALCOUNT;���� BIND(� CTX = .CTX_A_A : REF CTXDEF,%� CHN = CTX [CTX_W_CHAN] : WORD,�8� RCVSTR = .RCVSTR_A : BLOCK [DSC$K_S_BLN,BYTE];�� � LOCAL�� RCV : REF RCVDEF,� � STATUS;��-� IF REMQUE (.FREEQ [QUE_L_HEAD], RCV) THEN�+� LIB$GET_VM (%REF (RCV_S_RCVDEF), RCV);�� RC���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#����������������������������������NETLIB_SRC.BCK�����������������P��XP��[NETLIB]NETLIB_CMU_TCP.B32;20��������������������������������������������������������������������������������������������������_�����2�������������������������G�������������V [RCV_L_CTX] = .CTX;� � IF ACTUALCOUNT () GTR 2 THEN#� RCV [RCV_L_USRIOSB] = .IOSB_A;� � IF ACTUALCOUNT () GTR 3 THEN � BEGIN�"� RCV [RCV_L_ASTADR] = .ASTADR;"� RCV [RCV_L_ASTPRM] = .ASTPRM;� END�� ELSEG� RCV [RCV_L_USRIOSB] = RCV [RCV_L_ASTADR] = RCV [RCV_L_ASTPRM] = 0;���6� CH$MOVE (8, CTX [CTX_Q_EXPTIME], RCV [RCV_Q_TMO]); � IF ACTUALCOUNT () GTR 5 THEN@� IF .TMO_A NEQA 0 THEN CH$MOVE (8, .TMO_A, RCV [RCV_Q_TMO]);��F� $SETIMR (DAYTIM=RCV [RCV_Q_TMO], ASTADR=TCP_TMO_AST, REQIDT=.RCV);>� STATUS = NET$RECEIVE (IOCHAN=.CHN, IO$SB=RCV [RCV_Q_IOSB],:� AST$ADR=TCP_RAW_RCV_AST, AST$PRM=.RCV, IOMODE=ASYNCH,F� BUFADRS=.RCVSTR [DSC$A_POINTER], BUFSIZE=.RCVSTR [DSC$W_LENGTH]);� IF NOT .STATUS THEN� � BEGIN�� $CANTIM (REQIDT=.RCV);�(� INSQUE (.RCV, .FREEQ [QUE_L_TAIL]);� END�� ELSE!� IF ACTUALCOUNT () LSS 4 THEN� � BEGIN;� BIND IOSB = RCV [RCV_Q_IOSB] : NETIO_STATUS_BLOCK;�1� STATUS = $SYNCH (IOSB=RCV [RCV_Q_IOSB]);�F� IF .STATUS THEN STATUS = (IF .IOSB [NSB$STATUS] EQL SS$_ABORTL� THEN NET_CVT_STATUS (.IOSB [NSB$XERROR]) ELSE .IOSB [NSB$STATUS]);@� IF ACTUALCOUNT () GTR 2 THEN CH$MOVE (8, IOSB, .IOSB_A)K� ELSE IF .STATUS THEN STATUS = (IF .IOSB [NSB$STATUS] EQL SS$_ABORT�L� THEN NET_CVT_STATUS (.IOSB [NSB$XERROR]) ELSE .IOSB [NSB$STATUS]); � END;��� � .STATUS����END; ! TCP_RECEIVE� ��%SBTTL 'TCP_RAW_RCV_AST',�ROUTINE TCP_RAW_RCV_AST (RCV : REF RCVDEF) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�>�! This AST routine is invoked when a network read completes.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! TCP_RAW_RCV_AST buf��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND(� IOSB = RCV [RCV_Q_IOSB] : IOSBDEF,+� CTX = RCV [RCV_L_CTX] : REF CTXDEF,�/� UIOSB = RCV [RCV_L_USRIOSB] : REF IOSBDEF;���� $CANTIM (REQIDT=.RCV);B� IF .UIOSB NEQA 0 THEN CH$MOVE (8, IOSB, .RCV [RCV_L_USRIOSB]);'� INSQUE (.RCV, .FREEQ [QUE_L_TAIL]);���&� IF .RCV [RCV_L_ASTADR] NEQA 0 THEN0� (.RCV [RCV_L_ASTADR]) (.RCV [RCV_L_ASTPRM])� ELSE� SS$_NORMAL����END; ! TCP_RAW_RCV_AST� ��%SBTTL 'TCP_GET_LINE'�P�GLOBAL ROUTINE TCP_GET_LINE (CTX_A_A, RCVSTR_A, IOSB_A, ASTADR, ASTPRM, TMO_A) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�E�! This routine forms one NNTP "line" out of the input received over�K�! the net from the server. A "line" is a string of characters terminated�G�! with a cr/lf sequence. The routine will wait until enough input is��! received to form a "line".�!�I�! Note that I cheat a bit and assume that CR ends a record. This makes�K�! life a little easier since I don't have to wait around for another data�L�! block to show up if the CR occurs as the last character of a data block,F�! just to verify that there is an LF at the front of the next block.I�! IGNORE_LF_FRONT gets set instead, so on the next call I can strip the�I�! first character of the front of the next block (assuming it's an LF).��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�?�! TCP_GET_LINE ctx, strdsc [,iosb, astadr, astprm] [,timeout]��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������$����������������������������������NETLIB_SRC.BCK�����������������P��XP��[NETLIB]NETLIB_CMU_TCP.B32;20��������������������������������������������������������������������������������������������������_�����2�������������������������������������� �! None.��!--� � BUILTIN�� ACTUALCOUNT;���� BIND(� CTX = .CTX_A_A : REF CTXDEF,%� CHN = CTX [CTX_W_CHAN] : WORD,�'� INQ = CTX [CTX_Q_BUFQ] : QUEDEF,�8� RCVSTR = .RCVSTR_A : BLOCK [DSC$K_S_BLN,BYTE];�� � LOCAL�%� SDSC : BLOCK [DSC$K_S_BLN,BYTE],�� RCV : REF RCVDEF,� � LEN,� � EOPTR,� � LFPOS,� � STATUS,� FOUND_CRLF;��#� STR$COPY_DX (RCVSTR, %ASCID'');���'� SDSC [DSC$B_DTYPE] = DSC$K_DTYPE_T;�'� SDSC [DSC$B_CLASS] = DSC$K_CLASS_S;���� FOUND_CRLF = 0;�0� WHILE NOT REMQUE (.INQ [QUE_L_HEAD], RCV) DO � BEGIN� � BIND�6� IOSB = RCV [RCV_Q_IOSB] : NETIO_STATUS_BLOCK,-� RCNT = IOSB [NSB$BYTE_COUNT] : WORD;�A� EOPTR = CH$FIND_CH (.RCNT, .RCV [RCV_L_BUFPTR], %CHAR (13));�A� LFPOS = CH$FIND_CH (.RCNT, .RCV [RCV_L_BUFPTR], %CHAR (10));���,� IF CH$FAIL (.EOPTR) THEN EOPTR = .LFPOS&� ELSE IF NOT CH$FAIL (.LFPOS) THEN3� IF .LFPOS LSSA .EOPTR THEN EOPTR = .LFPOS;���� IF CH$FAIL (.EOPTR) THEN� � BEGIN4� SDSC [DSC$A_POINTER] = .RCV [RCV_L_BUFPTR];L� SDSC [DSC$W_LENGTH] = MINU (.RCNT, STR_MAX-.RCVSTR [DSC$W_LENGTH]);#� STR$APPEND (RCVSTR, SDSC);�,� INSQUE (.RCV, .FREEQ [QUE_L_TAIL]);� END � ELSE� � BEGIN4� SDSC [DSC$A_POINTER] = .RCV [RCV_L_BUFPTR];5� LEN = CH$DIFF (.EOPTR, .RCV [RCV_L_BUFPTR]);�K� SDSC [DSC$W_LENGTH] = MINU (.LEN, STR_MAX-.RCVSTR [DSC$W_LENGTH]);�#� STR$APPEND (RCVSTR, SDSC);�1� IF CH$RCHAR (.EOPTR) EQL %CHAR (13) THEN�� BEGIN2� IF .SDSC [DSC$W_LENGTH] GEQ .RCNT-2 THEN� BEGIN�6� IF .SDSC [DSC$W_LENGTH] EQL .RCNT-1 THEN(� CTX [CTX_V_IGNORELF] = 1;1� INSQUE (.RCV, .FREEQ [QUE_L_TAIL]);� � END�� ELSE� BEGIN�� LOCAL DELTA;<� DELTA = (IF CH$RCHAR (.EOPTR+1) EQL %CHAR (10)#� THEN 2 ELSE 1);�<� RCV [RCV_L_BUFPTR] = CH$PLUS (.EOPTR, .DELTA);;� RCNT = .RCNT - .SDSC [DSC$W_LENGTH] - .DELTA;�!� INSQUE (.RCV, INQ);�� END; � END � ELSE�� BEGIN2� IF .SDSC [DSC$W_LENGTH] GEQ .RCNT-1 THEN0� INSQUE (.RCV, .FREEQ [QUE_L_TAIL])� ELSE� BEGIN�7� RCV [RCV_L_BUFPTR] = CH$PLUS (.EOPTR, 1);�6� RCNT = .RCNT - .SDSC [DSC$W_LENGTH] - 1;!� INSQUE (.RCV, INQ);�� END; � END;�� FOUND_CRLF = 1;� EXITLOOP; � END;O� END; ! WHILE NOT REMQUE��� IF .FOUND_CRLF THENE � BEGINL!� IF ACTUALCOUNT () GTR 2 THENI � BEGIN� IF .IOSB_A NEQA 0 THEN�� BEGIN3� BIND IOSB = .IOSB_A : NETIO_STATUS_BLOCK;�9� IOSB [NSB$BYTE_COUNT] = .RCVSTR [DSC$W_LENGTH];i)� IOSB [NSB$STATUS] = SS$_NORMAL;E � END;C� IF .ASTADR NEQA 0 THENI:� RETURN $DCLAST (ASTADR=.ASTADR, ASTPRM=.ASTPRM); � END;N� RETURN SS$_NORMAL;N� END;� n-� IF REMQUE (.FREEQ [QUE_L_HEAD], RCV) THENd+� LIB$GET_VM (%REF (RCV_S_RCVDEF), RCV);9)� RCV [RCV_L_BUFPTR] = RCV [RCV_T_BUF];o� RCV [RCV_L_CTX] = .CTX; � RCV [RCV_L_STRPTR] = RCVSTR;�� � IF ACTUALCOUNT () GTR 2 THEN � BEGIN1#� RCV [RCV_L_USRIOSB] = .IOSB_A;I"� RCV [RCV_L_ASTADR] = .ASTADR;"� RCV [RCV_L_ASTPRM] = .ASTPRM;� ENDN� ELSEG� RCV [RCV_L_USRIOSB] = RCV [RCV_L_ASTADR] = RCV [RCV_L_ASTPRM] = 0;���6� CH$MOVE (8, CTX [CTX_Q_EXPTIME], RCV [RC���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%����������������������������������NETLIB_SRC.BCK�����������������P��XP��[NETLIB]NETLIB_CMU_TCP.B32;20��������������������������������������������������������������������������������������������������_�����2������������������������� ������#�������V_Q_TMO]); � IF ACTUALCOUNT () GTR 5 THEN@� IF .TMO_A NEQA 0 THEN CH$MOVE (8, .TMO_A, RCV [RCV_Q_TMO]);��F� $SETIMR (DAYTIM=RCV [RCV_Q_TMO], ASTADR=TCP_TMO_AST, REQIDT=.RCV);>� STATUS = NET$RECEIVE (IOCHAN=.CHN, IO$SB=RCV [RCV_Q_IOSB],;� AST$ADR=TCP_RCV_AST, AST$PRM=.RCV, IOMODE=ASYNCH,T6� BUFADRS=RCV [RCV_T_BUF], BUFSIZE=RCV_S_BUF);��� IF NOT .STATUS THEN � BEGINN� $CANTIM (REQIDT=.RCV);T(� INSQUE (.RCV, .FREEQ [QUE_L_TAIL]);� END�� ELSE'� IF .RCV [RCV_L_ASTADR] EQLA 0 THEN 1� STATUS = $SYNCH (IOSB=RCV [RCV_Q_IOSB]);U�� � .STATUSE���END; ! TCP_GET_LINEO� C�%SBTTL 'TCP_RCV_AST'(�ROUTINE TCP_RCV_AST (RCV : REF RCVDEF) =�BEGIN+�!++ �! FUNCTIONAL DESCRIPTION:��! >�! This AST routine is invoked when a network read completes.@�! It queues up the buffer block for processing by the mainline@�! thread, which will also handle I/O errors. Then a new block<�! is allocated and, barring any errors, a read is reQIO'd.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!c �! PROTOTYPE:�! �! TCP_RCV_AST buf �!o�! IMPLICIT INPUTS: None. �!D�! IMPLICIT OUTPUTS: None.B�!K�! COMPLETION CODES:��! 2�! SS$_NORMAL: normal successful completion.�! �! SIDE EFFECTS:C�! �! None.��!--A��� BIND3� IOSB = RCV [RCV_Q_IOSB] : NETIO_STATUS_BLOCK, 0� STR = .RCV [RCV_L_STRPTR] : BLOCK [,BYTE],.� BUF = RCV [RCV_T_BUF] : BLOCK [,BYTE],4� BUFPTR = RCV [RCV_L_BUFPTR]: REF BLOCK [,BYTE],+� CTX = RCV [RCV_L_CTX] : REF CTXDEF,I%� CHN = CTX [CTX_W_CHAN] : WORD,O:� UIOSB = RCV [RCV_L_USRIOSB] : REF NETIO_STATUS_BLOCK;�� � LOCALC � LEN,L � STATUS, � EOPTR,D � LFPOS,D%� SDSC : BLOCK [DSC$K_S_BLN,BYTE];I��� $CANTIM (REQIDT=.RCV);"� IF NOT .IOSB [NSB$STATUS] THEN � BEGINi� IF .UIOSB NEQA 0 THEN � BEGIN1� CH$MOVE (8, IOSB, .RCV [RCV_L_USRIOSB]);y6� UIOSB [NSB$BYTE_COUNT] = .STR [DSC$W_LENGTH]; � END;�(� INSQUE (.RCV, .FREEQ [QUE_L_TAIL]);'� IF .RCV [RCV_L_ASTADR] NEQA 0 THENC;� RETURN (.RCV [RCV_L_ASTADR]) (.RCV [RCV_L_ASTPRM]). � ELSEE� RETURN SS$_NORMAL;-� END;��!� IF .CTX [CTX_V_IGNORELF] THEN� � BEGIN � CTX [CTX_V_IGNORELF] = 0;.� IF CH$RCHAR (.BUFPTR) EQL %CHAR (10) THEN � BEGIN'� BUFPTR = CH$PLUS (.BUFPTR, 1);E<� IOSB [NSB$BYTE_COUNT] = .IOSB [NSB$BYTE_COUNT] - 1; � END;I� END;��'� SDSC [DSC$B_DTYPE] = DSC$K_DTYPE_T;P'� SDSC [DSC$B_CLASS] = DSC$K_CLASS_S;TE� EOPTR = CH$FIND_CH (.IOSB [NSB$BYTE_COUNT], .BUFPTR, %CHAR (13));VE� LFPOS = CH$FIND_CH (.IOSB [NSB$BYTE_COUNT], .BUFPTR, %CHAR (10));���+� IF CH$FAIL (.EOPTR) THEN EOPTR = .LFPOS�%� ELSE IF NOT CH$FAIL (.LFPOS) THENT/� IF .LFPOS LSSA .EOPTR THEN EOPTR = .LFPOS;P��� IF CH$FAIL (.EOPTR) THEN � BEGINI8� SDSC [DSC$W_LENGTH] = MINU (.IOSB [NSB$BYTE_COUNT],6� STR_MAX-.STR [DSC$W_LENGTH]);$� SDSC [DSC$A_POINTER] = .BUFPTR;� STR$APPEND (STR, SDSC);� BUFPTR = RCV [RCV_T_BUF];G� $SETIMR (DAYTIM=RCV [RCV_Q_TMO], ASTADR=TCP_TMO_AST, REQIDT=.RCV);P?� STATUS = NET$RECEIVE (IOCHAN=.CHN, IO$SB=RCV [RCV_Q_IOSB],D;� AST$ADR=TCP_RCV_AST, AST$PRM=.RCV, IOMODE=ASYNCH,�6� BUFADRS=RCV [RCV_T_BUF], BUFSIZE=RCV_S_BUF);� IF NOT .STATUS THEN � BEGIN� $CANTIM (REQIDT=.RCV);�� IF .UIOSB NEQA 0 THEN� BEGIN2� CH$MOVE (8, IOSB, .RCV [RCV_L_USRIOSB]);7� UIOSB [NSB$BYTE_COUNT] = .STR ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������&����������������������������������NETLIB_SRC.BCK�����������������P��XP��[NETLIB]NETLIB_CMU_TCP.B32;20��������������������������������������������������������������������������������������������������_�����2�������������������������}� �����*�������[DSC$W_LENGTH];,'� UIOSB [NSB$STATUS] = .STATUS;[ � END;$,� INSQUE (.RCV, .FREEQ [QUE_L_TAIL]);+� IF .RCV [RCV_L_ASTADR] NEQA 0 THENE<� RETURN (.RCV [RCV_L_ASTADR]) (.RCV [RCV_L_ASTPRM]) � ELSES� RETURN SS$_NORMAL; � END;L� RETURN SS$_NORMAL� END;��$� LEN = CH$DIFF (.EOPTR, .BUFPTR);C� SDSC [DSC$W_LENGTH] = MINU (.LEN, STR_MAX-.STR [DSC$W_LENGTH]);I#� SDSC [DSC$A_POINTER] = .BUFPTR;E� STR$APPEND (STR, SDSC);O,� IF CH$RCHAR (.EOPTR) EQL %CHAR (13) THEN � BEGIN�>� IF .SDSC [DSC$W_LENGTH] GEQ .IOSB [NSB$BYTE_COUNT]-2 THEN � BEGINB� IF .SDSC [DSC$W_LENGTH] EQL .IOSB [NSB$BYTE_COUNT]-1 THEN#� CTX [CTX_V_IGNORELF] = 1;.,� INSQUE (.RCV, .FREEQ [QUE_L_TAIL]);� END � ELSEv � BEGIN� LOCAL DELTA;_G� DELTA = (IF CH$RCHAR (.EOPTR+1) EQL %CHAR (10) THEN 2 ELSE 1);�+� BUFPTR = CH$PLUS (.EOPTR, .DELTA);L9� IOSB [NSB$BYTE_COUNT] = .IOSB [NSB$BYTE_COUNT] -�,� .SDSC [DSC$W_LENGTH] - .DELTA;)� INSQUE (.RCV, CTX [CTX_Q_BUFQ]); � END;]� ENDF� ELSE � BEGIN >� IF .SDSC [DSC$W_LENGTH] GEQ .IOSB [NSB$BYTE_COUNT]-1 THEN+� INSQUE (.RCV, .FREEQ [QUE_L_TAIL])) � ELSET � BEGIN&� BUFPTR = CH$PLUS (.EOPTR, 1);9� IOSB [NSB$BYTE_COUNT] = .IOSB [NSB$BYTE_COUNT] -P&� .SDSC [DSC$W_LENGTH] - 1;)� INSQUE (.RCV, CTX [CTX_Q_BUFQ]);n � END;m� END;��� IF .UIOSB NEQA 0 THENi � BEGINn%� UIOSB [NSB$STATUS] = SS$_NORMAL; 2� UIOSB [NSB$BYTE_COUNT] = .STR [DSC$W_LENGTH];� END;&� IF .RCV [RCV_L_ASTADR] NEQA 0 THEN0� (.RCV [RCV_L_ASTADR]) (.RCV [RCV_L_ASTPRM])� ELSE� SS$_NORMALc���END; ! TCP_RCV_AST� ,�%SBTTL 'TCP_TMO_AST')�ROUTINE TCP_TMO_AST (RCV : REF RCVDEF) = O�BEGIN �!++��! FUNCTIONAL DESCRIPTION:��!�7�! Delivered when a receive takes longer than EXPTIME. @�! Just cancels the I/O, to trigger the I/O completion AST with�! status SS$_CANCEL.�! B�! RETURNS: cond_value, longword (unsigned), write only, by value�!N �! PROTOTYPE:�!O�! TCP_TMO_AST rcv�![�! IMPLICIT INPUTS: None._�!T�! IMPLICIT OUTPUTS: None. �!D�! COMPLETION CODES:C�!D2�! SS$_NORMAL: normal successful completion.�!(�! SIDE EFFECTS:S�!, �! None.X�!--�� BIND%� CTX = .RCV [RCV_L_CTX] : CTXDEF;C��$� $CANCEL (CHAN=.CTX [CTX_W_CHAN])���END; ! TCP_TMO_AST���END��ELUDOMIN� $INIT_DYNDESC (STR);�K� STR$CONCAT (STR, SNDSTR, %ASCID %ST������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������'����������������������������������NETLIB_SRC.BCK�����������������P��XP��[NETLIB]NETLIB_CMU_UDP.B32;8���������������������������������������������������������������������������������������������������O���������������������������������������������*�[NETLIB]NETLIB_CMU_UDP.B32;8�+��,�P���.�����/� �@� �4�O������ � �������������������-�XP���0���1����2���3������K��P���W���O�����5���6� ,)��7�<,)��8�.wPډX��9�$.��G� �@��H��J������� �������������%TITLE 'NETLIB_CMU_UDP'�$�MODULE NETLIB_CMU_UDP (IDENT='V1.2',J� ADDRESSING_MODE (EXTERNAL=LONG_RELATIVE,NONEXTERNAL=LONG_RELATIVE)) =�BEGIN��!++��! FACILITY: NETLIB��!�-�! ABSTRACT: UDP NETLIB routines for CMU.��!��! MODULE DESCRIPTION:��!�3�! Contains UDP send and receive routines for CMU.��!��! AUTHOR: M. Madison�A�! COPYRIGHT 1991, RENSSELAER POLYTECHNIC INSTITUTE.�"�! ALL RIGHTS RESERVED.�!��! CREATION DATE: 29-JAN-1991��!��! MODIFICATION HISTORY:��!�?�! 29-JAN-1991 V1.0 Madison Initial coding (from NSQUERY).�G�! 08-FEB-1991 V1.1 Madison Add source info return to UDP_RECEIVE.�;�! 22-NOV-1991 V1.2 Madison Add rcvtmo to UDP_RECEIVE.��!--�"� LIBRARY 'SYS$LIBRARY:STARLET';*� LIBRARY 'CMUTEK_SRC:[CENTRAL]NETWORK';,� LIBRARY 'CMUTEK_SRC:[CENTRAL]NETCOMMON';� LIBRARY 'CMU_DEFS';�� LIBRARY 'NETLIB';���� FORWARD ROUTINE�� UDP_SEND,� UDP_RECEIVE,�� TIMER_AST;���� EXTERNAL ROUTINE� NET_CVT_STATUS;� ��%SBTTL 'UDP_SEND'�L�GLOBAL ROUTINE UDP_SEND (CTX_A_A, ADR, PORT : WORD, BUFPTR, BUFLEN : WORD) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!��! Sends out a UDP datagram.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�1�! UDP_SEND chan, address, port, bufptr, buflen��!�9�! chan: channel, word (unsigned), read only, by value�G�! address: longword_unsigned, longword (unsigned), read only, by value�?�! port: word_unsigned, word (unsigned), read only, by value�E�! bufptr: varying_arg, longword (unsigned), read only, by reference�?�! buflen: word_unsigned, word (unsigned), read only, by value��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND(� CTX = .CTX_A_A : REF CTXDEF,%� CHAN = CTX [CTX_W_CHAN] : WORD;��� � LOCAL�� IOSB : NETIO_STATUS_BLOCK,�!� IPADR : IPADR$ADDRESS_BLOCK,� � STATUS;��� IPADR [IPADR$SRC_HOST] = 0;�"� IPADR [IPADR$DST_HOST] = .ADR;� IPADR [IPADR$SRC_PORT] = 0;�#� IPADR [IPADR$DST_PORT] = .PORT;�7� STATUS = NET$SEND (IOCHAN=.CHAN, IO$SB=IOSB, EOL=1,�8� BUFADRS=.BUFPTR, BUFSIZE=.BUFLEN, ADDR_SPEC=IPADR);F� IF .STATUS THEN STATUS = (IF .IOSB [NSB$STATUS] EQL SS$_ABORT THENF� NET_CVT_STATUS (.IOSB [NSB$XERROR]) ELSE .IOSB [NSB$STATUS]); � .STATUS����END; ! UDP_SEND�� ��%SBTTL 'UDP_RECEIVE'E�GLOBAL ROUTINE UDP_RECEIVE (CTX_A_A, BUFPTR, BUFSIZ : WORD, BUFLEN_A,�.� SRCADR_A, SRCPRT_A, RCVTMO_A) = �BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!��! Reads a UDP datagram.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�J�! UDP_RECEIVE ctx, bufptr, bufsiz, buflen [,srcadr] [,srcprt] [,rcvtmo]�!�@�! ctx: context, longword (unsigned), read only, by referenceF�! bufptr: varying_arg, longword (unsigned), write only, by reference?�! bufsiz: word������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(����������������������������������NETLIB_SRC.BCK�����������������P��XP��[NETLIB]NETLIB_CMU_UDP.B32;8���������������������������������������������������������������������������������������������������O������������������������������"(� ������������_unsigned, word (unsigned), read only, by value�D�! buflen: word_unsigned, word (unsigned), write only, by referenceL�! srcadr: longword_unsigned, longword (unsigned), write only, by referenceL�! srcprt: longword_unsigned, longword (unsigned), write only, by referenceA�! rcvtmo: date_time, quadword (signed), read only, by reference��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND(� CTX = .CTX_A_A : REF CTXDEF,%� CHAN = CTX [CTX_W_CHAN] : WORD,�$� BUFLEN = .BUFLEN_A : WORD;�� � BUILTIN�� ACTUALCOUNT;��� � LOCAL�� RCVTMO : VECTOR [2,LONG],� INFO : VECTOR [3,LONG],� IOSB : NETIO_STATUS_BLOCK,�!� IPADR : IPADR$ADDRESS_BLOCK,� � STATUS;��� IPADR [IPADR$SRC_HOST] = 0;�� IPADR [IPADR$DST_HOST] = 0;�� IPADR [IPADR$SRC_PORT] = 0;�� IPADR [IPADR$DST_PORT] = 0;���"� STATUS = ACTUALCOUNT () GTR 6;.� IF .STATUS THEN STATUS = .RCVTMO_A NEQA 0;2� IF .STATUS THEN CH$MOVE (8, .RCVTMO_A, RCVTMO)<� ELSE $BINTIM (TIMBUF=%ASCID'0 00:00:10', TIMADR=RCVTMO);��� INFO [0] = .CHAN;�� INFO [1] = IOSB;� INFO [2] = SS$_NORMAL;;� $SETIMR (DAYTIM=RCVTMO, ASTADR=TIMER_AST, REQIDT=INFO);�D� STATUS = NET$RECEIVE (IOCHAN=.CHAN, IO$SB=IOSB, BUFADRS=.BUFPTR,'� BUFSIZE=.BUFSIZ, ADDR_SPEC=IPADR);�� $CANTIM (REQIDT=INFO);,� IF NOT .INFO [2] THEN STATUS = .INFO [2]K� ELSE IF .STATUS THEN STATUS = (IF .IOSB [NSB$STATUS] EQL SS$_ABORT THEN�G� NET_CVT_STATUS (.IOSB [NSB$XERROR]) ELSE .IOSB [NSB$STATUS]);�=� BUFLEN = (IF .STATUS THEN .IOSB [NSB$BYTE_COUNT] ELSE 0);�� IF .STATUS THEN� � BEGIN�!� IF ACTUALCOUNT () GTR 4 THEN�F� IF .SRCADR_A NEQA 0 THEN .SRCADR_A = .IPADR [IPADR$SRC_HOST];!� IF ACTUALCOUNT () GTR 5 THEN�F� IF .SRCPRT_A NEQA 0 THEN .SRCPRT_A = .IPADR [IPADR$SRC_PORT];� END;�� � .STATUS����END; ! UDP_RECEIVE� ��%SBTTL 'TIMER_AST'�ROUTINE TIMER_AST (INFO_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�F�! This AST routine is triggered when the net receive timer goes off.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! TIMER_AST info��!�O�! info: vector_longword_unsigned, longword (unsigned), modify, by reference��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND&� INFO = .INFO_A : VECTOR [3,LONG], � IOSB = .INFO [1] : IOSBDEF;��2� INFO [2] = IOSB [IOSB_W_STATUS] = SS$_TIMEOUT;� $CANCEL (CHAN=.INFO [0]);���� SS$_NORMAL���END; ! TIMER_AST���END��ELUDOM��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������)����������������������������������NETLIB_SRC.BCK�����������������17��XP��"[NETLIB]NETLIB_MULTINET_NET.B32;47���������������������������������������������������������������������������������������������P�����-���������������������������������������"�*�[NETLIB]NETLIB_MULTINET_NET.B32;47�+��,�17���.�-����/� �@� �4�P���-���+�J�������������������-�XP���0���1����2���3������K��P���W���O�.����5���6�.-p��7�n Ip��8�L��9�$.��G� �@��H��J����������������� �������������%TITLE 'NETLIB_MULTINET_NET'+�MODULE NETLIB_MULTINET_NET (IDENT='V1.5-1',�J� ADDRESSING_MODE (EXTERNAL=LONG_RELATIVE,NONEXTERNAL=LONG_RELATIVE)) =�BEGIN��!++��! FACILITY: NETLIB��!�A�! ABSTRACT: Common network library routines for TGV MultiNet�-�! and Process Software's TCPware.��!��! MODULE DESCRIPTION:��!��! AUTHOR: M. Madison�F�! COPYRIGHT 1991, 1992 RENSSELAER POLYTECHNIC INSTITUTE."�! ALL RIGHTS RESERVED.�!��! CREATION DATE: 04-FEB-1991��!��! MODIFICATION HISTORY:��!�0�! 04-FEB-1991 V1.0 Madison Initial coding.=�! 19-MAR-1991 V1.1 Madison Memory handling refinements.�B�! 05-SEP-1991 V1.2 Madison Add NOT_PASSIVE flag on NET_BIND.?�! 20-NOV-1991 V1.2-1 Madison Add REUSEADDR socket option.�9�! 04-DEC-1991 V1.2-2 Madison Improve debug support.�K�! 11-FEB-1992 V1.2-3 Madison GETSOCKNAME returned length is longword.�H�! 11-FEB-1992 V1.3 Madison Merge in Bernie Volz's TCPware support.;�! 07-JAN-1993 V1.3-1 Madison Update for TCPware V3.0.�G�! 22-MAR-1993 V1.4 Madison Bring in socket libraries at run-time.�:�! 26-MAR-1993 V1.4-1 Madison LIB$SIG_TO_RET unwinds!?�! 21-DEC-1993 V1.5 Madison First crack at WINTCP support.�K�! 07-JAN-1994 V1.5-1 Madison Have GETHOSTNAME call on socket library.�9�! 12-JAN-1994 V1.5-2 Madison Gack. GETHOSTNAME fix.��!--���� COMPILETIME�*� FOR_TCPWARE = (%VARIANT AND 2) NEQ 0,*� FOR_WINTCP = (%VARIANT AND 4) NEQ 0;��"� LIBRARY 'SYS$LIBRARY:STARLET';&� LIBRARY 'SYS$LIBRARY:UCX$INETDEF';� LIBRARY 'NETLIB';�� LIBRARY 'NETLIBDEF';$� LIBRARY 'MULTINET_TCPWARE_DEFS';��� FORWARD ROUTINE�� NET_ASSIGN,� NET_DEASSIGN,� NET_BIND,� NET_GET_ADDRESS,�� NET_ADDR_TO_NAME,� NET_GET_INFO,� NET_GET_HOSTNAME,� NET_CVT_STATUS,� NET_SET_TRACE_ROUTINE�%IF NOT FOR_WINTCP %THEN� ,GETHOSTBYNAME�� ,GETHOSTBYADDR�� ,GETHOSTNAME�� ,FIND_IMAGE_SYMBOL��%FI ! NOT FOR_WINTCP� ;���%IF FOR_WINTCP %THEN� EXTERNAL ROUTINE7� G_HAT (GETHOSTBYNAME, GETHOSTBYADDR, GETHOSTNAME);��%FI ! FOR_WINTCP��� EXTERNAL ROUTINE>� G_HAT (LIB$GET_VM, LIB$FREE_VM, STR$CONCAT, STR$FREE1_DX,<� STR$APPEND, STR$COPY_DX, STR$FIND_FIRST_NOT_IN_SET,<� STR$TRANSLATE, LIB$CVT_DTB, STR$UPCASE, STR$COPY_R,+� LIB$CREATE_VM_ZONE, LIB$PUT_OUTPUT��%IF NOT FOR_WINTCP %THEN/� ,LIB$SIG_TO_RET ,LIB$FIND_IMAGE_SYMBOL��%FI ! NOT FOR_WINTCP � );��� � GLOBAL.� TRACE_ROUTINE : INITIAL (LIB$PUT_OUTPUT);��� OWN� � CTXZONE : INITIAL (0);� ��%SBTTL 'NET_ASSIGN'�%�GLOBAL ROUTINE NET_ASSIGN (CTX_A_A) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�E�! This routine assigns a network channel for subsequent operations.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! NET_ASSIGN nodename��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORM��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������*����������������������������������NETLIB_SRC.BCK�����������������17��XP��"[NETLIB]NETLIB_MULTINET_NET.B32;47���������������������������������������������������������������������������������������������P�����-������������������������� �������������AL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND*� CTX = .CTX_A_A : REF CTXDEF;�� � LOCAL� � ASTSTAT,� � STATUS;��!� ASTSTAT = $SETAST (ENBFLG=0);�� IF .CTXZONE EQLA 0 THEN� � BEGIN�A� STATUS = LIB$CREATE_VM_ZONE (CTXZONE, %REF (LIB$K_VM_FIXED),�� %REF (CTX_S_CTXDEF),�;� %REF (LIB$M_VM_GET_FILL0 OR LIB$M_VM_EXTEND_AREA),�� %REF (4), %REF (4),<� %REF (8), %REF (8), 0, 0, %ASCID'NETLIB_CTX_ZONE');8� IF .ASTSTAT EQL SS$_WASSET THEN $SETAST (ENBFLG=1);(� IF NOT .STATUS THEN RETURN .STATUS;� END�� ELSE8� IF .ASTSTAT EQL SS$_WASSET THEN $SETAST (ENBFLG=1);��<� STATUS = LIB$GET_VM (%REF (CTX_S_CTXDEF), CTX, CTXZONE);'� IF NOT .STATUS THEN RETURN .STATUS;� � BEGIN�+� BIND BUFQ = CTX [CTX_Q_BUFQ] : QUEDEF;�2� BUFQ [QUE_L_TAIL] = BUFQ [QUE_L_HEAD] = BUFQ;E� $BINTIM (TIMBUF=%ASCID'0 00:05:00', TIMADR=CTX [CTX_Q_EXPTIME]);�� END;��D� STATUS = $ASSIGN (DEVNAM=%ASCID'INET0:', CHAN=CTX [CTX_W_CHAN]);H� IF NOT .STATUS THEN LIB$FREE_VM (%REF (CTX_S_CTXDEF), CTX, CTXZONE);�� � .STATUS����END; ! NET_ASSIGN�� ��%SBTTL 'NET_BIND'�J�GLOBAL ROUTINE NET_BIND (CTX_A_A, PROTOCOL, PORT, XTHREADS, NOT_PASSIVE) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�C�! This routine creates and binds a local socket for the specified� �! protocol.��!�A�! If the port number is specified, the connection is assumed to�F�! be passive and a listener channel is established, with the maximumE�! number of simultaneous incoming connections specified by XTHREADS�F�! (defaults to 4 if not specified). If the NOT_PASSIVE flag is set,D�! the connection is opened as an active channel with the specifiedJ�! port as the source, and XTHREADS is ignored. If no PORT is specified,H�! the connection is assumed to be active and a source port is assigned�! at random.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�<�! NET_BIND ctx, protocol [,port] [,threads] [,not_passive]�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND*� CTX = .CTX_A_A : REF CTXDEF;��� BUILTIN ACTUALCOUNT;�� � LOCAL�� IOSB : IOSBDEF,,� LCLSIN : BLOCK [SIN$C_LENGTH,BYTE], � THREADS,� � ACTIVE, � STATUS;��<� ACTIVE = (IF ACTUALCOUNT () GTR 4 THEN .NOT_PASSIVE ELSE=� IF ACTUALCOUNT () GTR 2 THEN (.PORT EQL 0) ELSE 1);���� SELECTONE .PROTOCOL OF� SET�� [NET_K_TCP] :�L� STATUS = $QIOW (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_SOCKET, IOSB=IOSB,.� P1=INET$C_AF_INET, P2=UCX$C_STREAM);� [NET_K_UDP] :�L� STATUS = $QIOW (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_SOCKET, IOSB=IOSB,-� P1=INET$C_AF_INET, P2=UCX$C_DGRAM);�� TES;��*� LCLSIN [SIN$W_FAMILY] = UCX$C_AF_INET; � IF ACTUALCOUNT () GTR 2 THEN � BEGIN�)� BIND NPORT = PORT : VECTOR [4,BYTE];�7� LCLSIN [SIN$W_PORT] = .NPORT [0] ^ 8 + .NPORT [1];�� IF .ACTIVE THEN � � BEGIN� THREADS = 0;�E� STATUS = $QIOW (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_SETSOCKOPT,�F� IOSB=IOSB, P1=%X'FFFF', P2=SOCKOPT$M_REUSEADDR, P3=%REF (1),� P4=4);I� IF .STATUS THEN STATUS = NET_CVT_STATUS (.IOSB [IOSB_W_STATUS]);�,� IF NOT .STATUS THEN RETURN .STATUS;� ENDD� ELSE THREADS = (IF ACTUALCOUNT () GTR 3 THEN .XTHREADS ELSE 4);� ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������+����������������������������������NETLIB_SRC.BCK�����������������17��XP��"[NETLIB]NETLIB_MULTINET_NET.B32;47���������������������������������������������������������������������������������������������P�����-�������������������������8������������� END�� ELSE � BEGIN�� LCLSIN [SIN$W_PORT] = 0;�� THREADS = 0;�A� STATUS = $QIOW (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_SETSOCKOPT,�L� IOSB=IOSB, P1=%X'FFFF', P2=SOCKOPT$M_REUSEADDR, P3=%REF (1), P4=4);E� IF .STATUS THEN STATUS = NET_CVT_STATUS (.IOSB [IOSB_W_STATUS]);�(� IF NOT .STATUS THEN RETURN .STATUS;� END;,� LCLSIN [SIN$L_ADDR] = INET$C_INADDR_ANY;9� CH$FILL (%CHAR (0), SIN$S_ZERO, LCLSIN [SIN$T_ZERO]);�E� STATUS = $QIOW (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_BIND, IOSB=IOSB,�!� P1=LCLSIN, P2=SIN$C_LENGTH);�D� IF .STATUS THEN STATUS = NET_CVT_STATUS (.IOSB [IOSB_W_STATUS]);��#� IF .STATUS AND NOT .ACTIVE THEN� � BEGIN�=� STATUS = $QIOW (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_LISTEN,�!� IOSB=IOSB, P1=.THREADS);�E� IF .STATUS THEN STATUS = NET_CVT_STATUS (.IOSB [IOSB_W_STATUS]);�� END;�� � .STATUS����END; ! NET_BIND�� ��%SBTTL 'NET_GET_ADDRESS'M�GLOBAL ROUTINE NET_GET_ADDRESS (CTX_A_A, HOST_A, ALSIZE, ALIST_A, ALCNT_A) = ��BEGIN��� ������������!++��! FUNCTIONAL DESCRIPTION:��!�D�! Given a host name, returns an array of valid Internet addresses.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�5�! NET_GET_ADDRESS ctx, host, arrsiz, array, retcnt��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND&� CTX = .CTX_A_A : REF CTXDEF,(� CHN = CTX [CTX_W_CHAN] : WORD,+� NODENAME = .HOST_A : BLOCK [,BYTE],�+� ALIST = .ALIST_A : VECTOR [,LONG],�� ALCNT = .ALCNT_A;�� � LOCAL�/� HENT : REF BLOCK [HOST$S_HOSTENTDEF,BYTE],� � STATUS;��K� IF STR$FIND_FIRST_NOT_IN_SET (NODENAME, %ASCID'0123456789.') NEQ 0 THEN� � BEGIN�*� LOCAL STR : BLOCK [DSC$K_S_BLN,BYTE];� ALCNT = 0;�� INIT_DYNDESC (STR);<� STR$CONCAT (STR, NODENAME, %ASCID %STRING (%CHAR (0)));1� HENT = GETHOSTBYNAME (.STR [DSC$A_POINTER]);�� FREE_STRINGS (STR);0� IF .HENT EQLA 0 THEN STATUS = SS$_ENDOFFILE � ELSE� � BEGINC� BIND PTRLST = .HENT [HOST$L_H_ADDR_LIST] : VECTOR [,LONG];�� INCR I FROM 0 DO�� BEGIN/� IF .PTRLST [.I] EQLA 0 THEN EXITLOOP;�.� IF .ALCNT GEQ .ALSIZE THEN EXITLOOP;)� ALIST [.ALCNT] = ..PTRLST [.I];�� ALCNT = .ALCNT + 1;� � END;�� STATUS = SS$_NORMAL;� � END;�� END�� ELSE BEGIN � LOCAL� ADRL : VOLATILE,�$� ADRB : REF VECTOR [4,BYTE],� CHP, DOTP,�� LEN, XLEN, VAL;��� ADRB = ADRL;�%� CHP = .NODENAME [DSC$A_POINTER];�$� LEN = .NODENAME [DSC$W_LENGTH];� INCR I FROM 0 TO 3 DO � BEGIN%� IF .LEN LSS 1 THEN EXITLOOP;�/� DOTP = CH$FIND_CH (.LEN, .CHP, %C'.');�,� IF CH$FAIL (.DOTP) THEN XLEN = .LEN+� ELSE XLEN = CH$DIFF (.DOTP, .CHP);�(� LIB$CVT_DTB (.XLEN, .CHP, VAL);!� ADRB [.I] = .VAL<0,8,0>;� � LEN = .LEN - .XLEN - 1;"� CHP = CH$PLUS (.DOTP, 1); � END;�� IF .ALSIZE GTR 0 THEN � BEGIN� ALCNT = 1;�� ALIST [0] = .ADRL;� � END;�� STATUS = SS$_NORMAL;�� END;�� � .STATUS����END; ! NET_GET_ADDRESS� ��%SBTTL 'NET_ADDR_TO_NAME'�8�GLOBAL ROUTINE NET_ADDR_TO_NAME (CTX_A_A, ADR, NAME_A) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�L�! Given an IP address, returns the corresponding host name (if available).�!�B�! RETURNS: cond_value, longword (unsigned)�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������,����������������������������������NETLIB_SRC.BCK�����������������17��XP��"[NETLIB]NETLIB_MULTINET_NET.B32;47���������������������������������������������������������������������������������������������P�����-��������������������������������������, write only, by value�!� �! PROTOTYPE:�!�%�! NET_ADDR_TO_NAME host, adr, name��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND&� CTX = .CTX_A_A : REF CTXDEF,(� NAME = .NAME_A : BLOCK [,BYTE];�� � LOCAL�/� HENT : REF BLOCK [HOST$S_HOSTENTDEF,BYTE],�� CP, � STATUS;��2� HENT = GETHOSTBYADDR (ADR, 4, INET$C_AF_INET);/� IF .HENT EQLA 0 THEN STATUS = SS$_ENDOFFILE�� ELSE � BEGIN�/� CP = (INCR P FROM .HENT [HOST$L_H_NAME] DO�;� IF CH$RCHAR (.P) EQL %CHAR (0) THEN EXITLOOP .P);�C� STR$COPY_R (NAME, %REF (CH$DIFF (.CP, .HENT [HOST$L_H_NAME])),� � .HENT [HOST$L_H_NAME]);� STATUS = SS$_NORMAL;�� END;�� � .STATUS����END; ! NET_ADDR_TO_NAME�� ��%SBTTL 'NET_DEASSIGN'�'�GLOBAL ROUTINE NET_DEASSIGN (CTX_A_A) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�-�! This routine deassigns a network channel.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! NET_DEASSIGN ctx��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND*� CTX = .CTX_A_A : REF CTXDEF;�� � LOCAL� � STATUS;��%� $DASSGN (CHAN=.CTX [CTX_W_CHAN]);�4� LIB$FREE_VM (%REF (CTX_S_CTXDEF), CTX, CTXZONE); � CTX = 0;��� SS$_NORMAL���END; ! NET_DEASSIGN�� ��%SBTTL 'NET_GET_INFO'�P�GLOBAL ROUTINE NET_GET_INFO (CTX_A_A, REMADR_A, REMPRT_A, LCLADR_A, LCLPRT_A) = �BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�A�! Gets address and port information about a network connection.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�:�! NET_GET_INFO ctx, remadr [,remprt] [,lcladr] [,lclprt]�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--� � BUILTIN�� ACTUALCOUNT;�� BIND/� CTX = .CTX_A_A : REF CTXDEF,�8� REMSIN = CTX [CTX_X_REMSIN] : BLOCK [,BYTE];�� � IF ACTUALCOUNT () GTR 3 THEN � BEGIN� � LOCAL-� LCLSIN : BLOCK [SIN$C_LENGTH,BYTE],�� IOSB : IOSBDEF,�� RETLEN,� STATUS;��� RETLEN = SIN$C_LENGTH;�B� STATUS = $QIOW (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_GETSOCKNAME,*� IOSB=IOSB, P1=LCLSIN, P2=RETLEN);E� IF .STATUS THEN STATUS = NET_CVT_STATUS (.IOSB [IOSB_W_STATUS]);�� IF .STATUS THEN � BEGING� IF ACTUALCOUNT () GTR 4 THEN .LCLPRT_A = .LCLSIN [SIN$W_PORT];�G� IF ACTUALCOUNT () GTR 3 THEN .LCLADR_A = .LCLSIN [SIN$L_ADDR];�� END� ELSE RETURN .STATUS;�� END;��B� IF ACTUALCOUNT () GTR 2 THEN .REMPRT_A = .REMSIN [SIN$W_PORT];B� IF ACTUALCOUNT () GTR 1 THEN .REMADR_A = .REMSIN [SIN$L_ADDR];��� SS$_NORMAL���END; ! NET_GET_INFO�� ��%SBTTL 'NET_GET_HOSTNAME'�1�GLOBAL ROUTINE NET_GET_HOSTNAME (HST_A, LEN_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�+�! Returns this host's Internet host name.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�%�! NET_GET_HOSTNAME hostname [,len]��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������-����������������������������������NETLIB_SRC.BCK�����������������17��XP��"[NETLIB]NETLIB_MULTINET_NET.B32;47���������������������������������������������������������������������������������������������P�����-�������������������������s��������������!� �! None.��!--�� BUILTIN ACTUALCOUNT;�� � LOCAL�!� HSTBUF : VECTOR [1024,BYTE],�� CP,� STATUS : SIGNED;���9� STATUS = GETHOSTNAME (HSTBUF, %ALLOCATION(HSTBUF)-1);�.� IF .STATUS LSS 0 THEN RETURN SS$_NOLOGNAM;��>� CP = CH$FIND_CH (%ALLOCATION (HSTBUF), HSTBUF, %CHAR (0));.� IF CH$FAIL (.CP) THEN RETURN SS$_NOLOGNAM;�� � IF ACTUALCOUNT () GTR 1 THEN:� IF .LEN_A NEQA 0 THEN .LEN_A = CH$DIFF (.CP, HSTBUF);��>� STR$COPY_R (.HST_A, %REF (CH$DIFF (.CP, HSTBUF)), HSTBUF);��� SS$_NORMAL���END; ! NET_GET_HOSTNAME�� ��%SBTTL 'NET_CVT_STATUS'�%�GLOBAL ROUTINE NET_CVT_STATUS (RC) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�M�! Converts a MultiNet/TCPware return code to an SS$_ equivalent (from UCX).��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! NET_CVT_STATUS rc�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� SELECTONE .RC OF� SET�>� [INET__ENOMEM,INET__EMSGSIZE,INET__ENOBUFS] : SS$_INSFMEM;8� [INET__ENOTSOCK,INET__EOPNOTSUPP] : SS$_ILLCNTRFUNC;>� [INET__EPROTOTYPE,INET__ENOPROTOOPT,INET__EPROTONOSUPPORT,.� INET__ESOCKTNOSUPPORT,INET__EPFNOSUPPORT,(� INET__EAFNOSUPPORT] : SS$_PROTOCOL;F� [INET__EDESTADDRREQ,INET__ENOTCONN,INET__ESHUTDOWN] : SS$_NOLINKS;5� [INET__EADDRINUSE,INET__EISCONN] : SS$_FILALRACC;� � [INET__EACCES] : SS$_NOPRI�������������V;'� [INET__EADDRNOTAVAIL] : SS$_IVADDR;� � [INET__ENETDOWN] : SS$_SHUT;M� [INET__ENETUNREACH,INET__EHOSTDOWN,INET__EHOSTUNREACH] : SS$_UNREACHABLE;�K� [INET__ENETRESET,INET__ECONNABORTED,INET__ECONNRESET] : SS$_LINKDISCON;�$� [INET__ETIMEDOUT] : SS$_TIMEOUT;&� [INET__ECONNREFUSED] : SS$_REJECT;� [OTHERWISE] : .RC;� TES����END; ! NET_CVT_STATUS�� ��%SBTTL 'NET_SET_TRACE_ROUTINE'/�GLOBAL ROUTINE NET_SET_TRACE_ROUTINE (RTN_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�@�! Sets the trace routine to be used instead of LIB$PUT_OUTPUT.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! NET_SET_TRACE_ROUTINE��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���8� IF .RTN_A EQLA 0 THEN TRACE_ROUTINE = LIB$PUT_OUTPUT � ELSE TRACE_ROUTINE = .RTN_A;� SS$_NORMAL���END;���%IF NOT FOR_WINTCP %THEN� '�%SBTTL 'GETHOSTBYNAME'!�ROUTINE GETHOSTBYNAME (NAME_A) = .�BEGIN��!++A�! FUNCTIONAL DESCRIPTION:N�!EL�! Dynamically maps in appropriate run-time code to perform a gethostbyname �! function. �! �! RETURNS: pointer�!o �! PROTOTYPE:�!l�! GETHOSTBYNAME name�!c1�! name: ASCIZ string, read only, by reference��!��! IMPLICIT INPUTS: None.o�!��! IMPLICIT OUTPUTS: None.9�! �! COMPLETION CODES:E�!I�! NULL: error occurred.L�!I�! SIDE EFFECTS:��! �! None.T�!-- � OWN9� RTNPTR : INITIAL (0),�%IF FOR_TCPWARE %THEN9C� IMGNAM : VECTOR [2,LONG] INITIAL (%ASCID'TCPWARE_SOCKLIB_SHR',M3� %ASCID'TCPIP_SOCKLIB'),dE� RTNNAM : VECTOR [2,LONG] INITIAL (%ASCID'TCPWARE_GETHOSTBYNAME',s3� %ASCID'GETHOSTBYNAME'); � LITERALn� IMG_COUNT = 2,o� RTN_COUNT = 2;1�%ELSEdH� IMGNAM : VECTOR [1,LONG] INITIAL (%ASCID'MULTINET_SOCKET_LIBRARY'),?� RTNNAM : VECTOR [1,LONG] INITIAL (%ASCID'GETHOSTBYNA�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.����������������������������������NETLIB_SRC.BCK�����������������17��XP��"[NETLIB]NETLIB_MULTINET_NET.B32;47���������������������������������������������������������������������������������������������P�����-�������������������������������#�������ME');9�� � LITERALn� IMG_COUNT = 1, � RTN_COUNT = 1; �%FIM � LOCALB � STATUS;��� RTNPTR = 0;i#� INCR I FROM 0 TO IMG_COUNT-1 DO � BEGINT$� INCR J FROM 0 TO RTN_COUNT-1 DO � BEGINI� STATUS = FIND_IMAGE_SYMBOL (.IMGNAM [.I], .RTNNAM [.J], RTNPTR);H5� IF .STATUS AND .RTNPTR NEQA 0 THEN EXITLOOP;2 � END; 1� IF .STATUS AND .RTNPTR NEQA 0 THEN EXITLOOP;�� END;��$� IF .RTNPTR EQLA 0 THEN RETURN 0;��� (.RTNPTR)(.NAME_A)���END; ! GETHOST� �����$�������BYNAME� S�%SBTTL 'GETHOSTBYADDR'.�ROUTINE GETHOSTBYADDR (ADDR_A, ASIZE, AFAM) = �BEGINI�!++��! FUNCTIONAL DESCRIPTION: �!IL�! Dynamically maps in appropriate run-time code to perform a gethostbyaddr �! function.��! �! RETURNS: pointer�!A �! PROTOTYPE:�!T%�! GETHOSTBYADDR addr, asize, afam �!T"�! addr: longword, by reference�! asize: longword, by value�! afam: longword, by value�!S�! IMPLICIT INPUTS: None.D�!��! IMPLICIT OUTPUTS: None.I�!I�! COMPLETION CODES:O�!O�! NULL: error occurred.I�!P�! SIDE EFFECTS:N�!R �! None. �!--T� OWNB� RTNPTR : INITIAL (0),�%IF FOR_TCPWARE %THENTC� IMGNAM : VECTOR [2,LONG] INITIAL (%ASCID'TCPWARE_SOCKLIB_SHR',C3� %ASCID'TCPIP_SOCKLIB'),XE� RTNNAM : VECTOR [2,LONG] INITIAL (%ASCID'TCPWARE_GETHOSTBYADDR',U3� %ASCID'GETHOSTBYADDR');P � LITERALI� IMG_COUNT = 2,�� RTN_COUNT = 2;T�%ELSEIH� IMGNAM : VECTOR [1,LONG] INITIAL (%ASCID'MULTINET_SOCKET_LIBRARY'),?� RTNNAM : VECTOR [1,LONG] INITIAL (%ASCID'GETHOSTBYADDR');E�� � LITERAL � IMG_COUNT = 1,S� RTN_COUNT = 1;N�%FIS�� � LOCAL � STATUS;��� RTNPTR = 0;S#� INCR I FROM 0 TO IMG_COUNT-1 DOg � BEGINk$� INCR J FROM 0 TO RTN_COUNT-1 DO � BEGINI� STATUS = FIND_IMAGE_SYMBOL (.IMGNAM [.I], .RTNNAM [.J], RTNPTR);:5� IF .STATUS AND .RTNPTR NEQA 0 THEN EXITLOOP; � END;�1� IF .STATUS AND .RTNPTR NEQA 0 THEN EXITLOOP;�� END;��$� IF .RTNPTR EQLA 0 THEN RETURN 0;��%� (.RTNPTR)(.ADDR_A, .ASIZE, .AFAM)e���END; ! GETHOSTBYADDR� C�%SBTTL 'GETHOSTNAME''�ROUTINE GETHOSTNAME (NAME_A, BUFSIZ) = T�BEGIN �!++U�! FUNCTIONAL DESCRIPTION: �!BL�! Dynamically maps in appropriate run-time code to perform a gethostbyname �! function.,�!E�! RETURNS: pointer�! �! PROTOTYPE:�!C�! GETHOSTBYNAME name�!M1�! name: ASCIZ string, read only, by reference%�! �! IMPLICIT INPUTS: None.E�!8�! IMPLICIT OUTPUTS: None.E�!B�! COMPLETION CODES: �!T�! NULL: error occurred.A�!(�! SIDE EFFECTS:I�!O �! None.H�!--T� OWNU� RTNPTR : INITIAL (0),�%IF FOR_TCPWARE %THENSC� IMGNAM : VECTOR [2,LONG] INITIAL (%ASCID'TCPWARE_SOCKLIB_SHR',C3� %ASCID'TCPIP_SOCKLIB'),NC� RTNNAM : VECTOR [2,LONG] INITIAL (%ASCID'TCPWARE_GETHOSTNAME',�1� %ASCID'GETHOSTNAME');� � LITERAL(� IMG_COUNT = 2,0� RTN_COUNT = 2;P�%ELSE�H� IMGNAM : VECTOR [1,LONG] INITIAL (%ASCID'MULTINET_SOCKET_LIBRARY'),=� RTNNAM : VECTOR [1,LONG] INITIAL (%ASCID'GETHOSTNAME');E�� � LITERALE� IMG_COUNT = 1,N� RTN_COUNT = 1;S�%FI' � LOCAL� � STATUS;��� RTNPTR = 0; #� INCR I FROM 0 TO IMG_COUNT-1 DO) � BEGIN�$� INCR J FROM 0 TO RTN_COUNT-1 DO � BEGINI� STATUS = FIND_IMAGE_SYMBOL (.IMGNAM [.I], .RTNNAM [.J], RTNPTR);�5� IF .STATUS AND .RTNPTR NEQA 0 THEN EXITLOOP;s � END;�1� IF .STATUS AND .RTNPTR NEQA 0 THEN EXITLOOP;h� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/����������������������������������NETLIB_SRC.BCK�����������������17��XP��"[NETLIB]NETLIB_MULTINET_NET.B32;47���������������������������������������������������������������������������������������������P�����-�������������������������Jr������*������� END;��%� IF .RTNPTR EQLA 0 THEN RETURN -1;c��� (.RTNPTR)(.NAME_A, .BUFSIZ)E���END; ! GETHOSTNAME� i�%SBTTL 'FIND_IMAGE_SYMBOL';�ROUTINE FIND_IMAGE_SYMBOL (IMGNAM_A, SYMNAM_A, SYMVAL_A) = t�BEGINn�!++i�! FUNCTIONAL DESCRIPTION:a�!hC�! Wrapper routine for LIB$FIND_IMAGE_SYMBOL. Errors are returned �! rather than signaled. �!iB�! RETURNS: cond_value, longword (unsigned), write only, by value�!_ �! PROTOTYPE:�!u-�! FIND_IMAGE_SYMBOL imgnam, symnam, symval:�!��! IMPLICIT INPUTS: None.l�!p�! IMPLICIT OUTPUTS: None.v�!��! COMPLETION CODES::�!o2�! SS$_NORMAL: normal successful completion.�!C�! SIDE EFFECTS:S�!O �! None.n�!-- � ENABLE� LIB$SIG_TO_RET;��;� LIB$FIND_IMAGE_SYMBOL (.IMGNAM_A, .SYMNAM_A, .SYMVAL_A)C���END; ! FIND_IMAGE_SYMBOL���%FI ! NOT FOR_WINTCP���END �ELUDOM IOSB : IOSBDEF,,� LCLSIN : BLOCK [SIN$C_LENGTH,BYTE], � THREADS,� � ACTIVE, � STATUS;��<� ACTIVE = (IF ACTUALCOUNT () GTR 4 THEN .NOT_PASSIVE ELSE=� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0����������������������������������NETLIB_SRC.BCK�����������������c~��XP��"[NETLIB]NETLIB_MULTINET_TCP.B32;27���������������������������������������������������������������������������������������������Q�����<�������������������������<��������������"�*�[NETLIB]NETLIB_MULTINET_TCP.B32;27�+��,�c~���.�<����/� �@� �4�Q���<���4�v��������������������-�XP���0���1����2���3������K��P���W���O�=����5���6�F؀2��7�&@2��8�.L��9�$.��G� �@��H��J����������������� �������������%TITLE 'NETLIB_MULTINET_TCP'+�MODULE NETLIB_MULTINET_TCP (IDENT='V1.3-1',�J� ADDRESSING_MODE (EXTERNAL=LONG_RELATIVE,NONEXTERNAL=LONG_RELATIVE)) =�BEGIN��!++��! FACILITY: NETLIB��!�>�! ABSTRACT: TCP NETLIB routines for MultiNet and TCPware.�!��! MODULE DESCRIPTION:��!��! AUTHOR: M. Madison�2�! COPYRIGHT 1992 MATTHEW D. MADISON."�! ALL RIGHTS RESERVED.�!��! CREATION DATE: 05-FEB-1991��!��! MODIFICATION HISTORY:��!�0�! 05-FEB-1991 V1.0 Madison Initial coding.=�! 19-MAR-1991 V1.1 Madison Memory handling refinements.�7�! 24-APR-1991 V1.1-1 Madison Cancel those timers!�E�! 20-APR-1991 V1.2 Madison User-specified timeouts on receives.�?�! 10-FEB-1992 V1.2-1 Madison ACCEPT structure is special.�:�! 11-FEB-1992 V1.3 Madison Merge in TCPware support.C�! 05-NOV-1992 V1.3-1 Madison Fix potential timer AST problem.��!--���"� LIBRARY 'SYS$LIBRARY:STARLET';&� LIBRARY 'SYS$LIBRARY:UCX$INETDEF';� LIBRARY 'NETLIB';�� LIBRARY 'NETLIBDEF';$� LIBRARY 'MULTINET_TCPWARE_DEFS';��� FORWARD ROUTINE�� TCP_CONNECT,�� TCP_CONNECT_ADDR,� TCP_ACCEPT,� TCP_DISCONNECT,� TCP_SEND,� TCP_SND_AST,�� TCP_RECEIVE,�� TCP_RAW_RCV_AST,�� TCP_FREE_RCV : NOVALUE,� TCP_GET_LINE,� TCP_RCV_AST,�� TCP_TMO_AST;���� EXTERNAL ROUTINE� NET_GET_ADDRESS,�� NET_CVT_STATUS,>� G_HAT (LIB$GET_VM, LIB$FREE_VM, STR$CONCAT, STR$FREE1_DX,<� STR$APPEND, STR$COPY_DX, STR$FIND_FIRST_NOT_IN_SET,E� STR$TRANSLATE, LIB$CVT_DTB, STR$UPCASE, LIB$CREATE_VM_ZONE);���� OWN�� RCVZONE : INITIAL (0),�� SNDZONE : INITIAL (0);�� ��%SBTTL 'TCP_CONNECT'8�GLOBAL ROUTINE TCP_CONNECT (CTX_A_A, NODENAME_A, PORT) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�C�! This routine establishes a connection to the specified host and�B�! port. The net context must already be assigned and bound to a�! TCP socket.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�#�! TCP_CONNECT ctx, nodename, port��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND*� CTX = .CTX_A_A : REF CTXDEF,<� NODENAME = .NODENAME_A : BLOCK [DSC$K_S_BLN,BYTE];�� � LOCAL�#� ADRLST : VECTOR [32,LONG],� � ADRCNT, � STATUS;��A� STATUS = NET_GET_ADDRESS (CTX, NOD�������������ENAME, 32, ADRLST, ADRCNT);�'� IF NOT .STATUS THEN RETURN .STATUS;�/� IF .ADRCNT EQL 0 THEN RETURN SS$_ENDOFFILE;�!� INCR I FROM 0 TO .ADRCNT-1 DO� � BEGIN�9� STATUS = TCP_CONNECT_ADDR (CTX, ADRLST [.I], .PORT);�� IF .STATUS THEN EXITLOOP;� END;�� � .STATUS����END; ! TCP_CONNECT� ��%SBTTL 'TCP_CONNECT_ADDR'�<�GLOBAL ROUTINE TCP_CONNECT_ADDR (CTX_A_A, ADDRESS_A, PORT) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�F�! This routine establishes a connection to the specified add����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������1����������������������������������NETLIB_SRC.BCK�����������������c~��XP��"[NETLIB]NETLIB_MULTINET_TCP.B32;27���������������������������������������������������������������������������������������������Q�����<������������������������� �������������ress andB�! port. The net context must already be assigned and bound to a�! TCP socket.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�'�! TCP_CONNECT_ADDR ctx, address, port��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND*� CTX = .CTX_A_A : REF CTXDEF,A� REMSIN = CTX [CTX_X_REMSIN] : BLOCK [SIN$C_LENGTH,BYTE],�� ADDRESS = .ADDRESS_A,.� NPORT = PORT : VECTOR [4,BYTE];�� � LOCAL�� IOSB : IOSBDEF, � STATUS;��*� REMSIN [SIN$W_FAMILY] = UCX$C_AF_INET;6� REMSIN [SIN$W_PORT] = .NPORT [0] ^ 8 + .NPORT [1];#� REMSIN [SIN$L_ADDR] = .ADDRESS;�9� CH$FILL (%CHAR (0), SIN$S_ZERO, REMSIN [SIN$T_ZERO]);�=� STATUS = $QIOW (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_CONNECT,�1� IOSB=IOSB, P1=REMSIN, P2=SIN$C_LENGTH);�D� IF .STATUS THEN STATUS = NET_CVT_STATUS (.IOSB [IOSB_W_STATUS]);�� � .STATUS����END; ! TCP_CONNECT_ADDR�� ��%SBTTL 'TCP_ACCEPT'�G�GLOBAL ROUTINE TCP_ACCEPT (LSNR_A_A, CTX_A_A, IOSB_A, ASTADR, ASTPRM) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�=�! This routine accepts an incoming connection. It will not�:�! complete until a connection comes in for it to accept.=�! This routine should only be used by servers with a socket��! bound to a particular port.��!�D�! NOTE: This call will be ASYNCHRONOUS if IOSB, ASTADR, and ASTPRM�! are specified!�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�1�! TCP_ACCEPT lsnr, ctx [,iosb ,astadr ,astprm]��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--� � BUILTIN�� ACTUALCOUNT;���� BIND)� LSNR = .LSNR_A_A : REF CTXDEF,�)� CTX = .CTX_A_A : REF CTXDEF,�=� REMSIN = CTX [CTX_X_REMSIN] : BLOCK [SIN$C_LENGTH,BYTE];��� � LOCAL� � STATUS;��)� CTX [CTX_L_REMSINLEN] = SIN$C_LENGTH;�,� REMSIN [SIN$W_FAMILY] = UCX$C_AF_UNSPEC;� REMSIN [SIN$W_PORT] = 0;,� REMSIN [SIN$L_ADDR] = INET$C_INADDR_ANY;�� � IF ACTUALCOUNT () GTR 2 THEN<� STATUS = $QIO (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_ACCEPT,6� IOSB=.IOSB_A, ASTADR=.ASTADR, ASTPRM=.ASTPRM,I� P1=CTX [CTX_X_ASTRUC], P2=SIN$C_LENGTH+4, P3=.LSNR [CTX_W_CHAN])�� ELSE � BEGIN�,� BIND IOSB = CTX [CTX_Q_IOSB] : IOSBDEF;=� STATUS = $QIOW (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_ACCEPT,�6� IOSB=CTX [CTX_Q_IOSB], P1=CTX [CTX_X_ASTRUC],3� P2=SIN$C_LENGTH+4, P3=.LSNR [CTX_W_CHAN]);�E� IF .STATUS THEN STATUS = NET_CVT_STATUS (.IOSB [IOSB_W_STATUS]);�� END;�� � .STATUS����END; ! TCP_ACCEPT�� ��%SBTTL 'TCP_DISCONNECT'�)�GLOBAL ROUTINE TCP_DISCONNECT (CTX_A_A) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!��! Closes a connection.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! TCP_DISCONNECT�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND(� CTX = .CTX_A_A : REF CTXDEF;�� � LOCAL�� IOSB : IOSBDEF, � STATUS;��J� STATUS = $QIOW (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_SHUTDOWN, IOSB=IOSB);D� IF .STATUS THEN STATUS = NET_CVT_STATUS (.IOSB [IO���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������2����������������������������������NETLIB_SRC.BCK�����������������c~��XP��"[NETLIB]NETLIB_MULTINET_TCP.B32;27���������������������������������������������������������������������������������������������Q�����<�������������������������O�������������SB_W_STATUS]);�� � .STATUS����END; ! TCP_DISCONNECT�� ��%SBTTL 'TCP_SEND'�M�GLOBAL ROUTINE TCP_SEND (CTX_A_A, SNDSTR_A, XFLAGS, IOSB_A, ASTADR, ASTPRM) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�D�! This routine sends a string to the remote system. The string isH�! automatically terminated with a cr/lf sequence, and the EOL ("push");�! bit is set based on the value of the PUSH bit of FLAGS.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�9�! TCP_SEND ctx, cmdstr [,flags] [,iosb, astadr, astprm]��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--� � BUILTIN�� ACTUALCOUNT;���� BIND#� CTX = .CTX_A_A : REF CTXDEF,�3� SNDSTR = .SNDSTR_A : BLOCK [DSC$K_S_BLN,BYTE];��� � LOCAL�� FLAGS : BLOCK [4,BYTE],� IOSB : IOSBDEF,� SND : REF SNDDEF,�%� STR : BLOCK [DSC$K_S_BLN,BYTE],� � ASTSTAT,� � STATUS;��!� ASTSTAT = $SETAST (ENBFLG=0);�� IF .SNDZONE EQLA 0 THEN� � BEGIN�A� STATUS = LIB$CREATE_VM_ZONE (SNDZONE, %REF (LIB$K_VM_FIXED),�:� %REF (SND_S_SNDDEF), %REF (LIB$M_VM_EXTEND_AREA),&� %REF (4), %REF (4), %REF (8),2� %REF (8), 0, 0, %ASCID'NETLIB_SND_ZONE');8� IF .ASTSTAT EQL SS$_WASSET THEN $SETAST (ENBFLG=1);(� IF NOT .STATUS THEN RETURN .STATUS;� END�� ELSE8� IF .ASTSTAT EQL SS$_WASSET THEN $SETAST (ENBFLG=1);��;� IF ACTUALCOUNT () GTR 2 THEN FLAGS [0,0,32,0] = .XFLAGS�� ELSE FLAGS [0,0,32,0] = 0;�� � IF ACTUALCOUNT () LSS 4 THEN � BEGIN�%� IF NOT .FLAGS [NET_V_NOTRM] THEN� � BEGIN� $INIT_DYNDESC (STR);�K� STR$CONCAT (STR, SNDSTR, %ASCID %STRING (%CHAR (13), %CHAR (10)));� � END;�F� STATUS = $QIOW (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_SEND, IOSB=IOSB,B� P1=(IF NOT .FLAGS [NET_V_NOTRM] THEN .STR [DSC$A_POINTER],� ELSE .SNDSTR [DSC$A_POINTER]),A� P2=(IF NOT .FLAGS [NET_V_NOTRM] THEN .STR [DSC$W_LENGTH]�,� ELSE .SNDSTR [DSC$W_LENGTH]));9� IF NOT .FLAGS [NET_V_NOTRM] THEN STR$FREE1_DX (STR);�E� IF .STATUS THEN STATUS = NET_CVT_STATUS (.IOSB [IOSB_W_STATUS]);�� END�� ELSE � BEGIN�4� LIB$GET_VM (%REF (SND_S_SNDDEF), SND, SNDZONE);� SND [SND_L_CTX] = .CTX;"� SND [SND_L_ASTADR] = .ASTADR;"� SND [SND_L_ASTPRM] = .ASTPRM; � BEGIN7� BIND STR = SND [SND_Q_SNDBUF] : BLOCK [,BYTE];�� $INIT_DYNDESC (STR);�?� IF .FLAGS [NET_V_NOTRM] THEN STR$COPY_DX (STR, SNDSTR)�&� ELSE STR$CONCAT (STR, SNDSTR,3� %ASCID %STRING (%CHAR (13), %CHAR (10)));�>� STATUS = $QIO (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_SEND,7� IOSB=.IOSB_A, ASTADR=TCP_SND_AST, ASTPRM=.SND,�:� P1=.STR [DSC$A_POINTER], P2=.STR [DSC$W_LENGTH]); � END;�� IF NOT .STATUS THEN9� LIB$FREE_VM (%REF (SND_S_SNDDEF), SND, SNDZONE);�� END;�� � .STATUS����END; ! TCP_SEND�� ��%SBTTL 'TCP_SND_AST'�ROUTINE TCP_SND_AST (SND_A) = �BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�-�! AST routine triggered on send completion.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! TCP_SND_AST snd�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND� SND = .SND_A : SNDDEF;��� � LOCAL�� A���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������3����������������������������������NETLIB_SRC.BCK�����������������c~��XP��"[NETLIB]NETLIB_MULTINET_TCP.B32;27���������������������������������������������������������������������������������������������Q�����<�������������������������0�������������STADR, ASTPRM;��&� STR$FREE1_DX (SND [SND_Q_SNDBUF]);!� ASTADR = .SND [SND_L_ASTADR];�!� ASTPRM = .SND [SND_L_ASTPRM];�4� LIB$FREE_VM (%REF (SND_S_SNDDEF), SND, SNDZONE);.� IF .ASTADR NEQA 0 THEN (.ASTADR) (.ASTPRM)� ELSE SS$_NORMAL����END; ! TCP_SND_AST� ��%SBTTL 'TCP_RECEIVE'O�GLOBAL ROUTINE TCP_RECEIVE (CTX_A_A, RCVSTR_A, IOSB_A, ASTADR, ASTPRM, TMO_A) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!��! Raw TCP receive routine.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�?�! TCP_RECEIVE ctx, strdsc [,iosb, astadr, astprm] [,timeout]��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--� � BUILTIN�� ACTUALCOUNT;���� BIND(� CTX = .CTX_A_A : REF CTXDEF,%� CHN = CTX [CTX_W_CHAN] : WORD,�8� RCVSTR = .RCVSTR_A : BLOCK [DSC$K_S_BLN,BYTE];�� � LOCAL�� RCV : REF RCVDEF,� � ASTSTAT,� � STATUS;��!� ASTSTAT = $SETAST (ENBFLG=0);�� IF .RCVZONE EQLA 0 THEN� � BEGIN�A� STATUS = LIB$CREATE_VM_ZONE (RCVZONE, %REF (LIB$K_VM_FIXED),�:� %REF (RCV_S_RCVDEF), %REF (LIB$M_VM_EXTEND_AREA),'� %REF (16), %REF (4), %REF (8),�2� %REF (8), 0, 0, %ASCID'NETLIB_RCV_ZONE');8� IF .ASTSTAT EQL SS$_WASSET THEN $SETAST (ENBFLG=1);(� IF NOT .STATUS THEN RETURN .STATUS;� END�� ELSE8� IF .ASTSTAT EQL SS$_WASSET THEN $SETAST (ENBFLG=1);��<� STATUS = LIB$GET_VM (%REF (RCV_S_RCVDEF), RCV, RCVZONE);'� IF NOT .STATUS THEN RETURN .STATUS;�� RCV [RCV_L_CTX] = .CTX;� � IF ACTUALCOUNT () GTR 2 THEN#� RCV [RCV_L_USRIOSB] = .IOSB_A;� � IF ACTUALCOUNT () GTR 3 THEN � BEGIN�"� RCV [RCV_L_ASTADR] = .ASTADR;"� RCV [RCV_L_ASTPRM] = .ASTPRM;� END�� ELSEG� RCV [RCV_L_USRIOSB] = RCV [RCV_L_ASTADR] = RCV [RCV_L_ASTPRM] = 0;���6� CH$MOVE (8, CTX [CTX_Q_EXPTIME], RCV [RCV_Q_TMO]); � IF ACTUALCOUNT () GTR 5 THEN@� IF .TMO_A NEQA 0 THEN CH$MOVE (8, .TMO_A, RCV [RCV_Q_TMO]);��F� $SETIMR (DAYTIM=RCV [RCV_Q_TMO], ASTADR=TCP_TMO_AST, REQIDT=.RCV);F� STATUS = $QIO (CHAN=.CHN, FUNC=IO$_RECEIVE, IOSB=RCV [RCV_Q_IOSB],E� ASTADR=TCP_RAW_RCV_AST, ASTPRM=.RCV, P1=.RCVSTR [DSC$A_POINTER],� � P2=.RCVSTR [DSC$W_LENGTH]);� IF NOT .STATUS THEN� � BEGIN�� $CANTIM (REQIDT=.RCV);�5� LIB$FREE_VM (%REF (RCV_S_RCVDEF), RCV, RCVZONE);�� END�� ELSE!� IF ACTUALCOUNT () LSS 4 THEN� � BEGIN0� BIND IOSB = RCV [RCV_Q_IOSB] : IOSBDEF;1� STATUS = $SYNCH (IOSB=RCV [RCV_Q_IOSB]);�@� IF ACTUALCOUNT () GTR 2 THEN CH$MOVE (8, IOSB, .IOSB_A)N� ELSE IF .STATUS THEN STATUS = NET_CVT_STATUS (.IOSB [IOSB_W_STATUS]);9� LIB$FREE_VM (%REF (RCV_S_RCVDEF), RCV, RCVZONE);� � END;��� � .STATUS����END; ! TCP_RECEIVE� ��%SBTTL 'TCP_RAW_RCV_AST',�ROUTINE TCP_RAW_RCV_AST (RCV : REF RCVDEF) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�>�! This AST routine is invoked when a network read completes.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! TCP_RAW_RCV_AST buf��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND(� IOSB = RCV [RCV_Q_IOSB] : IOSBDEF,+� CTX = RCV [RCV_L_CTX] : REF CTXDEF,�/� UIOSB = RCV [RCV_L_USRIOSB] : REF IOSBDEF;��� � LOCAL����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������4����������������������������������NETLIB_SRC.BCK�����������������c~��XP��"[NETLIB]NETLIB_MULTINET_TCP.B32;27���������������������������������������������������������������������������������������������Q�����<��������������������������������������� ASTADR, ASTPRM;��� RCV [RCV_L_TRIGGERED] = 1;� $CANTIM (REQIDT=.RCV);Q� IF NET_CVT_STATUS (.IOSB [IOSB_W_STATUS]) AND .IOSB [IOSB_W_COUNT] EQL 0 THEN�+� IOSB [IOSB_W_STATUS] = SS$_LINKDISCON;�B� IF .UIOSB NEQA 0 THEN CH$MOVE (8, IOSB, .RCV [RCV_L_USRIOSB]);!� ASTADR = .RCV [RCV_L_ASTADR];�!� ASTPRM = .RCV [RCV_L_ASTPRM];�/� $DCLAST (ASTADR=TCP_FREE_RCV, ASTPRM=.RCV);���.� IF .ASTADR NEQA 0 THEN (.ASTADR) (.ASTPRM)� ELSE SS$_NORMAL����END; ! TCP_RAW_RCV_AST� ��%SBTTL 'TCP_FREE_RCV'�0�GLOBAL ROUTINE TCP_FREE_RCV (RCV_A) : NOVALUE = �BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!��! Frees a RCV buffer. �!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! x��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���6� LIB$FREE_VM (%REF (RCV_S_RCVDEF), RCV_A, RCVZONE);���END;� ��%SBTTL 'TCP_GET_LINE'�P�GLOBAL ROUTINE TCP_GET_LINE (CTX_A_A, RCVSTR_A, IOSB_A, ASTADR, ASTPRM, TMO_A) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�@�! This routine forms one "line" out of the input received overK�! the net from the server. A "line" is a string of characters terminated�G�! with a cr/lf sequence. The routine will wait until enough input is��! received to form a "line".�!�I�! Note that I cheat a bit and assume that CR ends a record. This makes�K�! life a little easier since I don't have to wait around for another data�L�! block to show up if the CR occurs as the last character of a data block,F�! just to verify that there is an LF at the front of the next block.I�! IGNORE_LF_FRONT gets set instead, so on the next call I can strip the�I�! first character of the front of the next block (assuming it's an LF).��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�?�! TCP_GET_LINE ctx, strdsc [,iosb, astadr, astprm] [,timeout]��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--� � BUILTIN�� ACTUALCOUNT;���� BIND(� CTX = .CTX_A_A : REF CTXDEF,%� CHN = CTX [CTX_W_CHAN] : WORD,�'� INQ = CTX [CTX_Q_BUFQ] : QUEDEF,�8� RCVSTR = .RCVSTR_A : BLOCK [DSC$K_S_BLN,BYTE];�� � LOCAL�%� SDSC : BLOCK [DSC$K_S_BLN,BYTE],�� RCV : REF RCVDEF,� � LEN,� � EOPTR,� � LFPOS,L � STATUS, � ASTSTAT,I� FOUND_CRLF;��#� STR$COPY_DX (RCVSTR, %ASCID'');X��'� SDSC [DSC$B_DTYPE] = DSC$K_DTYPE_T;I'� SDSC [DSC$B_CLASS] = DSC$K_CLASS_S;T��� FOUND_CRLF = 0; 0� WHILE NOT REMQUE (.INQ [QUE_L_HEAD], RCV) DO � BEGINE � BINDN+� IOSB = RCV [RCV_Q_IOSB] : IOSBDEF, +� RCNT = IOSB [IOSB_W_COUNT] : WORD; A� EOPTR = CH$FIND_CH (.RCNT, .RCV [RCV_L_BUFPTR], %CHAR (13));9A� LFPOS = CH$FIND_CH (.RCNT, .RCV [RCV_L_BUFPTR], %CHAR (10)); ��,� IF CH$FAIL (.EOPTR) THEN EOPTR = .LFPOS&� ELSE IF NOT CH$FAIL (.LFPOS) THEN3� IF .LFPOS LSSA .EOPTR THEN EOPTR = .LFPOS;���� IF CH$FAIL (.EOPTR) THENU � BEGIN5� SDSC [DSC$A_POINTER] = .RCV [RCV_L_BUFPTR];nL� SDSC [DSC$W_LENGTH] = MINU (.RCNT, STR_MAX-.RCVSTR [DSC$W_LENGTH]);#� STR$APPEND (RCVSTR, SDSC);39� LIB$FREE_VM (%REF (RCV_S_RCVDEF), RCV, RCVZONE); � END � ELSEY � BEGIN4� SDSC [DSC$A_POINTER] = .RCV [RCV_L_BUFPTR];5����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������5����������������������������������NETLIB_SRC.BCK�����������������c~��XP��"[NETLIB]NETLIB_MULTINET_TCP.B32;27���������������������������������������������������������������������������������������������Q�����<�������������������������{C������#������� LEN = CH$DIFF (.EOPTR, .RCV [RCV_L_BUFPTR]);EK� SDSC [DSC$W_LENGTH] = MINU (.LEN, STR_MAX-.RCVSTR [DSC$W_LENGTH]);T#� STR$APPEND (RCVSTR, SDSC);S1� IF CH$RCHAR (.EOPTR) EQL %CHAR (13) THENT� BEGIN"� IF .LEN GEQ .RCNT-2 THEN� BEGIN @� IF .LEN EQL .RCNT-1 THEN CTX [CTX_V_IGNORELF] = 1;>� LIB$FREE_VM (%REF (RCV_S_RCVDEF), RCV, RCVZONE); � ENDE� ELSE� BEGINR� LOCAL DELTA;<� DELTA = (IF CH$RCHAR (.EOPTR+1) EQL %CHAR (10)#� THEN 2 ELSE 1);C<� RCV [RCV_L_BUFPTR] = CH$PLUS (.EOPTR, .DELTA);+� RCNT = .RCNT - .LEN - .DELTA;O!� INSQUE (.RCV, INQ);(� END; � END � ELSE � BEGIN"� IF .LEN GEQ .RCNT-1 THEN=� LIB$FREE_VM (%REF (RCV_S_RCVDEF), RCV, RCVZONE)n� ELSE� BEGINe7� RCV [RCV_L_BUFPTR] = CH$PLUS (.EOPTR, 1);_&� RCNT = .RCNT - .LEN - 1;!� INSQUE (.RCV, INQ); � END; � END;�� FOUND_CRLF = 1;� EXITLOOP; � END; � END; ! WHILE NOT REMQUE��� IF .FOUND_CRLF THEN � BEGINc!� IF ACTUALCOUNT () GTR 2 THENC � BEGIN� IF .IOSB_A NEQA 0 THENC� BEGIN(� BIND IOSB = .IOSB_A : IOSBDEF;7� IOSB [IOSB_W_COUNT] = .RCVSTR [DSC$W_LENGTH]; ,� IOSB [IOSB_W_STATUS] = SS$_NORMAL; � END;;� IF .ASTADR NEQA 0 THEN(:� RETURN $DCLAST (ASTADR=.ASTADR, ASTPRM=.ASTPRM); � END;T� RETURN SS$_NORMAL;L� END;� $!� ASTSTAT = $SETAST (ENBFLG=0);.� IF .RCVZONE EQLA 0 THEN � BEGINCA� STATUS = LIB$CREATE_VM_ZONE (RCVZONE, %REF (LIB$K_VM_FIXED),I:� %REF (RCV_S_RCVDEF), %REF (LIB$M_VM_EXTEND_AREA),'� %REF (16), %REF (4), %REF (8),E2� %REF (8), 0, 0, %ASCID'NETLIB_RCV_ZONE');8� IF .ASTSTAT EQL SS$_WASSET THEN $SETAST (ENBFLG=1);(� IF NOT .STATUS THEN RETURN .STATUS;� ENDa� ELSE8� IF .ASTSTAT EQL SS$_WASSET THEN $SETAST (ENBFLG=1);��<� STATUS = LIB$GET_VM (%REF (RCV_S_RCVDEF), RCV, RCVZONE);'� IF NOT .STATUS THEN RETURN .STATUS;T� RCV [RCV_L_TRIGGERED] = 0;)� RCV [RCV_L_BUFPTR] = RCV [RCV_T_BUF]; � RCV [RCV_L_CTX] = .CTX;S � RCV [RCV_L_STRPTR] = RCVSTR; � IF ACTUALCOUNT () GTR 2 THEN � BEGINc#� RCV [RCV_L_USRIOSB] = .IOSB_A;�"� RCV [RCV_L_ASTADR] = .ASTADR;"� RCV [RCV_L_ASTPRM] = .ASTPRM;� ENDM� ELSEG� RCV [RCV_L_USRIOSB] = RCV [RCV_L_ASTADR] = RCV [RCV_L_ASTPRM] = 0;R��6� CH$MOVE (8, CTX [CTX_Q_EXPTIME], RCV [RCV_Q_TMO]); � IF ACTUALCOUNT () GTR 5 THEN@� IF .TMO_A NEQA 0 THEN CH$MOVE (8, .TMO_A, RCV [RCV_Q_TMO]);��F� $SETIMR (DAYTIM=RCV [RCV_Q_TMO], ASTADR=TCP_TMO_AST, REQIDT=.RCV);F� STATUS = $QIO (CHAN=.CHN, FUNC=IO$_RECEIVE, IOSB=RCV [RCV_Q_IOSB],H� ASTADR=TCP_RCV_AST, ASTPRM=.RCV, P1=RCV [RCV_T_BUF], P2=RCV_S_BUF);� IF NOT .STATUS THENN � BEGINL� $CANTIM (REQIDT=.RCV); 5� LIB$FREE_VM (%REF (RCV_S_RCVDEF), RCV, RCVZONE); � END�� ELSE'� IF .RCV [RCV_L_ASTADR] EQLA 0 THEN�1� STATUS = $SYNCH (IOSB=RCV [RCV_Q_IOSB]);B�� � .STATUSP���END; ! TCP_GET_LINE � C�%SBTTL 'TCP_RCV_AST'(�ROUTINE TCP_RCV_AST (RCV : REF RCVDEF) =�BEGINo�!++t�! FUNCTIONAL DESCRIPTION:t�!a>�! This AST routine is invoked when a network read completes.@�! It queues up the buffer block for processing by the mainline@�! thread, which will also handle I/O errors. Then a new block���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������6����������������������������������NETLIB_SRC.BCK�����������������c~��XP��"[NETLIB]NETLIB_MULTINET_TCP.B32;27���������������������������������������������������������������������������������������������Q�����<�������������������������ߩ������*�������<�! is allocated and, barring any errors, a read is reQIO'd.�!aB�! RETURNS: cond_value, longword (unsigned), write only, by value�! �! PROTOTYPE:�!r�! TCP_RCV_AST buf,�!p�! IMPLICIT INPUTS: None.:�!o�! IMPLICIT OUTPUTS: None.S�!o�! COMPLETION CODES:N�!D2�! SS$_NORMAL: normal successful completion.�!t�! SIDE EFFECTS:E�!C �! None. �!--e��� BIND(� IOSB = RCV [RCV_Q_IOSB] : IOSBDEF,0� STR = .RCV [RCV_L_STRPTR] : BLOCK [,BYTE],.� BUF = RCV [RCV_T_BUF] : BLOCK [,BYTE],4� BUFPTR = RCV [RCV_L_BUFPTR]: REF BLOCK [,BYTE],+� CTX = RCV [RCV_L_CTX] : REF CTXDEF,L%� CHN = CTX [CTX_W_CHAN] : WORD,N/� UIOSB = RCV [RCV_L_USRIOSB] : REF IOSBDEF;I�� � LOCAL; � LEN,N � STATUS, � EOPTR,D � LFPOS, � ASTADR, ASTPRM,%� SDSC : BLOCK [DSC$K_S_BLN,BYTE];C��� RCV [RCV_L_TRIGGERED] = 1;� $CANTIM (REQIDT=.RCV);!� ASTADR = .RCV [RCV_L_ASTADR];=!� ASTPRM = .RCV [RCV_L_ASTPRM];+Q� IF NET_CVT_STATUS (.IOSB [IOSB_W_STATUS]) AND .IOSB [IOSB_W_COUNT] EQL 0 THEN +� IOSB [IOSB_W_STATUS] = SS$_LINKDISCON;T6� IF NOT NET_CVT_STATUS (.IOSB [IOSB_W_STATUS]) THEN � BEGINX� IF .UIOSB NEQA 0 THEN � BEGIN1� CH$MOVE (8, IOSB, .RCV [RCV_L_USRIOSB]);N4� UIOSB [IOSB_W_COUNT] = .STR [DSC$W_LENGTH]; � END; 5� LIB$FREE_VM (%REF (RCV_S_RCVDEF), RCV, RCVZONE);N� IF .ASTADR NEQA 0 THENS#� RETURN (.ASTADR) (.ASTPRM) � ELSED� RETURN SS$_NORMAL;a� END;��!� IF .CTX [CTX_V_IGNORELF] THENw � BEGINe� CTX [CTX_V_IGNORELF] = 0;.� IF CH$RCHAR (.BUFPTR) EQL %CHAR (10) THEN � BEGIN'� BUFPTR = CH$PLUS (.BUFPTR, 1);�8� IOSB [IOSB_W_COUNT] = .IOSB [IOSB_W_COUNT] - 1; � END;m� END;��'� SDSC [DSC$B_DTYPE] = DSC$K_DTYPE_T;�'� SDSC [DSC$B_CLASS] = DSC$K_CLASS_S;FC� EOPTR = CH$FIND_CH (.IOSB [IOSB_W_COUNT], .BUFPTR, %CHAR (13));TC� LFPOS = CH$FIND_CH (.IOSB [IOSB_W_COUNT], .BUFPTR, %CHAR (10)); ��+� IF CH$FAIL (.EOPTR) THEN EOPTR = .LFPOSB%� ELSE IF NOT CH$FAIL (.LFPOS) THENN/� IF .LFPOS LSSA .EOPTR THEN EOPTR = .LFPOS;B��� IF CH$FAIL (.EOPTR) THEN � BEGINA6� SDSC [DSC$W_LENGTH] = MINU (.IOSB [IOSB_W_COUNT],5� STR_MAX-.STR [DSC$W_LENGTH]);o$� SDSC [DSC$A_POINTER] = .BUFPTR;� STR$APPEND (STR, SDSC);� BUFPTR = RCV [RCV_T_BUF];� RCV [RCV_L_TRIGGERED] = 0; G� $SETIMR (DAYTIM=RCV [RCV_Q_TMO], ASTADR=TCP_TMO_AST, REQIDT=.RCV);rG� STATUS = $QIO (CHAN=.CHN, FUNC=IO$_RECEIVE, IOSB=RCV [RCV_Q_IOSB],x5� ASTADR=TCP_RCV_AST, ASTPRM=.RCV, P1=.BUFPTR,C� P2=RCV_S_BUF); � IF NOT .STATUS THEN � BEGIN� $CANTIM (REQIDT=.RCV); � IF .UIOSB NEQA 0 THEN� BEGIN2� CH$MOVE (8, IOSB, .RCV [RCV_L_USRIOSB]);5� UIOSB [IOSB_W_COUNT] = .STR [DSC$W_LENGTH];T*� UIOSB [IOSB_W_STATUS] = .STATUS; � END;�9� LIB$FREE_VM (%REF (RCV_S_RCVDEF), RCV, RCVZONE);O� IF .ASTADR NEQA 0 THEN�$� RETURN (.ASTADR) (.ASTPRM) � ELSE�� RETURN SS$_NORMAL; � END;E� RETURN SS$_NORMAL� END;��$� LEN = CH$DIFF (.EOPTR, .BUFPTR);C� SDSC [DSC$W_LENGTH] = MINU (.LEN, STR_MAX-.STR [DSC$W_LENGTH]);S#� SDSC [DSC$A_POINTER] = .BUFPTR;�� STR$APPEND (STR, SDSC);%,� IF CH$RCHAR (.EOPTR) EQL %CHAR (13) THEN � BEGIN',� IF .LEN GEQ .IOSB [IOSB_W_COUNT]-2 THEN � BEGIN0� IF .LEN EQL .IOSB [IOSB_W_COUNT]-1 THEN#� CTX [CTX_V_IGNORELF] = 1;S4� $DCLAST (ASTADR=TCP_FREE_���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������7����������������������������������NETLIB_SRC.BCK�����������������c~��XP��"[NETLIB]NETLIB_MULTINET_TCP.B32;27���������������������������������������������������������������������������������������������Q�����<�������������������������B0������1�������RCV, ASTPRM=.RCV);� END � ELSES � BEGIN� LOCAL DELTA;AG� DELTA = (IF CH$RCHAR (.EOPTR+1) EQL %CHAR (10) THEN 2 ELSE 1);I+� BUFPTR = CH$PLUS (.EOPTR, .DELTA);�D� IOSB [IOSB_W_COUNT] = .IOSB [IOSB_W_COUNT] - .LEN - .DELTA;)� INSQUE (.RCV, CTX [CTX_Q_BUFQ]); � END; � END � ELSE � BEGIN_,� IF .LEN GEQ .IOSB [IOSB_W_COUNT]-1 THEN3� $DCLAST (ASTADR=TCP_FREE_RCV, ASTPRM=.RCV)E � ELSE � BEGIN&� BUFPTR = CH$PLUS (.EOPTR, 1);?� IOSB [IOSB_W_COUNT] = .IOSB [IOSB_W_COUNT] - .LEN - 1; )� INSQUE (.RCV, CTX [CTX_Q_BUFQ]);O � END;E� END;��� IF .UIOSB NEQA 0 THEN � BEGINU(� UIOSB [IOSB_W_STATUS] = SS$_NORMAL;0� UIOSB [IOSB_W_COUNT] = .STR [DSC$W_LENGTH];� END;� IF .ASTADR NEQA 0 THEN� (.ASTADR) (.ASTPRM)� ELSE� SS$_NORMAL[���END; ! TCP_RCV_AST� ��%SBTTL 'TCP_TMO_AST')�ROUTINE TCP_TMO_AST (RCV : REF RCVDEF) = �BEGINS�!++S�! FUNCTIONAL DESCRIPTION: �! 7�! Delivered when a receive takes longer than EXPTIME.]@�! Just cancels the I/O, to trigger the I/O completion AST with�! status SS$_CANCEL.�!TB�! RETURNS: cond_value, longword (unsigned), write only, by value�!X �! PROTOTYPE:�!$�! TCP_TMO_AST rcv�!S�! IMPLICIT INPUTS: None.T�!=�! IMPLICIT OUTPUTS: None.S�!_�! COMPLETION CODES:C�!L2�! SS$_NORMAL: normal successful completion.�! �! SIDE EFFECTS:F�!N �! None.,�!-- � BIND%� CTX = .RCV [RCV_L_CTX] : CTXDEF;P��G� IF NOT .RCV [RCV_L_TRIGGERED] THEN $CANCEL (CHAN=.CTX [CTX_W_CHAN])+� ELSE SS$_NORMALR���END; ! TCP_TMO_AST���END �ELUDOMon send completion.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! TCP_SND_AST snd�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND� SND = .SND_A : SNDDEF;��� � LOCAL�� A��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������8����������������������������������NETLIB_SRC.BCK�����������������P��XP��"[NETLIB]NETLIB_MULTINET_UDP.B32;13���������������������������������������������������������������������������������������������O������������������������������ ��������������"�*�[NETLIB]NETLIB_MULTINET_UDP.B32;13�+��,�P���.�����/� �@� �4�O������ �(�������������������-�XP���0���1����2���3������K��P���W���O�����5���6�xr^��7�}7^��8�0{ډX��9�$.��G� �@��H��J����������������� �������������%TITLE 'NETLIB_MULTINET_UDP')�MODULE NETLIB_MULTINET_UDP (IDENT='V1.3',�J� ADDRESSING_MODE (EXTERNAL=LONG_RELATIVE,NONEXTERNAL=LONG_RELATIVE)) =�BEGIN��!++��! FACILITY: NETLIB��!�>�! ABSTRACT: UDP NETLIB routines for MultiNet and TCPware.�!��! MODULE DESCRIPTION:��!�D�! Contains UDP send and receive routines for MultiNet and TCPware.�!��! AUTHOR: M. Madison�F�! COPYRIGHT 1991, 1992 RENSSELAER POLYTECHNIC INSTITUTE."�! ALL RIGHTS RESERVED.�!��! CREATION DATE: 05-FEB-1991��!��! MODIFICATION HISTORY:��!�0�! 05-FEB-1991 V1.0 Madison Initial coding.G�! 08-FEB-1991 V1.1 Madison Add source info return on UDP_RECEIVE.�;�! 22-NOV-1991 V1.2 Madison Add rcvtmo to UDP_RECEIVE.��!--�"� LIBRARY 'SYS$LIBRARY:STARLET';&� LIBRARY 'SYS$LIBRARY:UCX$INETDEF';$� LIBRARY 'MULTINET_TCPWARE_DEFS';� LIBRARY 'NETLIB';���� EXTERNAL ROUTINE� NET_CVT_STATUS;��� FORWARD ROUTINE�� UDP_SEND,� UDP_RECEIVE,�� TIMER_AST;�� ��%SBTTL 'UDP_SEND'�L�GLOBAL ROUTINE UDP_SEND (CTX_A_A, ADR, PORT : WORD, BUFPTR, BUFLEN : WORD) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!��! Sends out a UDP datagram.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�1�! UDP_SEND chan, address, port, bufptr, buflen��!�9�! chan: channel, word (unsigned), read only, by value�G�! address: longword_unsigned, longword (unsigned), read only, by value�?�! port: word_unsigned, word (unsigned), read only, by value�E�! bufptr: varying_arg, longword (unsigned), read only, by reference�?�! buflen: word_unsigned, word (unsigned), read only, by value��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND#� CTX = .CTX_A_A : REF CTXDEF,�$� CHAN = CTX [CTX_W_CHAN] : WORD,(� PORT2 = PORT : VECTOR [2,BYTE];�� � LOCAL�)� REMSIN : BLOCK [SIN$C_LENGTH, BYTE],�� IOSB : IOSBDEF, � STATUS;��*� REMSIN [SIN$W_FAMILY] = UCX$C_AF_INET;8� REMSIN [SIN$W_PORT] = .PORT2 [0] * 256 + .PORT2 [1];� REMSIN [SIN$L_ADDR] = .ADR;�9� CH$FILL (%CHAR (0), SIN$S_ZERO, REMSIN [SIN$T_ZERO]);�9� STATUS = $QIOW (CHAN=.CHAN, FUNC=IO$_SEND, IOSB=IOSB,�9� P1=.BUFPTR, P2=.BUFLEN, P4=REMSIN, P5=SIN$C_LENGTH);�D� IF .STATUS THEN STATUS = NET_CVT_STATUS (.IOSB [IOSB_W_STATUS]);�� � .STATUS����END; ! UDP_SEND�� ��%SBTTL 'UDP_RECEIVE'E�GLOBAL ROUTINE UDP_RECEIVE (CTX_A_A, BUFPTR, BUFSIZ : WORD, BUFLEN_A,�.� SRCADR_A, SRCPRT_A, RCVTMO_A) = �BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!��! Reads a UDP datagram.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�K�! UDP_RECEIVE chan, bufptr, bufsiz, buflen [,srcadr] [,srcprt] [,rcvtmo]��!�9�! chan: channel, word (unsigned), read only, by value�F�! bufptr: varying_arg, longword (unsigned), write only, by reference?�! bufsiz: ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������9����������������������������������NETLIB_SRC.BCK�����������������P��XP��"[NETLIB]NETLIB_MULTINET_UDP.B32;13���������������������������������������������������������������������������������������������O������������������������������h� ������������ word_unsigned, word (unsigned), read only, by value�D�! buflen: word_unsigned, word (unsigned), write only, by referenceL�! srcadr: longword_unsigned, longword (unsigned), write only, by referenceL�! srcprt: longword_unsigned, longword (unsigned), write only, by referenceA�! rcvtmo: date_time, quadword (signed), read only, by reference��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND$� CTX = .CTX_A_A : REF CTXDEF,$� CHAN = CTX [CTX_W_CHAN] : WORD, � BUFLEN = .BUFLEN_A : WORD;�� � BUILTIN�� ACTUALCOUNT;��� � LOCAL�� RCVTMO : VECTOR [2,LONG],� INFO : VECTOR [3,LONG],,� FRMSTRC : BLOCK [SIN$C_LENGTH+2, BYTE],� IOSB : IOSBDEF,� DSC : VECTOR [3,LONG], � RETLEN, � STATUS;��"� STATUS = ACTUALCOUNT () GTR 6;.� IF .STATUS THEN STATUS = .RCVTMO_A NEQA 0;2� IF .STATUS THEN CH$MOVE (8, .RCVTMO_A, RCVTMO)<� ELSE $BINTIM (TIMBUF=%ASCID'0 00:00:10', TIMADR=RCVTMO);��� INFO [0] = .CHAN;�� INFO [1] = IOSB;� INFO [2] = SS$_NORMAL;;� $SETIMR (DAYTIM=RCVTMO, ASTADR=TIMER_AST, REQIDT=INFO);�=� STATUS = $QIOW (CHAN=.CHAN, FUNC=IO$_READVBLK, IOSB=IOSB,�H� P1=.BUFPTR, P2=.BUFSIZ, P4=FRMSTRC, P5=%ALLOCATION (FRMSTRC));� $CANTIM (REQIDT=INFO);,� IF NOT .INFO [2] THEN STATUS = .INFO [2]I� ELSE IF .STATUS THEN STATUS = NET_CVT_STATUS (.IOSB [IOSB_W_STATUS]);�;� BUFLEN = (IF .STATUS THEN .IOSB [IOSB_W_COUNT] ELSE 0);�� IF .STATUS THEN� � BEGIN�.� LOCAL REMSIN : BLOCK [SIN$C_LENGTH,BYTE];7� CH$MOVE (SIN$C_LENGTH, FRMSTRC [2,0,0,0], REMSIN);�!� IF ACTUALCOUNT () GTR 4 THEN�C� IF .SRCADR_A NEQA 0 THEN .SRCADR_A = .REMSIN [SIN$L_ADDR];�!� IF ACTUALCOUNT () GTR 5 THEN�!� IF .SRCPRT_A NEQA 0 THEN�=� .SRCPRT_A = (.REMSIN [SIN$W_PORT] MOD 256) * 256 + �0� (.REMSIN [SIN$W_PORT] / 256);� END;�� � .STATUS����END; ! UDP_RECEIVE� ��%SBTTL 'TIMER_AST'�ROUTINE TIMER_AST (INFO_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�F�! This AST routine is triggered when the net receive timer goes off.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! TIMER_AST info��!�O�! info: vector_longword_unsigned, longword (unsigned), modify, by reference��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND&� INFO = .INFO_A : VECTOR [3,LONG], � IOSB = .INFO [1] : IOSBDEF;��2� INFO [2] = IOSB [IOSB_W_STATUS] = SS$_TIMEOUT;� $CANCEL (CHAN=.INFO [0]);���� SS$_NORMAL���END; ! TIMER_AST���END��ELUDOM��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������:����������������������������������NETLIB_SRC.BCK�����������������\�XP��[NETLIB]NETLIB_UCX_NET.B32;23��������������������������������������������������������������������������������������������������P�����#�������������������������p���������������*�[NETLIB]NETLIB_UCX_NET.B32;23�+��,�\��.�#����/� �@� �4�P���#��� ���������������������-�XP����0���1����2���3������K��P���W���O�!����5���6�^G��7�VG��8�X I/K��9�$.��G� �@��H��J������ �������������%TITLE 'NETLIB_UCX_NET'�&�MODULE NETLIB_UCX_NET (IDENT='V1.1-3',J� ADDRESSING_MODE (EXTERNAL=LONG_RELATIVE,NONEXTERNAL=LONG_RELATIVE)) =�BEGIN��!++��! FACILITY: NETLIB��!�9�! ABSTRACT: Common network library routines for UCX.��!��! MODULE DESCRIPTION:��!��! AUTHOR: M. Madison�1�! COPYRIGHT 1994, MADGOAT SOFTWARE.�"�! ALL RIGHTS RESERVED.�!��! CREATION DATE: 28-JAN-1991��!��! MODIFICATION HISTORY:��!�0�! 28-JAN-1991 V1.0 Madison Initial coding.B�! 05-SEP-1991 V1.1 Madison Add NOT_PASSIVE flag on NET_BIND.=�! 04-DEC-1991 V1.1-1 Madison Improve debugging support.�N�! 28-MAY-1992 V1.1-2 Madison Add REUSEADDR option on active connections.O�! 08-FEB-1994 V1.1-3 Madison Use correct semantics for host/domain names.�K�! 07-MAR-1994 V1.1-4 Madison Got the contained-domain check backward.��!--���"� LIBRARY 'SYS$LIBRARY:STARLET';&� LIBRARY 'SYS$LIBRARY:UCX$INETDEF';� LIBRARY 'NETLIB';�� LIBRARY 'NETLIBDEF';� LIBRARY 'UCX_DEFS';���� FORWARD ROUTINE�� NET_ASSIGN,� NET_DEASSIGN,� NET_BIND,� NET_GET_ADDRESS,�� NET_ADDR_TO_NAME,� NET_GET_INFO,� NET_GET_HOSTNAME,� NET_SET_TRACE_ROUTINE;���� EXTERNAL ROUTINE>� G_HAT (LIB$GET_VM, LIB$FREE_VM, STR$CONCAT, STR$FREE1_DX,<� STR$APPEND, STR$COPY_DX, STR$FIND_FIRST_NOT_IN_SET,<� STR$TRANSLATE, LIB$CVT_DTB, STR$UPCASE, STR$COPY_R,� LIB$PUT_OUTPUT);��� � GLOBAL.� TRACE_ROUTINE : INITIAL (LIB$PUT_OUTPUT);� ��%SBTTL 'NET_ASSIGN'�%�GLOBAL ROUTINE NET_ASSIGN (CTX_A_A) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�E�! This routine assigns a network channel for subsequent operations.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! NET_ASSIGN nodename��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND*� CTX = .CTX_A_A : REF CTXDEF;�� � LOCAL� � STATUS;��3� STATUS = LIB$GET_VM (%REF (CTX_S_CTXDEF), CTX);�,� CH$FILL (%CHAR (0), CTX_S_CTXDEF, .CTX);'� IF NOT .STATUS THEN RETURN .STATUS;� � BEGIN�+� BIND BUFQ = CTX [CTX_Q_BUFQ] : QUEDEF;�2� BUFQ [QUE_L_TAIL] = BUFQ [QUE_L_HEAD] = BUFQ;E� $BINTIM (TIMBUF=%ASCID'0 00:05:00', TIMADR=CTX [CTX_Q_EXPTIME]);�� END;��H� STATUS = $ASSIGN (DEVNAM=%ASCID'UCX$DEVICE', CHAN=CTX [CTX_W_CHAN]);?� IF NOT .STATUS THEN LIB$FREE_VM (%REF (CTX_S_CTXDEF), CTX);��� � .STATUS����END; ! NET_ASSIGN�� ��%SBTTL 'NET_BIND'�J�GLOBAL ROUTINE NET_BIND (CTX_A_A, PROTOCOL, PORT, XTHREADS, NOT_PASSIVE) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�C�! This routine creates and binds a local socket for the specified� �! protocol.��!�A�! If the port number is specified, the connection is assumed to�F�! be passive and a listener channel is established, with the maximumE�! number of simultaneous incoming connections ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;����������������������������������NETLIB_SRC.BCK�����������������\�XP��[NETLIB]NETLIB_UCX_NET.B32;23��������������������������������������������������������������������������������������������������P�����#�������������������������b�������������specified by XTHREADS�F�! (defaults to 4 if not specified). If the NOT_PASSIVE flag is set,D�! the connection is opened as an active channel with the specifiedJ�! port as the source, and XTHREADS is ignored. If no PORT is specified,H�! the connection is assumed to be active and a source port is assigned�! at random.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�<�! NET_BIND ctx, protocol [,port] [,threads] [,not_passive]�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND*� CTX = .CTX_A_A : REF CTXDEF;��� BUILTIN ACTUALCOUNT;�� � LOCAL�� IOSB : IOSBDEF,� SCHAR : SCHARDEF,5� LCLSIN : VOLATILE BLOCK [SIN$C_LENGTH,BYTE],� � DSC : VECTOR [2,LONG], � THREADS,� � ACTIVE, � STATUS;��<� ACTIVE = (IF ACTUALCOUNT () GTR 4 THEN .NOT_PASSIVE ELSE=� IF ACTUALCOUNT () GTR 2 THEN (.PORT EQL 0) ELSE 1);���� SELECTONE .PROTOCOL OF� SET�� [NET_K_TCP] :� � BEGIN.� SCHAR [SCHAR_W_PROTOCOL] = UCX$C_TCP;0� SCHAR [SCHAR_B_PROTYPE] = UCX$C_STREAM; � END;�� [NET_K_UDP] :� � BEGIN.� SCHAR [SCHAR_W_PROTOCOL] = UCX$C_UDP;/� SCHAR [SCHAR_B_PROTYPE] = UCX$C_DGRAM;� � END;�� TES;��� SCHAR [SCHAR_B_DOMAIN] = 0;�*� LCLSIN [SIN$W_FAMILY] = UCX$C_AF_INET; � IF ACTUALCOUNT () GTR 2 THEN � BEGIN�)� BIND NPORT = PORT : VECTOR [4,BYTE];�7� LCLSIN [SIN$W_PORT] = .NPORT [0] ^ 8 + .NPORT [1];� � IF .ACTIVE THEN THREADS = 0D� ELSE THREADS = (IF ACTUALCOUNT () GTR 3 THEN .XTHREADS ELSE 4);� END�� ELSE � BEGIN�� LCLSIN [SIN$W_PORT] = 0;�� THREADS = 0;�� END;,� LCLSIN [SIN$L_ADDR] = INET$C_INADDR_ANY;� DSC [0] = SIN$C_LENGTH;�� DSC [1] = LCLSIN;�9� CH$FILL (%CHAR (0), SIN$S_ZERO, LCLSIN [SIN$T_ZERO]);�H� STATUS = $QIOW (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_SETMODE, IOSB=IOSB,M� P1=SCHAR, P2=(IF .ACTIVE THEN (UCX$M_REUSEADDR OR %X'FF000000') ELSE 0),�� P3=DSC, P4=.THREADS);3� IF .STATUS THEN STATUS = .IOSB [IOSB_W_STATUS];��� � .STATUS����END; ! NET_BIND�� ��%SBTTL 'NET_GET_ADDRESS'M�GLOBAL ROUTINE NET_GET_ADDRESS (CTX_A_A, HOST_A, ALSIZE, ALIST_A, ALCNT_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�D�! Given a host name, returns an array of valid Internet addresses.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�5�! NET_GET_ADDRESS ctx, host, arrsiz, array, retcnt��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND&� CTX = .CTX_A_A : REF CTXDEF,(� CHN = CTX [CTX_W_CHAN] : WORD,+� NODENAME = .HOST_A : BLOCK [,BYTE],�+� ALIST = .ALIST_A : VECTOR [,LONG],�� ALCNT = .ALCNT_A;�� � LOCAL�� SUBF : SUBFDEF,� IOSB : IOSBDEF,� OUTLEN : WORD,�� DSC1 : VECTOR [2,LONG],� DSC2 : VECTOR [2,LONG],� UCXADR : VOLATILE,� � STATUS;��K� IF STR$FIND_FIRST_NOT_IN_SET (NODENAME, %ASCID'0123456789.') NEQ 0 THEN� � BEGIN�*� LOCAL STR : BLOCK [DSC$K_S_BLN,BYTE];� INIT_DYNDESC (STR); � STR$UPCASE (STR, NODENAME);7� SUBF [SUBF_B_TYPE] = INETACP_FUNC$C_GETHOSTBYNAME;�*� SUBF [SUBF_B_CODE] = INETACP$C_TRANS;� SUBF [SUBF_W_UNUSED] = 0;� DSC1 [0���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<����������������������������������NETLIB_SRC.BCK�����������������\�XP��[NETLIB]NETLIB_UCX_NET.B32;23��������������������������������������������������������������������������������������������������P�����#��������������������������������������] = SUBF_S_SUBFDEF;�� DSC1 [1] = SUBF;�%� DSC2 [0] = %ALLOCATION (UCXADR);�� DSC2 [1] = UCXADR;�?� STATUS = $QIOW (CHAN=.CHN, FUNC=IO$_ACPCONTROL, IOSB=IOSB,�.� P1=DSC1, P2=STR, P3=OUTLEN, P4=DSC2);� FREE_STRINGS (STR);(� IF NOT .STATUS THEN RETURN .STATUS;&� IF NOT .IOSB [IOSB_W_STATUS] THEN � BEGINJ� STR$TRANSLATE (STR, NODENAME, %ASCID'abcdefghijklmnopqrstuvwxyz',2� %ASCID'ABCDEFGHIJKLMNOPQRSTUVWXYZ');C� STATUS = $QIOW (CHAN=.CHN, FUNC=IO$_ACPCONTROL, IOSB=IOSB,�/� P1=DSC1, P2=STR, P3=OUTLEN, P4=DSC2);�� FREE_STRINGS (STR);,� IF NOT .STATUS THEN RETURN .STATUS;H� IF NOT .IOSB [IOSB_W_STATUS] THEN RETURN .IOSB [IOSB_W_STATUS]; � END;�� IF .ALSIZE GTR 0 THEN � BEGIN� ALCNT = 1;�� ALIST [0] = .UCXADR;� � END;�� END�� ELSE BEGIN � LOCAL� ADRL : VOLATILE,�$� ADRB : REF VECTOR [4,BYTE],� CHP, DOTP,�� LEN, XLEN, VAL;��� ADRB = ADRL;�%� CHP = .NODENAME [DSC$A_POINTER];�$� LEN = .NODENAME [DSC$W_LENGTH];� INCR I FROM 0 TO 3 DO � BEGIN%� IF .LEN LSS 1 THEN EXITLOOP;�/� DOTP = CH$FIND_CH (.LEN, .CHP, %C'.');�,� IF CH$FAIL (.DOTP) THEN XLEN = .LEN+� ELSE XLEN = CH$DIFF (.DOTP, .CHP);�(� LIB$CVT_DTB (.XLEN, .CHP, VAL);!� ADRB [.I] = .VAL<0,8,0>;� � LEN = .LEN - .XLEN - 1;"� CHP = CH$PLUS (.DOTP, 1); � END;�� IF .ALSIZE GTR 0 THEN � BEGIN� ALCNT = 1;�� ALIST [0] = .ADRL;� � END;�� STATUS = SS$_NORMAL;�� END;�� � .STATUS����END; ! NET_GET_ADDRESS� ��%SBTTL 'NET_ADDR_TO_NAME'�8�GLOBAL ROUTINE NET_ADDR_TO_NAME (CTX_A_A, ADR, NAME_A) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�L�! Given an IP address, returns the corresponding host name (if available).�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�%�! NET_ADDR_TO_NAME host, adr, name��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND&� CTX = .CTX_A_A : REF CTXDEF,(� NAME = .NAME_A : BLOCK [,BYTE];�� � LOCAL�� SUBF : VOLATILE SUBFDEF,�� IOSB : IOSBDEF,� UCXADR : VOLATILE,�� DSC1 : VECTOR [2,LONG],� DSC2 : VECTOR [2,LONG],� ADRBUF : BLOCK [512,BYTE],�� ADRLEN : WORD,�-� SDSC : BLOCK [DSC$K_S_BLN,BYTE] PRESET (�,� [DSC$B_DTYPE] = DSC$K_DTYPE_T,,� [DSC$B_CLASS] = DSC$K_CLASS_S,4� [DSC$W_LENGTH] = %ALLOCATION (ADRBUF),(� [DSC$A_POINTER] = ADRBUF), � STATUS;��� UCXADR = .ADR;6� SUBF [SUBF_B_TYPE] = INETACP_FUNC$C_GETHOSTBYADDR;)� SUBF [SUBF_B_CODE] = INETACP$C_TRANS;�� SUBF [SUBF_W_UNUSED] = 0;�� DSC1 [0] = SUBF_S_SUBFDEF;� DSC1 [1] = SUBF;$� DSC2 [0] = %ALLOCATION (UCXADR);� DSC2 [1] = UCXADR;K� STATUS = $QIOW (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_ACPCONTROL, IOSB=IOSB,�/� P1=DSC1, P2=DSC2, P3=ADRLEN, P4=SDSC);�3� IF .STATUS THEN STATUS = .IOSB [IOSB_W_STATUS];�� IF .STATUS THEN�'� STR$COPY_R (NAME, ADRLEN, ADRBUF);��� � .STATUS����END; ! NET_ADDR_TO_NAME�� ��%SBTTL 'NET_DEASSIGN'�'�GLOBAL ROUTINE NET_DEASSIGN (CTX_A_A) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�-�! This routine deassigns a network channel.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������=����������������������������������NETLIB_SRC.BCK�����������������\�XP��[NETLIB]NETLIB_UCX_NET.B32;23��������������������������������������������������������������������������������������������������P�����#�������������������������)|�������������!��! NET_DEASSIGN ctx��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND*� CTX = .CTX_A_A : REF CTXDEF;�� � LOCAL� � STATUS;��%� $DASSGN (CHAN=.CTX [CTX_W_CHAN]);�+� LIB$FREE_VM (%REF (CTX_S_CTXDEF), CTX);� � CTX = 0;��� SS$_NORMAL���END; ! NET_DEASSIGN�� ��%SBTTL 'NET_GET_INFO'�P�GLOBAL ROUTINE NET_GET_INFO (CTX_A_A, REMADR_A, REMPRT_A, LCLADR_A, LCLPRT_A) = �BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�A�! Gets address and port information about a network connection.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�:�! NET_GET_INFO ctx, remadr [,remprt] [,lcladr] [,lclprt]�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--� � BUILTIN�� ACTUALCOUNT;�� BIND/� CTX = .CTX_A_A : REF CTXDEF,�8� REMSIN = CTX [CTX_X_REMSIN] : BLOCK [,BYTE];�� � IF ACTUALCOUNT () GTR 3 THEN � BEGIN� � LOCAL6� LCLSIN : VOLATILE BLOCK [SIN$C_LENGTH,BYTE],#� DSC : VECTOR [3,LONG],�!� RETLEN : VOLATILE WORD,�� IOSB : IOSBDEF,�� STATUS;��� DSC [0] = SIN$C_LENGTH;� DSC [1] = LCLSIN;� DSC [2] = RETLEN;@� STATUS = $QIOW (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_SENSEMODE,� IOSB=IOSB, P3=DSC);4� IF .STATUS THEN STATUS = .IOSB [IOSB_W_STATUS];� IF .STATUS THEN � BEGING� IF ACTUALCOUNT () GTR 4 THEN .LCLPRT_A = .LCLSIN [SIN$W_PORT];�G� IF ACTUALCOUNT () GTR 3 THEN .LCLADR_A = .LCLSIN [SIN$L_ADDR];�� END� ELSE RETURN .STATUS;�� END;��B� IF ACTUALCOUNT () GTR 2 THEN .REMPRT_A = .REMSIN [SIN$W_PORT];B� IF ACTUALCOUNT () GTR 1 THEN .REMADR_A = .REMSIN [SIN$L_ADDR];��� SS$_NORMAL���END; ! NET_GET_INFO�� ��%SBTTL 'NET_GET_HOSTNAME'�1�GLOBAL ROUTINE NET_GET_HOSTNAME (HST_A, LEN_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�+�! Returns this host's Internet host name.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�%�! NET_GET_HOSTNAME hostname [,len]��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BUILTIN ACTUALCOUNT;�� � LOCAL�%� LNMLST : $ITMLST_DECL (ITEMS=1),�*� HSTBUF : VOLATILE VECTOR [2048,BYTE],� HSTLEN : VOLATILE WORD,*� DOMBUF : VOLATILE VECTOR [1024,BYTE],� DOMLEN : VOLATILE WORD,%� DSC1 : BLOCK [DSC$K_S_BLN,BYTE],�%� DSC2 : BLOCK [DSC$K_S_BLN,BYTE],�%� SDSC : BLOCK [DSC$K_S_BLN,BYTE],� � STATUS;�� � $ITMLST_INIT (ITMLST=LNMLST,M� (ITMCOD=LNM$_STRING, BUFSIZ=%ALLOCATION (HSTBUF)-%ALLOCATION (DOMBUF)-1,�(� BUFADR=HSTBUF, RETLEN=HSTLEN));0� STATUS = $TRNLNM (TABNAM=%ASCID'LNM$SYSTEM',2� LOGNAM=%ASCID'UCX$INET_HOST', ITMLST=LNMLST);��'� IF NOT .STATUS THEN RETURN .STATUS;���� INIT_DYNDESC (DSC1, DSC2);'� SDSC [DSC$B_DTYPE] = DSC$K_DTYPE_T;�'� SDSC [DSC$B_CLASS] = DSC$K_CLASS_S;�"� SDSC [DSC$W_LENGTH] = .HSTLEN;"� SDSC [DSC$A_POINTER] = HSTBUF;� STR$UPCASE (DSC1, SDSC);���!+=�! OK, we have the hostname part. Now let's see if the domain��! name is defined.�!-�� � $ITMLST_INIT (ITMLST=LNMLST,6� (ITMCOD=LNM$_STRING���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������>����������������������������������NETLIB_SRC.BCK�����������������\�XP��[NETLIB]NETLIB_UCX_NET.B32;23��������������������������������������������������������������������������������������������������P�����#�������������������������� ������������, BUFSIZ=%ALLOCATION (DOMBUF),(� BUFADR=DOMBUF, RETLEN=DOMLEN));0� STATUS = $TRNLNM (TABNAM=%ASCID'LNM$SYSTEM',4� LOGNAM=%ASCID'UCX$INET_DOMAIN', ITMLST=LNMLST);���!+>�! If we found a domain name, let's see if we should be tacking*�! it onto the host name or not. We do if:�!�)�! - the host name doesn't contain a dot�8�! - the host name contains a dot but we don't find the4�! domain name contained in the host name already�!�<�! This test should give us backward compatibility with olderC�! versions which assumed the domain name was part of the host name.��!-� IF .STATUS THEN� � BEGIN�� LOCAL DOIT;� DOIT = 1;>� IF NOT CH$FAIL (CH$FIND_CH (.HSTLEN, HSTBUF, %C'.')) THEN � BEGIN'� SDSC [DSC$W_LENGTH] = .DOMLEN;�'� SDSC [DSC$A_POINTER] = DOMBUF;�!� STR$UPCASE (DSC2, SDSC);�;� DOIT = CH$FAIL (CH$FIND_SUB (.DSC1 [DSC$W_LENGTH],�;� .DSC1 [DSC$A_POINTER], .DSC2 [DSC$W_LENGTH],�'� .DSC2 [DSC$A_POINTER]));� � END;�� IF .DOIT THEN � BEGIN5� CH$WCHAR (%C'.', CH$PLUS (HSTBUF, .HSTLEN));�D� CH$MOVE (.DOMLEN, DOMBUF, CH$PLUS (HSTBUF, (.HSTLEN + 1)));(� HSTLEN = .HSTLEN + .DOMLEN + 1; � END;�� END;��(� STR$COPY_R (.HST_A, HSTLEN, HSTBUF); � IF ACTUALCOUNT () GTR 1 THEN,� IF .LEN_A NEQA 0 THEN .LEN_A = .HSTLEN;�� � .STATUS����END; ! NET_GET_HOSTNAME�� ��%SBTTL 'NET_SET_TRACE_ROUTINE'/�GLOBAL ROUTINE NET_SET_TRACE_ROUTINE (RTN_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�@�! Sets the trace routine to be used instead of LIB$PUT_OUTPUT.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! NET_SET_TRACE_ROUTINE��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���8� IF .RTN_A EQLA 0 THEN TRACE_ROUTINE = LIB$PUT_OUTPUT � ELSE TRACE_ROUTINE = .RTN_A;� SS$_NORMAL���END;���END��ELUDOM������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������?����������������������������������NETLIB_SRC.BCK�����������������P��XP��[NETLIB]NETLIB_UCX_TCP.B32;17��������������������������������������������������������������������������������������������������P�����2�������������������������0���������������*�[NETLIB]NETLIB_UCX_TCP.B32;17�+��,�P���.�2����/� �@� �4�P���2���.�<�������������������-�XP���0���1����2���3������K��P���W���O�3����5���6���7� )ɦ��8�Xm.D/K��9�$.��G� �@��H��J������ �������������%TITLE 'NETLIB_UCX_TCP'�$�MODULE NETLIB_UCX_TCP (IDENT='V1.1',J� ADDRESSING_MODE (EXTERNAL=LONG_RELATIVE,NONEXTERNAL=LONG_RELATIVE)) =�BEGIN��!++��! FACILITY: NETLIB��!�-�! ABSTRACT: TCP NETLIB routines for UCX.��!��! MODULE DESCRIPTION:��!��! AUTHOR: M. Madison�A�! COPYRIGHT 1991, RENSSELAER POLYTECHNIC INSTITUTE.�"�! ALL RIGHTS RESERVED.�!��! CREATION DATE: 28-JAN-1991��!��! MODIFICATION HISTORY:��!�0�! 28-JAN-1991 V1.0 Madison Initial coding.7�! 24-APR-1991 V1.0-1 Madison Cancel those timers!�E�! 20-JUN-1991 V1.1 Madison User-specified timeouts on receives.��!--���"� LIBRARY 'SYS$LIBRARY:STARLET';&� LIBRARY 'SYS$LIBRARY:UCX$INETDEF';� LIBRARY 'NETLIB';�� LIBRARY 'NETLIBDEF';� LIBRARY 'UCX_DEFS';���� FORWARD ROUTINE�� TCP_CONNECT,�� TCP_CONNECT_ADDR,� TCP_ACCEPT,� TCP_DISCONNECT,� TCP_SEND,� TCP_SND_AST,�� TCP_RECEIVE,�� TCP_RAW_RCV_AST,�� TCP_GET_LINE,� TCP_RCV_AST,�� TCP_TMO_AST;���� EXTERNAL ROUTINE� NET_GET_ADDRESS,�>� G_HAT (LIB$GET_VM, LIB$FREE_VM, STR$CONCAT, STR$FREE1_DX,<� STR$APPEND, STR$COPY_DX, STR$FIND_FIRST_NOT_IN_SET,1� STR$TRANSLATE, LIB$CVT_DTB, STR$UPCASE);���� OWN�� FREEQ : QUEDEF PRESET (#� [QUE_L_HEAD] = FREEQ,�$� [QUE_L_TAIL] = FREEQ);� ��%SBTTL 'TCP_CONNECT'8�GLOBAL ROUTINE TCP_CONNECT (CTX_A_A, NODENAME_A, PORT) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�C�! This routine establishes a connection to the specified host and�B�! port. The net context must already be assigned and bound to a�! TCP socket.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�#�! TCP_CONNECT ctx, nodename, port��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND*� CTX = .CTX_A_A : REF CTXDEF,<� NODENAME = .NODENAME_A : BLOCK [DSC$K_S_BLN,BYTE];�� � LOCAL�#� ADRLST : VECTOR [32,LONG],� � ADRCNT, � STATUS;��A� STATUS = NET_GET_ADDRESS (CTX, NODENAME, 32, ADRLST, ADRCNT);�'� IF NOT .STATUS THEN RETURN .STATUS;�/� IF .ADRCNT EQL 0 THEN RETURN SS$_ENDOFFILE;�!� INCR I FROM 0 TO .ADRCNT-1 DO� � BEGIN�9� STATUS = TCP_CONNECT_ADDR (CTX, ADRLST [.I], .PORT);�� IF .STATUS THEN EXITLOOP;� END;�� � .STATUS����END; ! TCP_CONNECT� ��%SBTTL 'TCP_CONNECT_ADDR'�<�GLOBAL ROUTINE TCP_CONNECT_ADDR (CTX_A_A, ADDRESS_A, PORT) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�F�! This routine establishes a connection to the specified address andB�! port. The net context must already be assigned and bound to a�! TCP socket.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�'�! TCP_CONNECT_ADDR ctx, address, port��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETI������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������@����������������������������������NETLIB_SRC.BCK�����������������P��XP��[NETLIB]NETLIB_UCX_TCP.B32;17��������������������������������������������������������������������������������������������������P�����2�������������������������}�������������ON CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND*� CTX = .CTX_A_A : REF CTXDEF,A� REMSIN = CTX [CTX_X_REMSIN] : BLOCK [SIN$C_LENGTH,BYTE],�� ADDRESS = .ADDRESS_A,.� NPORT = PORT : VECTOR [4,BYTE];�� � LOCAL�� IOSB : IOSBDEF, � DSC : VECTOR [2,LONG], � STATUS;��*� REMSIN [SIN$W_FAMILY] = UCX$C_AF_INET;6� REMSIN [SIN$W_PORT] = .NPORT [0] ^ 8 + .NPORT [1];#� REMSIN [SIN$L_ADDR] = .ADDRESS;�� DSC [0] = SIN$C_LENGTH;�� DSC [1] = REMSIN;�9� CH$FILL (%CHAR (0), SIN$S_ZERO, REMSIN [SIN$T_ZERO]);�<� STATUS = $QIOW (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_ACCESS,� IOSB=IOSB, P3=DSC);�3� IF .STATUS THEN STATUS = .IOSB [IOSB_W_STATUS];��� � .STATUS����END; ! TCP_CONNECT_ADDR�� ��%SBTTL 'TCP_ACCEPT'�G�GLOBAL ROUTINE TCP_ACCEPT (LSNR_A_A, CTX_A_A, IOSB_A, ASTADR, ASTPRM) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�=�! This routine accepts an incoming connection. It will not�:�! complete until a connection comes in for it to accept.=�! This routine should only be used by servers with a socket��! bound to a particular port.��!�D�! NOTE: This call will be ASYNCHRONOUS if IOSB, ASTADR, and ASTPRM�! are specified!�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�1�! TCP_ACCEPT lsnr, ctx [,iosb ,astadr ,astprm]��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--� � BUILTIN�� ACTUALCOUNT;���� BIND$� LSNR = .LSNR_A_A : REF CTXDEF,$� CTX = .CTX_A_A : REF CTXDEF;�� � LOCAL� � STATUS;�� � BEGIN� � BIND�9� REMSIN = CTX [CTX_X_REMSIN] : BLOCK [,BYTE];�-� REMSIN [SIN$W_FAMILY] = UCX$C_AF_UNSPEC;�� REMSIN [SIN$W_PORT] = 0;�-� REMSIN [SIN$L_ADDR] = INET$C_INADDR_ANY;�'� CTX [CTX_L_DSCLEN] = SIN$C_LENGTH;�!� CTX [CTX_L_DSCADR] = REMSIN;�.� CTX [CTX_L_RETLEN] = CTX [CTX_L_RETSTAT];� END;�� � IF ACTUALCOUNT () GTR 2 THEN � BEGIN�L� STATUS = $QIO (CHAN=.LSNR [CTX_W_CHAN], FUNC=IO$_ACCESS OR IO$M_ACCEPT,6� IOSB=.IOSB_A, ASTADR=.ASTADR, ASTPRM=.ASTPRM,2� P3=CTX [CTX_X_DSC], P4=CTX [CTX_W_CHAN]);� END�� ELSE � BEGIN�,� BIND IOSB = CTX [CTX_Q_IOSB] : IOSBDEF;M� STATUS = $QIOW (CHAN=.LSNR [CTX_W_CHAN], FUNC=IO$_ACCESS OR IO$M_ACCEPT,�I� IOSB=CTX [CTX_Q_IOSB], P3=CTX [CTX_X_DSC], P4=CTX [CTX_W_CHAN]);�4� IF .STATUS THEN STATUS = .IOSB [IOSB_W_STATUS];� END;�� � .STATUS����END; ! TCP_ACCEPT�� ��%SBTTL 'TCP_DISCONNECT'�)�GLOBAL ROUTINE TCP_DISCONNECT (CTX_A_A) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!��! Closes a connection.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! TCP_DISCONNECT�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND(� CTX = .CTX_A_A : REF CTXDEF,'� BUFQ = CTX [CTX_Q_BUFQ] : QUEDEF;��� � LOCAL�� RCV : REF RCVDEF,�� IOSB : IOSBDEF;��F� $QIOW (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_DEACCESS OR IO$M_SHUTDOWN,%� IOSB=IOSB, P4=UCX$C_DSC_RCV)����END; ! TCP_DISCONNECT�� ��%SBTTL 'TCP_SEND'�M�GLOBAL ROUTINE TCP_SEND (CTX_A_A, SNDSTR_A, XFLAGS, IOSB_A, ASTADR, ASTPRM) =��BEGIN��!+���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������A����������������������������������NETLIB_SRC.BCK�����������������P��XP��[NETLIB]NETLIB_UCX_TCP.B32;17��������������������������������������������������������������������������������������������������P�����2�������������������������k�������������+��! FUNCTIONAL DESCRIPTION:��!�D�! This routine sends a string to the remote system. The string isH�! automatically terminated with a cr/lf sequence, and the EOL ("push");�! bit is set based on the value of the PUSH bit of FLAGS.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�9�! TCP_SEND ctx, cmdstr [,flags] [,iosb, astadr, astprm]��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--� � BUILTIN�� ACTUALCOUNT;���� BIND#� CTX = .CTX_A_A : REF CTXDEF,�3� SNDSTR = .SNDSTR_A : BLOCK [DSC$K_S_BLN,BYTE];��� � LOCAL�� FLAGS : BLOCK [4,BYTE],� IOSB : IOSBDEF,� SND : REF SNDDEF,�%� STR : BLOCK [DSC$K_S_BLN,BYTE],� � STATUS;��;� IF ACTUALCOUNT () GTR 2 THEN FLAGS [0,0,32,0] = .XFLAGS�� ELSE FLAGS [0,0,32,0] = 0;�� � IF ACTUALCOUNT () LSS 4 THEN � BEGIN�%� IF NOT .FLAGS [NET_V_NOTRM] THEN� � BEGIN� $INIT_DYNDESC (STR);�K� STR$CONCAT (STR, SNDSTR, %ASCID %STRING (%CHAR (13), %CHAR (10)));� � END;�K� STATUS = $QIOW (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_WRITEVBLK, IOSB=IOSB,�B� P1=(IF NOT .FLAGS [NET_V_NOTRM] THEN .STR [DSC$A_POINTER],� ELSE .SNDSTR [DSC$A_POINTER]),A� P2=(IF NOT .FLAGS [NET_V_NOTRM] THEN .STR [DSC$W_LENGTH]�,� ELSE .SNDSTR [DSC$W_LENGTH]));9� IF NOT .FLAGS [NET_V_NOTRM] THEN STR$FREE1_DX (STR);�4� IF .STATUS THEN STATUS = .IOSB [IOSB_W_STATUS];� END�� ELSE � BEGIN�+� LIB$GET_VM (%REF (SND_S_SNDDEF), SND);�� SND [SND_L_CTX] = .CTX;"� SND [SND_L_ASTADR] = .ASTADR;"� SND [SND_L_ASTPRM] = .ASTPRM; � BEGIN7� BIND STR = SND [SND_Q_SNDBUF] : BLOCK [,BYTE];�� $INIT_DYNDESC (STR);�?� IF .FLAGS [NET_V_NOTRM] THEN STR$COPY_DX (STR, SNDSTR)�&� ELSE STR$CONCAT (STR, SNDSTR,3� %ASCID %STRING (%CHAR (13), %CHAR (10)));�C� STATUS = $QIO (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_WRITEVBLK,�7� IOSB=.IOSB_A, ASTADR=TCP_SND_AST, ASTPRM=.SND,�:� P1=.STR [DSC$A_POINTER], P2=.STR [DSC$W_LENGTH]); � END;�� IF NOT .STATUS THEN0� LIB$FREE_VM (%REF (SND_S_SNDDEF), SND);� END;�� � .STATUS����END; ! TCP_SEND�� ��%SBTTL 'TCP_SND_AST'�ROUTINE TCP_SND_AST (SND_A) = �BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�-�! AST routine triggered on send completion.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! TCP_SND_AST snd�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND� SND = .SND_A : SNDDEF;��� � LOCAL�� ASTADR, ASTPRM;��&� STR$FREE1_DX (SND [SND_Q_SNDBUF]);!� ASTADR = .SND [SND_L_ASTADR];�!� ASTPRM = .SND [SND_L_ASTPRM];�+� LIB$FREE_VM (%REF (SND_S_SNDDEF), SND);�.� IF .ASTADR NEQA 0 THEN (.ASTADR) (.ASTPRM)� ELSE SS$_NORMAL����END; ! TCP_SND_AST� ��%SBTTL 'TCP_RECEIVE'O�GLOBAL ROUTINE TCP_RECEIVE (CTX_A_A, RCVSTR_A, IOSB_A, ASTADR, ASTPRM, TMO_A) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!��! Raw TCP receive routine.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�?�! TCP_RECEIVE ctx, strdsc [,iosb, astadr, astprm] [,timeout]��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETI���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������B����������������������������������NETLIB_SRC.BCK�����������������P��XP��[NETLIB]NETLIB_UCX_TCP.B32;17��������������������������������������������������������������������������������������������������P�����2��������������������������������������ON CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--� � BUILTIN�� ACTUALCOUNT;���� BIND(� CTX = .CTX_A_A : REF CTXDEF,%� CHN = CTX [CTX_W_CHAN] : WORD,�8� RCVSTR = .RCVSTR_A : BLOCK [DSC$K_S_BLN,BYTE];�� � LOCAL�� RCV : REF RCVDEF,� � STATUS;��-� IF REMQUE (.FREEQ [QUE_L_HEAD], RCV) THEN�+� LIB$GET_VM (%REF (RCV_S_RCVDEF), RCV);�� RCV [RCV_L_CTX] = .CTX;� � IF ACTUALCOUNT () GTR 2 THEN#� RCV [RCV_L_USRIOSB] = .IOSB_A;� � IF ACTUALCOUNT () GTR 3 THEN � BEGIN�"� RCV [RCV_L_ASTADR] = .ASTADR;"� RCV [RCV_L_ASTPRM] = .ASTPRM;� END�� ELSEG� RCV [RCV_L_USRIOSB] = RCV [RCV_L_ASTADR] = RCV [RCV_L_ASTPRM] = 0;���6� CH$MOVE (8, CTX [CTX_Q_EXPTIME], RCV [RCV_Q_TMO]); � IF ACTUALCOUNT () GTR 5 THEN@� IF .TMO_A NEQA 0 THEN CH$MOVE (8, .TMO_A, RCV [RCV_Q_TMO]);��F� $SETIMR (DAYTIM=RCV [RCV_Q_TMO], ASTADR=TCP_TMO_AST, REQIDT=.RCV);G� STATUS = $QIO (CHAN=.CHN, FUNC=IO$_READVBLK, IOSB=RCV [RCV_Q_IOSB],�E� ASTADR=TCP_RAW_RCV_AST, ASTPRM=.RCV, P1=.RCVSTR [DSC$A_POINTER],� � P2=.RCVSTR [DSC$W_LENGTH]);� IF NOT .STATUS THEN� � BEGIN�� $CANTIM (REQIDT=.RCV);�(� INSQUE (.RCV, .FREEQ [QUE_L_TAIL]);� END�� ELSE!� IF ACTUALCOUNT () LSS 4 THEN� � BEGIN0� BIND IOSB = RCV [RCV_Q_IOSB] : IOSBDEF;1� STATUS = $SYNCH (IOSB=RCV [RCV_Q_IOSB]);�@� IF ACTUALCOUNT () GTR 2 THEN CH$MOVE (8, IOSB, .IOSB_A)=� ELSE IF .STATUS THEN STATUS = .IOSB [IOSB_W_STATUS];�,� INSQUE (.RCV, .FREEQ [QUE_L_TAIL]); � END;��� � .STATUS����END; ! TCP_RECEIVE� ��%SBTTL 'TCP_RAW_RCV_AST',�ROUTINE TCP_RAW_RCV_AST (RCV : REF RCVDEF) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�>�! This AST routine is invoked when a network read completes.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! TCP_RAW_RCV_AST buf��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND(� IOSB = RCV [RCV_Q_IOSB] : IOSBDEF,+� CTX = RCV [RCV_L_CTX] : REF CTXDEF,�/� UIOSB = RCV [RCV_L_USRIOSB] : REF IOSBDEF;���� $CANTIM (REQIDT=.RCV);B� IF .UIOSB NEQA 0 THEN CH$MOVE (8, IOSB, .RCV [RCV_L_USRIOSB]);'� INSQUE (.RCV, .FREEQ [QUE_L_TAIL]);���&� IF .RCV [RCV_L_ASTADR] NEQA 0 THEN0� (.RCV [RCV_L_ASTADR]) (.RCV [RCV_L_ASTPRM])� ELSE� SS$_NORMAL����END; ! TCP_RAW_RCV_AST� ��%SBTTL 'TCP_GET_LINE'�P�GLOBAL ROUTINE TCP_GET_LINE (CTX_A_A, RCVSTR_A, IOSB_A, ASTADR, ASTPRM, TMO_A) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�@�! This routine forms one "line" out of the input received overK�! the net from the server. A "line" is a string of characters terminated�G�! with a cr/lf sequence. The routine will wait until enough input is��! received to form a "line".�!�I�! Note that I cheat a bit and assume that CR ends a record. This makes�K�! life a little easier since I don't have to wait around for another data�L�! block to show up if the CR occurs as the last character of a data block,F�! just to verify that there is an LF at the front of the next block.I�! IGNORE_LF_FRONT gets set instead, so on the next call I can strip the�I�! first character of the front of the next block (assuming it's an LF).��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�?�! TCP_GET_���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������C����������������������������������NETLIB_SRC.BCK�����������������P��XP��[NETLIB]NETLIB_UCX_TCP.B32;17��������������������������������������������������������������������������������������������������P�����2�������������������������R�������������LINE ctx, strdsc [,iosb, astadr, astprm] [,timeout]��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--� � BUILTIN�� ACTUALCOUNT;���� BIND(� CTX = .CTX_A_A : REF CTXDEF,%� CHN = CTX [CTX_W_CHAN] : WORD,�'� INQ = CTX [CTX_Q_BUFQ] : QUEDEF,�8� RCVSTR = .RCVSTR_A : BLOCK [DSC$K_S_BLN,BYTE];�� � LOCAL�%� SDSC : BLOCK [DSC$K_S_BLN,BYTE],�� RCV : REF RCVDEF,� � LEN,� � EOPTR,� � LFPOS,� � STATUS,� FOUND_CRLF;��#� STR$COPY_DX (RCVSTR, %ASCID'');���'� SDSC [DSC$B_DTYPE] = DSC$K_DTYPE_T;�'� SDSC [DSC$B_CLASS] = DSC$K_CLASS_S;���� FOUND_CRLF = 0;�0� WHILE NOT REMQUE (.INQ [QUE_L_HEAD], RCV) DO � BEGIN� � BIND�+� IOSB = RCV [RCV_Q_IOSB] : IOSBDEF,�+� RCNT = IOSB [IOSB_W_COUNT] : WORD;�A� EOPTR = CH$FIND_CH (.RCNT, .RCV [RCV_L_BUFPTR], %CHAR (13));�A� LFPOS = CH$FIND_CH (.RCNT, .RCV [RCV_L_BUFPTR], %CHAR (10));���,� IF CH$FAIL (.EOPTR) THEN EOPTR = .LFPOS&� ELSE IF NOT CH$FAIL (.LFPOS) THEN3� IF .LFPOS LSSA .EOPTR THEN EOPTR = .LFPOS;���� IF CH$FAIL (.EOPTR) THEN� � BEGIN5� SDSC [DSC$A_POINTER] = .RCV [RCV_L_BUFPTR];�L� SDSC [DSC$W_LENGTH] = MINU (.RCNT, STR_MAX-.RCVSTR [DSC$W_LENGTH]);#� STR$APPEND (RCVSTR, SDSC);�,� INSQUE (.RCV, .FREEQ [QUE_L_TAIL]);� END � ELSE� � BEGIN4� SDSC [DSC$A_POINTER] = .RCV [RCV_L_BUFPTR];5� LEN = CH$DIFF (.EOPTR, .RCV [RCV_L_BUFPTR]);�K� SDSC [DSC$W_LENGTH] = MINU (.LEN, STR_MAX-.RCVSTR [DSC$W_LENGTH]);�#� STR$APPEND (RCVSTR, SDSC);�1� IF CH$RCHAR (.EOPTR) EQL %CHAR (13) THEN�� BEGIN"� IF .LEN GEQ .RCNT-2 THEN� BEGIN�@� IF .LEN EQL .RCNT-1 THEN CTX [CTX_V_IGNORELF] = 1;1� INSQUE (.RCV, .FREEQ [QUE_L_TAIL]);� � END�� ELSE� BEGIN�� LOCAL DELTA;<� DELTA = (IF CH$RCHAR (.EOPTR+1) EQL %CHAR (10)#� THEN 2 ELSE 1);�<� RCV [RCV_L_BUFPTR] = CH$PLUS (.EOPTR, .DELTA);+� RCNT = .RCNT - .LEN - .DELTA;�!� INSQUE (.RCV, INQ);�� END; � END � ELSE�� BEGIN"� IF .LEN GEQ .RCNT-1 THEN0� INSQUE (.RCV, .FREEQ [QUE_L_TAIL])� ELSE� BEGIN�7� RCV [RCV_L_BUFPTR] = CH$PLUS (.EOPTR, 1);�&� RCNT = .RCNT - .LEN - 1;!� INSQUE (.RCV, INQ);'� END; � END;X� FOUND_CRLF = 1;� EXITLOOP; � END;�� END; ! WHILE NOT REMQUE��� IF .FOUND_CRLF THENP � BEGINt!� IF ACTUALCOUNT () GTR 2 THENP � BEGIN� IF .IOSB_A NEQA 0 THEN � BEGIN(� BIND IOSB = .IOSB_A : IOSBDEF;7� IOSB [IOSB_W_COUNT] = .RCVSTR [DSC$W_LENGTH];D,� IOSB [IOSB_W_STATUS] = SS$_NORMAL; � END;8� IF .ASTADR NEQA 0 THENl:� RETURN $DCLAST (ASTADR=.ASTADR, ASTPRM=.ASTPRM); � END; � RETURN SS$_NORMAL; � END;� -� IF REMQUE (.FREEQ [QUE_L_HEAD], RCV) THENS+� LIB$GET_VM (%REF (RCV_S_RCVDEF), RCV);U)� RCV [RCV_L_BUFPTR] = RCV [RCV_T_BUF];I� RCV [RCV_L_CTX] = .CTX;R � RCV [RCV_L_STRPTR] = RCVSTR; � IF ACTUALCOUNT () GTR 2 THEN � BEGIND#� RCV [RCV_L_USRIOSB] = .IOSB_A;N"� RCV [RCV_L_ASTADR] = .ASTADR;"� RCV [RCV_L_ASTPRM] = .ASTPRM;� ENDT� ELSEG� RCV [RCV_L_���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������D����������������������������������NETLIB_SRC.BCK�����������������P��XP��[NETLIB]NETLIB_UCX_TCP.B32;17��������������������������������������������������������������������������������������������������P�����2�������������������������������#�������USRIOSB] = RCV [RCV_L_ASTADR] = RCV [RCV_L_ASTPRM] = 0;I��6� CH$MOVE (8, CTX [CTX_Q_EXPTIME], RCV [RCV_Q_TMO]); � IF ACTUALCOUNT () GTR 5 THEN@� IF .TMO_A NEQA 0 THEN CH$MOVE (8, .TMO_A, RCV [RCV_Q_TMO]);��F� $SETIMR (DAYTIM=RCV [RCV_Q_TMO], ASTADR=TCP_TMO_AST, REQIDT=.RCV);G� STATUS = $QIO (CHAN=.CHN, FUNC=IO$_READVBLK, IOSB=RCV [RCV_Q_IOSB],LH� ASTADR=TCP_RCV_AST, ASTPRM=.RCV, P1=RCV [RCV_T_BUF], P2=RCV_S_BUF);� IF NOT .STATUS THEN= � BEGIN+� $CANTIM (REQIDT=.RCV);�(� INSQUE (.RCV, .FREEQ [QUE_L_TAIL]);� ENDt� ELSE'� IF .RCV [RCV_L_ASTADR] EQLA 0 THENm1� STATUS = $SYNCH (IOSB=RCV [RCV_Q_IOSB]);k�� � .STATUSU���END; ! TCP_GET_LINEw� �%SBTTL 'TCP_RCV_AST'(�ROUTINE TCP_RCV_AST (RCV : REF RCVDEF) =�BEGIN �!++n�! FUNCTIONAL DESCRIPTION:C�!I>�! This AST routine is invoked when a network read completes.@�! It queues up the buffer block for processing by the mainline@�! thread, which will also handle I/O errors. Then a new block<�! is allocated and, barring any errors, a read is reQIO'd.�! B�! RETURNS: cond_value, longword (unsigned), write only, by value�!2 �! PROTOTYPE:�!R�! TCP_RCV_AST buf��! �! IMPLICIT INPUTS: None.T�!N�! IMPLICIT OUTPUTS: None.)�!��! COMPLETION CODES:E�!E2�! SS$_NORMAL: normal successful completion.�!D�! SIDE EFFECTS:R�!F �! None.D�!--1��� BIND(� IOSB = RCV [RCV_Q_IOSB] : IOSBDEF,0� STR = .RCV [RCV_L_STRPTR] : BLOCK [,BYTE],.� BUF = RCV [RCV_T_BUF] : BLOCK [,BYTE],4� BUFPTR = RCV [RCV_L_BUFPTR]: REF BLOCK [,BYTE],+� CTX = RCV [RCV_L_CTX] : REF CTXDEF,�%� CHN = CTX [CTX_W_CHAN] : WORD,�/� UIOSB = RCV [RCV_L_USRIOSB] : REF IOSBDEF;o�� � LOCALd � LEN,d � STATUS, � EOPTR,t � LFPOS, %� SDSC : BLOCK [DSC$K_S_BLN,BYTE];k��� $CANTIM (REQIDT=.RCV);%� IF NOT .IOSB [IOSB_W_STATUS] THENy � BEGIN�� IF .UIOSB NEQA 0 THEN � BEGIN1� CH$MOVE (8, IOSB, .RCV [RCV_L_USRIOSB]);�4� UIOSB [IOSB_W_COUNT] = .STR [DSC$W_LENGTH]; � END; (� INSQUE (.RCV, .FREEQ [QUE_L_TAIL]);'� IF .RCV [RCV_L_ASTADR] NEQA 0 THEN�;� RETURN (.RCV [RCV_L_ASTADR]) (.RCV [RCV_L_ASTPRM]), � ELSEI� RETURN SS$_NORMAL;B� END;��!� IF .CTX [CTX_V_IGNORELF] THEN. � BEGIN�� CTX [CTX_V_IGNORELF] = 0;.� IF CH$RCHAR (.BUFPTR) EQL %CHAR (10) THEN � BEGIN'� BUFPTR = CH$PLUS (.BUFPTR, 1);;8� IOSB [IOSB_W_COUNT] = .IOSB [IOSB_W_COUNT] - 1; � END;T� END;��'� SDSC [DSC$B_DTYPE] = DSC$K_DTYPE_T;D'� SDSC [DSC$B_CLASS] = DSC$K_CLASS_S;GC� EOPTR = CH$FIND_CH (.IOSB [IOSB_W_COUNT], .BUFPTR, %CHAR (13));SC� LFPOS = CH$FIND_CH (.IOSB [IOSB_W_COUNT], .BUFPTR, %CHAR (10));I��+� IF CH$FAIL (.EOPTR) THEN EOPTR = .LFPOS %� ELSE IF NOT CH$FAIL (.LFPOS) THENS/� IF .LFPOS LSSA .EOPTR THEN EOPTR = .LFPOS;D��� IF CH$FAIL (.EOPTR) THEN � BEGINE6� SDSC [DSC$W_LENGTH] = MINU (.IOSB [IOSB_W_COUNT],5� STR_MAX-.STR [DSC$W_LENGTH]);h$� SDSC [DSC$A_POINTER] = .BUFPTR;� STR$APPEND (STR, SDSC);� BUFPTR = RCV [RCV_T_BUF];G� $SETIMR (DAYTIM=RCV [RCV_Q_TMO], ASTADR=TCP_TMO_AST, REQIDT=.RCV);sH� STATUS = $QIO (CHAN=.CHN, FUNC=IO$_READVBLK, IOSB=RCV [RCV_Q_IOSB],5� ASTADR=TCP_RCV_AST, ASTPRM=.RCV, P1=.BUFPTR, � P2=RCV_S_BUF);:� IF NOT .STATUS THEN � BEGIN� $CANTIM (REQIDT=.RCV);P� IF .UIOSB NEQA 0 THEN� BEGIN2� CH$MOVE (8, IOSB, .RCV [RCV_L_USRIOSB]);5� UIOSB [IOSB_W_COUNT]���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������E����������������������������������NETLIB_SRC.BCK�����������������P��XP��[NETLIB]NETLIB_UCX_TCP.B32;17��������������������������������������������������������������������������������������������������P�����2�������������������������� �����*������� = .STR [DSC$W_LENGTH]; *� UIOSB [IOSB_W_STATUS] = .STATUS; � END;E,� INSQUE (.RCV, .FREEQ [QUE_L_TAIL]);+� IF .RCV [RCV_L_ASTADR] NEQA 0 THEN <� RETURN (.RCV [RCV_L_ASTADR]) (.RCV [RCV_L_ASTPRM]) � ELSE�� RETURN SS$_NORMAL; � END; � RETURN SS$_NORMAL� END;��$� LEN = CH$DIFF (.EOPTR, .BUFPTR);C� SDSC [DSC$W_LENGTH] = MINU (.LEN, STR_MAX-.STR [DSC$W_LENGTH]);R#� SDSC [DSC$A_POINTER] = .BUFPTR;Y� STR$APPEND (STR, SDSC); ,� IF CH$RCHAR (.EOPTR) EQL %CHAR (13) THEN � BEGINC,� IF .LEN GEQ .IOSB [IOSB_W_COUNT]-2 THEN � BEGIN0� IF .LEN EQL .IOSB [IOSB_W_COUNT]-1 THEN#� CTX [CTX_V_IGNORELF] = 1;F,� INSQUE (.RCV, .FREEQ [QUE_L_TAIL]);� END � ELSED � BEGIN� LOCAL DELTA; G� DELTA = (IF CH$RCHAR (.EOPTR+1) EQL %CHAR (10) THEN 2 ELSE 1);B+� BUFPTR = CH$PLUS (.EOPTR, .DELTA);SD� IOSB [IOSB_W_COUNT] = .IOSB [IOSB_W_COUNT] - .LEN - .DELTA;)� INSQUE (.RCV, CTX [CTX_Q_BUFQ]);[ � END; � ENDT� ELSE � BEGIN ,� IF .LEN GEQ .IOSB [IOSB_W_COUNT]-1 THEN+� INSQUE (.RCV, .FREEQ [QUE_L_TAIL])� � ELSEL � BEGIN&� BUFPTR = CH$PLUS (.EOPTR, 1);?� IOSB [IOSB_W_COUNT] = .IOSB [IOSB_W_COUNT] - .LEN - 1;s)� INSQUE (.RCV, CTX [CTX_Q_BUFQ]);u � END; � END;��� IF .UIOSB NEQA 0 THEN � BEGIN�(� UIOSB [IOSB_W_STATUS] = SS$_NORMAL;0� UIOSB [IOSB_W_COUNT] = .STR [DSC$W_LENGTH];� END;&� IF .RCV [RCV_L_ASTADR] NEQA 0 THEN0� (.RCV [RCV_L_ASTADR]) (.RCV [RCV_L_ASTPRM])� ELSE� SS$_NORMALI���END; ! TCP_RCV_AST� �%SBTTL 'TCP_TMO_AST')�ROUTINE TCP_TMO_AST (RCV : REF RCVDEF) = �BEGIN��!++ �! FUNCTIONAL DESCRIPTION:I�! 7�! Delivered when a receive takes longer than EXPTIME._@�! Just cancels the I/O, to trigger the I/O completion AST with�! status SS$_CANCEL.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!A �! PROTOTYPE:�!R�! TCP_TMO_AST rcv�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.s�!n�! COMPLETION CODES:m�!T2�! SS$_NORMAL: normal successful completion.�! �! SIDE EFFECTS: �! �! None. �!-- � BIND%� CTX = .RCV [RCV_L_CTX] : CTXDEF;S��$� $CANCEL (CHAN=.CTX [CTX_W_CHAN])���END; ! TCP_TMO_AST���ENDv�ELUDOM! PROTOTYPE:�!�9�! TCP_SEND ctx, cmdstr [,flags] [,iosb, astadr, astprm]��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: n������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������F����������������������������������NETLIB_SRC.BCK�����������������P��XP��[NETLIB]NETLIB_UCX_UDP.B32;11��������������������������������������������������������������������������������������������������O���������������������������������������������*�[NETLIB]NETLIB_UCX_UDP.B32;11�+��,�P���.�����/� �@� �4�O������ ��������������������-�XP����0���1����2���3������K��P���W���O� ����5���6�=,)��7� ,)��8�ډX��9�$.��G� �@��H��J������ �������������%TITLE 'NETLIB_UCX_UDP'�$�MODULE NETLIB_UCX_UDP (IDENT='V1.2',J� ADDRESSING_MODE (EXTERNAL=LONG_RELATIVE,NONEXTERNAL=LONG_RELATIVE)) =�BEGIN��!++��! FACILITY: NETLIB��!�-�! ABSTRACT: UDP NETLIB routines for UCX.��!��! MODULE DESCRIPTION:��!�3�! Contains UDP send and receive routines for UCX.��!��! AUTHOR: M. Madison�A�! COPYRIGHT 1991, RENSSELAER POLYTECHNIC INSTITUTE.�"�! ALL RIGHTS RESERVED.�!��! CREATION DATE: 29-JAN-1991��!��! MODIFICATION HISTORY:��!�?�! 29-JAN-1991 V1.0 Madison Initial coding (from NSQUERY).�G�! 08-FEB-1991 V1.1 Madison Add source info return to UDP_RECEIVE.�;�! 22-NOV-1991 V1.2 Madison Add rcvtmo to UDP_RECEIVE.��!--�"� LIBRARY 'SYS$LIBRARY:STARLET';&� LIBRARY 'SYS$LIBRARY:UCX$INETDEF';� LIBRARY 'UCX_DEFS';�� LIBRARY 'NETLIB';���� FORWARD ROUTINE�� UDP_SEND,� UDP_RECEIVE,�� TIMER_AST;�� ��%SBTTL 'UDP_SEND'�L�GLOBAL ROUTINE UDP_SEND (CTX_A_A, ADR, PORT : WORD, BUFPTR, BUFLEN : WORD) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!��! Sends out a UDP datagram.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�1�! UDP_SEND chan, address, port, bufptr, buflen��!�@�! ctx: context, longword (unsigned), read only, by referenceG�! address: longword_unsigned, longword (unsigned), read only, by value�?�! port: word_unsigned, word (unsigned), read only, by value�E�! bufptr: varying_arg, longword (unsigned), read only, by reference�?�! buflen: word_unsigned, word (unsigned), read only, by value��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND#� CTX = .CTX_A_A : REF CTXDEF,�$� CHAN = CTX [CTX_W_CHAN] : WORD,(� PORT2 = PORT : VECTOR [2,BYTE];�� � LOCAL�)� REMSIN : BLOCK [SIN$C_LENGTH, BYTE],�� IOSB : IOSBDEF,� DSC : VECTOR [3,LONG], � RETLEN, � STATUS;��*� REMSIN [SIN$W_FAMILY] = UCX$C_AF_INET;8� REMSIN [SIN$W_PORT] = .PORT2 [0] * 256 + .PORT2 [1];� REMSIN [SIN$L_ADDR] = .ADR;�9� CH$FILL (%CHAR (0), SIN$S_ZERO, REMSIN [SIN$T_ZERO]);�� DSC [0] = SIN$C_LENGTH;�� DSC [1] = REMSIN;�� DSC [2] = RETLEN;�>� STATUS = $QIOW (CHAN=.CHAN, FUNC=IO$_WRITEVBLK, IOSB=IOSB,%� P1=.BUFPTR, P2=.BUFLEN, P3=DSC);�3� IF .STATUS THEN STATUS = .IOSB [IOSB_W_STATUS];��� � .STATUS����END; ! UDP_SEND�� ��%SBTTL 'UDP_RECEIVE'E�GLOBAL ROUTINE UDP_RECEIVE (CTX_A_A, BUFPTR, BUFSIZ : WORD, BUFLEN_A,�.� SRCADR_A, SRCPRT_A, RCVTMO_A) = �BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!��! Reads a UDP datagram.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�K�! UDP_RECEIVE chan, bufptr, bufsiz, buflen [,srcadr] [,srcprt] [,rcvtmo]��!�@�! ctx: context, longword (unsigned), read only, by referenceF�! bufptr: varying_arg, longword (unsigned), write only, by referen������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������G����������������������������������NETLIB_SRC.BCK�����������������P��XP��[NETLIB]NETLIB_UCX_UDP.B32;11��������������������������������������������������������������������������������������������������O������������������������������[� ������������ce?�! bufsiz: word_unsigned, word (unsigned), read only, by value�D�! buflen: word_unsigned, word (unsigned), write only, by referenceL�! srcadr: longword_unsigned, longword (unsigned), write only, by referenceL�! srcprt: longword_unsigned, longword (unsigned), write only, by referenceA�! rcvtmo: date_time, quadword (signed), read only, by reference��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND$� CTX = .CTX_A_A : REF CTXDEF,$� CHAN = CTX [CTX_W_CHAN] : WORD, � BUFLEN = .BUFLEN_A : WORD;�� � BUILTIN�� ACTUALCOUNT;��� � LOCAL�� RCVTMO : VECTOR [2,LONG],� INFO : VECTOR [3,LONG],2� REMSIN : VOLATILE BLOCK [SIN$C_LENGTH, BYTE],� IOSB : VOLATILE IOSBDEF,�� DSC : VECTOR [3,LONG],� RETLEN : VOLATILE,� � STATUS;��*� REMSIN [SIN$W_FAMILY] = UCX$C_AF_INET;#� REMSIN [SIN$W_PORT] = 53 * 256;�+� REMSIN [SIN$L_ADDR] = UCX$C_INADDR_ANY;�� DSC [0] = SIN$C_LENGTH;�� DSC [1] = REMSIN;�� DSC [2] = RETLEN;���"� STATUS = ACTUALCOUNT () GTR 6;.� IF .STATUS THEN STATUS = .RCVTMO_A NEQA 0;2� IF .STATUS THEN CH$MOVE (8, .RCVTMO_A, RCVTMO)<� ELSE $BINTIM (TIMBUF=%ASCID'0 00:00:10', TIMADR=RCVTMO);��� INFO [0] = .CHAN;�� INFO [1] = IOSB;� INFO [2] = SS$_NORMAL;;� $SETIMR (DAYTIM=RCVTMO, ASTADR=TIMER_AST, REQIDT=INFO);�=� STATUS = $QIOW (CHAN=.CHAN, FUNC=IO$_READVBLK, IOSB=IOSB,�*� P1=.BUFPTR, P2=.BUFSIZ, P3=DSC);� $CANTIM (REQIDT=INFO);,� IF NOT .INFO [2] THEN STATUS = .INFO [2]8� ELSE IF .STATUS THEN STATUS = .IOSB [IOSB_W_STATUS];;� BUFLEN = (IF .STATUS THEN .IOSB [IOSB_W_COUNT] ELSE 0);�� IF .STATUS THEN� � BEGIN�!� IF ACTUALCOUNT () GTR 4 THEN�C� IF .SRCADR_A NEQA 0 THEN .SRCADR_A = .REMSIN [SIN$L_ADDR];�!� IF ACTUALCOUNT () GTR 5 THEN�!� IF .SRCPRT_A NEQA 0 THEN�=� .SRCPRT_A = (.REMSIN [SIN$W_PORT] MOD 256) * 256 + �0� (.REMSIN [SIN$W_PORT] / 256);� END;�� � .STATUS����END; ! UDP_RECEIVE� ��%SBTTL 'TIMER_AST'�ROUTINE TIMER_AST (INFO_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�F�! This AST routine is triggered when the net receive timer goes off.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! TIMER_AST info��!�O�! info: vector_longword_unsigned, longword (unsigned), modify, by reference��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND&� INFO = .INFO_A : VECTOR [3,LONG], � IOSB = .INFO [1] : IOSBDEF;��2� INFO [2] = IOSB [IOSB_W_STATUS] = SS$_TIMEOUT;� $CANCEL (CHAN=.INFO [0]);���� SS$_NORMAL���END; ! TIMER_AST���END��ELUDOM��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������H����������������������������������NETLIB_SRC.BCK�����������������"��XP��[NETLIB]NETLIB_MXLOOK.B32;30���������������������������������������������������������������������������������������������������P�����U�������������������������Ӓ���������������*�[NETLIB]NETLIB_MXLOOK.B32;30�+��,�"���.�U����/� �@� �4�P���U���R��������������������-�XP����0���1����2���3������K��P���W���O�V����5���6�BN ۗ��7�| ۗ��8�Q:I��9����������G� �@��H��J������� �������������%TITLE 'NETLIB_MXLOOK'%�MODULE NETLIB_MXLOOK (IDENT='V1.5-3',�J� ADDRESSING_MODE (EXTERNAL=LONG_RELATIVE,NONEXTERNAL=LONG_RELATIVE)) =�BEGIN��!++��! FACILITY: NETLIB��!� �! ABSTRACT:��!�<�! Mail Exchange resource record lookup routine for NETLIB.<�! This module is layered on other NETLIB routines and thusB�! can be used with any TCP/IP supporting the Domain Name System.�!��! MODULE DESCRIPTION:��!��!��! AUTHOR: M. Madison�3�! COPYRIGHT 1993, MATTHEW D. MADISON.�"�! ALL RIGHTS RESERVED.�!��! CREATION DATE: 30-JAN-1991��!��! MODIFICATION HISTORY:��!�:�! 30-JAN-1991 V1.0 Madison Initial coding (from MX).C�! 05-FEB-1991 V1.1 Madison Handle automatic domain expansion.�C�! 25-MAR-1991 V1.2 Madison Allow site-defined domain name(s).�G�! 26-APR-1991 V1.3 Madison If NETLIB_NAMESERVERS not defined, use�;�! MultiNet or UCX ones.�C�! 22-NOV-1991 V1.3-1 Madison Use UDP_RECEIVE timeout feature.�F�! 04-DEC-1991 V1.4 Madison Improve no-MX case handling; recurse.G�! 01-FEB-1992 V1.4-1 Volz If NETLIB_NAMESERVERS not defined, also�*�! use TCPware one.>�! 13-FEB-1992 V1.4-2 Madison Fix NETLIB_DOMAIN loop bug.J�! 13-FEB-1992 V1.5 Madison If name contains dot, try it plain first.2�! ??-???-1993 V1.5-1 Madison Update for AXP.<�! 22-APR-1993 V1.5-2 Madison Fix one BIND declaration.P�! 29-APR-1994 V1.5-3 Madison Add support for PATHWAY's nameserver logical.�!--���"� LIBRARY 'SYS$LIBRARY:STARLET';� LIBRARY 'NETLIBDEF';� LIBRARY 'NETLIB';�� LIBRARY 'FIELDS';�� LIBRARY 'DEBUG';��� OWN�� DBGSWI : INITIAL (0),� DBGTST : INITIAL (0);��� FORWARD ROUTINE�� DNS_MXLOOK,� DNS_MXLOOK_TRY,� NAME_UNPACK : NOVALUE,�� ADD_CNAME : NOVALUE,�� ADD_MX : NOVALUE,� ADD_NULL : NOVALUE,�� GET_NAMESERVERS;���� EXTERNAL ROUTINE5� NET_ASSIGN, NET_BIND, NET_GET_ADDRESS, UDP_SEND,�5� UDP_RECEIVE, NET_DEASSIGN, NET_GET_HOSTNAME,�7� G_HAT (LIB$ANALYZE_SDESC, LIB$FREE_VM, LIB$GET_VM,�=� STR$COPY_DX, STR$APPEND, STR$FREE1_DX, STR$POS_EXTR,�;� STR$POSITION, STR$COMPARE, STR$CONCAT, STR$COPY_R,�@� STR$UPCASE, LIB$ADD_TIMES, LIB$SUB_TIMES, LIB$SYS_FAO);�� � LITERAL� � IPNS_CLASS_IN = %X'0100', � IPNS_TYPE_CNAME = %X'0500', � IPNS_TYPE_NS = %X'0200', � IPNS_TYPE_MX = %X'0F00',� IPNS_RC_SUCCESS = 0,�� IPNS_RC_NAMERR = 3,�� MAX_REQUESTS = 32,�� NSHO_S_HOST = 128,� CNAM_S_NAME = 128,� NUL_S_NAME = 128,� CNAM_S_CNAME = 128,� MX_S_NAME = 128,� MX_K_MAXMX = 4,� MX_S_MXNAME = 128;��� _DEF (NSMSG)!� NSMSG_L_LONGWORD = _LONG,� � _OVERLAY (NSMSG_L_LONGWORD)&� NSMSG_W_ID = _WORD,*� NSMSG_V_RECURSION_DESIRED = _BIT,(� NSMSG_V_TRUNCATION = _BIT,)� NSMSG_V_AUTHORITATIVE = _BIT,�+� NSMSG_V_OPCODE = _BITS (4)������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������I����������������������������������NETLIB_SRC.BCK�����������������"��XP��[NETLIB]NETLIB_MXLOOK.B32;30���������������������������������������������������������������������������������������������������P�����U�������������������������N �������������,�&� NSMSG_V_RESPONSE = _BIT,+� NSMSG_V_RCODE = _BITS (4),�+� NSMSG_V_UNUSED = _BITS (3),�(� NSMSG_V_RECURSION_AVAIL = _BIT� _ENDOVERLAY� _ENDDEF (NSMSG);��� _DEF (NSHO)�� NSHO_L_FLINK = _LONG,� NSHO_L_BLINK = _LONG,� NSHO_W_HOST = _WORD,(� NSHO_T_HOST = _BYTES (NSHO_S_HOST)� _ENDDEF (NSHO);���� _DEF (CNAM)�� CNAM_Q_EXPDT = _QUAD,� CNAM_L_FLAGS = _LONG,� _OVERLAY (CNAM_L_FLAGS) � CNAM_V_INUSE = _BIT,� _ENDOVERLAY� CNAM_L_NAME = _LONG,� CNAM_L_CNAME = _LONG,�+� CNAM_T_NAME = _BYTES (CNAM_S_NAME),�,� CNAM_T_CNAME = _BYTES (CNAM_S_CNAME)� _ENDDEF (CNAM);��� � _DEF (MX)�� MX_Q_EXPDT = _QUAD,*� MX_AL_MXPREF = _BYTES (4*MX_K_MAXMX),*� MX_AL_MXNAME = _BYTES (4*MX_K_MAXMX),� MX_L_COUNT = _LONG,� MX_L_FLAGS = _LONG,� _OVERLAY (MX_L_FLAGS)� MX_V_INUSE = _BIT,�� _ENDOVERLAY� MX_L_NAME = _LONG,'� MX_T_NAME = _BYTES (MX_S_NAME),�3� MX_AT_MXNAME = _BYTES (MX_K_MAXMX*MX_S_MXNAME)�� _ENDDEF (MX);���� _DEF (NUL)� NUL_Q_EXPDT = _QUAD,�� NUL_L_FLAGS = _LONG,�� _OVERLAY (NUL_L_FLAGS)�� NUL_V_INUSE = _BIT,�� _ENDOVERLAY� NUL_L_NAME = _LONG,�(� NUL_T_NAME = _BYTES (NUL_S_NAME)� _ENDDEF (NUL);�� � MACRO�� TABLE (TABNAM, ITEM1) [] =�/� %IF %LENGTH EQL 1 %THEN %EXITMACRO %FI�8� LITERAL %NAME (TABNAM, '_COUNT') = %LENGTH - 1;� PSECT OWN = $PLIT$;F� OWN TABNAM : VECTOR [%NAME (TABNAM, '_COUNT'),LONG] INITIAL (� %ASCID ITEM1E� %IF NOT %NULL (%REMAINING) %THEN FILLTAB (%REMAINING) %FI);�� PSECT OWN = $OWN$;�� %,�� FILLTAB (X) [] =�M� , %ASCID X %IF NOT %NULL (%REMAINING) %THEN FILLTAB (%REMAINING) %FI�� %;��� � LITERAL�� CNAMTAB_SIZE = 128,� MXTAB_SIZE = 128,� NULLTAB_SIZE = 128,�� MXN_S_HOST = 128;��� OWN�A� CNAMTAB : BLOCKVECTOR [CNAMTAB_SIZE,CNAM_S_CNAMDEF,BYTE]�'� FIELD (CNAM_FIELDS),�9� MXTAB : BLOCKVECTOR [MXTAB_SIZE,MX_S_MXDEF,BYTE]�%� FIELD (MX_FIELDS),�?� NULLTAB : BLOCKVECTOR [NULLTAB_SIZE,NUL_S_NULDEF,BYTE]�&� FIELD (NUL_FIELDS),!� NSHPRM : QUEDEF PRESET (�� [QUE_L_TAIL] = NSHPRM,� � [QUE_L_HEAD] = NSHPRM);�� � MACRO�� MXN_L_PREF = 0,0,32,0%,� MXN_L_LEN = 1,0,32,0%,� MXN_T_HOST = 2,0,0,0%;��� � MACRO�$� LONG_PACK (X, NSBUF, NSINDEX) = � BEGIN%� NSBUF [.NSINDEX,0,32,0] = X;� � NSINDEX = .NSINDEX + 4; � END%,&� LONG_UNPACK (X, NSBUF, NSINDEX) = � BEGIN%� X =.NSBUF [.NSINDEX,0,32,0];� � NSINDEX = .NSINDEX + 4; � END%,.� LONG_REVERSE_UNPACK (X, NSBUF, NSINDEX) = � BEGIN-� X<24,8,0> = .NSBUF [.NSINDEX,0,8,0];�/� X<16,8,0> = .NSBUF [.NSINDEX+1,0,8,0];�/� X<8,8,0> = .NSBUF [.NSINDEX+2,0,8,0];�/� X<0,8,0> = .NSBUF [.NSINDEX+3,0,8,0];� � NSINDEX = .NSINDEX + 4; � END%,)� BYTE_SWAP_PACK (X, NSBUF, NSINDEX) =� � BEGIN+� NSBUF [.NSINDEX,0,8,0] = X<8,8,0>;�-� NSBUF [.NSINDEX+1,0,8,0] = X<0,8,0>;� � NSINDEX = .NSINDEX + 2; � END%,+� BYTE_SWAP_UNPACK (X, NSBUF, NSINDEX) =� � BEGIN,� X<8,8,0> = .NSBUF [.NSINDEX,0,8,0];.� X<0,8,0> = .NSBUF [.NSINDEX+1,0,8,0]; � NSINDEX = .NSINDEX + 2; � END%,$� WORD_PACK (X, NSBUF, NSINDEX) = � BEG���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������J����������������������������������NETLIB_SRC.BCK�����������������"��XP��[NETLIB]NETLIB_MXLOOK.B32;30���������������������������������������������������������������������������������������������������P�����U��������������������������������������IN%� NSBUF [.NSINDEX,0,16,0] = X;� � NSINDEX = .NSINDEX + 2; � END%,&� WORD_UNPACK (X, NSBUF, NSINDEX) = � BEGIN&� X = .NSBUF [.NSINDEX,0,16,0]; � NSINDEX = .NSINDEX + 2; � END%,$� BYTE_PACK (X, NSBUF, NSINDEX) = � BEGIN$� NSBUF [.NSINDEX,0,8,0] = X; � NSINDEX = .NSINDEX + 1; � END%,&� BYTE_UNPACK (X, NSBUF, NSINDEX) = � BEGIN%� X = .NSBUF [.NSINDEX,0,8,0];� � NSINDEX = .NSINDEX + 1; � END%,'� ASCIC_PACK (STR, NSBUF, NSINDEX) =� � BEGIN6� NSBUF [.NSINDEX,0,8,0] = .STR [DSC$W_LENGTH];<� CH$MOVE (.STR [DSC$W_LENGTH], .STR [DSC$A_POINTER],7� NSBUF [.NSINDEX+1,0,8,0]);�6� NSINDEX = .NSINDEX + 1 + .STR [DSC$W_LENGTH]; � END%,)� ASCIC_UNPACK (STR, NSBUF, NSINDEX) =�$� BEGIN 9� STR$COPY_R (STR, %REF (.NSBUF [.NSINDEX,0,8,0]),�$� NSBUF [.NSINDEX+1,0,8,0]);:� NSINDEX = .NSINDEX + 1 + .NSBUF [.NSINDEX,0,8,0]; � END%,(� TIME_UNPACK (TIM, NSBUF, NSINDEX) = � BEGIN� BUILTIN EMUL;� LOCAL XTIME;�5� LONG_REVERSE_UNPACK (XTIME, NSBUF, NSINDEX);�9� EMUL (XTIME, UPLIT (-10000000), UPLIT (0), TIM);� � END%;��� OWN�0� ONEHR : VECTOR [2,LONG] INITIAL (0,0),!� USE_RECURSION : INITIAL (1);�� ��%SBTTL 'DNS_MXLOOK'�G�GLOBAL ROUTINE DNS_MXLOOK (QHDESC_A, MXMAX_A, MXCOUNT_A, MXNSTRUC_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�>�! Front-end for DNS_MXLOOK_TRY that handles domain suffixes.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�0�! DNS_MXLOOK qhname, mxmax, mxcount, mxnstruc�!�C�! qhname: char_string, character string, read only, by descriptor�K�! mxmax: unsigned_longword, longword (unsigned), read only, by reference�L�! mxcount: unsigned_longword, longword (unsigned), write only, by referenceG�! mxnstruc: mxname_struc, longword (unsigned), write only, by reference��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.$�! Other codes possible.�!��! SIDE EFFECTS: None.��!��!--���� BIND2� QHOST = .QHDESC_A : BLOCK [DSC$K_S_BLN,BYTE],� MXMAX = .MXMAX_A,� MXCOUNT = .MXCOUNT_A,5� MXNSTRUC = .MXNSTRUC_A : BLOCKVECTOR [,34,LONG];��� � LOCAL�'� MYHOST : BLOCK [DSC$K_S_BLN,BYTE],�&� QHLCL : BLOCK [DSC$K_S_BLN,BYTE],%� SDSC : BLOCK [DSC$K_S_BLN,BYTE],�%� LNMLST : $ITMLST_DECL (ITEMS=2),�)� DOMNAM : VOLATILE VECTOR [255,BYTE],�� DOMLEN : VOLATILE WORD,� RCVTMO : VECTOR [2,LONG], � DNSSTAT,�� CP, � STATUS;��:� IF .QHOST [DSC$W_LENGTH] EQL 0 THEN RETURN SS$_IVADDR;��L� IF $TRNLNM (TABNAM=%ASCID'LNM$SYSTEM', LOGNAM=%ASCID'NETLIB_MXLOOK_TMO')� THEN � BEGIN� � LOCAL*� TMOLST : $ITMLST_DECL (ITEMS=1),.� TMOBUF : VOLATILE VECTOR [255,BYTE],4� DSC : BLOCK [DSC$K_S_BLN,BYTE] PRESET (-� [DSC$B_DTYPE] = DSC$K_DTYPE_T,�-� [DSC$B_CLASS] = DSC$K_CLASS_S,�)� [DSC$A_POINTER] = TMOBUF);���!� $ITMLST_INIT (ITMLST=TMOLST,�I� (ITMCOD=LNM$_STRING, BUFADR=TMOBUF, BUFSIZ=%ALLOCATION (TMOBUF),�&� RETLEN=DSC [DSC$W_LENGTH]));@� STATUS = $TRNLNM (TABNAM=%ASCID'LNM$SYSTEM', ITMLST=TMOLST,0� LOGNAM=%ASCID'NETLIB_MXLOOK_TMO');��L� STATUS = $BINTIM (TIMBUF=(IF .STATUS THEN DSC ELSE %ASCID'0 00:00:15'),� TI���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������K����������������������������������NETLIB_SRC.BCK�����������������"��XP��[NETLIB]NETLIB_MXLOOK.B32;30���������������������������������������������������������������������������������������������������P�����U�������������������������wx�������������MADR=RCVTMO);�L� IF NOT .STATUS THEN $BINTIM (TIMBUF=%ASCID'0 00:00:15', TIMADR=RCVTMO);� END�<� ELSE $BINTIM (TIMBUF=%ASCID'0 00:00:15', TIMADR=RCVTMO);��K� IF CH$RCHAR (CH$PLUS (.QHOST [DSC$A_POINTER], .QHOST [DSC$W_LENGTH]-1))�� EQL %C'.' THEN�<� RETURN DNS_MXLOOK_TRY (.QHDESC_A, .MXMAX_A, .MXCOUNT_A,-� .MXNSTRUC_A, RCVTMO);���8� IF NOT CH$FAIL (CH$FIND_CH (.QHOST [DSC$W_LENGTH]-1,.� .QHOST [DSC$A_POINTER], %C'.')) THEN8� IF DNS_MXLOOK_TRY (.QHDESC_A, .MXMAX_A, .MXCOUNT_A,:� .MXNSTRUC_A, RCVTMO) THEN RETURN SS$_NORMAL;��!� INIT_DYNDESC (MYHOST, QHLCL);�'� SDSC [DSC$B_DTYPE] = DSC$K_DTYPE_T;�'� SDSC [DSC$B_CLASS] = DSC$K_CLASS_S;���M� IF $TRNLNM (TABNAM=%ASCID'LNM$SYSTEM', LOGNAM=%ASCID'NETLIB_DOMAIN') THEN� � BEGIN�� DNSSTAT = SS$_ENDOFFILE;�� INCR I FROM 0 DO� � BEGIN%� $ITMLST_INIT (ITMLST=LNMLST,�2� (ITMCOD=LNM$_INDEX, BUFADR=I, BUFSIZ=4),J� (ITMCOD=LNM$_STRING, BUFADR=DOMNAM, BUFSIZ=%ALLOCATION (DOMNAM),� RETLEN=DOMLEN));D� STATUS = $TRNLNM (TABNAM=%ASCID'LNM$SYSTEM', ITMLST=LNMLST,2� LOGNAM=%ASCID'NETLIB_DOMAIN');-� IF NOT .STATUS OR .DOMLEN EQL 0 THEN�� BEGIN� STATUS = .DNSSTAT;� EXITLOOP;� � END;�5� IF CH$RCHAR (DOMNAM+.DOMLEN-1) NEQ %C'.' AND�/� .DOMLEN LSS %ALLOCATION (DOMNAM) THEN�� BEGIN+� CH$WCHAR (%C'.', DOMNAM+.DOMLEN);�� DOMLEN = .DOMLEN + 1;� � END;�'� SDSC [DSC$A_POINTER] = DOMNAM;�'� SDSC [DSC$W_LENGTH] = .DOMLEN;�,� IF CH$RCHAR (DOMNAM) EQL %C'.' THEN)� STR$CONCAT (QHLCL, QHOST, SDSC)� � ELSE�5� STR$CONCAT (QHLCL, QHOST, %ASCID'.', SDSC);�>� STATUS = DNS_MXLOOK_TRY (QHLCL, .MXMAX_A, .MXCOUNT_A,$� .MXNSTRUC_A, RCVTMO);"� IF .STATUS THEN EXITLOOP; � END;�� END�� ELSE � BEGIN�� NET_GET_HOSTNAME (MYHOST);�$� STR$APPEND (MYHOST, %ASCID'.');?� SDSC [DSC$A_POINTER] = CH$FIND_CH (.MYHOST [DSC$W_LENGTH],�)� .MYHOST [DSC$A_POINTER], %C'.');�3� SDSC [DSC$W_LENGTH] = .MYHOST [DSC$W_LENGTH] -�B� CH$DIFF (.SDSC [DSC$A_POINTER], .MYHOST [DSC$A_POINTER]);� WHILE 1 DO� � BEGIN)� STR$CONCAT (QHLCL, QHOST, SDSC);�>� STATUS = DNS_MXLOOK_TRY (QHLCL, .MXMAX_A, .MXCOUNT_A,$� .MXNSTRUC_A, RCVTMO);"� IF .STATUS THEN EXITLOOP;5� IF .SDSC [DSC$W_LENGTH] LEQ 1 THEN EXITLOOP;�P� CP = CH$FIND_CH (.SDSC [DSC$W_LENGTH]-1,.SDSC [DSC$A_POINTER]+1,%C'.');(� IF CH$FAIL (.CP) THEN EXITLOOP;5� SDSC [DSC$W_LENGTH] = .SDSC [DSC$W_LENGTH] -�/� CH$DIFF (.CP, .SDSC [DSC$A_POINTER]);�$� SDSC [DSC$A_POINTER] = .CP; � END;�� END;��!� FREE_STRINGS (QHLCL, MYHOST);��� � .STATUS����END; ! DNS_MXLOOK�� ��%SBTTL 'DNS_MXLOOK_TRY'�N�ROUTINE DNS_MXLOOK_TRY (QHDESC_A, MXMAX_A, MXCOUNT_A, MXNSTRUC_A, RCVTMO_A) = �BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�B�! This routine asks name servers for MX records for a host name.E�! The initial list of name servers is obtained from the system-wide�G�! logical name NETLIB_NAMESERVERS, which should be set up as a search� �! list.��!�B�! For each name server in the list, the addresses for the serverC�! are looked up via GTHST, and for each address UDP connection is�B�! started, a request for MX records is constructed and sent off,<�! and we wait for the return message for about 10 seconds.D����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������L����������������������������������NETLIB_SRC.BCK�����������������"��XP��[NETLIB]NETLIB_MXLOOK.B32;30���������������������������������������������������������������������������������������������������P�����U�������������������������t�������������! If no response comes back or some error occurs, the next addressF�! for that server is tried; after all addresses have been tried, theF�! next server in the list is tried. If a response comes back, it isD�! parsed. If the AUTHORITATIVE bit is set in the header and thereA�! are no ANSWER RR's, then we know that there are no MX records�B�! and we stop asking. If there are ANSWER RR's of type MX, thenB�! we add them names and preferences to the MXNAMES structure andA�! increment MXCOUNT. If there is a CNAME RR, we save that name�?�! for future requests. If there are AUTHORITY RR's, we queue�B�! the name server names at the front of our name server list forB�! future requests. Before we make the next request we incrementB�! a request counter. We give up after MAX_REQUESTS requests. We2�! also stop if we collect any MX records at all.�!�@�! The MXNAMES structure is an array of records like (in PL/I):�! DECLARE 1 MXNAMES (n),�4�! 2 PREFERENCE_VALUE FIXED BINARY (31),4�! 2 HOST_NAME_LENGTH FIXED BINARY (31),+�! 2 HOST_NAME CHARACTER (128);��!�;�! i.e, two longwords and a 128-byte string. No more than�2�! MXMAX names are ever returned by this routine.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�0�! DNS_MXLOOK qhname, mxmax, mxcount, mxnstruc�!�C�! qhname: char_string, character string, read only, by descriptor�K�! mxmax: unsigned_longword, longword (unsigned), read only, by reference�L�! mxcount: unsigned_longword, longword (unsigned), write only, by referenceG�! mxnstruc: mxname_struc, longword (unsigned), write only, by reference��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.$�! Other codes possible.�!��! SIDE EFFECTS: None.��!��!--���� BIND:� QHOST = .QHDESC_A : BLOCK [DSC$K_S_BLN,BYTE],� MXMAX = .MXMAX_A,� MXCOUNT = .MXCOUNT_A,:� MXNSTRUC = .MXNSTRUC_A : BLOCKVECTOR [,34,LONG],2� XRCVTMO = .RCVTMO_A : BLOCK [8,BYTE];�� � LOCAL� � STATUS,#� REQBUF : BLOCK [256,BYTE],� � REQIDX,� REQCOUNT,$� RCVBUF : BLOCK [512,BYTE], � RCVIDX,*� PHOST : BLOCK [DSC$K_S_BLN,BYTE],)� NAME : BLOCK [DSC$K_S_BLN,BYTE],�*� NAME2 : BLOCK [DSC$K_S_BLN,BYTE],*� PHSEG : BLOCK [DSC$K_S_BLN,BYTE], � TTL : VECTOR [2,LONG],"� RCVTMO : VECTOR [2,LONG], � NOW : VECTOR [2,LONG],� NSH : REF NSHODEF,"� QIDENT : VECTOR [4,WORD],� HDR : NSMSGDEF,A� NSHQUE : QUEDEF,A � CURMXR, � IPCTX; ��-� INIT_DYNDESC (PHOST, PHSEG, NAME, NAME2); ��9� IF .NSHPRM [QUE_L_HEAD] EQLA NSHPRM [QUE_L_HEAD] THENe � BEGINu9� CH$FILL (%CHAR (0), %ALLOCATION (CNAMTAB), CNAMTAB);t5� CH$FILL (%CHAR (0), %ALLOCATION (MXTAB), MXTAB);�9� CH$FILL (%CHAR (0), %ALLOCATION (NULLTAB), NULLTAB); <� USE_RECURSION = NOT $TRNLNM (TABNAM=%ASCID'LNM$SYSTEM',=� LOGNAM=%ASCID'NETLIB_RECURSION_DISABLE');O'� STATUS = GET_NAMESERVERS (NSHPRM); (� IF NOT .STATUS THEN RETURN .STATUS;� END;��� MXCOUNT = 0;� REQCOUNT = 0;i��<� IF .QHOST [DSC$W_LENGTH] EQL 0 THEN RETURN SS$_BADPARAM;��� IF .USE_RECURSION THEN-� LIB$ADD_TIMES (XRCVTMO, XRCVTMO, RCVTMO)d� ELSE"� CH$MOVE (8, XRCVTMO, RCVTMO);��� $GETTIM (TIMADR = NOW);N��� STR$UPCASE (PHOST, QHOST);K� IF CH$RCHAR (CH$���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������M����������������������������������NETLIB_SRC.BCK�����������������"��XP��[NETLIB]NETLIB_MXLOOK.B32;30���������������������������������������������������������������������������������������������������P�����U�������������������������<������#�������PLUS (.PHOST [DSC$A_POINTER], .PHOST [DSC$W_LENGTH]-1))s2� NEQ %C'.' THEN STR$APPEND (PHOST, %ASCID'.');��&� INCR I FROM 0 TO CNAMTAB_SIZE-1 DO&� IF .CNAMTAB [.I,CNAM_V_INUSE] THEN � BEGIN30� BIND CNAM = CNAMTAB [.I,0,0,0,0] : CNAMDEF;!� LOCAL TMP : VECTOR [2,LONG];n��E� DBGPRT ('%NETLIB_MXLOOK, CNAME entry[!UL]: !AD expires !%D', .I,dG� .CNAM [CNAM_L_NAME], CNAM [CNAM_T_NAME], CNAM [CNAM_Q_EXPDT]); ��:� IF LIB$SUB_TIMES (CNAM [CNAM_Q_EXPDT], NOW, TMP) THEN � BEGIN<� IF CH$EQL (.CNAM [CNAM_L_NAME], CNAM [CNAM_T_NAME],A� .PHOST [DSC$W_LENGTH], .PHOST [DSC$A_POINTER]) THENF� BEGING� STR$COPY_R (PHOST, CNAM [CNAM_L_CNAME], CNAM [CNAM_T_CNAME]);TJ� DBGPRT ('%NETLIB_MXLOOK, found CNAMTAB[!UL] -> !AS', .I, PHOST); � END;:� END � ELSEC � BEGINJ� DBGPRT ('%NETLIB_MXLOOK, cleaned entry [!UL], !AD, from CNAMTAB',7� .I, .CNAM [CNAM_L_NAME], CNAM [CNAM_T_NAME]);T!� CNAM [CNAM_V_INUSE] = 0;� � END;P� END;��$� INCR I FROM 0 TO MXTAB_SIZE-1 DO"� IF .MXTAB [.I,MX_V_INUSE] THEN � BEGINM*� BIND MX = MXTAB [.I,0,0,0,0] : MXDEF;!� LOCAL TMP : VECTOR [2,LONG];R��B� DBGPRT ('%NETLIB_MXLOOK, MX entry[!UL]: !AD expires !%D', .I,;� .MX [MX_L_NAME], MX [MX_T_NAME], MX [MX_Q_EXPDT]);���6� IF LIB$SUB_TIMES (MX [MX_Q_EXPDT], NOW, TMP) THEN � BEGINK� IF CH$EQL (.MX [MX_L_NAME], MX [MX_T_NAME], .PHOST [DSC$W_LENGTH],C&� .PHOST [DSC$A_POINTER]) THEN� BEGIN� BIND;� PREF = MX [MX_AL_MXPREF] : VECTOR [,LONG],N;� LENGTH = MX [MX_AL_MXNAME] : VECTOR [,LONG],2L� NAME = MX [MX_AT_MXNAME] : BLOCKVECTOR [,MX_S_MXNAME,BYTE];I� DBGPRT ('%NETLIB_MXLOOK, We have a match, entry [!UL]...', .I);N3� MXCOUNT = MIN (.MX [MX_L_COUNT], .MXMAX);I(� INCR J FROM 0 TO .MXCOUNT-1 DO� BEGIN,8� DBGPRT ('%NETLIB_MXLOOK, !AD, pref=!UL',<� .LENGTH [.J], NAME [.J,0,0,0,0], .PREF [.J]);5� MXNSTRUC [.J, MXN_L_PREF] = .PREF [.J];�6� MXNSTRUC [.J, MXN_L_LEN] = .LENGTH [.J];7� CH$MOVE (.LENGTH [.J], NAME [.J,0,0,0,0],E*� MXNSTRUC [.J, MXN_T_HOST]);� END;� FREE_STRINGS (PHOST); � RETURN SS$_NORMAL; � END� END � ELSE) � BEGINI� DBGPRT ('%NETLIB_MXLOOK, cleaned entry [!UL], !AD, from MXTAB',L/� .I, .MX [MX_L_NAME], MX [MX_T_NAME]); � MX [MX_V_INUSE] = 0; � END;L� END;��&� INCR I FROM 0 TO NULLTAB_SIZE-1 DO%� IF .NULLTAB [.I,NUL_V_INUSE] THENT � BEGINN.� BIND NUL = NULLTAB [.I,0,0,0,0] : NULDEF;!� LOCAL TMP : VECTOR [2,LONG];D��D� DBGPRT ('%NETLIB_MXLOOK, NULL entry[!UL]: !AD expires !%D', .I,A� .NUL [NUL_L_NAME], NUL [NUL_T_NAME], NUL [NUL_Q_EXPDT]);N��8� IF LIB$SUB_TIMES (NUL [NUL_Q_EXPDT], NOW, TMP) THEN � BEGIN8� IF CH$EQL (.NUL [NUL_L_NAME], NUL [NUL_T_NAME],A� .PHOST [DSC$W_LENGTH], .PHOST [DSC$A_POINTER]) THENT� BEGINJ� DBGPRT ('%NETLIB_MXLOOK, found NULLTAB[!UL] -> !AS', .I, PHOST);� MXCOUNT = 0;� FREE_STRINGS (PHOST);V� RETURN SS$_NORMAL; � END; � END � ELSEE � BEGINJ� DBGPRT ('%NETLIB_MXLOOK, cleaned entry [!UL], !AD, from NULLTAB',3� .I, .NUL [NUL_L_NAME], NUL [NUL_T_NAME]); � NUL [NUL_V_INUSE] = 0;H � END;R� END;�� � STATUS = NET_ASSIGN (IPCTX);� IF NOT .���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������N����������������������������������NETLIB_SRC.BCK�����������������"��XP��[NETLIB]NETLIB_MXLOOK.B32;30���������������������������������������������������������������������������������������������������P�����U�������������������������������*�������STATUS THEN � BEGINN� FREE_STRINGS (PHOST);� RETURN .STATUS;� END;)� STATUS = NET_BIND (IPCTX, NET_K_UDP);E� IF NOT .STATUS THENL � BEGINN� NET_DEASSIGN (IPCTX);� FREE_STRINGS (PHOST);� RETURN .STATUS;� END;��D� NSHQUE [QUE_L_TAIL] = NSHQUE [QUE_L_HEAD] = NSHQUE [QUE_L_HEAD];��� NSH = .NSHPRM [QUE_L_HEAD]; *� WHILE .NSH NEQA NSHPRM [QUE_L_HEAD] DO � BEGIN � LOCAL NSH2 : REF NSHODEF;.� LIB$GET_VM (%REF (NSHO_S_NSHODEF), NSH2);+� CH$MOVE (NSHO_S_NSHODEF, .NSH, .NSH2);_*� INSQUE (.NSH2, .NSHQUE [QUE_L_TAIL]);� NSH = .NSH [NSHO_L_FLINK];O� END;��3� WHILE NOT REMQUE (.NSHQUE [QUE_L_HEAD], NSH) DO( � BEGIN���D� DBGPRT ('%NETLIB_MXLOOK, Asking nameserver !AF about name !AS',7� .NSH [NSHO_W_HOST], NSH [NSHO_T_HOST], PHOST);D��� $GETTIM (TIMADR = QIDENT); ��� REQIDX = 0;�� � HDR [NSMSG_L_LONGWORD] = 0;$� HDR [NSMSG_W_ID] = .QIDENT [0];6� HDR [NSMSG_V_RECURSION_DESIRED] = .USE_RECURSION;9� DBGPRT ('%NETLIB_MXLOOK, [recursion_desired=!AS]',GC� (IF .USE_RECURSION THEN %ASCID'TRUE' ELSE %ASCID'FALSE'));E��9� LONG_PACK (.HDR [NSMSG_L_LONGWORD], REQBUF, REQIDX); �� � BEGIN� LOCAL"� ONE : WORD INITIAL (1),"� ZERO : WORD INITIAL (0);>� BYTE_SWAP_PACK (.ONE, REQBUF, REQIDX); ! Query count?� BYTE_SWAP_PACK (.ZERO, REQBUF, REQIDX); ! Answer count B� BYTE_SWAP_PACK (.ZERO, REQBUF, REQIDX); ! Authority countC� BYTE_SWAP_PACK (.ZERO, REQBUF, REQIDX); ! Additional countX � END; �� � BEGIN� LOCAL CURPOS, I; ��� CURPOS = 1;4� WHILE .CURPOS LEQU .PHOST [DSC$W_LENGTH] DO� BEGIN6� I = STR$POSITION (PHOST, %ASCID'.', CURPOS);;� STR$POS_EXTR (PHSEG, PHOST, CURPOS, %REF (.I-1));X-� ASCIC_PACK (PHSEG, REQBUF, REQIDX);N� CURPOS = .I+1; � END;F6� IF STR$COMPARE (PHOST, %ASCID'.') NEQU 0 THEN(� BYTE_PACK (0, REQBUF, REQIDX); � END; �� � BEGIN� LOCAL/� TYPEMX : WORD INITIAL (IPNS_TYPE_MX),;0� CLSIN : WORD INITIAL (IPNS_CLASS_IN);?� WORD_PACK (.TYPEMX, REQBUF, REQIDX); ! MX request typeN?� WORD_PACK (.CLSIN, REQBUF, REQIDX); ! INternet classN � END; �� � BEGIN� LOCAL$� ADRLST : VECTOR [32,LONG],� ADRCNT,D� RCVLEN,K3� NSHST : BLOCK [DSC$K_S_BLN,BYTE] PRESET (U1� [DSC$B_DTYPE] = DSC$K_DTYPE_T, 1� [DSC$B_CLASS] = DSC$K_CLASS_S,X7� [DSC$W_LENGTH] = .NSH [NSHO_W_HOST],[8� [DSC$A_POINTER] = NSH [NSHO_T_HOST]);��� ADRCNT = 0;E� STATUS = NET_GET_ADDRESS (IPCTX, NSHST, 32, ADRLST, ADRCNT);=��*� IF .STATUS AND .ADRCNT GTR 0 THEN� BEGIN'� INCR I FROM 0 TO .ADRCNT-1 DON� BEGIN %� BIND ADR = ADRLST [.I];F��D� DBGPRT ('%NETLIB_MXLOOK, trying !UB.!UB.!UB.!UB...',E� .ADR<0,8,0>, .ADR<8,8,0>, .ADR<16,8,0>, .ADR<24,8,0>); ��C� STATUS = UDP_SEND (IPCTX, .ADR, 53, REQBUF, .REQIDX);;B� IF .STATUS THEN STATUS = UDP_RECEIVE (IPCTX, RCVBUF,@� %ALLOCATION (RCVBUF), RCVLEN, 0, 0, RCVTMO);'� IF .STATUS THEN EXITLOOP;R� END; � END� ELSE STATUS = 0;N � END;��.� LIB$FREE_VM (%REF (NSHO_S_NSHODEF), NSH);��� IF .STATUS THEN � BEGIN��� LOCAL � RCVHDR : NSMSGDEF,� RDLENGTH ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������O����������������������������������NETLIB_SRC.BCK�����������������"��XP��[NETLIB]NETLIB_MXLOOK.B32;30���������������������������������������������������������������������������������������������������P�����U�������������������������������1�������: WORD,N� TYPE : WORD,� QDCOUNT : WORD, � ANCOUNT : WORD,)� NSCOUNT : WORD,R � ARCOUNT : WORD;��� RCVIDX = 0;��.� LONG_UNPACK (RCVHDR, RCVBUF, RCVIDX);��;� IF .RCVHDR [NSMSG_V_RCODE] EQL IPNS_RC_SUCCESS ANDn=� .RCVHDR [NSMSG_W_ID] EQL .HDR [NSMSG_W_ID] THENd� BEGIN��5� BYTE_SWAP_UNPACK (QDCOUNT, RCVBUF, RCVIDX);a5� BYTE_SWAP_UNPACK (ANCOUNT, RCVBUF, RCVIDX);�5� BYTE_SWAP_UNPACK (NSCOUNT, RCVBUF, RCVIDX);S5� BYTE_SWAP_UNPACK (ARCOUNT, RCVBUF, RCVIDX); ��E� DBGPRT (%STRING ('%NETLIB_MXLOOK, got !UW answer!%S and ',�@� '!UW auth!%S with authoritative = !UL'), .ANCOUNT,9� .NSCOUNT, .RCVHDR [NSMSG_V_AUTHORITATIVE]);_��0� IF .RCVHDR [NSMSG_V_AUTHORITATIVE] AND$� (.ANCOUNT EQL 0) THEN� BEGINM� MXCOUNT = 0;"� STATUS = SS$_NORMAL;D� DBGPRT ('%NETLIB_MXLOOK, no MX RR''s for !AS', PHOST);$� ADD_NULL (PHOST, NOW);� EXITLOOP;�� END;��&� INCR I FROM 1 TO .QDCOUNT DO� BEGINT1� NAME_UNPACK (NAME, RCVBUF, RCVIDX);L#� RCVIDX = .RCVIDX + 4;�� END;��� CURMXR = -1;��!� IF .ANCOUNT GTRU 0 THEN�� BEGINI*� INCR I FROM 1 TO .ANCOUNT DO� BEGIN � LOCAL IDX_SAVE;2� NAME_UNPACK (NAME, RCVBUF, RCVIDX);2� WORD_UNPACK (TYPE, RCVBUF, RCVIDX);,� RCVIDX = .RCVIDX + 2; ! class1� TIME_UNPACK (TTL, RCVBUF, RCVIDX);�;� BYTE_SWAP_UNPACK (RDLENGTH, RCVBUF, RCVIDX);_"� IDX_SAVE = .RCVIDX;��0� IF .TYPE EQL IPNS_TYPE_CNAME THEN� BEGIN?� ADD_CNAME (PHOST, RCVBUF, RCVIDX, NOW, TTL);OE� DBGPRT ('%NETLIB_MXLOOK, CNAME -> !AS', PHOST);S� END2� ELSE IF .TYPE EQL IPNS_TYPE_MX THEN� BEGIN� LOCAL � PREF : WORD,� I;;� BYTE_SWAP_UNPACK (PREF, RCVBUF, RCVIDX);A7� NAME_UNPACK (NAME2, RCVBUF, RCVIDX);-.� IF .MXCOUNT LSS .MXMAX THEN� BEGIN<� MXNSTRUC [.MXCOUNT, MXN_L_PREF] = .PREF;4� MXNSTRUC [.MXCOUNT, MXN_L_LEN] =@� MIN (MXN_S_HOST, .NAME2 [DSC$W_LENGTH]);=� CH$MOVE (.MXNSTRUC [.MXCOUNT, MXN_L_LEN], /� .NAME2 [DSC$A_POINTER],�9� MXNSTRUC [.MXCOUNT, MXN_T_HOST]);=+� MXCOUNT = .MXCOUNT + 1;C� END;RF� DBGPRT ('%NETLIB_MXLOOK, MX Pref=!UW, name=!AS',"� .PREF, NAME2);B� ADD_MX (CURMXR, PHOST, .PREF, NAME2, NOW, TTL);� END; ��� END;$� IF .MXCOUNT GTR 0 THEN� BEGIN=#� STATUS = SS$_NORMAL;�� EXITLOOP;� END;� END;��!� IF .NSCOUNT GTRU 0 THEN � BEGINO� LOCALM� NQ : QUEDEF,!� NSH : REF NSHODEF;B��7� NQ [QUE_L_TAIL] = (NQ [QUE_L_HEAD] = NQ); *� INCR I FROM 1 TO .NSCOUNT DO� BEGINN� LOCAL IDX_SAVE;2� NAME_UNPACK (NAME, RCVBUF, RCVIDX);2� WORD_UNPACK (TYPE, RCVBUF, RCVIDX);1����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������P����������������������������������NETLIB_SRC.BCK�����������������"��XP��[NETLIB]NETLIB_MXLOOK.B32;30���������������������������������������������������������������������������������������������������P�����U�������������������������G������8������� RCVIDX = .RCVIDX + 6; ! class, ttlP;� BYTE_SWAP_UNPACK (RDLENGTH, RCVBUF, RCVIDX);�"� IDX_SAVE = .RCVIDX;��-� IF .TYPE EQL IPNS_TYPE_NS THENC� BEGIN7� NAME_UNPACK (NAME2, RCVBUF, RCVIDX); B� DBGPRT ('%NETLIB_MXLOOK, NS -> !AS', NAME2);;� LIB$GET_VM (%REF (NSHO_S_NSHODEF), NSH);O?� NSH [NSHO_W_HOST] = .NAME2 [DSC$W_LENGTH]-1;N4� CH$MOVE (.NAME2 [DSC$W_LENGTH]-1,?� .NAME2 [DSC$A_POINTER], NSH [NSHO_T_HOST]);�%� INSQUE (.NSH, NQ);)� END;L��.� RCVIDX = .IDX_SAVE + .RDLENGTH;��� END;9� WHILE NOT REMQUE (.NQ [QUE_L_HEAD], NSH) DON%� INSQUE (.NSH, NSHQUE);S� END; � END@� ELSE IF .RCVHDR [NSMSG_V_RCODE] EQL IPNS_RC_NAMERR THEN� BEGINH� DBGPRT ('%NETLIB_MXLOOK, Name error with authoritative = !UL',/� .RCVHDR [NSMSG_V_AUTHORITATIVE]);C1� IF .RCVHDR [NSMSG_V_AUTHORITATIVE] THEN � BEGINP� MXCOUNT = 0;"� STATUS = SS$_IVADDR;� EXITLOOP;F� END; � END;� � END;S��� REQCOUNT = .REQCOUNT + 1;'� IF .REQCOUNT GEQ MAX_REQUESTS THEN, � BEGIN� STATUS = SS$_EXQUOTA;� EXITLOOP; � END;Y��� END;��� NET_DEASSIGN (IPCTX);A��3� WHILE NOT REMQUE (.NSHQUE [QUE_L_HEAD], NSH) DO�.� LIB$FREE_VM (%REF (NSHO_S_NSHODEF), NSH);��-� FREE_STRINGS (PHOST, PHSEG, NAME, NAME2);.�� � .STATUSa���END; ! DNS_MXLOOK_TRY � a�%SBTTL 'NAME_UNPACK'7�ROUTINE NAME_UNPACK (NAME_A, BUF_A, IDX_A) : NOVALUE = e�BEGIN �!++s�! FUNCTIONAL DESCRIPTION: �! B�! This routine unpacks a name from the response buffer, handlingC�! the relative-offset name segment references used for compactionr �! purposes.f�!M�! RETURNS: nothing�!a �! PROTOTYPE:�! #�! NAME_UNPACK name, buffer, indexr�!oD�! name: char_string, character string, write only, by descriptor3�! buffer: block of bytes, read only, by referencelH�! index: unsigned_longword, longword (unsigned), modify, by reference�! �! IMPLICIT INPUTS: None.��! �! IMPLICIT OUTPUTS: None.V�!i�! COMPLETION CODES: None.t�!e�! SIDE EFFECTS: None.h�!w�!--w��� BIND/� NAME = .NAME_A : BLOCK [DSC$K_S_BLN,BYTE],h%� BUF = .BUF_A : BLOCK [, BYTE], � IDX = .IDX_A;n�� � LOCAL $� SEG : BLOCK [DSC$K_S_BLN,BYTE],� I,O� XOFFSET : WORD, � OFFSET, � NSI;���&� SEG [DSC$B_DTYPE] = DSC$K_DTYPE_T;&� SEG [DSC$B_CLASS] = DSC$K_CLASS_S;!� STR$COPY_DX (NAME, %ASCID'');e� I = .BUF [.IDX,0,8,0];� IF .I EQLU 0 THENa � BEGIN � IDX = .IDX + 1;#� STR$COPY_DX (NAME, %ASCID'.');e � RETURN;� END;� WHILE .I LSSU 64 DO � BEGIN � IF .I EQLU 0 THEN � BEGIN� IDX = .IDX + 1;� RETURN; � END; � SEG [DSC$W_LENGTH] = .I;�.� SEG [DSC$A_POINTER] = BUF [.IDX+1,0,8,0];� STR$APPEND (NAME, SEG);"� STR$APPEND (NAME, %ASCID'.');� IDX = .IDX + .I + 1;T� I = .BUF [.IDX,0,8,0];l� END;)� BYTE_SWAP_UNPACK (XOFFSET, BUF, IDX);X!� OFFSET = .XOFFSET - %X'C000'; � NSI = .IDX;E� IDX = .OFFSET;� $INIT_DYNDESC (SEG); � NAME_UNPACK (SEG, BUF, IDX);� IDX = .NSI;O� STR$APPEND (NAME, SEG);x� STR$FREE1_DX (SEG);h���END; ! NAME_UNPACK� n�%SBTTL 'ADD_CNAME'J�ROUTINE ADD_CNAME (PHOST_A, RCVBUF_A, RCVIDX_A, NOW_A, TTL_A) : NOVALUE ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Q����������������������������������NETLIB_SRC.BCK�����������������"��XP��[NETLIB]NETLIB_MXLOOK.B32;30���������������������������������������������������������������������������������������������������P�����U�������������������������d������?�������= �BEGINc�!++ �! FUNCTIONAL DESCRIPTION:,�!n'�! Adds a CNAME RR to the CNAME table.e�! B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!P �! ADD_CNAME��! �! IMPLICIT INPUTS: None.��! �! IMPLICIT OUTPUTS: None. �!_�! COMPLETION CODES:u�!s2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:S�! �! None.��!--�� BIND2� PHOST = .PHOST_A : BLOCK [DSC$K_S_BLN,BYTE],� RCVBUF = .RCVBUF_A,� RCVIDX = .RCVIDX_A,(� NOW = .NOW_A : VECTOR [2,LONG],(� TTL = .TTL_A : VECTOR [2,LONG];�� � LOCAL=%� STR : BLOCK [DSC$K_S_BLN,BYTE], %� STR2 : BLOCK [DSC$K_S_BLN,BYTE], � TMP : VECTOR [2,LONG],� I;R��,� I = (INCR CI FROM 0 TO CNAMTAB_SIZE-1 DO� BEGIN?� IF NOT .CNAMTAB [.CI,CNAM_V_INUSE] THEN EXITLOOP .CI;DE� IF NOT LIB$SUB_TIMES (CNAMTAB [.CI,CNAM_Q_EXPDT], NOW, TMP)S� THEN EXITLOOP .CI;� END);��� INIT_DYNDESC (STR, STR2);M&� NAME_UNPACK (STR, RCVBUF, RCVIDX);� STR$UPCASE (STR2, STR); � IF .I GEQ 0 THEN � BEGIN 0� BIND CNAM = CNAMTAB [.I,0,0,0,0] : CNAMDEF;F� DBGPRT ('%NETLIB_MXLOOK, -- added to CNAMTAB, index [!UL]', .I);� CNAM [CNAM_V_INUSE] = 1; C� CNAM [CNAM_L_NAME] = MIN (CNAM_S_NAME, .PHOST [DSC$W_LENGTH]);E:� CH$MOVE (.CNAM [CNAM_L_NAME], .PHOST [DSC$A_POINTER],� CNAM [CNAM_T_NAME]);%3� LIB$ADD_TIMES (NOW, TTL, CNAM [CNAM_Q_EXPDT]);,D� CNAM [CNAM_L_CNAME] = MIN (CNAM_S_CNAME, .STR2 [DSC$W_LENGTH]);:� CH$MOVE (.CNAM [CNAM_L_CNAME], .STR2 [DSC$A_POINTER],� CNAM [CNAM_T_CNAME]);� ENDU� ELSE2� DBGPRT ('%NETLIB_MXLOOK, -- CNAMTAB full!');� STR$COPY_DX (PHOST, STR2);� FREE_STRINGS (STR, STR2);����END; ! ADD_CNAME� N�%SBTTL 'ADD_MX'EL�ROUTINE ADD_MX (CURMXR_A, PHOST_A, PREF, NAME2_A, NOW_A, TTL_A) : NOVALUE = �BEGINO�!++T�! FUNCTIONAL DESCRIPTION:E�!,�! Adds an MX RR to MXTAB.T�! B�! RETURNS: cond_value, longword (unsigned), write only, by value�!$ �! PROTOTYPE:�!$ �! ADD_MX�!O�! IMPLICIT INPUTS: None. �!Q�! IMPLICIT OUTPUTS: None.S�!%�! COMPLETION CODES:R�!F2�! SS$_NORMAL: normal successful completion.�!I�! SIDE EFFECTS:E�!3 �! None. �!--=� BIND� CURMXR = .CURMXR_A,3� PHOST = .PHOST_A : BLOCK [DSC$K_S_BLN,BYTE],T3� NAME2 = .NAME2_A : BLOCK [DSC$K_S_BLN,BYTE],�)� NOW = .NOW_A : VECTOR [2,LONG],N)� TTL = .TTL_A : VECTOR [2,LONG];$�� � LOCALA� TMP : VECTOR [2,LONG];����� IF .CURMXR GEQ 0 THENE>� IF CH$EQL (.PHOST [DSC$W_LENGTH], .PHOST [DSC$A_POINTER],H� .MXTAB [.CURMXR, MX_L_NAME], MXTAB [.CURMXR, MX_T_NAME], %C' ')� THEN � BEGINC7� IF .MXTAB [.CURMXR,MX_L_COUNT] LSS MX_K_MAXMX THENP � BEGIN � BINDC3� MX = MXTAB [.CURMXR,0,0,0,0] : MXDEF, ,� I = MXTAB [.CURMXR,MX_L_COUNT],7� PREFS = MX [MX_AL_MXPREF] : VECTOR [,LONG],,7� LENGTH = MX [MX_AL_MXNAME] : VECTOR [,LONG],TH� NAME = MX [MX_AT_MXNAME] : BLOCKVECTOR [,MX_S_MXNAME,BYTE];��I� DBGPRT ('%NETLIB_MXLOOK, -- appending to MXTAB[!UL]', .CURMXR); � PREFS [.I] = .PREF;@� LENGTH [.I] = MIN (MX_S_MXNAME, .NAME2 [DSC$W_LENGTH]);K� CH$MOVE (.LENGTH [.I], .NAME2 [DSC$A_POINTER], NAME [.I,0,0,0,0]);X� I = .I + 1; � END;� � RETURN;� END;��/� CURMXR = (INCR MI FROM 0 TO MXTAB_SIZE-1 DO � BEGIN;� IF NOT .MXTAB [.MI,MX_V_INUSE] THEN EXITLOOP .MI; F� IF NOT LIB$SUB_TIMES���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������R����������������������������������NETLIB_SRC.BCK�����������������"��XP��[NETLIB]NETLIB_MXLOOK.B32;30���������������������������������������������������������������������������������������������������P�����U�������������������������4������F������� (MXTAB [.MI,MX_Q_EXPDT], NOW, TMP) THEN� EXITLOOP .MI;X� END);��� IF .CURMXR GEQ 0 THENH � BEGINA � BIND 2� MX = MXTAB [.CURMXR,0,0,0,0] : MXDEF,6� PREFS = MX [MX_AL_MXPREF] : VECTOR [,LONG],6� LENGTH = MX [MX_AL_MXNAME] : VECTOR [,LONG],G� NAME = MX [MX_AT_MXNAME] : BLOCKVECTOR [,MX_S_MXNAME,BYTE];N��J� DBGPRT ('%NETLIB_MXLOOK, -- new MXTAB entry, index [!UL]', .CURMXR);� MX [MX_V_INUSE] = 1;�� MX [MX_L_COUNT] = 1;,>� MX [MX_L_NAME] = MIN (MX_S_NAME, .PHOST [DSC$W_LENGTH]);G� CH$MOVE (.MX [MX_L_NAME], .PHOST [DSC$A_POINTER], MX [MX_T_NAME]);H/� LIB$ADD_TIMES (NOW, TTL, MX [MX_Q_EXPDT]); � PREFS [0] = .PREF; ;� LENGTH [0] = MIN (MX_S_MXNAME, .NAME2 [DSC$W_LENGTH]);RE� CH$MOVE (.LENGTH [0], .NAME2 [DSC$A_POINTER], NAME [0,0,0,0,0]);E� ENDE� ELSE0� DBGPRT ('%NETLIB_MXLOOK, -- MXTAB full!');�� �END; ! ADD_MX � o�%SBTTL 'ADD_NULL' .�ROUTINE ADD_NULL (PHOST_A, NOW_A) : NOVALUE = �BEGINM�!++N�! FUNCTIONAL DESCRIPTION: �!;%�! Adds a NULL RR to the NULL table. �!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!L �! PROTOTYPE:�!: �! ADD_NULL�!C�! IMPLICIT INPUTS: None.��! �! IMPLICIT OUTPUTS: None. �!L�! COMPLETION CODES:r�!!2�! SS$_NORMAL: normal successful completion.�! �! SIDE EFFECTS:)�!� �! None.I�!--_� BIND2� PHOST = .PHOST_A : BLOCK [DSC$K_S_BLN,BYTE],(� NOW = .NOW_A : VECTOR [2,LONG];�� � LOCAL � TMP : VECTOR [2,LONG],� I;D��,� I = (INCR CI FROM 0 TO NULLTAB_SIZE-1 DO� BEGIN>� IF NOT .NULLTAB [.CI,NUL_V_INUSE] THEN EXITLOOP .CI;D� IF NOT LIB$SUB_TIMES (NULLTAB [.CI,NUL_Q_EXPDT], NOW, TMP)� THEN EXITLOOP .CI;� END);��1� IF .ONEHR [0] EQL 0 AND .ONEHR [1] EQL 0 THENr:� $BINTIM (TIMBUF=%ASCID'0 01:00:00.00', TIMADR=ONEHR);��� IF .I GEQ 0 THEN � BEGINL.� BIND NUL = NULLTAB [.I,0,0,0,0] : NULDEF;F� DBGPRT ('%NETLIB_MXLOOK, -- added to NULLTAB, index [!UL]', .I);� NUL [NUL_V_INUSE] = 1; @� NUL [NUL_L_NAME] = MIN (NUL_S_NAME, .PHOST [DSC$W_LENGTH]);8� CH$MOVE (.NUL [NUL_L_NAME], .PHOST [DSC$A_POINTER],� NUL [NUL_T_NAME]);G3� LIB$ADD_TIMES (NOW, ONEHR, NUL [NUL_Q_EXPDT]);Q� END_� ELSE2� DBGPRT ('%NETLIB_MXLOOK, -- NULLTAB full!');���END; ! ADD_NULLA� �%SBTTL 'GET_NAMESERVERS'*�GLOBAL ROUTINE GET_NAMESERVERS (NSHQ_A) = �BEGINE�!++O�! FUNCTIONAL DESCRIPTION: �!H2�! Fetches the names of some domain name servers.�!HB�! RETURNS: cond_value, longword (unsigned), write only, by value�! �! PROTOTYPE:�!��! GET_NAMESERVERS �! �! IMPLICIT INPUTS: None.]�!S�! IMPLICIT OUTPUTS: None.D�!R�! COMPLETION CODES:s�!g2�! SS$_NORMAL: normal successful completion.�!_�! SIDE EFFECTS:T�!S �! None.D�!-- � BIND � NSHQUE = .NSHQ_A : QUEDEF;��@� TABLE (LNMTAB, 'NETLIB_NAMESERVERS', 'MULTINET_NAMESERVERS',9� 'TCPWARE_NAMESERVERS', 'TCPIP_NAMESERVERS',E%� 'INET_NAMESERVER_LIST', =� 'NETLIB_CMU064_NAMESERVERS','UCX$BIND_SERVER');%�� � LOCALL&� LNMLST1 : $ITMLST_DECL (ITEMS=1),&� LNMLST2 : $ITMLST_DECL (ITEMS=2),� LNMCOUNT: VOLATILE,$� NSHLEN : VOLATILE SIGNED WORD,+� NSHNAME : VOLATILE VECTOR [255, BYTE], � NSH : REF NSHODEF, � STATUS;��#� $ITMLST_INIT (ITMLST = LNMLST1,P?� (ITMCOD = LNM$_MAX_INDEX, BUFADR = LNMCOUNT, BUFSIZ = 4));P&� INCR I FROM 0 TO LNMTAB_COUNT-1 DO � BEGIN 3� STATUS = $TRNLN���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������S����������������������������������NETLIB_SRC.BCK�����������������"��XP��[NETLIB]NETLIB_MXLOOK.B32;30���������������������������������������������������������������������������������������������������P�����U�������������������������]� �����M�������M (TABNAM = %ASCID'LNM$SYSTEM',o2� LOGNAM = .LNMTAB [.I], ITMLST = LNMLST1);6� IF .STATUS AND (.LNMCOUNT LSS 0) THEN STATUS = 0;� IF .STATUS THEN � BEGING� IF .I EQL LNMTAB_COUNT-1 THEN ! UCX is different (of course)�� BEGIN2� LOCAL LOGNAM : BLOCK [DSC$K_S_BLN,BYTE]; � INIT_DYNDESC (LOGNAM);!� INCR J FROM 0 TO 999 DO � BEGIN G� LIB$SYS_FAO (%ASCID'UCX$BIND_SERVER!3ZL', 0, LOGNAM, .J);0+� $ITMLST_INIT (ITMLST=LNMLST2,�?� (ITMCOD=LNM$_INDEX, BUFADR=UPLIT (0), BUFSIZ=4),�3� (ITMCOD=LNM$_STRING, BUFADR=NSHNAME, A� BUFSIZ=%ALLOCATION (NSHNAME), RETLEN=NSHLEN)); :� STATUS = $TRNLNM (TABNAM=%ASCID'LNM$SYSTEM',.� LOGNAM=LOGNAM, ITMLST=LNMLST2);+� IF NOT .STATUS THEN EXITLOOP;C6� LIB$GET_VM (%REF (NSHO_S_NSHODEF), NSH);<� CH$MOVE (.NSHLEN, NSHNAME, NSH [NSHO_T_HOST]);*� NSH [NSHO_W_HOST] = .NSHLEN;2� INSQUE (.NSH, .NSHQUE [QUE_L_TAIL]);� END; � FREE_STRINGS (LOGNAM); � END � ELSES� BEGIN'� INCR J FROM 0 TO .LNMCOUNT DOD� BEGINS+� $ITMLST_INIT (ITMLST=LNMLST2,U7� (ITMCOD=LNM$_INDEX, BUFADR=J, BUFSIZ=4),I3� (ITMCOD=LNM$_STRING, BUFADR=NSHNAME, A� BUFSIZ=%ALLOCATION (NSHNAME), RETLEN=NSHLEN));O:� STATUS = $TRNLNM (TABNAM=%ASCID'LNM$SYSTEM',4� LOGNAM=.LNMTAB [.I], ITMLST=LNMLST2);� IF .STATUS THENX� BEGINR� LOCAL*� ANCHOR, CP, COUNT, LEN; � ANCHOR = NSHNAME;%� WHILE .NSHLEN GTR 0 DOO� BEGINJ� WHILE .NSHLEN GTR 0 AND CH$RCHAR (.ANCHOR) EQL %C' ' DO� BEGIN2� ANCHOR = CH$PLUS (.ANCHOR, 1);)� NSHLEN = .NSHLEN - 1;L� END;N2� IF .NSHLEN EQL 0 THEN EXITLOOP;��=� CP = CH$FIND_CH (.NSHLEN, .ANCHOR, %C',');N(� IF CH$FAIL (.CP) THEN#� COUNT = .NSHLEN;� ELSE�3� COUNT = CH$DIFF (.CP, .ANCHOR); �� � LEN = .COUNT;'� WHILE .LEN GTR 1 ANDVB� CH$RCHAR (CH$PLUS (.ANCHOR, .LEN-1)) EQL %C' '%� DO LEN = .LEN - 1;,��;� LIB$GET_VM (%REF (NSHO_S_NSHODEF), NSH);)>� CH$MOVE (.LEN, .ANCHOR, NSH [NSHO_T_HOST]);,� NSH [NSHO_W_HOST] = .LEN;7� INSQUE (.NSH, .NSHQUE [QUE_L_TAIL]);!��7� ANCHOR = CH$PLUS(.ANCHOR, .COUNT+1);r1� NSHLEN = .NSHLEN - .COUNT - 1; ��� END;I� END;� END;� END;� RETURN SS$_NORMAL;C � END; � END;��� 0I���END; ! GET_NAMESERVERS���END �ELUDOM STATUS = SS$_NORMAL;D� DBGPRT ('%NETLIB_MXLOOK, n����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������T����������������������������������NETLIB_SRC.BCK�����������������4��XP��[NETLIB]NETLIB_INSTALL.COM;36��������������������������������������������������������������������������������������������������U������������������������������"���������������*�[NETLIB]NETLIB_INSTALL.COM;36�+��,�4���.�����/� �@� �4�U��������������������������-�XP����0���1����2���3������K��P���W���O�����5���6�.w9Ӡ��7�Z9Ӡ��8�Zk��9�$.��G� �@��H��J������ �������������$! [NETLIB]NETLIB_INSTALL.COM��$!.�$! KITINSTAL procedure for installing NETLIB.�$!0�$! 31-JAN-1991 V1.0 Madison Initial coding.M�$! 05-FEB-1991 V1.0-1 Madison Two parts for integration into other kits.�6�$! 26-APR-1991 V1.0-2 Madison Nameserver changes.I�$! 20-JUN-1991 V1.0-3 Madison Newer versions of some pkgs supported.�L�$! 03-DEC-1991 V1.0-4 Madison A bit of rearranging of the startup file.4�$! 01-FEB-1992 V1.1 Volz Added TCPware support.2�$! 17-FEB-1992 V1.1-1 Madison LINK/NOUSERLIB.+�$! 08-OCT-1992 V1.2 Madison Alpha AXP.�M�$! 19-FEB-1993 V1.2-1 Madison Accommodate TCPware V3.0 filename changes.�C�$! 22-MAR-1993 V1.2-2 Madison TCPware now runs on AXP systems.�L�$! 26-MAR-1993 V1.2-3 Madison Eliminate IP0/IPA0 confusion for CMU-Tek.?�$! 21-DEC-1993 V1.3 Madison First crack at WINTCP support.�B�$! 27-DEC-1993 V1.3-1 Madison Second crack at WINTCP support.K�$! 27-JAN-1994 V1.3-2 Madison TCP0 device can exist with MultiNet too.��$!)�$ ON CONTROL_Y THEN GOTO NETLIB_CONTROL_Y�"�$ ON WARNING THEN GOTO NETLIB_FAIL�$!�$ GOTO NETLIB_INSTALL��$!�$NETLIB_CONTROL_Y:=�$ IF F$TRNLNM ("NETLIB_STUP") .NES. "" THEN CLOSE NETLIB_STUP��$ VMI$CALLBACK CONTROL_Y�$! �$NETLIB_FAIL:��$ NETLIB_STATUS == $STATUS=�$ IF F$TRNLNM ("NETLIB_STUP") .NES. "" THEN CLOSE NETLIB_STUP��$ EXIT 'NETLIB_STATUS��$!�$NETLIB_INSTALL:�$!�$ IF P2 THEN SET VERIFY��$! �$ NETLIB_SAY := WRITE SYS$OUTPUT�$ LINK := LINK/NOUSERLIBRARY�$!-�$ NETLIB_INSTALL_NODE = F$GETSYI ("NODENAME")��$!�$!%�$! Build the tables for menu choices.��$!�$ IF NETLIB_VAX��$ THEN�$ NETLIB_TCP_NAMES = "?" +-�� ":CMU-Tek TCP/IP V6.4"+-�&� ":CMU-Tek TCP/IP V6.5 or later"+-.� ":DEC VMS/ULTRIX Connection (UCX) V1.2"+-?� ":DEC UCX V1.3 or TCP/IP Services for VMS V2.0 or later"+-�$� ":TGV MultiNet V2.2 or later"+-� ":PSC TCPware"+-�-� ":TWG WIN/TCP or PathWay Access for VMS"�I�$ NETLIB_TCPS = "?:NETLIB_CMU064:NETLIB_CMU:NETLIB_UCX012:NETLIB_UCX"+-�=� ":NETLIB_MULTINET:NETLIB_TCPWARE:NETLIB_WINTCP"��$ OLB = ".OLB"�$ OPT = ".OPT"�$ OBJ = ".OBJ"�$ ELSE�$ NETLIB_TCP_NAMES = "?" +-�%� ":DEC TCP/IP Services for VMS"+-�$� ":TGV MultiNet V3.2 or later"+-� ":PSC TCPware"+-�-� ":TWG WIN/TCP or PathWay Access for VMS"�M�$ NETLIB_TCPS = "?:NETLIB_UCX:NETLIB_MULTINET:NETLIB_TCPWARE:NETLIB_WINTCP"��$ NETLIB_CMU064 = ""�$ NETLIB_CMU = ""��$ NETLIB_UCX012 = ""�$ OLB = ".ALPHA_OLB"�$ OPT = ".ALPHA_OPT"�$ OBJ = ".ALPHA_OBJ"�$ ENDIF��$ NETLIB_I = 0�$NETLIB_INIT_LOOP:�$ NETLIB_I = NETLIB_I + 1�3�$ NETLIB_TCP = F$ELEMENT (NETLIB_I,":",NETLIB_TCPS)�8�$ IF NETLIB_TCP .EQS. ":" THEN GOTO NETLIB_END_INIT_LOOP�$ 'NETLIB_TCP = " "��$ GOTO NETLIB_INIT_LOOP��$!@�$! Now we make some educated guesses about which TCP/IP's should�$! be pre-selected.��$!�$NETLIB_END_INIT_LOOP:�$!�$ IF F$GETDVI ("IP0","EXISTS")�$ THEN�$!-�$! Don't confuse with TCPware's IPA0: device��$!.�$ IF F$GETDVI ("IP0","DEVNAM") .EQS. "_IP0:"�$ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������U����������������������������������NETLIB_SRC.BCK�����������������4��XP��[NETLIB]NETLIB_INSTALL.COM;36��������������������������������������������������������������������������������������������������U������������������������������p������������� THEN)�$ IF F$TRNLNM ("CMUTEK_ROOT") .NES. ""� �$ THEN��$ NETLIB_CMU = "*"� �$ ELSE��$ NETLIB_CMU064 = "*" �$ ENDIF �$ ENDIF��$ ENDIF�-�$ IF F$GETDVI ("UCX$DEVICE","EXISTS") .AND. -�5� F$SEARCH ("SYS$SYSTEM:UCX$INETACP.EXE") .NES. ""��$ THEN<�$ IF F$SEARCH ("SYS$SYSTEM:UCX$INET_ROUTING.EXE") .NES. ""�$ THEN�$ NETLIB_UCX = "*"��$ ELSE�$ NETLIB_UCX012 = "*" �$ ENDIF��$ ENDIF� �$ IF F$GETDVI ("INET0","EXISTS")�$ THEN6�$ IF F$TRNLNM("TCPWARE_SOCKLIB_SHR") .NES. "" .OR. -)� F$TRNLNM("TCPIP_SOCKLIB") .NES. ""��$ THEN�$ NETLIB_TCPWARE = "*"��$ ELSEM�$ IF F$TRNLNM("TWG$TCP") .NES. "" .AND. F$TRNLNM("MULTINET_ROOT") .EQS. ""� �$ THEN��$ NETLIB_WINTCP = "*" �$ ELSE��$ NETLIB_MULTINET = "*" �$ ENDIF �$ ENDIF��$ ENDIF��$!�$NETLIB_SELECT_MENU:�$!�$ TYPE SYS$INPUT:���/� TCP/IP Support Selection���A� Select the NETLIB TCP/IP support you wish to install from the�C� menu below. An asterisk appears next to the packages that have�B� already been selected. You can remove a package from the listA� by selecting it again. You may enter more than one selection�+� by separating your choices with commas.����$ NETLIB_M = 0�$NETLIB_SEL_LOOP:��$ NETLIB_M = NETLIB_M + 1�6�$ NETLIB_N = F$ELEMENT (NETLIB_M,":",NETLIB_TCP_NAMES)3�$ IF NETLIB_N .EQS. ":" THEN GOTO NETLIB_SELECT_ASK�1�$ NETLIB_T = F$ELEMENT (NETLIB_M,":",NETLIB_TCPS)�I�$ NETLIB_SAY F$FAO (" !2UL. [!AS] !AS", NETLIB_M, 'NETLIB_T, NETLIB_N)��$ GOTO NETLIB_SEL_LOOP�$NETLIB_SELECT_ASK:��$ NETLIB_SAY ""�3�$ NETLIB_SAY F$FAO (" !2UL. Exit", NETLIB_M)��$ NETLIB_SAY ""��$ NETLIB_SAY ""��$!*�$ VMI$CALLBACK ASK NETLIB_CHOICE_INPUT -&� " Your choice" "''NETLIB_M'"�$ NETLIB_I = -1��$NETLIB_PARSE_LOOP:��$ NETLIB_I = NETLIB_I + 1�@�$ NETLIB_CHOICE = F$ELEMENT (NETLIB_I, ",", NETLIB_CHOICE_INPUT)9�$ IF NETLIB_CHOICE .EQS. "," THEN GOTO NETLIB_SELECT_MENU�+�$ NETLIB_CHOICE = F$INTEGER (NETLIB_CHOICE)�9�$ IF NETLIB_CHOICE .EQ. NETLIB_M THEN GOTO NETLIB_CONFIRM�:�$ IF NETLIB_CHOICE .LT. 1 .OR. NETLIB_CHOICE .GT. NETLIB_M�$ THEN&�$ VMI$CALLBACK MESSAGE E BADCHOICE -L� "Choice ''NETLIB_CHOICE' invalid; choices range from 1 to ''NETLIB_M'."�$ ELSE:�$ NETLIB_T = F$ELEMENT (NETLIB_CHOICE, ":", NETLIB_TCPS)�$ IF 'NETLIB_T .EQS. "*"�$ THEN�$ 'NETLIB_T = " "�$ ELSE�$ 'NETLIB_T = "*" �$ ENDIF��$ ENDIF��$ GOTO NETLIB_PARSE_LOOP�$!�$NETLIB_CONFIRM:�$ NETLIB_SAY ""�B�$ NETLIB_SAY " You have selected the following TCP/IP support:"�$ NETLIB_SAY ""��$ NETLIB_CNT = 0�$ NETLIB_M = 0�$NETLIB_CONF_LOOP:�$ NETLIB_M = NETLIB_M + 1�6�$ NETLIB_N = F$ELEMENT (NETLIB_M,":",NETLIB_TCP_NAMES)1�$ IF NETLIB_N .EQS. ":" THEN GOTO NETLIB_CONF_ASK�1�$ NETLIB_T = F$ELEMENT (NETLIB_M,":",NETLIB_TCPS)��$ IF 'NETLIB_T .EQS. "*"�$ THEN�$ NETLIB_PRI = NETLIB_M�"�$ NETLIB_SAY " ",NETLIB_N�$ NETLIB_CNT = NETLIB_CNT + 1��$ ENDIF��$ GOTO NETLIB_CONF_LOOP��$!�$NETLIB_CONF_ASK:�7�$ IF NETLIB_CNT .EQ. 0 THEN NETLIB_SAY " (None)"��$ NETLIB_SAY ""��$ NETLIB_SAY ""�6�$ VMI$CALLBACK ASK NETLIB_OK "Is this correct" "YES" B1�$ IF .NOT. NETLIB_OK THEN GOTO NETLIB_SELECT_MENU��$!�$ IF NETLIB_CNT .EQ. 0�$ THEN>�$ VMI$CALLBACK MESSAGE I WONTINSTALL "No packages selected."�$ EXIT VMI$_SUCCESS��$ ENDIF��$!/�$ IF NETLIB_CNT .EQ. 1 THEN GOTO NETLIB_DIR_ASK��$!�$NETLIB_PRIMARY_MENU:��$!�$ TYPE SYS$INPUT:���?� You have selected support for more than one TCP/IP package.�=� You must now select wh���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������V����������������������������������NETLIB_SRC.BCK�����������������4��XP��[NETLIB]NETLIB_INSTALL.COM;36��������������������������������������������������������������������������������������������������U�������������������������������������������ich is to be used by default on the�� current system.����$ NETLIB_M = 0�$NETLIB_PRI_LOOP:��$ NETLIB_M = NETLIB_M + 1�6�$ NETLIB_N = F$ELEMENT (NETLIB_M,":",NETLIB_TCP_NAMES)4�$ IF NETLIB_N .EQS. ":" THEN GOTO NETLIB_PRIMARY_ASK1�$ NETLIB_T = F$ELEMENT (NETLIB_M,":",NETLIB_TCPS)�2�$ IF 'NETLIB_T .EQS. " " THEN GOTO NETLIB_PRI_LOOP8�$ NETLIB_SAY F$FAO (" !2UL. !AS", NETLIB_M, NETLIB_N)�$ GOTO NETLIB_PRI_LOOP�$!�$NETLIB_PRIMARY_ASK:�$!�$ NETLIB_SAY ""��$ NETLIB_SAY ""�3�$ VMI$CALLBACK ASK NETLIB_TMP " Your choice"��$!%�$ NETLIB_PRI = F$INTEGER (NETLIB_TMP)�4�$ IF NETLIB_PRI .LT. 1 .OR. NETLIB_PRI .GE. NETLIB_M�$ THENP�$ VMI$CALLBACK MESSAGE W SELRANGE "Selection out of range. Please try again."�$ GOTO NETLIB_PRIMARY_MENU�$ ENDIF�3�$ NETLIB_T = F$ELEMENT (NETLIB_PRI,":",NETLIB_TCPS)��$ IF 'NETLIB_T .NES. "*"�$ THENU�$ VMI$CALLBACK MESSAGE W UNAVAIL "That choice is not available. Please try again."��$ GOTO NETLIB_PRIMARY_MENU�$ ENDIF��$!�$NETLIB_DIR_ASK:�$!�$ NETLIB_SAY ""�8�$ NETLIB_SAY " Default TCP/IP transport will be: ", -0� F$ELEMENT (NETLIB_PRI,":",NETLIB_TCP_NAMES)�$!�$!D�$! TWG software uses shareable libraries on AXP systems, I guess.�$!6�$ IF NETLIB_AXP .AND. (NETLIB_WINTCP .EQS. "*") THEN -L� RENAME VMI$KWD:NETLIB_WINTCP_AXP.VERSION VMI$KWD:NETLIB_WINTCP.VERSION;�$!�$!�$ TYPE SYS$INPUT:�����!� Choosing the NETLIB Directory���=� The NETLIB libraries may go in either SYS$COMMON:[SYSLIB]�(� or some other directory you specify.��&�$ NETLIB_DEFANS := SYS$COMMON:[SYSLIB],�$ IF F$TRNLNM ("NETLIB_DIR") .NES. "" THEN -+� NETLIB_DEFANS = F$TRNLNM ("NETLIB_DIR")��$ VMI$CALLBACK ASK NETLIB_DIR -�D� "Where should the NETLIB libraries be placed" "''NETLIB_DEFANS'"1�$ NETLIB_DIR = F$PARSE (NETLIB_DIR,,,"DEVICE") +-�'� F$PARSE (NETLIB_DIR,,,"DIRECTORY")�2�$ IF F$SEARCH ("''NETLIB_DIR'X.X") .EQS. "" THEN -4� VMI$CALLBACK CREATE_DIRECTORY USER 'NETLIB_DIR -2� "/OWNER=[1,4]/PROTECT=(S:RWE,O:RWE,G:RE,W:E)"�$!#�$ CREATE VMI$KWD:NETLIB_STARTUP.COM�4�$ OPEN/APPEND NETLIB_STUP VMI$KWD:NETLIB_STARTUP.COM �$ NETLIB_W = "WRITE NETLIB_STUP".�$ NETLIB_W "$! SYS$STARTUP:NETLIB_STARTUP.COM"F�$ NETLIB_W "$! Startup command procedure for NETLIB library routines."�$ NETLIB_W "$!"�@�$ NETLIB_W "$ DEFINE/SYSTEM/EXEC/NOLOG NETLIB_DIR ''NETLIB_DIR'"�$ IF NETLIB_CMU064 .EQS. "*"�$ THENE�$ NETLIB_W "$ DEFINE/SYSTEM/EXEC/NOLOG NETLIB_CMU064_NAMESERVERS -"�H�$ NETLIB_W " ""c.nyser.net"",""terp.umd.edu"",""ns.nasa.gov"",-"(�$ NETLIB_W " ""ns.nic.ddn.mil"""�$ ENDIF��$!�$ NETLIB_W "$!"�@�$ NETLIB_W "$ IF F$TRNLNM (""NETLIB_SHRXFR"") .NES. """" THEN -"I�$ NETLIB_W " IF F$FILE_ATTR (""NETLIB_SHRXFR:.EXE"",""KNOWN"") THEN -"�/�$ NETLIB_W " INSTALL REMOVE NETLIB_SHRXFR"�=�$ NETLIB_W "$ IF F$TRNLNM (""NETLIB_SHR"") .NES. """" THEN -"�F�$ NETLIB_W " IF F$FILE_ATTR (""NETLIB_SHR:.EXE"",""KNOWN"") THEN -",�$ NETLIB_W " INSTALL REMOVE NETLIB_SHR"�$ NETLIB_W "$!N�$ NETLIB_W "$ DEFINE/SYSTEM/EXEC/NOLOG NETLIB_SHRXFR NETLIB_DIR:NETLIB_SHRXFR"1�$ NETLIB_W "$ CALL DO_INSTALL NETLIB_SHRXFR:.EXE"��$!A�$ VMI$CALLBACK MESSAGE I LINKING "Linking image NETLIB_SHRXFR..."�H�$ LINK/SHARE=VMI$KWD:NETLIB_SHRXFR.EXE VMI$KWD:NETLIB_INSTALL'OPT'/OPT,-@� VMI$KWD:NETLIB_SHRXFR'OBJ',VMI$KWD:NETLIB_SHRXFR.VERSION/OPT/�$ SET PROTECTION=W:RE VMI$KWD:NETLIB_SHRXFR.EXE�H�$ VMI$CALLBACK PROVIDE_IMAGE NETLIB_IMGOK NETLIB_SHRXFR.EXE 'NETLIB_DIR'�$!@�$ NETLIB_W "$ DEFINE/SYSTEM/EXEC/NOLOG NETLIB_SHR NETLIB_DIR:",-3� F$ELEMENT (NETLIB_PRI,":",NETLIB_TC���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������W����������������������������������NETLIB_SRC.BCK�����������������4��XP��[NETLIB]NETLIB_INSTALL.COM;36��������������������������������������������������������������������������������������������������U�������������������������������������������PS), "_SHR"��$!�$ NETLIB_I = 0�$NETLIB_INST_LOOP:�$ NETLIB_I = NETLIB_I + 1�1�$ NETLIB_T = F$ELEMENT (NETLIB_I,":",NETLIB_TCPS)�7�$ IF NETLIB_T .EQS. ":" THEN GOTO NETLIB_FINISH_INSTALL��$ IF 'NETLIB_T .EQS. "*"�$ THEN?� NETLIB_W "$ CALL DO_INSTALL NETLIB_DIR:''NETLIB_T'_SHR.EXE"�E�$ VMI$CALLBACK MESSAGE I LINKING "Linking image ''NETLIB_T'_SHR..."��$ NETLIB_L = ""��$ NETLIB_V = NETLIB_T�@�$ IF F$LOCATE ("CMU",NETLIB_T) .LT. F$LENGTH (NETLIB_T) THEN -;� NETLIB_L = ",''NETLIB_T'_ERRORS''OPT'/OPT" - "NETLIB_"�K�$ LINK/SHARE=VMI$KWD:'NETLIB_T'_SHR.EXE VMI$KWD:NETLIB_INSTALL'OPT'/OPT,-�I� VMI$KWD:'NETLIB_T''OLB'/LIB,VMI$KWD:'NETLIB_V'.VERSION/OPT'NETLIB_L'�2�$ SET PROTECTION=W:RE VMI$KWD:'NETLIB_T'_SHR.EXEK�$ VMI$CALLBACK PROVIDE_IMAGE NETLIB_IMGOK 'NETLIB_T'_SHR.EXE 'NETLIB_DIR'��$ ENDIF��$ GOTO NETLIB_INST_LOOP��$!�$NETLIB_FINISH_INSTALL:��$!�$ NETLIB_W "$ EXIT"��$ NETLIB_W "$!"�$�$ NETLIB_W "$DO_INSTALL: SUBROUTINE"�$ NETLIB_W "$ CMD := CREATE"F�$ NETLIB_W "$ IF F$FILE_ATTRIBUTES (P1,""KNOWN"") THEN CMD := REPLACE"2�$ NETLIB_W "$ INSTALL 'CMD'/OPEN/SHARE/HEADER 'P1"�$ NETLIB_W "$ ENDSUBROUTINE"�$ CLOSE NETLIB_STUP�U�$ VMI$CALLBACK PROVIDE_FILE NETLIB_STUPFILE NETLIB_STARTUP.COM VMI$ROOT:[SYS$STARTUP]�?�$ VMI$CALLBACK PROVIDE_FILE NETLIB_OK NETLIBDEF.R32 'NETLIB_DIR�?�$ VMI$CALLBACK PROVIDE_FILE NETLIB_OK NETLIBDEF.L32 'NETLIB_DIR��$!6�$ IF NETLIB_CMU064 .EQS. "*" .OR. NETLIB_CMU .EQS. "*"�$ THEN0�$ IF F$INTEGER (F$GETSYI ("MAXBUF")) .LT. 2300�$ THEN�$ TYPE SYS$INPUT:��� -- WARNING --���H� NETLIB support for CMU-Tek TCP/IP requires that the SYSGEN parameter#� MAXBUF be set to at least 2300.���G�$ NETLIB_SAY " MAXBUF is currently set to: ", F$GETSYI ("MAXBUF")��$ TYPE SYS$INPUT:��F� Please remember to change the value of MAXBUF before attempting to7� use a NETLIB-based application over CMU-Tek TCP/IP.��� �$ ENDIF��$ ENDIF��$!�$ NETLIB_STATUS == VMI$_SUCCESS��$!�$ EXIT 'NETLIB_STATUS�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������X����������������������������������NETLIB_SRC.BCK�����������������P��XP��[NETLIB]NETLIB_INSTALL.OPT;2���������������������������������������������������������������������������������������������������3���������������������������������������������*�[NETLIB]NETLIB_INSTALL.OPT;2�+��,�P���.�����/� �@� �4�3���������������������������-�XP���0���1����2���3������K��P���W���O�����5�A��6� :;��7�q��8�Έ��9�$.��G� �@��H��J��������������������GSMATCH=LEQUAL,1,03�CLUSTER=$$NETLIB_VECTOR,,,VMI$KWD:NETLIB_VECTOR.OBJ��CLUSTER=CLUSTER1���PSECT_ATTR=$CODE$,PIC,SHR��PSECT_ATTR=$PLIT$,PIC,SHR�&�COLLECT = CLUSTER1,$CODE$,$CODE,$PLIT$�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Y����������������������������������NETLIB_SRC.BCK�����������������*T��XP��"[NETLIB]NETLIB_MULTINET.VERSION;13��������������������������������������������������������������������������������������������� ������������������������������e��������������"�*�[NETLIB]NETLIB_MULTINET.VERSION;13�+��,�*T���.�����/� �@� �4� ���������������������������-�XP���0���1����2���3������K��P���W���O�����5���6�n 9b��7�Fb��8�X��9����������G� �@��H��J����������������������������� �IDENT="V1.6B"��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Z����������������������������������NETLIB_SRC.BCK�����������������5T<��XP��[NETLIB]NETLIB_UCX.VERSION;14�������������������������������������������������������������������������������������������������� ���������������������������������������������*�[NETLIB]NETLIB_UCX.VERSION;14�+��,�5T<���.�����/� �@� �4� ���������������������������-�XP���0���1����2���3������K��P���W���O�����5���6�b��7�.b��8�.xX��9����������G� �@��H��J������������������ �IDENT="V1.6B"��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������[����������������������������������NETLIB_SRC.BCK�����������������P��XP�� [NETLIB]NETLIB_NULL_MXLOOK.B32;1�����������������������������������������������������������������������������������������������L�������������������������������������������� �*�[NETLIB]NETLIB_NULL_MXLOOK.B32;1�+��,�P���.�����/� �@� �4�L���������������������������-�XP���0���1����2���3������K��P���W���O�����5� ��6�ȿ7��7�ɦ��8�N!ډX��9�$.��G� �@��H��J��� �������������%TITLE 'NETLIB_NULL_MXLOOK'�(�MODULE NETLIB_NULL_MXLOOK (IDENT='V1.0',J� ADDRESSING_MODE (EXTERNAL=LONG_RELATIVE,NONEXTERNAL=LONG_RELATIVE)) =�BEGIN��!++��! FACILITY: NETLIB��!�&�! ABSTRACT: Dummy MXLOOK routine.�!��!��! MODULE DESCRIPTION:��!�C�! This module contains a routine that looks up mail exchange (MX)�<�! records for a particular host name. For UCX V1.2 or any8�! TCP/IP that does not support the Domain Name System.�!��!��! AUTHOR: M. Madison�A�! COPYRIGHT 1990, RENSSELAER POLYTECHNIC INSTITUTE.�"�! ALL RIGHTS RESERVED.�!��! CREATION DATE: 03-APR-1990��!��! MODIFICATION HISTORY:��!�?�! 03-APR-1990 V1.0 Madison Initial coding (null routine).��!--���"� LIBRARY 'SYS$LIBRARY:STARLET';��� FORWARD ROUTINE�� DNS_MXLOOK;� ��%SBTTL 'DNS_MXLOOK'�G�GLOBAL ROUTINE DNS_MXLOOK (QHDESC_A, MXMAX_A, MXCOUNT_A, MXNSTRUC_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�@�! This routine does nothing but return a 0 count to caller and'�! return a status of SS$_UNSUPPORTED.��!�@�! The MXNAMES structure is an array of records like (in PL/I):�! DECLARE 1 MXNAMES (n),�4�! 2 PREFERENCE_VALUE FIXED BINARY (31),4�! 2 HOST_NAME_LENGTH FIXED BINARY (31),+�! 2 HOST_NAME CHARACTER (128);��!�;�! i.e, two longwords and a 128-byte string. No more than�2�! MXMAX names are ever returned by this routine.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�0�! DNS_MXLOOK qhname, mxmax, mxcount, mxnstruc�!�C�! qhname: char_string, character string, read only, by descriptor�K�! mxmax: unsigned_longword, longword (unsigned), read only, by reference�L�! mxcount: unsigned_longword, longword (unsigned), write only, by referenceG�! mxnstruc: mxname_struc, longword (unsigned), write only, by reference��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.$�! Other codes possible.�!��! SIDE EFFECTS: None.��!��!--���� .MXCOUNT_A = 0;���� SS$_UNSUPPORTED����END; ! DNS_MXLOOK����END��ELUDOM����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\����������������������������������NETLIB_SRC.BCK�����������������P��XP��ETLIB]NETLIB_SHRXFR.B32;7����������������������������������������������������������������������������������������������������F���������������������������������������������*�[NETLIB]NETLIB_SHRXFR.B32;7�+��,�P���.�����/� �@� �4�F��������������������������-�XP���0���1����2���3������K��P���W���O�����5���6�Ȗdg��7��eg��8�;ډX��9�$.��G� �@��H��J�������� �������������%TITLE 'NETLIB_SHRXFR'%�MODULE NETLIB_SHRXFR (IDENT='V1.1') =��BEGIN��!++��! FACILITY: NETLIB_SHRXFR�!�.�! ABSTRACT: Transfer routines for NETLIB.�!��! MODULE DESCRIPTION:��!�?�! NETLIB is an interface library to underlying TCP/IP network�F�! services. The interface library is provided as a shareable image.�!�A�! This additional layer of transfer routines is needed to allow�C�! the appropriate interface library to be substituted on the fly.�B�! Programs should be linked against NETLIB_SHRXFR. The routinesD�! in the SHRXFR library in turn map in the NETLIB_SHR routines for?�! your TCP/IP transport. This way, programs won't break when��! you change transports.�!��! AUTHOR: M. Madison�A�! COPYRIGHT 1991, RENSSELAER POLYTECHNIC INSTITUTE.�"�! ALL RIGHTS RESERVED.�!��! CREATION DATE: 29-JAN-1991��!��! MODIFICATION HISTORY:��!�0�! 29-JAN-1991 V1.0 Madison Initial coding.;�! 04-DEC-1991 V1.1 Madison Add NET_SET_TRACE_ROUTINE.��!--���"� LIBRARY 'SYS$LIBRARY:STARLET';��� EXTERNAL ROUTINE=� LIB$FIND_IMAGE_SYMBOL : BLISS ADDRESSING_MODE (GENERAL);���� EXTERNAL LITERAL� LIB$_FATERRLIB;�� � BUILTIN� � CALLG;��� � MACRO�� TRANSFER (RTN) =�� GLOBAL ROUTINE RTN =�� BEGIN/� BUILTIN ACTUALCOUNT, ACTUALPARAMETER;�#� OWN RTNADR : INITIAL (0);�2� LOCAL STATUS, ARGLST : VECTOR [16,LONG]; � IF .RTNADR EQLA 0 THEN� BEGIN�A� STATUS = LIB$FIND_IMAGE_SYMBOL (%ASCID'NETLIB_SHR',�-� %ASCID %STRING (RTN), RTNADR);�<� IF NOT .STATUS THEN SIGNAL (LIB$_FATERRLIB, 0,� .STATUS);� END;/� ARGLST [0] = MIN (ACTUALCOUNT(), 15);�)� INCR I FROM 1 TO .ARGLST [0] DO�� BEGIN�1� ARGLST [.I] = ACTUALPARAMETER (.I);�� END;!� CALLG (ARGLST, .RTNADR)�� END%;��� TRANSFER (NET_ASSIGN);� TRANSFER (NET_BIND);� TRANSFER (NET_DEASSIGN);� TRANSFER (NET_GET_ADDRESS);� � TRANSFER (NET_ADDR_TO_NAME);� TRANSFER (NET_GET_INFO); � TRANSFER (NET_GET_HOSTNAME);%� TRANSFER (NET_SET_TRACE_ROUTINE);�� TRANSFER (TCP_CONNECT);� � TRANSFER (TCP_CONNECT_ADDR);� TRANSFER (TCP_DISCONNECT);� TRANSFER (TCP_ACCEPT);� TRANSFER (TCP_SEND);� TRANSFER (TCP_RECEIVE);�� TRANSFER (TCP_GET_LINE);� TRANSFER (UDP_SEND);� TRANSFER (UDP_RECEIVE);�� TRANSFER (DNS_MXLOOK);���END��ELUDOM��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������]����������������������������������NETLIB_SRC.BCK�����������������1T*��XP��[NETLIB]NETLIB_SHRXFR.VERSION;6���������������������������������������������������������������������������������������������������������������������������������������������*�[NETLIB]NETLIB_SHRXFR.VERSION;6�+��,�1T*���.�����/� �@� �4��������$��������������������-�XP���0���1����2���3������K��P���W���O�����5���6�.Zb��7�nib��8�n>X��9����������G� �@��H��J�����������������NAME=NETLIB_SHRXFR �IDENT="V1.6B"������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������^����������������������������������NETLIB_SRC.BCK�����������������:TL��XP��[NETLIB]NETLIB_UCX012.VERSION;5������������������������������������������������������������������������������������������������ ���������������������������������������������*�[NETLIB]NETLIB_UCX012.VERSION;5�+��,�:TL���.�����/� �@� �4� ���������������������������-�XP���0���1����2���3������K��P���W���O�����5���6�b��7�b��8�X��9����������G� �@��H��J���������������� �IDENT="V1.6B"��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������_����������������������������������NETLIB_SRC.BCK�����������������?7��XP��"[NETLIB]NETLIB_USER_INSTALL.COM;20���������������������������������������������������������������������������������������������T������������������������������U)��������������"�*�[NETLIB]NETLIB_USER_INSTALL.COM;20�+��,�?7���.�����/� �@� �4�T�������,�������������������-�XP����0���1����2���3������K��P���W���O�����5���6�sӠ��7�lsӠ��8�lɥ��9�$.��G� �@��H��J����������������� ������������"�$! [NETLIB]NETLIB_USER_INSTALL.COM�$!1�$! Procedure for private installation of NETLIB.� �$! To use:��$!0�$! $ CREATE/DIRECTORY [some working directory]&�$! $ SET DEFAULT [working directory]!�$! $ BACKUP NETLIBvvu.B/SAVE []��$! $ @NETLIB_USER_INSTALL��$!0�$! 08-FEB-1991 V1.0 Madison Initial coding.4�$! 01-FEB-1992 V1.1 Volz Added TCPware support.>�$! 19-FEB-1993 V1.2 Madison AXP support, TCPware updates.C�$! 22-MAR-1993 V1.2-1 Madison TCPware now runs on AXP systems.�L�$! 26-MAR-1993 V1.2-2 Madison Eliminate IP0/IPA0 confusion for CMU-Tek.6�$! 13-JAN-1994 V1.2-3 Madison Update for WIN/TCP.�$!)�$ ON CONTROL_Y THEN GOTO NETLIB_CONTROL_Y�"�$ ON WARNING THEN GOTO NETLIB_FAIL�$! �$ NETLIB_SAY := WRITE SYS$OUTPUT�$ LINK := LINK/NOUSERLIBRARY#�$ IF F$GETSYI("HW_MODEL") .LT. 1024��$ THEN�$ NETLIB_VAX = 1�$ NETLIB_AXP = 0�$ ELSE�$ NETLIB_VAX = 0�$ NETLIB_AXP = 1�$ ENDIF��$ DEFINE VMI$KWD SYS$DISK:[]�$!�$ TYPE SYS$INPUT:���7� NETLIB User Installation Procedure���F� Copyright 1992-1994, MadGoat Software. All Rights Reserved.@� Redistribution for no commercial gain is permitted.���$!�$ GOTO NETLIB_INSTALL��$!�$NETLIB_CONTROL_Y:=�$ IF F$TRNLNM ("NETLIB_STUP") .NES. "" THEN CLOSE NETLIB_STUP�0�$ NETLIB_SAY "Installation cancelled by CTRL/Y."�$ EXIT 1�$! �$NETLIB_FAIL:��$ NETLIB_STATUS == $STATUS=�$ IF F$TRNLNM ("NETLIB_STUP") .NES. "" THEN CLOSE NETLIB_STUP��$ EXIT 'NETLIB_STATUS��$!�$NETLIB_INSTALL:�$!-�$ NETLIB_INSTALL_NODE = F$GETSYI ("NODENAME")��$!%�$! Build the tables for menu choices.��$!�$ IF NETLIB_VAX��$ THEN�$ NETLIB_TCP_NAMES = "?" +-�� ":CMU-Tek TCP/IP V6.4"+-�&� ":CMU-Tek TCP/IP V6.5 or later"+-.� ":DEC VMS/ULTRIX Connection (UCX) V1.2"+-?� ":DEC UCX V1.3 or TCP/IP Services for VMS V2.0 or later"+-�$� ":TGV MultiNet V2.2 or later"+-� ":PSC TCPware"+-�-� ":TWG WIN/TCP or PathWay Access for VMS"�I�$ NETLIB_TCPS = "?:NETLIB_CMU064:NETLIB_CMU:NETLIB_UCX012:NETLIB_UCX"+-�=� ":NETLIB_MULTINET:NETLIB_TCPWARE:NETLIB_WINTCP"��$ OLB = ".OLB"�$ OPT = ".OPT"�$ OBJ = ".OBJ"�$ ELSE�$ NETLIB_TCP_NAMES = "?" +-�%� ":DEC TCP/IP Services for VMS"+-�$� ":TGV MultiNet V3.2 or later"+-� ":PSC TCPware"+-�-� ":TWG WIN/TCP or PathWay Access for VMS"�M�$ NETLIB_TCPS = "?:NETLIB_UCX:NETLIB_MULTINET:NETLIB_TCPWARE:NETLIB_WINTCP"��$ NETLIB_CMU064 = ""�$ NETLIB_CMU = ""��$ NETLIB_UCX012 = ""�$ OLB = ".ALPHA_OLB"�$ OPT = ".ALPHA_OPT"�$ OBJ = ".ALPHA_OBJ"�$ ENDIF��$ NETLIB_I = 0�$NETLIB_INIT_LOOP:�$ NETLIB_I = NETLIB_I + 1�3�$ NETLIB_TCP = F$ELEMENT (NETLIB_I,":",NETLIB_TCPS)�8�$ IF NETLIB_TCP .EQS. ":" THEN GOTO NETLIB_END_INIT_LOOP�$ 'NETLIB_TCP = " "��$ GOTO NETLIB_INIT_LOOP��$!@�$! Now we make some educated guesses about which TCP/IP's should�$! be pre-selected.��$!�$NETLIB_END_INIT_LOOP:�$!�$ IF F$GETDVI ("IP0","EXISTS")�$ THEN�$!-�$! Don't confuse with TCPware's IPA0: device��$!.�$ IF F$GETDVI ("IP0","DEVN��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������`����������������������������������NETLIB_SRC.BCK�����������������?7��XP��"[NETLIB]NETLIB_USER_INSTALL.COM;20���������������������������������������������������������������������������������������������T������������������������������3C�������������AM") .EQS. "_IP0:"�$ THEN)�$ IF F$TRNLNM ("CMUTEK_ROOT") .NES. ""� �$ THEN��$ NETLIB_CMU = "*"� �$ ELSE��$ NETLIB_CMU064 = "*" �$ ENDIF �$ ENDIF��$ ENDIF�-�$ IF F$GETDVI ("UCX$DEVICE","EXISTS") .AND. -�5� F$SEARCH ("SYS$SYSTEM:UCX$INETACP.EXE") .NES. ""��$ THEN<�$ IF F$SEARCH ("SYS$SYSTEM:UCX$INET_ROUTING.EXE") .NES. ""�$ THEN�$ NETLIB_UCX = "*"��$ ELSE�$ NETLIB_UCX012 = "*" �$ ENDIF��$ ENDIF� �$ IF F$GETDVI ("INET0","EXISTS")�$ THEN!�$ IF F$GETDVI ("TCP0","EXISTS")��$ THEN�$ NETLIB_TCPWARE = "*"��$ ELSEM�$ IF F$TRNLNM("TWG$TCP") .NES. "" .AND. F$TRNLNM("MULTINET_ROOT") .EQS. ""� �$ THEN��$ NETLIB_WINTCP = "*" �$ ELSE��$ NETLIB_MULTINET = "*" �$ ENDIF �$ ENDIF��$ ENDIF��$!�$NETLIB_SELECT_MENU:�$!�$ TYPE SYS$INPUT:���/� TCP/IP Support Selection���A� Select the NETLIB TCP/IP support you wish to install from the�C� menu below. An asterisk appears next to the packages that have�B� already been selected. You can remove a package from the listA� by selecting it again. You may enter more than one selection�+� by separating your choices with commas.����$ NETLIB_M = 0�$NETLIB_SEL_LOOP:��$ NETLIB_M = NETLIB_M + 1�6�$ NETLIB_N = F$ELEMENT (NETLIB_M,":",NETLIB_TCP_NAMES)3�$ IF NETLIB_N .EQS. ":" THEN GOTO NETLIB_SELECT_ASK�1�$ NETLIB_T = F$ELEMENT (NETLIB_M,":",NETLIB_TCPS)�I�$ NETLIB_SAY F$FAO (" !2UL. [!AS] !AS", NETLIB_M, 'NETLIB_T, NETLIB_N)��$ GOTO NETLIB_SEL_LOOP�$NETLIB_SELECT_ASK:��$ NETLIB_SAY ""�3�$ NETLIB_SAY F$FAO (" !2UL. Exit", NETLIB_M)��$ NETLIB_SAY ""��$ NETLIB_SAY ""��$!'�$ CALL NETLIB_ASK NETLIB_CHOICE_INPUT -�&� " Your choice" "''NETLIB_M'"�$ NETLIB_I = -1��$NETLIB_PARSE_LOOP:��$ NETLIB_I = NETLIB_I + 1�@�$ NETLIB_CHOICE = F$ELEMENT (NETLIB_I, ",", NETLIB_CHOICE_INPUT)9�$ IF NETLIB_CHOICE .EQS. "," THEN GOTO NETLIB_SELECT_MENU�+�$ NETLIB_CHOICE = F$INTEGER (NETLIB_CHOICE)�9�$ IF NETLIB_CHOICE .EQ. NETLIB_M THEN GOTO NETLIB_CONFIRM�:�$ IF NETLIB_CHOICE .LT. 1 .OR. NETLIB_CHOICE .GT. NETLIB_M�$ THEN'�$ NETLIB_SAY "%NETLIB-E-BADCHOICE, ",�L� "Choice ''NETLIB_CHOICE' invalid; choices range from 1 to ''NETLIB_M'."�$ ELSE:�$ NETLIB_T = F$ELEMENT (NETLIB_CHOICE, ":", NETLIB_TCPS)�$ IF 'NETLIB_T .EQS. "*"�$ THEN�$ 'NETLIB_T = " "�$ ELSE�$ 'NETLIB_T = "*" �$ ENDIF��$ ENDIF��$ GOTO NETLIB_PARSE_LOOP�$!�$NETLIB_CONFIRM:�$ NETLIB_SAY ""�B�$ NETLIB_SAY " You have selected the following TCP/IP support:"�$ NETLIB_SAY ""��$ NETLIB_CNT = 0�$ NETLIB_M = 0�$NETLIB_CONF_LOOP:�$ NETLIB_M = NETLIB_M + 1�6�$ NETLIB_N = F$ELEMENT (NETLIB_M,":",NETLIB_TCP_NAMES)1�$ IF NETLIB_N .EQS. ":" THEN GOTO NETLIB_CONF_ASK�1�$ NETLIB_T = F$ELEMENT (NETLIB_M,":",NETLIB_TCPS)��$ IF 'NETLIB_T .EQS. "*"�$ THEN�$ NETLIB_PRI = NETLIB_M�"�$ NETLIB_SAY " ",NETLIB_N�$ NETLIB_CNT = NETLIB_CNT + 1��$ ENDIF��$ GOTO NETLIB_CONF_LOOP��$!�$NETLIB_CONF_ASK:�7�$ IF NETLIB_CNT .EQ. 0 THEN NETLIB_SAY " (None)"��$ NETLIB_SAY ""��$ NETLIB_SAY ""�5�$ CALL NETLIB_ASK NETLIB_OK "Is this correct" "YES" B�1�$ IF .NOT. NETLIB_OK THEN GOTO NETLIB_SELECT_MENU��$!�$ IF NETLIB_CNT .EQ. 0�$ THEN=�$ NETLIB_SAY "%NETLIB-I-WONTINSTALL, No packages selected."� �$ EXIT 1�$ ENDIF��$!/�$ IF NETLIB_CNT .EQ. 1 THEN GOTO NETLIB_DIR_ASK��$!�$NETLIB_PRIMARY_MENU:��$!�$ TYPE SYS$INPUT:���?� You have selected support for more than one TCP/IP package.�=� You must now select which is to be used by default on the�� current syst���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������a����������������������������������NETLIB_SRC.BCK�����������������?7��XP��"[NETLIB]NETLIB_USER_INSTALL.COM;20���������������������������������������������������������������������������������������������T�������������������������������������������em.����$ NETLIB_M = 0�$NETLIB_PRI_LOOP:��$ NETLIB_M = NETLIB_M + 1�6�$ NETLIB_N = F$ELEMENT (NETLIB_M,":",NETLIB_TCP_NAMES)4�$ IF NETLIB_N .EQS. ":" THEN GOTO NETLIB_PRIMARY_ASK1�$ NETLIB_T = F$ELEMENT (NETLIB_M,":",NETLIB_TCPS)�2�$ IF 'NETLIB_T .EQS. " " THEN GOTO NETLIB_PRI_LOOP8�$ NETLIB_SAY F$FAO (" !2UL. !AS", NETLIB_M, NETLIB_N)�$ GOTO NETLIB_PRI_LOOP�$!�$NETLIB_PRIMARY_ASK:�$!�$ NETLIB_SAY ""��$ NETLIB_SAY ""�2�$ CALL NETLIB_ASK NETLIB_TMP " Your choice"�$!%�$ NETLIB_PRI = F$INTEGER (NETLIB_TMP)�4�$ IF NETLIB_PRI .LT. 1 .OR. NETLIB_PRI .GE. NETLIB_M�$ THENO�$ NETLIB_SAY "%NETLIB-W-SELRANGE, Selection out of range. Please try again."��$ GOTO NETLIB_PRIMARY_MENU�$ ENDIF�3�$ NETLIB_T = F$ELEMENT (NETLIB_PRI,":",NETLIB_TCPS)��$ IF 'NETLIB_T .NES. "*"�$ THENT�$ NETLIB_SAY "%NETLIB-W-UNAVAIL, That choice is not available. Please try again."�$ GOTO NETLIB_PRIMARY_MENU�$ ENDIF��$!�$NETLIB_DIR_ASK:�$!�$ NETLIB_SAY ""�8�$ NETLIB_SAY " Default TCP/IP transport will be: ", -0� F$ELEMENT (NETLIB_PRI,":",NETLIB_TCP_NAMES)�$!6�$ IF NETLIB_AXP .AND. (NETLIB_WINTCP .EQS. "*") THEN -L� RENAME VMI$KWD:NETLIB_WINTCP_AXP.VERSION VMI$KWD:NETLIB_WINTCP.VERSION;�$ TYPE SYS$INPUT:�����!� Choosing the NETLIB Directory���>� The NETLIB libraries may go in either your login directory(� or some other directory you specify.���$ NETLIB_DEFANS := SYS$LOGIN:�:�$ IF F$TRNLNM ("NETLIB_DIR","LNM$PROCESS") .NES. "" THEN -9� NETLIB_DEFANS = F$TRNLNM ("NETLIB_DIR","LNM$PROCESS")��$ CALL NETLIB_ASK NETLIB_DIR -D� "Where should the NETLIB libraries be placed" "''NETLIB_DEFANS'"1�$ NETLIB_DIR = F$PARSE (NETLIB_DIR,,,"DEVICE") +-�'� F$PARSE (NETLIB_DIR,,,"DIRECTORY")�2�$ IF F$SEARCH ("''NETLIB_DIR'X.X") .EQS. "" THEN - � CREATE/DIRECTORY 'NETLIB_DIR�$!#�$ CREATE SYS$LOGIN:NETLIB_LOGIN.COM�4�$ OPEN/APPEND NETLIB_STUP SYS$LOGIN:NETLIB_LOGIN.COM �$ NETLIB_W = "WRITE NETLIB_STUP" �$ NETLIB_W "$! NETLIB_LOGIN.COM"D�$ NETLIB_W "$! Login command procedure for NETLIB library routines."�$ NETLIB_W "$!"�4�$ NETLIB_W "$ DEFINE/NOLOG NETLIB_DIR ''NETLIB_DIR'">�$ NETLIB_W "$ DEFINE/NOLOG NETLIB_NAMESERVERS ""127.0.0.1"",-"F�$ NETLIB_W " ""c.nyser.net"",""terp.umd.edu"",""ns.nasa.gov"",-"&�$ NETLIB_W " ""ns.nic.ddn.mil"""�$!�$ NETLIB_W "$!"�B�$ NETLIB_W "$ DEFINE/NOLOG NETLIB_SHRXFR NETLIB_DIR:NETLIB_SHRXFR"�$!@�$ NETLIB_SAY "%NETLIB-I-LINKING, Linking image NETLIB_SHRXFR..."H�$ LINK/SHARE=VMI$KWD:NETLIB_SHRXFR.EXE VMI$KWD:NETLIB_INSTALL'OPT'/OPT,-@� VMI$KWD:NETLIB_SHRXFR'OBJ',VMI$KWD:NETLIB_SHRXFR.VERSION/OPT�$!.�$ NETLIB_W "$ DEFINE NETLIB_SHR NETLIB_DIR:",-3� F$ELEMENT (NETLIB_PRI,":",NETLIB_TCPS), "_SHR"��$!�$ NETLIB_I = 0�$NETLIB_INST_LOOP:�$ NETLIB_I = NETLIB_I + 1�1�$ NETLIB_T = F$ELEMENT (NETLIB_I,":",NETLIB_TCPS)�7�$ IF NETLIB_T .EQS. ":" THEN GOTO NETLIB_FINISH_INSTALL��$ IF 'NETLIB_T .EQS. "*"�$ THEND�$ NETLIB_SAY "%NETLIB-I-LINKING, Linking image ''NETLIB_T'_SHR..."�$ NETLIB_L = ""��$ NETLIB_V = NETLIB_T�@�$ IF F$LOCATE ("CMU",NETLIB_T) .LT. F$LENGTH (NETLIB_T) THEN -;� NETLIB_L = ",''NETLIB_T'_ERRORS''OPT'/OPT" - "NETLIB_"�K�$ LINK/SHARE=VMI$KWD:'NETLIB_T'_SHR.EXE VMI$KWD:NETLIB_INSTALL'OPT'/OPT,-�I� VMI$KWD:'NETLIB_T''OLB'/LIB,VMI$KWD:'NETLIB_V'.VERSION/OPT'NETLIB_L'��$ ENDIF��$ GOTO NETLIB_INST_LOOP��$!�$NETLIB_FINISH_INSTALL:��$!�$ CLOSE NETLIB_STUP��$ TYPE SYS$INPUT:���E� The file SYS$LOGIN:NETLIB_LOGIN.COM includes commands that should�E� be added to your login command procedure to set up NETLIB logical� � ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������b����������������������������������NETLIB_SRC.BCK�����������������?7��XP��"[NETLIB]NETLIB_USER_INSTALL.COM;20���������������������������������������������������������������������������������������������T������������������������������ 0������������� names.��!� NETLIB installation complete.����$!�$ @SYS$LOGIN:NETLIB_LOGIN��$ EXIT 1�$!�$NETLIB_ASK: SUBROUTINE��$ PROMPT = "* " + P21�$ IF "''P4'" .EQS. "B" THEN PROMPT = PROMPT + "?"�7�$ IF "''P3'" .NES. "" THEN PROMPT = PROMPT + " [''P3']"��$ PROMPT = PROMPT + ": "�$ASK1: �$ ANSWER = ""�,�$ READ SYS$COMMAND/PROMPT="''PROMPT'" ANSWER*�$ IF ANSWER .EQS. "" THEN ANSWER = "''P3'"�$ IF ANSWER .EQS. ""�$ THEN;�$ NETLIB_SAY "%NETLIB-I-ANSREQD, A response is required."� �$ GOTO ASK1��$ ENDIF�#�$ ANSWER = F$EDIT (ANSWER,"UPCASE")��$ IF "''P4'" .EQS. "B"�$ THEN#�$ ANSWER = F$EXTRACT (0,1,ANSWER)�.�$ IF ANSWER .NES. "Y" .AND. ANSWER .NES. "N"�$ THEN;�$ NETLIB_SAY "%NETLIB-I-ANSYN, please answer YES or NO."��$ GOTO ASK1 �$ ENDIF��$ ENDIF��$ 'P1 == ANSWER��$ ENDSUBROUTINE������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������c����������������������������������NETLIB_SRC.BCK�����������������P��XP��ETLIB]NETLIB_VECTOR.MAR;7����������������������������������������������������������������������������������������������������D������������������������������+���������������*�[NETLIB]NETLIB_VECTOR.MAR;7�+��,�P���.�����/� �@� �4�D���������������������������-�XP���0���1����2���3������K��P���W���O�����5���6�� )��7�5)��8�Έ��9�$.��G� �@��H��J��������������������� .TITLE NETLIB_VECTOR�� .IDENT /V1.1/�;��; FACILITY: NETLIB��;�D�; ABSTRACT: This module defines the transfer vectors for the NETLIB0�; common network routines library.�;��; AUTHOR: M. Madison��;��; MODIFICATION HISTORY:��;�0�; 28-JAN-1991 V1.0 Madison Initial coding.;�; 04-DEC-1991 V1.1 Madison Add NET_SET_TRACE_ROUTINE.��;�� .DISABLE GLOBAL�;�,�; Macro to generate a transfer vector entry.�;�� .MACRO ROUTINE NAME � .EXTRN NAME� � .ALIGN QUAD� .TRANSFER NAME� � .MASK NAME � JMP NAME+2� .ENDM�;�� .PSECT $$NETLIB_VECTOR -�,� PIC,USR,CON,REL,GBL,SHR,EXE,RD,NOWRT,QUAD�;�� ROUTINE NET_ASSIGN�� ROUTINE NET_BIND�� ROUTINE NET_DEASSIGN�� ROUTINE NET_GET_ADDRESS� ROUTINE NET_ADDR_TO_NAME�� ROUTINE NET_GET_INFO�� ROUTINE NET_GET_HOSTNAME��;�� ROUTINE TCP_CONNECT� ROUTINE TCP_CONNECT_ADDR�� ROUTINE TCP_DISCONNECT�� ROUTINE TCP_ACCEPT�� ROUTINE TCP_SEND�� ROUTINE TCP_RECEIVE� ROUTINE TCP_GET_LINE��;�� ROUTINE UDP_SEND�� ROUTINE UDP_RECEIVE��� ROUTINE DNS_MXLOOK���� ROUTINE NET_SET_TRACE_ROUTINE��&� .BLKL 28 ; room for 14 more routines�;�� .END�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������d����������������������������������NETLIB_SRC.BCK�����������������P��XP��[NETLIB]UCX_DEFS.R32;4���������������������������������������������������������������������������������������������������������<������������������������������yH���������������*�[NETLIB]UCX_DEFS.R32;4�+��,�P���.�����/� �@� �4�<�������T��������������������-�XP����0���1����2���3������K��P���W���O�����5���6�؆6��7�ɦ��8�ꂓ3��9�$.��G� �@��H��J��������������������������!++��!��! UCX_DEFS.R32�!�<�! Definitions specific to the UCX implementation of NETLIB.�!�0�! 29-JAN-1991 V1.0 Madison Initial coding.�!--���� LIBRARY 'FIELDS';�&� LIBRARY 'SYS$LIBRARY:UCX$INETDEF';��� _DEF (CTX)� CTX_L_FLINK = _LONG,� CTX_L_BLINK = _LONG,� CTX_Q_BUFQ = _QUAD,� CTX_Q_EXPTIME = _QUAD,�� CTX_Q_CURSTR = _QUAD,� CTX_Q_IOSB = _QUAD, � CTX_X_DSC = _BYTES (12),� _OVERLAY (CTX_X_DSC)�!� CTX_L_DSCLEN = _LONG,�!� CTX_L_DSCADR = _LONG,�!� CTX_L_RETLEN = _LONG,�� _ENDOVERLAY4� CTX_X_REMSIN = _BYTES (((SIN$C_LENGTH+3)/4)*4),� CTX_L_RETSTAT = _LONG,�� CTX_W_CHAN = _WORD,� CTX_W_FLAGS = _WORD,� _OVERLAY (CTX_W_FLAGS)�� CTX_V_IGNORELF = _BIT� _ENDOVERLAY� _ENDDEF (CTX);��� _DEF (SCHAR)!� SCHAR_W_PROTOCOL = _WORD,�!� SCHAR_B_PROTYPE = _BYTE,�� SCHAR_B_DOMAIN = _BYTE�� _ENDDEF (SCHAR);��� _DEF (SUBF)�� SUBF_B_TYPE = _BYTE,� SUBF_B_CODE = _BYTE,� SUBF_W_UNUSED = _WORD� _ENDDEF (SUBF);�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������e����������������������������������NETLIB_SRC.BCK�����������������d)��XP��#[NETLIB]MULTINET_TCPWARE_DEFS.R32;4��������������������������������������������������������������������������������������������A����� ���������������������������������������#�*�[NETLIB]MULTINET_TCPWARE_DEFS.R32;4�+��,�d)���.� ����/� �@� �4�A��� ����H��������������������-�XP���0���1����2���3������K��P���W���O� ����5���6�`_��7� ԅ_��8�гcS<��9�$.��G� �@��H��J���������������� �������������!++��!��! MULTINET_DEFS.R32��!�A�! Definitions specific to the MultiNet implementation of NETLIB.��!�0�! 04-FEB-1991 V1.0 Madison Initial coding.�!--���� LIBRARY 'FIELDS';�&� LIBRARY 'SYS$LIBRARY:UCX$INETDEF';"� LIBRARY 'SYS$LIBRARY:STARLET';��� _DEF (CTX)� CTX_L_FLINK = _LONG,� CTX_L_BLINK = _LONG,� CTX_Q_BUFQ = _QUAD,� CTX_Q_EXPTIME = _QUAD,�� CTX_Q_CURSTR = _QUAD,� CTX_Q_IOSB = _QUAD,:� CTX_X_ASTRUC = _BYTES (((((SIN$C_LENGTH+3)/4)*4)+4)),� _OVERLAY (CTX_X_ASTRUC)� CTX_L_REMSINLEN = _LONG,�;� CTX_X_REMSIN = _BYTES (((SIN$C_LENGTH+3)/4)*4),�� _ENDOVERLAY� CTX_L_RETSTAT = _LONG,�� CTX_W_CHAN = _WORD,� CTX_W_FLAGS = _WORD,� _OVERLAY (CTX_W_FLAGS)�� CTX_V_IGNORELF = _BIT� _ENDOVERLAY� _ENDDEF (CTX);�� � LITERAL�!� IO$_SEND = IO$_WRITEVBLK,�#� IO$_RECEIVE = IO$_READVBLK,�4� IO$_SOCKET = IO$_ACCESS OR (0 ^ IO$S_FCODE),2� IO$_BIND = IO$_ACCESS OR (1 ^ IO$S_FCODE),4� IO$_LISTEN = IO$_ACCESS OR (2 ^ IO$S_FCODE),4� IO$_ACCEPT = IO$_ACCESS OR (3 ^ IO$S_FCODE),5� IO$_CONNECT = IO$_ACCESS OR (4 ^ IO$S_FCODE),�8� IO$_SETSOCKOPT = IO$_ACCESS OR (5 ^ IO$S_FCODE),8� IO$_GETSOCKOPT = IO$_ACCESS OR (6 ^ IO$S_FCODE),3� IO$_IOCTL = IO$_ACCESS OR (8 ^ IO$S_FCODE),�:� IO$_ACCEPT_WAIT = IO$_ACCESS OR (10 ^ IO$S_FCODE),7� IO$_SHUTDOWN = IO$_ACCESS OR (12 ^ IO$S_FCODE),�:� IO$_GETSOCKNAME = IO$_ACCESS OR (13 ^ IO$S_FCODE),9� IO$_GETPEERNAME =IO$_ACCESS OR (15 ^ IO$S_FCODE);����� � MACRO�/� MULTINET_ERROR (X) = ((X^3) OR %X'8000')%;��� � LITERAL�-� INET__ENOMEM = MULTINET_ERROR (12),�-� INET__EACCES = MULTINET_ERROR (13),�1� INET__ENOTSOCK = MULTINET_ERROR (38),�1� INET__EDESTADDRREQ = MULTINET_ERROR (39),�1� INET__EMSGSIZE = MULTINET_ERROR (40),�1� INET__EPROTOTYPE = MULTINET_ERROR (41),�1� INET__ENOPROTOOPT = MULTINET_ERROR (42),�4� INET__EPROTONOSUPPORT = MULTINET_ERROR (43),4� INET__ESOCKTNOSUPPORT = MULTINET_ERROR (44),1� INET__EOPNOTSUPP = MULTINET_ERROR (45),�1� INET__EPFNOSUPPORT = MULTINET_ERROR (46),�1� INET__EAFNOSUPPORT = MULTINET_ERROR (47),�1� INET__EADDRINUSE = MULTINET_ERROR (48),�2� INET__EADDRNOTAVAIL = MULTINET_ERROR (49),1� INET__ENETDOWN = MULTINET_ERROR (50),�1� INET__ENETUNREACH = MULTINET_ERROR (51),�1� INET__ENETRESET = MULTINET_ERROR (52),�1� INET__ECONNABORTED = MULTINET_ERROR (53),�1� INET__ECONNRESET = MULTINET_ERROR (54),�1� INET__ENOBUFS = MULTINET_ERROR (55),�1� INET__EISCONN = MULTINET_ERROR (56),�1� INET__ENOTCONN = MULTINET_ERROR (57),�1� INET__ESHUTDOWN = MULTINET_ERROR (58),�1� INET__ETOOMANYREFS = MULTINET_ERROR (59),�1� INET__ETIMEDOUT = MULTINET_ERROR (60),�1� INET__ECONNREFUSED = MULTINET_ERROR (61),�1� INET__EHOSTDOWN = M��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������f����������������������������������NETLIB_SRC.BCK�����������������d)��XP��#[NETLIB]MULTINET_TCPWARE_DEFS.R32;4��������������������������������������������������������������������������������������������A����� �������������������������c6�������������ULTINET_ERROR (64),�1� INET__EHOSTUNREACH = MULTINET_ERROR (65);������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������g����������������������������������NETLIB_SRC.BCK�����������������3TY��XP�� [NETLIB]NETLIB_TCPWARE.VERSION;9����������������������������������������������������������������������������������������������� ������������������������������*�������������� �*�[NETLIB]NETLIB_TCPWARE.VERSION;9�+��,�3TY���.�����/� �@� �4� ���������������������������-�XP���0���1����2���3������K��P���W���O�����5���6�6yb��7�xb��8�x]X��9����������G� �@��H��J��������������� �IDENT="V1.6B"��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������h����������������������������������NETLIB_SRC.BCK�����������������P��XP��[NETLIB]DUMMY.B32;1������������������������������������������������������������������������������������������������������������������������������������������+���������������*�[NETLIB]DUMMY.B32;1�+��,�P���.�����/� �@� �4��������~��������������������-�XP���0���1����2���3������K��P���W���O�����5���6�c��7�Ɩ ��8�nF ډX��9�$.��G� �@��H��J�����������������������������MODULE DUMMY =�BEGIN����LIBRARY 'SYS$LIBRARY:STARLET';���GLOBAL ROUTINE DUMMY =�BEGIN� �SS$_NORMAL�END;���END��ELUDOM������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������i����������������������������������NETLIB_SRC.BCK�����������������P��XP��[NETLIB]NETLIB.ALPHA_OPT;4�����������������������������������������������������������������������������������������������������'������������������������������4���������������*�[NETLIB]NETLIB.ALPHA_OPT;4�+��,�P���.�����/� �@� �4�'�������Z��������������������-�XP���0���1����2���3������K��P���W���O�����5���6� ��7�  ��8�(I��9�$.��G� �@��H��J����������������������GSMATCH=LEQUAL,1,4�DUMMY.ALPHA_OBJ��CLUSTER=CLUSTER1���PSECT_ATTR=$CODE$,PIC,SHR��PSECT_ATTR=$PLIT$,PIC,SHR�&�COLLECT = CLUSTER1,$CODE$,$CODE,$PLIT$���SYMBOL_VECTOR=(-!� NET_ASSIGN = PROCEDURE,-�� NET_BIND = PROCEDURE,-�"� NET_DEASSIGN = PROCEDURE,-"� NET_GET_ADDRESS = PROCEDURE,-"� NET_ADDR_TO_NAME = PROCEDURE,-"� NET_GET_INFO = PROCEDURE,-"� NET_GET_HOSTNAME = PROCEDURE,-"� TCP_CONNECT = PROCEDURE,-"� TCP_CONNECT_ADDR = PROCEDURE,-"� TCP_DISCONNECT = PROCEDURE,-!� TCP_ACCEPT = PROCEDURE,-�� TCP_SEND = PROCEDURE,-�"� TCP_RECEIVE = PROCEDURE,-"� TCP_GET_LINE = PROCEDURE,-� UDP_SEND = PROCEDURE,-�"� UDP_RECEIVE = PROCEDURE,-!� DNS_MXLOOK = PROCEDURE,-�'� NET_SET_TRACE_ROUTINE = PROCEDURE,-�'� DUMMY = PRIVATE_PROCEDURE,-�'� DUMMY = PRIVATE_PROCEDURE,-�'� DUMMY = PRIVATE_PROCEDURE,-�'� DUMMY = PRIVATE_PROCEDURE,-�'� DUMMY = PRIVATE_PROCEDURE,-�'� DUMMY = PRIVATE_PROCEDURE,-�&� DUMMY = PRIVATE_PROCEDURE)��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������