DIRECTORY Arpa USING [Address], Basics USING [HFromCard16], Convert USING [CardFromRope], RefText USING [ObtainScratch, ReleaseScratch], Rope USING [FromRefText, Index, ROPE, Substr, ToRefText], SunPMap USING [ipProtocolUDP, udpPort], SunPMapClient USING [GetPort], SunRPC USING [Create, Destroy, Error, Handle, SetRemote], SunRPCAuth USING [Conversation, Initiate, Terminate], SunYP USING [program, programVersion, ResponseVal], SunYPClient USING [Match], SunYPOps USING [], UserCredentials USING [Get] ; SunYPOpsImpl: CEDAR MONITOR IMPORTS Basics, Convert, RefText, Rope, SunPMapClient, SunRPC, SunRPCAuth, SunYPClient, UserCredentials EXPORTS SunYPOps ~ { ROPE: TYPE ~ Rope.ROPE; RopeSeq: TYPE ~ REF RopeSeqObject; RopeSeqObject: TYPE ~ RECORD [ length: CARDINAL, rope: SEQUENCE maxLength: CARDINAL OF ROPE ]; uidPosInPasswdLine: CARDINAL _ 2; gidPosInPasswdLine: CARDINAL _ 3; domainName: ROPE _ "SCL"; mapName: ROPE _ "passwd"; ypServerAddress: Arpa.Address _ [13, 1, 100, 175]; pMapServerPort: CARD ~ SunPMap.udpPort; cachedYPServerPort: CARD _ 0; GetCachedYPServerPort: ENTRY PROC RETURNS [CARD] ~ { RETURN [cachedYPServerPort] }; SetCachedYPServerPort: ENTRY PROC [port: CARD] ~ { cachedYPServerPort _ port }; OpenConnectionToYPServer: PROC [domainName: ROPE] RETURNS [h: SunRPC.Handle, c: SunRPCAuth.Conversation] ~ { port: CARD; h _ SunRPC.Create[]; c _ SunRPCAuth.Initiate[]; IF (port _ GetCachedYPServerPort[]) # 0 THEN { h _ SunRPC.SetRemote[h, ypServerAddress, Basics.HFromCard16[port]]; RETURN; }; h _ SunRPC.SetRemote[h, ypServerAddress, Basics.HFromCard16[pMapServerPort]]; port _ SunPMapClient.GetPort[h, c, SunYP.program, SunYP.programVersion, SunPMap.ipProtocolUDP ! SunRPC.Error => { port _ 0; CONTINUE }]; IF port # 0 THEN { SetCachedYPServerPort[port]; h _ SunRPC.SetRemote[h, ypServerAddress, Basics.HFromCard16[port]]; RETURN; }; SunRPC.Destroy[h]; h _ NIL; SunRPCAuth.Terminate[c]; c _ NIL; }; cacheOK: BOOL _ FALSE; cachedUid: CARD _ CARD.LAST; cachedGid: CARD _ CARD.LAST; CheckUIDCache: ENTRY PROC [name: ROPE] RETURNS [ok: BOOL, uid, gid: CARD] ~ { ENABLE UNWIND => NULL; RETURN [cacheOK, cachedUid, cachedGid]; }; SetUIDCache: ENTRY PROC [name: ROPE, uid, gid: CARD] ~ { ENABLE UNWIND => NULL; cachedUid _ uid; cachedGid _ gid; cacheOK _ TRUE; }; MyUID: PUBLIC PROC RETURNS [ok: BOOL, uid, gid: CARD] ~ { h: SunRPC.Handle; c: SunRPCAuth.Conversation; myName: ROPE _ UserCredentials.Get[].name; myName _ Rope.Substr[myName, 0, Rope.Index[myName, 0, "."]]; [ok, uid, gid] _ CheckUIDCache[myName]; IF ok THEN RETURN; [h, c] _ OpenConnectionToYPServer[domainName]; IF h = NIL THEN RETURN [FALSE, CARD.LAST, CARD.LAST]; { resp: SunYP.ResponseVal ~ SunYPClient.Match[h, c, [domainName, mapName, Rope.ToRefText[myName]] ]; SELECT resp.status FROM true => { seq: RopeSeq ~ ParseRefText[resp.val]; uid _ Convert.CardFromRope[seq.rope[uidPosInPasswdLine]]; gid _ Convert.CardFromRope[seq.rope[gidPosInPasswdLine]]; ok _ TRUE; SetUIDCache[myName, uid, gid]; }; ENDCASE => { uid _ gid _ CARD.LAST; ok _ FALSE; }; }; SunRPC.Destroy[h]; SunRPCAuth.Terminate[c]; }; ParseRefText: PROC [r: REF TEXT] RETURNS [seq: RopeSeq] ~ { i, iTo: CARDINAL; scratch: REF TEXT _ RefText.ObtainScratch[r.length]; seq _ NEW[RopeSeqObject[20]]; seq.length _ 0; i _ 0; DO IF i >= r.length THEN EXIT; iTo _ 0; DO IF i >= r.length THEN EXIT; IF r[i] = ': THEN EXIT; scratch[iTo] _ r[i]; i _ i + 1; iTo _ iTo + 1; ENDLOOP; scratch.length _ iTo; IF seq.length >= seq.maxLength THEN ERROR; seq.rope[seq.length] _ Rope.FromRefText[scratch]; seq.length _ seq.length + 1; i _ i + 1; ENDLOOP; RefText.ReleaseScratch[scratch]; }; }... RSunYPOpsImpl.mesa Demers, September 9, 1987 0:02:40 am PDT Types Procedures Κ˜code™K™(K˜—šΟk ˜ Kšœœ ˜Kšœœ˜Kšœœ˜Kšœœ!˜.Kšœœœ˜9Kšœœ˜'Kšœœ ˜Kšœœ-˜9Kšœ œ%˜5Kšœœ(˜3Kšœ œ ˜Kšœ œ˜Kšœœ˜K˜K˜—šΟn œœ˜Kšœ`˜gKšœ ˜K˜K˜head™Kšœœœ˜K˜Kšœ œœ˜"šœœœ˜Kšœœ˜Kšœœ œœ˜*K˜K˜—Kšœœ˜!Kšœœ˜!K˜Kšœ œ ˜Kšœ œ ˜—™ K˜2Kšœœ˜'K˜Kšœœ˜K˜š žœœœœœ˜4Kšœ˜K˜—šžœœœœ˜2Kšœ˜—K˜šžœœœœ3˜lKšœœ˜ K˜K˜šœ&œ˜.KšœC˜CKšœ˜K˜—KšœM˜MKšœ|œ˜ˆšœ œ˜Kšœ˜KšœC˜CKšœ˜K˜—Kšœœ˜Kšœœ˜!K˜K˜—Kšœ œœ˜Kšœ œœœ˜Kšœ œœœ˜K˜šž œœœœœœ œ˜MKšœœœ˜Kšœ!˜'K˜K˜—š ž œœœœ œ˜8Kšœœœ˜Kšœ˜Kšœ˜Kšœ œ˜K˜K˜—š žœœœœœ œ˜9K˜K˜Kšœœ˜*K˜