<> <> <> DIRECTORY PupDefs USING[GetLocalPupAddress, PupBuffer, PupSocket, PupSocketDestroy, PupSocketMake, ReturnFreePupBuffer, veryLongWait], PupTypes USING[ PupHostID, PupSocketID ], RPCBcstListen, RPCPkt USING [ Header ], RPCPktIO USING [ EnqueueRecvd ], RPCPrivate USING[ rpcSocket ] ; RPCBcstListenImpl: CEDAR PROGRAM IMPORTS PupDefs, RPCPktIO EXPORTS RPCBcstListen--BcstListenInitialize-- SHARES RPCPktIO = { 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; IF NOT RPCPktIO.EnqueueRecvd[b, TRUE] THEN PupDefs.ReturnFreePupBuffer[b]; ENDLOOP; PupDefs.PupSocketDestroy[soc]; }; bcstListenerProcess: PROCESS; BcstListenInitialize: PUBLIC PROC = { bcstListenerProcess _ FORK BcstListener[]; }; <> BcstListenInitialize[]; }.