DIRECTORY BasicTime USING [GMT, nullGMT, ToPupTime, Update], CedarProcess USING [Fork, ForkableProc, Process], Endian USING [FFromCard], FS USING [ComponentPositions, Error, ExpandName, FileInfo], PupBuffer USING [Buffer, FileLookupReply], PupSocket USING [CreateServer, Destroy, ExtractRope, FreeBuffer, Get, ReturnToSender, SetUserHWords, SetUserSize, Socket, waitForever], PupType USING [fileLookup, fileLookupError, fileLookupReply], PupWKS USING [fileLookup], Rope USING [Cat, Find, Index, Length, Replace, ROPE, Substr], STPServerFileTranslation USING [FindNamedTranslator, NamedTranslator], STPServerPrivate USING [CurrentVersion, FileName, NameMapDirection, NameMapList], UserProfile USING [CallWhenProfileChanges, ListOfTokens, ProfileChangeReason]; STPServerAuxImpl: CEDAR MONITOR IMPORTS BasicTime, CedarProcess, Endian, FS, PupSocket, Rope, STPServerPrivate, UserProfile, STPServerFileTranslation EXPORTS STPServerPrivate ~ BEGIN OPEN STPServerPrivate; nameMaps: NameMapList _ NIL; GMT: TYPE ~ BasicTime.GMT; ROPE: TYPE ~ Rope.ROPE; LOR: TYPE ~ LIST OF ROPE; BothFromOne: PUBLIC PROC [oneName: ROPE, direction: NameMapDirection] RETURNS [both: FileName] ~ { otherName: ROPE _ oneName; otherLength: INT _ otherName.Length[]; FOR nms: NameMapList _ nameMaps, nms.rest WHILE nms # NIL DO find: ROPE ~ SELECT direction FROM localToRemote => nms.first.local, remoteToLocal => nms.first.remote, ENDCASE => ERROR; repl: ROPE ~ SELECT direction FROM localToRemote => nms.first.remote, remoteToLocal => nms.first.local, ENDCASE => ERROR; start: INT ~ otherName.Find[s2: find, case: FALSE]; cutLength: INT ~ find.Length[]; IF start >= 0 THEN { otherName _ otherName.Replace[start: start, len: cutLength, with: repl]; EXIT; }; ENDLOOP; both _ SELECT direction FROM localToRemote => [local: oneName, remote: otherName], remoteToLocal => [local: otherName, remote: oneName], ENDCASE => ERROR; }; RealName: PROC [remoteName: ROPE] RETURNS [realName: ROPE _ NIL, translated: BOOL _ FALSE] ~ { fullFName: ROPE _ NIL; cp: FS.ComponentPositions; namedTranslator: STPServerFileTranslation.NamedTranslator _ NIL; hostNameLength: INT _ 0; [fullFName, cp] _ FS.ExpandName[remoteName]; namedTranslator _ STPServerFileTranslation.FindNamedTranslator[fullFName, cp.dir.start, cp.dir.length]; IF namedTranslator = NIL OR cp.subDirs.length = 0 THEN RETURN [realName: BothFromOne[remoteName, remoteToLocal].local, translated: FALSE]; hostNameLength _ Rope.Index[s1: fullFName, pos1: cp.subDirs.start, s2: ">"] - cp.subDirs.start; realName _ Rope.Cat["[", Rope.Substr[fullFName, cp.subDirs.start, hostNameLength], "]<", Rope.Substr[fullFName, cp.subDirs.start+hostNameLength+1]]; translated _ TRUE; }; NoteProfile: PROC [reason: UserProfile.ProfileChangeReason] --UserProfile.ChangeProc-- ~ { maps: LOR _ UserProfile.ListOfTokens["STPServer.NameMappings", NIL]; newMaps: NameMapList _ NIL; FOR maps _ maps, maps.rest.rest WHILE maps # NIL AND maps.rest # NIL DO remote: ROPE ~ maps.first; local: ROPE ~ maps.rest.first; newMaps _ CONS[[local: local, remote: remote], newMaps]; ENDLOOP; IF maps # NIL THEN ERROR; nameMaps _ newMaps; }; socket: PupSocket.Socket _ NIL; singleProcess: CedarProcess.Process _ NIL; StartSingle: PUBLIC ENTRY PROC = { IF singleProcess = NIL THEN { socket _ PupSocket.CreateServer[ local: PupWKS.fileLookup, recvBuffers: 5, getTimeout: PupSocket.waitForever ]; singleProcess _ CedarProcess.Fork[ SinglePacketListener, NIL, [priority: foreground, usePriority: TRUE]]; }; }; StopSingle: PUBLIC ENTRY PROC = { IF singleProcess # NIL THEN { PupSocket.Destroy[socket]; socket _ NIL; }; }; SinglePacketListener: CedarProcess.ForkableProc = TRUSTED { ENABLE UNWIND => singleProcess _ NIL; DO b: PupBuffer.Buffer = PupSocket.Get[socket]; IF b = NIL THEN EXIT; SELECT b.type FROM PupType.fileLookup => { name: ROPE _ Rope.Cat["[]", PupSocket.ExtractRope[b]]; fileLen: INT _ 0; fileDate: GMT _ BasicTime.nullGMT; translated: BOOL _ FALSE; [name, translated] _ RealName[name]; [fullFName: name, created: fileDate, bytes: fileLen] _ FS.FileInfo[name: name ! FS.Error => { b.type _ PupType.fileLookupError; b.hWord[0] _ error.group.ORD; PupSocket.SetUserHWords[b, 1]; CONTINUE; }; ]; IF fileDate # BasicTime.nullGMT AND fileLen >= 0 THEN { IF translated THEN { fileLen _ (fileLen+999)/1000*1000; fileDate _ BasicTime.Update[fileDate, 1]; }; b.fileLookupReply.version _ CurrentVersion[name]; b.fileLookupReply.createTime _ Endian.FFromCard[BasicTime.ToPupTime[fileDate]]; b.fileLookupReply.length _ Endian.FFromCard[fileLen]; b.type _ PupType.fileLookupReply; PupSocket.SetUserSize[b, SIZE[PupBuffer.FileLookupReply]]; }; PupSocket.ReturnToSender[b]; }; ENDCASE => PupSocket.FreeBuffer[b]; ENDLOOP; singleProcess _ NIL; }; Init: PROC ~ { UserProfile.CallWhenProfileChanges[NoteProfile]; }; Init[]; END. ’STPServerAuxImpl.mesa Copyright (C) 1984, 1985 Xerox Corporation. All rights reserved. Michael Plass, December 30, 1985 3:02:24 pm PST Jim Gasbarro, March 8, 1985 11:39:14 am PST Russ Atkinson (RRA) June 21, 1985 1:05:20 pm PDT Spreitzer, September 4, 1985 4:56:26 pm PDT Hal Murray December 9, 1985 5:14:47 pm PST Hal Murray, June 18, 1986 7:08:45 pm PDT Name Mapping Single Packet Protocol Initialization Κ]˜code™K™AK™/K™+K™0K™+K™*K™(K™—šΟk ˜ Jšœ œœ˜2Jšœ œ˜1Jšœœ ˜Jšœœ3˜;Jšœ œ˜*Jšœ œx˜‡Jšœœ0˜=Jšœœ˜Jšœœ%œ ˜=Jšœœ(˜FJšœœ;˜QJšœ œ=˜N—K˜šΠlnœœ˜Kšœ"œJ˜uKšœ˜šœœœ˜K˜——™ K˜Kšœœ˜K˜Kšœœ œ˜Kšœœœ˜š œœœœœ˜K˜—š Οn œœœ œœ˜bKšœ œ ˜Kšœ œ˜&šœ'œœ˜<šœœœ ˜"Kšœ!˜!Kšœ"˜"Kšœœ˜—šœœœ ˜"Kšœ"˜"Kšœ!˜!Kšœœ˜—Kšœœ"œ˜3Kšœ œ˜šœ œ˜KšœH˜HKšœ˜K˜—Kšœ˜—šœœ ˜Kšœ5˜5Kšœ5˜5Kšœœ˜—K˜K˜—šŸœœœœ œœœœ˜^Kšœ œœ˜Kšœœ˜Kšœ<œ˜@Kšœœ˜Kšœœ˜,Kšœg˜gKš œœœœœFœ˜ŠK•StartOfExpansion>[s1: ROPE, pos1: INT _ 0, s2: ROPE, case: BOOL _ TRUE]šœ_˜_Kšœ”˜”Kšœ œ˜K˜K˜—šŸ œœ+Οcœ˜ZKšœœ6œ˜DKšœœ˜š œœœœ œ˜GKšœœ˜Kšœœ˜Kšœ œ*˜8Kšœ˜—Kšœœœœ˜Kšœ˜K˜K˜——™K™Kšœœ˜Kšœ&œ˜*K˜šŸ œœœœ˜"šœœœ˜šœ ˜ Kšœ˜Kšœ˜Kšœ$˜$—Kšœ9œ&œ˜iK˜—K˜K˜—šŸ œœœœ˜!šœœœ˜Kšœ˜Kšœ œ˜ K˜—K˜K˜—šΟbœœ˜;Kšœœœ˜%š˜Icode2šœ,˜,Lšœœœœ˜šœ˜šœ˜Lšœœ,˜6Lšœ œ˜Lšœ œ˜"Lšœ œœ˜Lšœ$˜$šœ7œ˜Mšœœ ˜Lšœ!˜!Lšœœ˜Lšœ˜Lš ˜ L˜—Lšœ˜—šœœœ˜7šœ œ˜Lšœ"˜"Lšœ,˜,—Lšœ1˜1LšœO˜OLšœ5˜5Lšœ!˜!Lšœœ˜:L˜—Lšœ˜—Lšœ˜#—Kšœ˜—Kšœœ˜Kšœ˜—K™—™K˜šŸœœ˜Kšœ0˜0Kšœ˜K˜—šœ˜K˜—Kšœ˜—K˜—…—ΞΝ