DIRECTORY PupDefs USING[GetLocalPupAddress, PupBuffer, PupSocket, PupSocketDestroy, PupSocketMake, veryLongWait], PupTypes USING[ PupHostID, PupSocketID ], RPCBcstListen, RPCPkt USING [ EnqueueAgain, Header ], RPCPrivate USING[ rpcSocket ] ; RPCBcstListenImpl: CEDAR PROGRAM IMPORTS PupDefs, RPCPkt EXPORTS RPCBcstListen = { bcstRpcSocket: PupTypes.PupSocketID = [0, 45B]; BcstListener: PROC = TRUSTED { myDeviceHost: PupTypes.PupHostID _ PupDefs.GetLocalPupAddress[bcstRpcSocket, [[0],[0],[0,0]]].host; soc: PupDefs.PupSocket = PupDefs.PupSocketMake[local: bcstRpcSocket, remote: [[0],[0],[0,0]], ticks: PupDefs.veryLongWait]; DO ENABLE ABORTED => EXIT; b: PupDefs.PupBuffer = soc.get[]; header: LONG POINTER TO RPCPkt.Header = LOOPHOLE[@b.pupLength]; header.destHost.host _ myDeviceHost; header.destSoc _ RPCPrivate.rpcSocket; RPCPkt.EnqueueAgain[b]; ENDLOOP; PupDefs.PupSocketDestroy[soc]; }; bcstListenerProcess: PROCESS; BcstListenInitialize: PUBLIC PROC = { bcstListenerProcess _ FORK BcstListener[]; }; BcstListenInitialize[]; }. RPCBcstListenImpl.mesa; Clean up and enqueue incoming broadcast RPC packets (!!) Based on an original idea by A. Birrell; adapted for Thrush By D. Swinehart September 15, 1985 12:55:08 pm PDT A machine running BcstListener has agreed to accept RPC Call packets that are broadcast to this network. The assumption is that not very many machines will need to provide broadcast services. Convert the Pup to appear to be addressed to us, and dispatch it to the RPC system. Unless there's a problem, just start self. Êa˜JšœP™PJšœ(™(JšœF™FJ˜šÏk ˜ JšœœZ˜oJšœœ˜0J˜Jšœ œ˜*Jšœœ ˜"J˜—J˜šœœ˜ Jšœ˜Jšœ˜J˜—J˜/J˜šÏn œœœ˜JšœW™WJšœT™TJšœX™XJšœ™˜"J˜@—˜]J˜—šœœœœ˜J˜!Jš œœœœœ˜?J˜$J˜&Jšœ˜Jšœ˜—J˜J˜J˜—Jšœœ˜J˜Jšžœœœœ˜SJ˜Jšœ*™*J˜J˜Jšœ˜J˜—…—0™