<> <> <> 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[]; }.