Copyright (C) 1994, Digital Equipment Corp.
Created on Sat Jan 11 15:49:00 PST 1992 by gnelson
Last modified onFri Jan 7 13:31:07 PST 1994by msm
UNSAFE MODULE; IMPORT Atom, AtomList, Herrno, M3toC, TextF, Unetdb, Usocket, Unix, Uin, Utypes; EXCEPTION FatalError; <*FATAL FatalError*> VAR mu := NEW(MUTEX); PROCEDURE IP GetHostByName (nm: TEXT; VAR (*out*) res: Address): BOOLEAN RAISES {Error} = BEGIN LOCK mu DO VAR h := Unetdb.gethostbyname(ADR(nm[0])); BEGIN IF h = NIL THEN InterpretError(); RETURN FALSE; END; res := GetAddress(h); END; END; RETURN TRUE; END GetHostByName; PROCEDUREGetCanonicalByName (nm: TEXT): TEXT RAISES {Error} = BEGIN LOCK mu DO VAR h := Unetdb.gethostbyname(ADR(nm[0])); BEGIN IF h # NIL THEN RETURN M3toC.CopyStoT(h.h_name); END; END; END; InterpretError(); RETURN NIL; END GetCanonicalByName; PROCEDUREGetCanonicalByAddr (addr: Address): TEXT RAISES {Error} = VAR ua: Uin.struct_in_addr; BEGIN ua.s_addr := LOOPHOLE(addr, Utypes.u_int); LOCK mu DO VAR h := Unetdb.gethostbyaddr( ADR(ua), BYTESIZE(ua), Usocket.AF_INET); BEGIN IF h # NIL THEN RETURN M3toC.CopyStoT(h.h_name); END; END; END; InterpretError(); RETURN NIL; END GetCanonicalByAddr; PROCEDUREGetAddress (ent: Unetdb.struct_hostent_star): Address = VAR ua: Uin.struct_in_addr; BEGIN <* ASSERT ent.h_length <= BYTESIZE(Address) *> ua := LOOPHOLE(ent.h_addr_list, UNTRACED REF UNTRACED REF Uin.struct_in_addr)^^; RETURN LOOPHOLE(ua.s_addr, Address); END GetAddress; PROCEDUREGetHostAddr (): Address = VAR hname: ARRAY [0..255] OF CHAR; BEGIN LOCK mu DO IF Unix.gethostname(ADR(hname[0]), BYTESIZE(hname)) # 0 THEN RAISE FatalError; END; VAR h := Unetdb.gethostbyname(ADR(hname[0])); BEGIN IF h = NIL THEN RAISE FatalError; END; RETURN GetAddress(h); END; END; END GetHostAddr; PROCEDUREInterpretError () RAISES {Error} = BEGIN CASE Herrno.h_errno OF | Unetdb.TRY_AGAIN, Unetdb.NO_RECOVERY, Unetdb.NO_ADDRESS => RAISE Error(AtomList.List1(LookupFailure)); ELSE END; END InterpretError; BEGIN LookupFailure := Atom.FromText("IP.LookupFailure"); Unreachable := Atom.FromText("IP.Unreachable"); PortBusy := Atom.FromText("IP.PortBusy"); NoResources := Atom.FromText("IP.NoResources"); END IP.