DIRECTORY Arpa, ArpaUDP, Basics, Convert, CStrings, EnvironmentVariables, Rope, SunPMap, SunPMapClient, SunRPC, SunRPCOnUDP, SunRPCAuth, SunYP, SunYPBind, SunYPBindClient, SunYPClient, SunYPFind, UnixSysCalls, UXStrings ; SunYPFindImplP: CEDAR MONITOR LOCKS lock USING lock: Lock IMPORTS Basics, Convert, EnvironmentVariables, Rope, SunPMapClient, SunRPC, SunRPCOnUDP, SunRPCAuth, SunYPBindClient, SunYPClient, UnixSysCalls, UXStrings EXPORTS SunYPFind ~ { Address: TYPE ~ Arpa.Address; nullAddress: Address ~ Arpa.nullAddress; Port: TYPE ~ ArpaUDP.Port; nullPort: Port ~ ArpaUDP.nullPort; ROPE: TYPE ~ Rope.ROPE; pMapPort: ArpaUDP.Port ¬ Basics.HFromCard16[Basics.LowHalf[SunPMap.udpPort]]; defaultRemoteAddressForYPBind: Address ¬ nullAddress; -- nullAddress => ME maxDomainNameLength: CARD ¬ 255; Lock: TYPE ~ REF LockObject; LockObject: TYPE ~ MONITORED RECORD []; Error: PUBLIC ERROR [code: ATOM] ~ CODE; defaultDomainName: ROPE ¬ NIL; defaultDomainNameLock: Lock ~ NEW[LockObject]; GetDefaultDomain: PUBLIC PROC RETURNS [domainName: ROPE ¬ NIL] ~ { GetDefaultDomainInner: ENTRY PROC [lock: Lock ¬ defaultDomainNameLock] ~ { domainString: CStrings.CString ¬ UXStrings.CreateSpace[maxDomainNameLength+1]; domainName ¬ defaultDomainName; IF Rope.IsEmpty[domainName] THEN TRUSTED { IF UnixSysCalls.GetDomainName[domainString, maxDomainNameLength+1]#success THEN ERROR Error[$programmingError]; domainName ¬ defaultDomainName ¬ UXStrings.ToRope[domainString]; }; }; GetDefaultDomainInner[]; IF Rope.IsEmpty[domainName] THEN ERROR Error[$noDefaultDomain]; }; SetDefaultDomain: PUBLIC PROC [domainName: ROPE] ~ { SetDefaultDomainInner: ENTRY PROC [lock: Lock ¬ defaultDomainNameLock] ~ { defaultDomainName ¬ domainName; }; SetDefaultDomainInner[]; }; LookupYPPort: PROC [address: Address, domain: ROPE] RETURNS [port: Port] ~ { h: SunRPC.Handle ¬ NIL; c: SunRPCAuth.Conversation ¬ NIL; errorCode: ATOM ¬ NIL; portNumber: CARD; { ENABLE { SunRPC.Error, SunRPCAuth.Error => { errorCode ¬ code; CONTINUE }; }; h ¬ SunRPCOnUDP.Create[remoteAddress~address, remotePort~pMapPort]; c ¬ SunRPCAuth.Initiate[]; portNumber ¬ SunPMapClient.GetPort[h, c, SunYP.program, SunYP.programVersion, SunPMap.ipProtocolUDP]; IF portNumber = 0 THEN { errorCode ¬ $noYP; } ELSE { h ¬ SunRPCOnUDP.SetRemote[h, address, Basics.HFromCard16[Basics.LowHalf[portNumber]]]; IF NOT SunYPClient.Domain[h, c, domain] THEN errorCode ¬ $domainNotFound; }; }; IF h # NIL THEN SunRPC.Destroy[h]; h ¬ NIL; IF c # NIL THEN SunRPCAuth.Terminate[c]; c ¬ NIL; IF errorCode # NIL THEN ERROR Error[errorCode]; port ¬ Basics.HFromCard16[Basics.LowHalf[portNumber]]; }; GetServerAddressAndPortUsingYPBind: PROC [domainName: ROPE] RETURNS [address: Address, port: Port] ~ { h: SunRPC.Handle ¬ NIL; c: SunRPCAuth.Conversation ¬ NIL; errorCode: ATOM ¬ NIL; ypBindPortNumber: CARD; ypBindRemoteAddress: Address; ypBindRemotePort: Port; IF Rope.IsEmpty[domainName] THEN ERROR; -- can't happen { ENABLE { SunRPC.Error => { errorCode ¬ code; GOTO Cant }; SunRPCAuth.Error => { errorCode ¬ code; GOTO Cant }; }; h ¬ SunRPCOnUDP.Create[defaultRemoteAddressForYPBind, pMapPort]; [ypBindRemoteAddress, ypBindRemotePort] ¬ SunRPCOnUDP.GetRemote[h]; c ¬ SunRPCAuth.Initiate[]; ypBindPortNumber ¬ SunPMapClient.GetPort[h, c, SunYPBind.program, SunYPBind.programVersion, SunPMap.ipProtocolUDP]; IF ypBindPortNumber = 0 THEN { errorCode ¬ $noYPBind; GOTO Cant }; ypBindRemotePort ¬ Basics.HFromCard16[Basics.LowHalf[ypBindPortNumber]]; h ¬ SunRPCOnUDP.SetRemote[h, ypBindRemoteAddress, ypBindRemotePort]; { response: SunYPBind.ResponseBinding ~ SunYPBindClient.Domain[h, c, domainName]; WITH response SELECT FROM successResp: success SunYPBind.ResponseBinding => { address ¬ successResp.binding.address; port ¬ Basics.HFromCard16[CARD16[successResp.binding.port]]; }; failureResp: failure SunYPBind.ResponseBinding => { errorCode ¬ (SELECT failureResp.errorCode FROM internalError => $failureYPBind, noServer => $noYP, resourceError => $resourceYPBind, ENDCASE => $protocolYPBind); }; ENDCASE => { errorCode ¬ $protocolYPBind; } }; EXITS Cant => NULL; }; IF h # NIL THEN SunRPC.Destroy[h]; h ¬ NIL; IF c # NIL THEN SunRPCAuth.Terminate[c]; c ¬ NIL; IF errorCode # NIL THEN ERROR Error[errorCode]; }; GetServerAddressAndPortForDomain: PUBLIC PROC [domainName: ROPE, addressHint: Address] RETURNS [address: Address, port: Port ¬ nullPort] ~ { errorCode: ATOM; IF Rope.IsEmpty[domainName] THEN domainName ¬ GetDefaultDomain[]; errorCode ¬ $noServerSpecified; IF (address ¬ addressHint) = nullAddress THEN { addressRope: Rope.ROPE ¬ EnvironmentVariables.Get[Rope.Concat["XR_YPSERVER_", domainName]]; IF addressRope # NIL THEN address ¬ Convert.ArpaAddressFromRope[addressRope ! Convert.Error => CONTINUE ]; }; IF address = nullAddress THEN { [address, port] ¬ GetServerAddressAndPortUsingYPBind[domainName ! Error => { errorCode ¬ code; CONTINUE }]; }; IF address = nullAddress THEN ERROR Error[errorCode]; errorCode ¬ $noYP; IF port = nullPort THEN { port ¬ LookupYPPort[address, domainName]; -- ! Error[...] }; IF port = nullPort THEN ERROR Error[errorCode]; }; }. ^SunYPFindImplP.mesa Copyright Σ 1989, 1991, 1992, 1993 by Xerox Corporation. All rights reserved. Demers, July 2, 1990 4:41 pm PDT Carl Hauser, November 28, 1988 4:51:19 pm PST Willie-Sue, March 15, 1989 4:41:49 pm PST Schilit, July 2, 1990 3:03 pm PDT Willie-s, September 27, 1991 6:55 pm PDT Chauser, January 3, 1992 11:04 am PST Christian Jacobi, March 31, 1993 3:15 pm PST Types Parameters Locks Error Default Domain Get YP Port on Server YPBind Client IF errorCode # NIL THEN GOTO Cant; Server Location Determine domain ... Determine host address and possibly YP port ... Determine YP port ... Κ<•NewlineDelimiter –(cedarcode) style˜code™Kšœ ΟeœC™NK™ K™-K™)K™!K™(K™%K™,K˜—šΟk ˜ K˜K˜K˜K˜K˜ K˜K˜K˜Kšœ˜K˜K˜ K˜ K˜K˜ K˜Kšœ ˜ K˜ K˜ K˜ K˜K˜—šΟnœžœž˜Kšžœžœ ˜Kšžœ“˜šKšžœ ˜K˜head™Kšœ žœ˜Kšœ(˜(K˜Kšœžœ˜Kšœ"˜"K˜Kšžœžœžœ˜—™ K˜MKšœ6Οc˜JKšœžœ˜ —™Kšœžœžœ ˜Kšœ žœž œžœ˜'—™Kš Ÿœžœžœžœžœ˜(—™Kšœžœžœ˜Kšœžœ ˜.K˜K˜š Ÿœžœžœžœžœžœ˜BšŸœžœžœ)˜JKšœN˜NKšœ˜šžœžœžœ˜*KšžœIžœžœ˜oKšœ@˜@Kšœ˜—K˜—Kšœ˜Kšžœžœžœ˜?K˜—K˜šŸœžœžœžœ˜4šŸœžœžœ)˜JKšœ˜K˜—Kšœ˜K˜——™šŸ œžœžœžœ˜LKšœžœ˜Kšœžœ˜!Kšœ žœžœ˜Kšœ žœ˜˜šžœ˜Kšœ5ž œ˜AK˜—KšœC˜CK˜Kšœe˜ešžœ˜šžœ˜Kšœ˜K˜—šžœ˜KšœV˜VKšžœžœ"žœ˜IK˜——K˜—Kšžœžœžœžœ˜+Kšžœžœžœžœ˜1Kšžœ žœ˜/Kšœ6˜6K˜——™ šŸ"œžœžœžœ#˜fKšœžœ˜Kšœžœ˜!Kšœ žœžœ˜Kšœžœ˜K˜Kšœ˜K˜Kšžœžœžœ ˜7K˜˜šžœ˜Kšœ$žœ˜0Kšœ(žœ˜4Kšœ˜K˜—Kšœ@˜@KšœC˜CK˜Kšœs˜sKšžœžœžœ˜BKšœH˜HKšœD˜DK˜˜KšœO˜Ošžœ žœž˜šœ3˜3Kšœ&˜&Kšœžœ˜