dww@stl.stc.co.uk (David Wright) (01/27/88)
I recently needed to know whether a DECnet node was 'known'. This was within a DCL procedure we run nightly on all our DECnet nodes to update the DECnet tables from a central master list. If you try to remove a node that isn't there you get lots of error messages! There does not appear to be a DCL lexical function to reveal if a node is known, so I had to find an alternative; look up the node in the appropriate DECnet file. In this case I needed to check the address, not the name, so I had to convert the form area.node into the internal binary format. The method I worked out may be useful to others, so I'm posting it to the net as a small stand-alone .COM procedure - as it's small I'm not VMS_SHAR'ing it. There is a note in the code on how to lookup by name too. This procedure has been tested with VMS 4.4/5/6. The DECnet file format was changed in VMS 4.4 when the files were reorganised, to simplify cluster operation I think. We haven't seen 4.7 yet. I would expect the format to change again eventually (VMS 5?), as DECnet's present address range is inadequate for very large networks. $! ----------------------------- Cut Here ------------------------------------ $! Check whether a DECnet node address is 'known' by converting to 16-bit $! binary form and looking it up in the DECnet tables. $! $! The address should be in standard DECnet area.node form, e.g. 1.3 $! This is converted as follows: $! area in first 6 bits range 1-63, node in remaining 10 bits range 1-1023 $! The actual lookup treats the binary number as a 2-char string, because $! DCL read/key only accepts string type keys. $! $! The first two fields of netnote_remote.dat under VMS V4.4+ are $! address as a 16-bit binary number $! name as a 6-byte fixed string $! This file format was different under VMS V4.2 and may change again in V5 $! $! Author: David Wright - dww@stl.stc.co.uk - December 1987 $! $ address = p1 $ if p1 .eqs. "" then inquire address $! $ if f$element(0,".",address) .lt. 1 .or. f$element(1,".",address) .lt. 1 - then goto NO_CANCEL ! neither field can be 0 $! $!!!TEST $ bin_address = - $!!!TEST f$element(0,".",address) * 1024 + f$element(1,".",address) $!!!TEST $ show symbol bin_address $ str_address[0,16] = - f$element(0,".",address) * 1024 + f$element(1,".",address) $ open/read/share netnode sys$system:netnode_remote.dat $ read /index=0 /key="''str_address'" /match=eq /error=NO_CANCEL netnode line $! If you want to search on name instead, use ... index=1 /key="''name'" ... $ close netnode $! $ write sys$output address, " is known, name ", f$extract(2,6,line) $ exit $NO_CANCEL: $ write sys$output address, " not found" $ exit -- Regards, David Wright STL, London Road, Harlow, Essex CM17 9NA, UK dww@stl.stc.co.uk <or> ...uunet!mcvax!ukc!stl!dww <or> PSI%234237100122::DWW