$! ------------------ CUT HERE ----------------------- $ v='f$verify(f$trnlnm("SHARE_UNPACK_VERIFY"))' $! $! This archive created by VMS_SHARE Version 8.2A $! On 1-FEB-1993 16:31:36.76 By user UDAA055 $! $! The VMS_SHARE software that created this archive $! was written by Andy Harper, Kings College London UK $! -- December 1992 $! $! Credit is due to these people for their original ideas: $! James Gray, Michael Bednarek $! $!+ THIS PACKAGE DISTRIBUTED IN 5 PARTS, TO KEEP EACH PART $! BELOW 30 BLOCKS $! $! TO UNPACK THIS SHARE FILE, CONCATENATE ALL PARTS IN ORDER $! AND EXECUTE AS A COMMAND PROCEDURE ( @name ) $! $! THE FOLLOWING FILE(S) WILL BE CREATED AFTER UNPACKING: $! 1. [.DNET_SOCKET_LIBRARY]DNET_SOCKET_LIBRARY.C;83 $! 2. [.DNET_SOCKET_LIBRARY]EMULATIONLIB.H;15 $! 3. [.DNET_SOCKET_LIBRARY]PORTOBJ.H;1 $! $set="set" $set symbol/scope=(nolocal,noglobal) $f=f$parse("SHARE_UNPACK_TEMP","SYS$SCRATCH:."+f$getjpi("","PID")) $e="write sys$error ""%UNPACK"", " $w="write sys$output ""%UNPACK"", " $ if .not. f$trnlnm("SHARE_UNPACK_LOG") then $ w = "!" $ ve=f$getsyi("version") $ if ve-f$extract(0,1,ve) .ges. "4.4" then $ goto start $ e "-E-OLDVER, Must run at least VMS 4.4" $ v=f$verify(v) $ exit 44 $unpack: subroutine ! P1=filename, P2=checksum, P3=attributes $ if f$parse(P1) .nes. "" then $ goto dirok $ dn=f$parse(P1,,,"DIRECTORY") $ w "-I-CREDIR, Creating directory ''dn'" $ create/dir 'dn' $ if $status then $ goto dirok $ e "-E-CREDIRFAIL, Unable to create ''dn' File skipped" $ delete 'f'* $ exit $dirok: $ x=f$search(P1) $ if x .eqs. "" then $ goto file_absent $ e "-W-EXISTS, File ''P1' exists. Skipped" $ delete 'f'* $ exit $file_absent: $ w "-I-UNPACK, Unpacking file ", P1 $ n=P1 $ if P3 .nes. "" then $ n=f $ if .not. f$verify() then $ define/user sys$output nl: $ EDIT/TPU/NOSEC/NODIS/COM=SYS$INPUT 'f'/OUT='n' PROCEDURE GetHex(s,p)LOCAL x1,x2;x1:=INDEX(t,SUBSTR(s,p,1))-1;x2:=INDEX(t, SUBSTR(s,p+1,1))-1;RETURN 16*x1+x2;ENDPROCEDURE; PROCEDURE SkipPartsep LOOP EXITIF MARK(NONE)=END_OF(b);EXITIF INDEX(ERASE_LINE, "-+-+-+-+-+-+-+-+")=1;ENDLOOP;ENDPROCEDURE;PROCEDURE COPY_PREVIOUS(b,n)LOCAL m, s,e;m:=MARK(NONE);MOVE_HORIZONTAL(-b);s:=MARK(NONE);MOVE_HORIZONTAL(n-1);e:= MARK(NONE);POSITION(m);COPY_TEXT(CREATE_RANGE(s,e));ENDPROCEDURE; PROCEDURE ProcessLine LOCAL c,s,l,b,n,p;c := ERASE_CHARACTER(1);s := ERASE_LINE;IF c = "X" THEN SPLIT_LINE; ENDIF;MOVE_HORIZONTAL(-1);l := LENGTH( s);p := 1;LOOP EXITIF p > l;c := SUBSTR(s,p,1);p := p+1; CASE c FROM ' ' TO '`' ['\']: b:=GetHex(s,p); n:=GetHex(s,p+2); p:=p+4; COPY_PREVIOUS(b,n);['`']: COPY_TEXT(ASCII(GetHex(s,p))); p:=p+2;[' ']: p:=p+1; [INRANGE,OUTRANGE]: COPY_TEXT(c);ENDCASE;ENDLOOP;ENDPROCEDURE; PROCEDURE Decode POSITION(BEGINNING_OF(b));LOOP EXITIF MARK(NONE)=END_OF(b); IF INDEX(CURRENT_LINE,"+-+-+-+-+-+-+-+-")=1 THEN SkipPartSep;ELSE ProcessLine; MOVE_HORIZONTAL(1);ENDIF;ENDLOOP;ENDPROCEDURE;SET(FACILITY_NAME,"UNPACK");SET( SUCCESS,OFF);SET(INFORMATIONAL,OFF);t:="0123456789ABCDEF";f:=GET_INFO( COMMAND_LINE,"file_name");b:=CREATE_BUFFER(f,f);Decode;WRITE_FILE(b,GET_INFO( COMMAND_LINE,"output_file"));QUIT; $ if p3 .eqs. "" then $ goto dl $ open/write fdl &f $ write fdl "RECORD" $ write fdl P3 $ close fdl $ w "-I-CONVRFM, Converting record format to ", P3 $ convert/fdl=&f &f-1 &P1 $dl: delete 'f'* $ checksum 'P1' $ if checksum$checksum .nes. P2 then $ - e "-E-CHKSMFAIL, Checksum of ''P1' failed." $ exit $ endsubroutine $start: $! $ create 'f' X/* X`20*`20$NCDId:`20@(#)dnet_socket_library.c,v`204.9`201992/02/12`2016:01:34`20h Vardison`20Exp`20$ X`20*\5104Socket`20l\4006`20emulation`20for`20DECnet. X\2803This\2609was`20created`20primarily`20out`20of`20the`20need`20\4204a`20 V\A106-type`20interface X\5203\610A`20on`20a`20VMS`20host`20(originally`20\2504\5104\2907Font`20Server V`20from`20NCD).`20`20\5004Gradually,`20\3204various`20\8006`20calls`20and`20lo Vwer`20level`20functions`20evolved`20into`20its`20\5304present`20form.`20`20Th V\570Aassump\3C06\5604warnings\B205each`20routine`20are`20included`20\5604befor Ve`20its`20declaration. X`20*\1E04Another`20f\3C04product`20from:`20Osborne`20Hardison`20-`20NCD\060311 V/21/91\4307Modifications: X\1506-`20Ad\8204suppor\D405`20gethostbyxxxx`20by`20querying`20the`20NCP`20data Vbase\2F05node`20names\5104`20`20\F804addresses;`20`20subsequent`20calls`20to V`20NCPfind`20use`20a`20binary`20search`20to`20actually`20find\5606\7B04given V`20reference`20(inputs`20can`20be`20in`20\2604form`20of\5803name,`20a`20DECnet V\9508,`20or\AA07`20hybri\AF09`20composed`20of`20\4B04last`20two`20bytes\1608ac Vtive`20ethern\580A).\5606OBH`20-`201/5/92\1204-`20Made`20changes`20\DF05cept, V`20bind`20and`20nameFromPort\C004`20XSCOPE`20fixes.\570C3/23\5806 X`20*/ X#module`20DSL`20DNET_SOCKET_LIBRARY`20`09/*`20\5004easy`20DEBUG`20reference V\4004 X#include`20stdio X\0F09dvidef\100Amsgd\100Csy\200Ess\0F0Ets\100Ddescrip X\1109nfbd\210Cio\0F0Derrn\8E0Btime\0E0Actyp\0F0B"emulationlib.h"`09`09/*`20 V\1409`20macros`20and`20definitions`20*/ X\420Aportobj.\3D04\3E04port/object`20translation\3606pragma`20builtins`09 V\3205for`20_FFS`20support\2A04 Xextern`20volatile`20int`20noshare`20socket_errno; X\2A1Ch_\2523\2307 Xstatic`20$DESCRIPTOR`20(netcmd_mbx,`20"NETCMD_MBX"); X\2F17_device,`20"_NET:"\2A0Aunsigned`20short`20lisChannel`20=`200\2618mbx V\2623net\2614\E604stackIndex;\170CtimerExpired\190Dzero\4511info_cnt\150DNCPto Vt\2C11mbx_created`20\4812itChanTable`20=`201;\3A0FMsgLen\1A03MAX_MSG;\2008char V`20*ncb`20=`20NULL\1909struct`20io_stat_blk`20netiosb\2309NCP\2607*pNCP\4217ch Vant\9805*C\A308Info`5BFD_SETSIZE`5D\3410stack\0C0C`5BMAX_LINKS`5D; X Xfd_se\5A06nelfds; X\1307*allChannels`20=`20`26c\230B X#define`20Number(a)`20`20`20`20\0303(sizeof(a)/s\0A07`5B0`5D)) X X`0C X/*`20 X`20*`20SUPPORT`20ROUTINE`20DECLARATIONS\2004Routines`20to`20support`20socket V`20library`20emulation`20r\2D07 X`20*/ Xvoid`20`09`09clearChanTable`20();`09/*`20Sets`20up`20and`20clears`20\DE07`20T V\2805*/ Xint`20\4003onnectNet`20\3C04\3D04Connect\9405NET:\4605network`20MBX`20*/ Xchar\3E03*dnMalloc`20\3D08Special`20ma\1705\6809dnFree\2711free`20`20`20\520Bi VnitNCB`20\2A08\9A04control`20block`20init`20routine\610AisEtherAddr`20\3C08fun Vct`20to`20determ\3004is`20passed`20str`20is`20enet`20addr`20\4B0BDnet\4A31dn V\4A13sueNetCmdRead`20\4F04\4E0Cissue`20a`20network`20r\2504w/AST`20\440E\3E09 V\3F15socket`20\3E0Evoid\3F03linkInit\3E09link`20initilization`20rout\D304 V\360ETerm\360E\FB06\3411struct`20dsc$descriptor`20*nameFromPort\FA11return`20a Vn`20object`20from\CB03port`20desig\6807*/ Xstatic`20int`20`09NCPpredicate`20\5510pass\0804qs\4604*/ X\3305\3404init\CC09sets`20up`20the`20DECnet`20node`20data\360Dfind\3609finds V`20\300Cinfo\B806name`20or`20addr\4204void\4303netCmdAst\4509AST`20for`20netwo Vrk`20messages`20\350BotUsed\780A\DE05\3504unrecognized`20\4214\B906processNetC Vmd\4705/*`20\1507es`20\3917`09`09read\AC14all`20asynch`20select`20socket`20rea Vd\BA0CtimeoutA\440B\BD0A\3B07\2407\370Cupper`20\3208lower`20to`20u\1705convers Vion\3204 X`0C X/*`20 X`20*`20EMULATION`20ROUTINE`20DECLARATIONS X\2203Routines`20\7E04the`20actual\BD08library`20emulation X`20*/ Xunsigned`20short`20`09accept\9D04 Xint\AD03bcmp\0F05\BD07*bcopy\210Cind`20\0F0Bzero\100Bconnect\120Bffs`20\0E0Age Vtdtablesize`20(); Xstruct`20hosten\2303*gethostbyaddr\231Fname\5E0Ehost\1612peer\1612timeofda V\E006unsigned`20short`20`09hton\BB0Chtonl`20\100Ainet_a\A408\1406listen\110Bse Vlect`20\110Ctsockopt\7515socket\300Cocket_close\1712ioct\9406void\180Aperror V\3012read\1612writ\5D13writev`20(); X X`0C X/* X`20*`20SUPPORT`20ROUTINES X`20*/ X\1C07clearChanTable(): X\1503Module`20to`20allocate`20a`20chantable-struct-sized`20chunk`20of`20VM`20( Vif`20the`20entry`20in\4C04\1004channel`20table`20is`20NULL`20for`20\1E04pass V\4903shifte\5104annel)`20\1F04o`20free\2705\AE05urrent`20\750Cthat\5404us V\3D03to`20maps\580C\5007's`20information`20(as\5104in\A106ase`20of`20a`20li V\5903termination). X`20*/ Xvoid XclearChanTa\C804(shiftChan) X`09unsigne\C704ort`20\1B09; X`7B X`09int`09i; X`09static`20int`20movlen`20=`20sizeof(struc\D904antable); X X`09if`20(initChanTable) X`09\4F03`09in\140B\44030;\1503for`20(i\0E05`20i`20<`20FD_SETSIZE;`20i++) X`09`09`09\3509Info`5Bi`5D`20=`20\7A11`20*)`20NULL; X`09`7D X/*`20 X`20*`20Allocate`20or`20free`20the\3205nel`20\3606info`20area`20in`20VM`20depen Vding`20on`20who`20called`20\4F04this`20procedure. X`20*/ X\ED05\A00EshiftChan`5D)\F807\231B->nodename\EA05DNETFREE\3125; X`09\5C1Fbase\5829base)\5424ckLogQueue\5C2B\350B\6404\3522\2705\1D18`20=`20(str Vuct`20chantable`20*)`20NULL\3804FD_CLR((\3209<<4),`20allChannels\5F05return; X`09`7D X\6B31DNETALLOC`20(movlen); X`09LIB$MOVC5`20(`26zero,`20NULL,`20"`5C0",`20`26movlen,`20(char`20*)`20\FD1B V`20`20`20`20\9519->base\9B03\8609(MAX_QIO\3A22delta`20=`20\5C1E; X`7D X X`0C X/* X`20*`20connectNet X\0E03Creates`20a`20link`20to`20the`20_NET:`20device`20and,`20if`20no`20MBX`20 V\2805`20exists,`20c\4007one X\4F03\4007network`20mailbox. X`20*/ Xint X\7D0A`20() X`7B X\DF05int`09status; X X\1206f`20(!mbx_\5F06d)\1706\3007\2D07\F703SYS$CREMBX`20(TEMP_MBX,`20`26mbxChan Vnel,`20MAX_MSG,`20BUF_QUO,`200,`200\2503netcmd_mbx); X`09\7305VMSFAIL(\6006))`20LIB$SIGNA\1409; X\8306\9D0B++\1507`7D X\9A0EASSIGN`20(\6B04_device,\7805\9D09\8812\8729#ifdef`20DNDEBUG\8106fprintf(s Vtderr,`20"connectNet:`20n\7809:`20%d`5Cn",\130B); X#endif X\4905return`20status; X`7D X X`0C X/* X`20*`20malloc`20and`20free`20routines:\1D04These`20are`20specifically`20tied V`20to`20LIB$GET_VM\4005LIB$FREE\1004to\40041)\3904\2D04hings`20up`20a`20notch, V`20and\23042)`20get`20away`20from`20using`20buggy`20CRTL`20\A206. X`20*/ Xchar`20* XdnMalloc(size)\E306int`20size; X`7B X\110A\F107\110Aoql`20=`20sizeof(long)\85038;\2206\5F06addr; X\1206size\3003(((((size`20+\3C08int))\0F03(s\5304-`201))/soql)`20+1)`20*`20 V\0C05\5807\8706\4803LIB$GET_VM(`26size,`20(unsigned`20long`20*)`20`26addr V\3A08if`20(VMSFAIL(\4606))`20LIB$SIGNAL\1408\2E07bcopy`20((\C806\4B03\6406addr V,`20\B80C\3007addr`20+=`20\1B0B\1A07return\3A05; X`7D X X`0C Xint XdnFree(addr)\2806\6A06\2706`7B X\B306nt`20status\4C07\E209\1A05ize\1806\1C05\E60A!addr)`20r\79061;\A20B-= V\A213\EC07\DC06\F210\EC13\9306`20=`20LIB$FREE_VM(`26\2F06(u\A308long\4805 V\8E05\3B07\9F04VMSFAIL(\4706))\4705SIGNAL\1408\2E07\C20A`7D X X`0C X/*`20 X`20*`20initNCB X\0B03Module`20to`20create`20Network`20Control`20Block`20as`20in,`20\3204`7B V`20"MV3100::",'"',"TASK=FONT$FS/",0,'"'`20`7D`20from`20something`20that`20look Vs`20\4704like`20this:`20"decnet/mv\5706\4B07".`20`20Note`20\3A05the`20object V`20name`20is\4705assumed`20to`20be`20a\2806pointer`20located`20one`20word`20of Vf`20of\2405"name"`20\2B08\4C04(name+2),`20where\6806points`20to`20\3604sockadd Vr`20structure`20\E705\7605rogram\4B05\B305called`20(connect()). X`20*/ Xchar`20* XinitNCB\7706,`20objlen,`20task,`20node) X`09\6706\770A*name; X`09unsigned`20short`09*objlen; X`09\5C06task\0D09node; X`7B X\0F07pncb`20=`20(c\0E05)`20DNETALLOC`20(NCBSIZE);\2C08op\0B0Anp; X X`09if`20(!n\9D06\5303\0404`09`09\2207op\580C((\0A08name`20+`20sizeof(name->sa_ Vfamily)\6E04\4308t`20=`20`26o\7504`09`09bcopy`20(oop,`20t,\3E08`26op\3206`7D X`20`20`20`20`09`09\9105isalpha(*op))`20return`20NULL\2A04upper(op)\0D04\2F05(m Vemcmp(\5B04DNET_PREFIX,`20strlen(\140B))))`20\8F04op`20+=\2114\5604else\9007 V`09r\7E0D`7D X\1D06\4105=`20node; X`09bcopy\7F05(c\F905)`20pncb\8109\E507on\3404strchr(\2106':')`20+`202; X`09\CB05node)`20\5C05\2807\5604\260B*onp++\1F03'"'; X`09strcpy(onp,`20task\6708\DC0A\1608\5F0A X`09`7B X`09`09\3A0Cop)\F704\390E\1507\710A/'; X`09`7D X\120B`5C0\1304\1010\A30F*objlen\1003\6004-`20(char`20*)`20pncb; X`09return\0E07`7D X X`0C X/* X`20*`20isEtherAddr\0F04Boolean`20routine`20to`20determine`20if`20a`20passed V`20client`20node`20name X\4C05\2003valid`20DECnet\1A05`20or`20a`20ether\1304ad`20hoc\1A06derived`20from V`20the\4504last`20two`20bytes`20of`20the`20active\460Cdress. X`20*/ Xint X\C80B`20(caddr) X`20`20`20`20`09char`20*caddr; X`7B X\140Ba; X X\0F05if`20((!caddr)`20`7C`7C`20(!\3006))`20return`200;\2A0Astrchr\6406,`20'.') V\2711for`20(\F503=`20\7806\6C04`20a++\9307`09if((*a`20<`20'0'\7206*a`20>`20'9 V\4C13\7304a`20=\4B07\1F0C#ifdef`20DNDEBUG\7A07printf(stderr,`20"isEtherAddr: V`20%s`20is`20an`20ethernet`20address`5Cn",caddr); X#endif X\4F05\6D071;\B907 X`7D X X`0C X/* X`20*`20isDnetAddr\0E04Boolean`20routine`20to`20determine`20if`20a`20passed`20c Vlient`20node`20name X\4B05\2003valid`20DECn\980A. X`20*/ Xint Xi\6E09`20(\AA06\9306char`20*caddr; X`7B X\1405if`20(strchr(caddr,`20'.'))`20\CE0F\0F070;\D60EsueNetCmdRead X\1303Reading`20from`20the`20Network`20Command`20Mailbox`20willbe`20done`20on V\2B05mbxChannel,`20but X\4F03will`20be`20treated`20as\FD03read`20in\5F06ET:`20cha\3606since`20it`20is V\1E05\1907`20that\1104\5304upper`20layer`20sees. X`20*/ Xint X\CF0F`20(chan) X`09unsigned`20short`20chan; X`7B X`20`20`20`20`09int`20status; X X\1206f`20(!ChanTableInfo`5B(m\DA09>>4)`5D->readAstPend)\3706`7B X#ifdef`20DNDEBUG\1606`09fprintf(stderr,`20"i\A50E:`20read`20pending`20on\F409% Vd`20from`20chan`20%d`5Cn",`20m\8809,`20chan); X#endif X\6E06\B72B`20=`201; X\3704\3B05status\1503SYS$QIO`20(0\6F0EIO$_READVBLK,`20`26netiosb\0A06CmdAst, V`20NET_CMD,\5709\0808\1010`26nb,`20mbxMsgLen,`200,`200,`20\0604); X\CB06if`20(VMSFAIL(\9D06))`20LIB$SIGNA\1409\2F07`7D X\0705return`20status; X`7D X X`0C X/* X`20*`20issueRead`20(chan) X\1403Routine`20to`20setup`20a`20read`20AST`20on`20the`20passed`20channel.`20 V`20In`20our`20emulation\4804we`20must`20check`20\3704\3007's`20buffers\6406e V`20if`20any`20remaining`20data`20is`20left X\4C03to`20be\8705\6D06\4E05ase`20that`20there\2F04some\4607der,\2705ro\CF06wil Vl`20 X\4C03"fake"`20an\D205event`20by`20shoving`20interrupt`20information`20in\4D05s Vtack.`20`20Otherwise\9D05\660Bsets`20up`20\1404\5F04normally`20with\1605\FB06 V\CF03\6D04\1105\C804of\0C05\4F04vm`20area\4B04up. X`20*/ Xint XissueRead`20(chan) X`09unsigned`20short`20chan; X`7B X`09astParam`20ap; X`09int`20shiftChan`20=\2705>>4; X`09char`20*vmb\8104=`20ChanTableInfo`5Bs\3308`5D->base\300Bdelta`20\311Cdelta V\7C07vmle\7804\2E1Alen\2C07remainder`20=`20(v\9906+`20vmlen)`20-`20\7B07; X`20`20`20`20\D906tatus; X/*`20 X`20*`20Insert`20a`20fake`20result`20in`20the`20stack`20if`20there`20is`20unrea Vd`20data`20in`20our`20channel's`20buffer.\5705Then`20return`20without`20settin Vg`20up`20\5E04\4A05attention`20AST`20QIO. X`20*/ X`09if`20(r\DB09>`200) X`09`7B X`09`09stack`5BstackIndex`5D.c\8006\FF03chan; X\2414type\2103NET_RD\2309Index++\1004ChanTableInfo`5B(chan>>4)`5D->readAstPend +-+-+-+-+-+-+-+- END OF PART 1 +-+-+-+-+-+-+-+-