-+-+-+-+-+-+-+-+ START OF PART 2 -+-+-+-+-+-+-+-+ V`20=`200;\2D24Done\2D031; X#ifdef`20DNDEBUG X`09`09fprintf(stderr,`20"issueRead:`20(puesdoread)`20to\D005\DA04%d`20remainde Vr`20%d`5Cn",\1C05,`20\1709); X#endif\6303return`20SS$_NORMAL; X`09`7D X`20`20`20`20\0404\BD0EshiftChan`5D->base\B603vmbase; X\3122delta`20\3204\0A0A\3C28len`20\3004\08060; X X`09ap.ast.type\1303NET_RD; X`09\1707chan\1703chan; X X#ifdef`20DNDEBUG\7005`09fprintf(stderr,`20"issueRead:`20read`20pending`20on V`20channel`20%d`5Cn",\0F05); X#endif X`09C\B719readAstDon\A4040; X\2C22Pend\2C031;\A605\0404status\1403SYS$QIO`20(0\8306,`20IO$_READVBLK,`20`26C V\5D1D_iosb,`20 X`09`09`09`26\6D07,`20ap.astid,`20vmbase,`20MAX_QIO,`200,`200,`20\0604); X\8904`09if`20(VMSFAIL(status))`20LIB$SIGNA\1409; X`7D X X`0C X/* X`20*`20linkInit X\0C03Routine`20to`20intercept`20the`20network`20message`20and`20parse`20it`20i Vnto`20a`20node`20name. X`20*/ Xvoid Xl\5D07`20() X`7B X`09int`20i`20=`20nb.mbxMsg`5B0`5D`20+`201;\1B06start\1F03i`20\1405\1504fo_c V\1A03\330Ci`5D; X`09ncb`20=`20`26n\1609start`5D; X\DA0FTerm\DA0Fterminate\B403link`20(low`20level`20-`20socket_clo\DD04s`20high V\1D06)`20given X\4E03a`20channel`20spec`20or`20the`20network`20message`20block's`20unit`20numb Ver. X`20*/ Xvoid Xl\9E07(sChan) X`09unsigned`20short`20sChan; X`7B X`09int`20status;\2611\8807\1912next; X`09\3C04currChan\2806\1204i; X X`20`20`20`20`09next`20=`200\1804f`20\8B08\1B05`7B X\0705\1805!ChanTableInfo`5BsChan`5D)`20return; X\290A((sChan<<4)`20==`20netC\7906)`20`26`26`20(lisChannel))`20\1D0A\8203\1A0A V\4F06\5305\5204\7A14->chanDassgn\860A`09`09\CE07sChan\1004goto`20bash; X`09`7D X`09for`20(i`20\EF04`20i`20<`20(FD_SETSIZE/NFDBITS);`20i++) X\FE03`09`09curr\A20A(int)`20allC\1306s->bits`5Bi`5D\6B04while`20(c\330A) X`09\4605\9608(ffs\200D`20-`201)`20+`20(i`20*`20\8009\3204\F812next`5D->unit V`20==`20nb.unit)`20\E20C\B10E`26=`20`7E(1`20<<`20next); X`09`09`7D X`09`7D Xbash: X`09if`20((!next)`20`7C`7C`20(next`20>`20FD_SETSIZE)) X`20`20`20`20`09`09return; X`09else X`09`7B X`09`09channel`20=`20next<<4; X#ifdef`20DNDEBUG X`09`09fprintf(stderr,`20"linkTerm:`20terminating`20link`20to`20%d`5Cn",\5907); V X#endif\4803status\6B03SYS$DASSGN`20(\280A`09`09\CA04VMSFAIL(\2D06))`20LIB$SIGN VA\1409; X\CF04\D305ChanTableInfo`5Bnext`5D->chanDassgn\6C031; X`09`7D X`7D X X`0C X/* X`20*`20nameFromPort X\1003A`20hack\B904translate`20the`20passed`20port`20number`20to`20a`20DECnet V`20OBJECT`20name.`20Its`20ugly\5004but`20hey,`20who`20asked`20you? X`20*/ Xstruct`20dsc$descriptor X*n\930B`20(sa) X`09s\2A06sockaddr`20*sa; X`7B X`09union X`09\0A03`09unsigned`20sh\3804port; X`09`09char`20t`5B2`5D;\F903`20temp; X`20`20`20`20`09int`20i`20=`200; X X`09temp.t`5B0`5D`20=`20sa->sa_data`5B1`5D; X`09\1D071`5D\1D0F0`5D\4B07for`20(i\4C05\5303<`20Number(transTable);`20i++) X\2E05`7B X\0705`09if`20\230B`5Bi`5D.port`20==`20temp.port\3207\3309\3419`20X11_PORT) V\F303`09`09x11_dsc.dsc$a_pointer`5B3\C1040x30\B707`09`09return`20t\520Dobject V\2406\2805`7D X\0707/* X`20*`20Of`20course`20-`20the`20obligatory`20special`20case:`20used`20when`20so Vmeone`20tries`20to`20 X\4803access`20a\BC04`20"reserved"`20\D2056001-9`20(beyond\0F049,`20I`20don't V\5F03re!) X`20*/ X`09if`20((temp.p\3804>`20X11_PORT)`20`26`26`20\1A0B<`20\1A08`20+`2010)) X`09`7B X`09`09x11_dsc.dsc$a_pointer`5B3`5D`20=`20\580C-`20\580A+`200x30);\3E03return V`20`26\4607; X`09`7D`20 X`09fprintf`20(stderr,`20"nameFromPort:`20unrecognized\EF06request:`20%d`5Cn") V\4803\5A07NULL; X`7D X X`0C X/* X`20*`20NCPpredicate X\1003Routine`20that`20is`20passed`20to`20qsort. X`20*/ Xstatic`20int XN\400B`20(c1,`20c2) X`20`20`20`20`09NCPstruct`20*c1; X\14112; X`7B\1606\9D07(memcmp`20(c1->nodebuf,`20c2\0D0BMAX(strlen(\250B),`20s\1507 V\2D0A))))\EB10init()\E80Do`20load`20the`20NCP`20table`20of`20node/addresses V`20from`20its`20data`20base`20using`20\3905etwork\5804File`20Block`20(NFB$) V`20defined`20constants`20for\5F05`20and`20a\6306`20match\5104of`20\5404on-l V\A104\5504\7409. X`20*/ Xint X\CD0A`7B X`20`20`20`20`09int`09i; X\0C09j;\0C0Aadd\0E0BretLen`20=`200\150Bstatus;\110Beg\2303MAXDNETNODES`20+`201 V; X`09unsig\D104short`20netNCPChan\3D07struct`20io_stat_blk`20iosb\1E07char`20 V`09*delta\310Enfbdef\0704\7803`7B`20NFB$C_FC_SHOW,`200,`20\1206DB_NDI\0E08OP_E VQL, X\4905`09`09\0704`20`20\1B06WILDCARD\2B08\100A0,`200,`200,\3614NDI_NNA\3508NDI_ VTA\4409ENDOFLIST`20`7D;\BD0Ddsc$descriptor\C504Des`20\C803sizeof(nfb),\7907 V`26nfb\3F08char`20*keyArea`20=`20DNETALLOC(\7106CTX_SIZE);\6F1Cka\6E07\350E V\7108\5F07\740EbufA\7410BUF_QUO)\6D1Dbuf\6E07\2F07\6708\5207\6708\3E07nfbdef1 V`20*prm;\1A132`20*val; X\1B06i`20=`200; X/* X`20*`20Assign`20a`20temporary`20channel`20to`20_NET:`20to`20return`20NCP`20db V`20info X`20*/ X`09status\5103SYS$ASSIGN`20(`26net_device,`20`26netNCPChan\C506); X`09if`20(VMSFAIL(status))`20LIB$SIGNAL\1408\CC07LIB$MOVC5`20(`26zero,`20NULL, V`20"`5C0"\6103kaDes,`20keyArea\3507\0404\9D0DQIOW`20(0,`20netChannel,`20IO$_AC VPCONTROL\4C03iosb\A706,`20\7D06`09`26nfbD\6104\6908`26retLen,`20`26buf\1205 V\D707\3005\DB04!V\DC10\8B09iosb.status\310B(V\3110`26`26`20(\3507!=`20SS$_ENDO VFFILE))`20LIB$SIGNAL\3208; X/* X`20*`20Main`20loop`20for`20calling`20\E40A`20on`20the`20_NET:`20device,`20retu Vrning`20database`20information. X`20*/ X\AD05while`20\9A19\2506`7B X\0704\0B05delta`20=`20bufArea;\2106\F405seg`20>`20MAXDNETNODES)`09`09/*`20add V`20memory`20in`20puesdo`20realloc`20mode`20\8D08\6907`09`09`09NCPstruct`20*tmp V`20=`20(N\120A)`20\2708`09DNETALLOC((i+M\7B0C*sizeof(\3809))\AD08`09if(!tmp) V`20exit(SS$_INSFMEM)\230B`20(pNCP) X\1107\9B05\7304bcopy`20((char\8C04pNCP,`20\0F09tmp,`20\7C11`20*`20i\5D06\B608F VREE\6206\7409`7D X\0806pNCP\F303tmp\1B09seg`20=`200;\1007`7D X/* X`20*`20Loop`20through`20the`20NFB`20records`20that\1506ETACP`20passed`20back V`20to`20this`20routine. X`20*/ X\5C06for`20(j\6E05`20nfb.fldid`5Bj`5D`20!=\5F04$C_ENDOFLIST;`20++j)\3807`7B X\AC07add`20\AC0B`09prm\1003(struct`20nfbdef1`20*)`20`26n\5F0B\2F09val`20\2F102 V`20*)`20delta;\2708switch`20(prm->overlay.fields.typ\9608\970Acase\C107TYP_BIT V:\1B17LNG: X`09\BA04NCP`5Bi`5D.area`20\9404hort)`20(val\740AlngValue`20/`201024); X\3B0Cnode\3B22%`20\3B07\9107`09add\3603sizeof(long)\1C0Abreak;\BC17STR:\1B07 V\0606\890Cbuf`20=`20DNETALLOC`20(NODNAMSIZ\5F0Ccopy`20(`26v\AA0Cstring.strText V,`20\560F, X\3E08`09v\3716Count)\660A\410F`5Bv\371B`5D`20=`200x0;\3D09add`20=`20\331C`20+ V`20sizeof(shor\790Cbreak;\0F08default:\1F09fprintf(stderr,`20"NCPinit:`20unrec Vognized`20%d`5Cn",\820DlngValue\6C0B\A806\8907long\1C0A`7D X\8209lta`20+=`20add\1E08`7D X#ifdef`20NCPDEBUG X\1804\1B05\A01A%d.%d:`20%s`5Cn",pNCP`5Bi`5D.area,`20\0E08node\0E0Ebuf); X#endif`20/*`20\7108`20*/ X\7106i++;\0B07seg+\0D07\1105status\E203SYS$QIOW`20(0,`20netNCPChan,`20IO$_ACPC VONTROL,`20`26iosb,`200,`200,`20\5607`09`26nfbDes\1E03ka\0806retLen\0903buf V\1205\3104); X\9207f`20(!VMSFAIL(\8406))`20s\8D08iosb.status\320C(V\3210`26`26`20(\3607!= V`20SS$_ENDOFFILE))`20LIB$SIGNAL\3208; X`09`7D X/* X`20*`20Hopefully`20we`20have`20some`20nodes`20here`20to`20sort... X`20*/ X\8805\8704i)\0C06`7B X\9B06NCPtot\B704\AD08qsort`20((char`20*)`20pNCP,`20\2806,`20sizeof(NCPstruct), V\1B04predicate)\4608SYS$DASSGN`20(netNCPChan); X#ifdef\3504DEBUG X\2F06fprintf(stderr,`20"NCPinit:`20%d\D707found`5Cn"\8C08); X#endif X\4305`7D X\0705else\5421no\540C!`5Cn"); X`7D X X`0C X/* X`20*\6104find\0B04Ah,`20the`20luscious`20jewel`20of`20\1604Nile,`20itself!`20 V`20This`20baby`20looks`20up`20a`20given`20node`20i\5305in\3C06CP`20table`20(bu Vilt`20in`20\A207()).\4E04\3204`20can`20be`20in`20one`20\7905ree`20forms:\50041 V)`20DECnet`20Node`20Name`20-`20Phase`20IV`20has\8603max`20of`206`20characters V\3C042)\3C0DAddress`20-`20up`20to\A805\3A083.1023\35043)`20Unknown\3610this V`20sucker`20comes`20from\4705active`20ethernet`20address. X\5103`20`20`20It`20is`20composed`20of`20all`20numbers`20(illegal`20for\CD03no V\7603name`20spec).`20`20The`20rtn`20can X\5106translate`20\9505\6F07\D504become\4703\FA14type`20above\5607fact\5308ha V\B803\7E06\DE06in`20as`20a`20hybrid`20\E417\AB06portends\4705\5209e`20n\4F04 V\A203not`20known`20by`20NCP. X\2403\D805outine`20returns\6F03binary`20value`20of`20\4704\6C08in`20\0F04socka Vddr`20passed`20area`20and X\5503\2004resolved`20\7F05name/a\420A"client"\8404/ Xint XNCPfind`20(sChan,`20psock,`20\2806) X\CD04`09unsigned`20short`20sChan; X\1B05char`09*psock\120B`20`09*client; X`7B X\1605int`20`09status\2807\1205i;\0D06\5906`09node\120C`09area\300A`09result; X\1109last\0F0Bstrt\870Eb1\100F2;\100Daoff\7208tatic`20NCPstruct`20dum`20=`20 V`7BNULL,`200,`200`7D;\2A06\230A*pNCP\410A\1405sht X\1005\FB07`09union\0C07\1408\2D08chs X\1207\1B09\9C06c1\5707\1109\BB08`09`09`7Dc\0B09short`20s\2D09`7Do\0A07`7Ds; X\0A06if`20(!pNCP)`20NCPinit()\2507\1B04sChan)\B30Eaoff\FC03(c\7904*)`20(psock V`20+`20sizeof(long)\4508\4605ChanTableInfo`5BsChan`5D)\F510\2918->node\5F03 V\1D16area\4C08\4D07\5125name\3809\3906`09`09\3B08bcopy`20\3E1F,`20client,`20 V\4709`09`09strlen\7820+1);\350A\4706`5Bs\3B25`5D`20=`200x0;\3F09`7D X\0904\0B04else\0D09`09sprintf`20(\A608"%d.%d",`20C\6215area\CB0D\270Ei`5D V\8506\B907\2707bcopy`20((char`20*)`20`26C\5C1Baoff,`20sizeof(short))\4E05 V\B105\4B27node\A70C\3009(aoff`20+\600F\7015\3A05return`200\1207\D509`7D X\0B0B\120B`09else X\3E06\6B05=`20psock;\1406if`20((!client)`20`7C`7C`20(!*c\0E06)`20fprintf(stder Vr,`20"NCPaddr:`20error`20no`20\2C06`20spec`20in`20call`5Cn"); X`09upper(c\4C06\6E0Bstrchr\1907,`20':'))`20*((char`20*)`20s\2014=`20'`5C0' V\460BisEtherAddr\6408)`20`09/*`20it's`20an`20active`20ethernet`20hybrid`20addr Vess`20*/\4C06`7B X\0705`09result`20=`20atoi\B60F`09DNETFREE(\180F\FD07=`20DNETALLOC(NODNAMSIZ) V\2508sprintf(\D108"%d.%d",`20result/1024,\0D07`20%`201024\3C08`7D X\F00BDnet\EF18`20DEC\E504\DE08(eg.,`20"1.22")\EC11b1\B303\4606\A508b2\1303strc Vhr`20(\AA08'.')\2108*b2++`20=`200x0;\1307area\1203(short)`20atoi(b1)\1F08node V\1F112); X`09`09sprintf`20(\6A08"%d.%d",`20area,`20node\4809for`20(i`20=`200;`20i`20< V`20NCPtot;`20i++) X\2306\D908`09if`20((pNCP`5Bi`5D.\A006=`20area)`20`26`26`20(\1A08\9B06=`20 V\6805)`20break;\4405\4805`7D X\0707\0705else\5C04`09/*`20it's`20a\3805`20name`20(eg.,`20"NCD999")`20*/ X\3505\9208dum.nodebuf`20=`20\EF06\D908\D404-1\0E09f((pNCP\2804(NCPstruct`20* V\9F03search`20(`26dum,`20pNCP,`20NCPtot,`20 X\FA07sizeof\390A),\2304predicate))) X\2A07\7704\6A07-`20pNCP);\F008/* X`20*`20We`20should`20now`20have`20either`20a`20valid`20index`20into`20the V\6904`20table`20o\2404indication`20that\5304\2604node`20name/address`20is V\1503t`20currently`20known`20by`20this`20host\3605. X`20*/ X`09if`20((i`20>`20-1)`20`26`26`20(i`20<`20NCPtot)\DE07`7B X\E506\2B04pNCP`5Bi`5D.nodebuf)\1B05\1F06bcopy`20\2210,`20client,`20strlen V\4211+1);\6107else\0B07`09sprintf`20(\3F08"%d.%d",`20p\4107area\0E0Anode\4909 V\8B07(char`20*)`20`26\340Eaoff,`20sizeof(short))\3B21node,`20\1809(aoff`20+ V\460F\5618if`20(sChan`20`26`26`20ChanTableInfo`5BsChan`5D)\2907`7B X\0806\3205!C\2A13->nodename)`20\2D08`09C\291D`20=`20DNETALLOC(NODNAMSIZ\9D09 V\F408client,`20\4D1E,`20strlen(\2F06)`20+`201)\4B09\3C1E`5Bs\3B0D`5D`20=`200x0 V;\3D22\2903pNCP`5Bi`5D.node\321Farea\320Barea\3208`7D X\0806return`200\1807\1707else\0A06`7B X\2806fprintf(stderr,`20"NCPfind:`20%s`20not`20found`20in`20\A705lookup`5Cn", V\E307\7808\7007-1\7109`7D X X`0C X/* X`20*`20netCmdAst\0D04AST`20routine`20the`20fires`20for`20incoming\3004work`20m Vessages. X`20*/ Xvoid Xn\4B08`20(type) X`09int`20type; X`7B X\0D05i;\0806start; X X\9005ChanTableInfo`5B(mbxChannel>>4)`5D->readAstPend`20=`200; X`09stack`5BstackIndex`5D.c\3206\2003netC\0D06\2915type\2603NET_CMD;\2307Index+ V+; X`09WAKE_UP_DAMMIT; X`7D X X`0C\DF07otUsed()\CD04fprintf`20(stderr,`20"Unused`20message`20%d`20detected V`5Cn",`20nb.netCmd);\5406/* X`20*`20processNetCmd\1104Routine`20to\1C08`20a\D404work\5D08. X`20*/ Xint Xp\3F0C`20(pChan) X`20`20`20`20`09unsigned`20short`20*pChan; X`7B X\1E14sChan`20=`20((*\4406>>4); X\A406Note`20that`20the`20current`20netChannel`20could`20have`20disappeared`20d Vuring\3505interim`20(as\5204with`20an`20xscope`20connect()ed`20link\2006\3804X V11`20server),`20so`20\8605issu\5908netcmd`20read\5904us\1906at`20ch\9D06wo V\9D04be`20invalid`20on\3A07xt\3F04work`20directive.`20`20Therefore,\2804re V\5804must\4404a`20provision`20for`20testi\8B07passed`20\7808information. X`20*/ X`20`20`20`20`09if`20(!ChanTableInfo`5BsChan`5D)\2006`7B X\0705\2805lisChannel)`20\1707`09*pChan`20=`20l\1D09; X\1C06else\2708fprintf(stderr,`20"processNetCmd:`20error`20on`20invalid`20netC V\B907%d`5Cn",`20*pChan);\5306`7D X/*`20Reissue\3804\F10Bor`20update\FC0A*/ X`09issue\7006Read`20(\5109#ifdef`20DNDEBUG\6006\B120netiosb:`20%d`20status: V\A908\1B07.msg_len\110A\2806); X#endif X X`09switch`20(nb.netCmd) X`09`7B X`09`09case`20MSG$_CONNECT\9404:`09\AA15`09`09`09`09\AE11Link`20init`5Cn"\710A V\3009linkInit`20();`20return`201;`20break; X\2704\0404\0808\8E0AABOR\8C05\8E03\271BDISCON\2721EXIT\1507\271CPATHLOST\2720R VOTOCOL`20\271ETHIRDPARTY\271EIMEOUT\9C05`09 X#ifdef`20DNDEBUG\3705`09`09`09`09`09fprintf(stderr,`20"processNetCmd:`20linkTe Vrm`5Cn"); X#endif X\3A05\1A08`20((unsigned`20short)`200);`20break; X\A01ANETSHU\A007\8707`20(\8809DECnet`20shutdown`20detected`20-`20exiting`5Cn") V;`20 X\8D05exit(1); X\701ACONFIRM`20\7004`20`20 X#ifdef`20DNDEBUG X\1704\4A05\8A07\890AConnection`20confirmed`5C\7B06#endif\3C0A\F421INTMSG\1505 V\8403\2F21REJECT\2F1Fdefault\150E:`09notUsed();`20\3907`09`7D X`09return`200; X`7D X X`0C X/*`20readAst`20(ap) X`20*`20AST`20routine`20to`20update`20the`20stack,`20increment`20\1504channel's V`20length`20variable,\4D04and`20wake`20up\4306erver. X`20*/ Xint X\7D0D`09struct`20astblk`20ap; X`7B\EE05`09unsigned`20short`20sChan`20=`20ap.chan>>4; X X\2905if`20(ChanTableInfo`5BsChan`5D)\1F06\4F07`09stack`5BstackIndex`5D.channel V\550A; X\2B18type\2806type; X\2407Index++\1004\8214->le\B404\1C16read_iosb.msg_len\471AreadAstPend`20=`200; V\2920Done\29031;\D107WAKE_UP_DAMMIT\1607`7D X`7D X X`0C X/* X`20*`20timeoutAst\0E04Routine`20that`20fires`20after`20the`20select()\3405r V`20expires. X`20*/ Xvoid Xt\4C09() X`7B X`09timerExpire\BF041; X\9111\8A0Bupper X\850Co`20convert`20a`20NUL`20terminated`20string\2304uppercase\890Bupper`20(s) V\F105\0404char\0804*s; X`7B X\1608int`20\0805; X\2911tp; X\1609for`20(i`20=`200,`20tp`20=`20s;`20i`20<\8704len(s);`20i++\1C04++\750A V\6709f`20(islower(*tp))\5E04\4503toupper(*tp); X`7D X X`0C X/* X`20*`20EMULATION`20ROUTINES X\DC04\2009accept(): X\0D03Module`20to`20emulate`20the`20"\2406ance"`20of`20a`20connection`20over V\1203"listen()"ing`20channel.\5404In\4505current`20paradigm,`20only`20one`20 +-+-+-+-+-+-+-+- END OF PART 2 +-+-+-+-+-+-+-+-