-- Socket.Mesa (last edited by: BLyon on: January 27, 1981  5:10 PM)

DIRECTORY
  BufferDefs USING [OisBuffer],
  Environment USING [Byte],
  OISCPTypes USING [WaitTime],
  System USING [NetworkAddress];

Socket: DEFINITIONS =
  BEGIN

  -- definitions

  -- various types used by socket channels.
  ChannelHandle: TYPE [2];

  Byte: TYPE = Environment.Byte;

  TransferStatus: TYPE = {
    pending, goodCompletion, aborted, noRouteToNetwork, hardwareProblem,
    invalidDestAddr,
    -- the following apply to circuit-like media only and mostly to the first packet sent
    noAnswerOrBusy, -- auto-dial case only
    noTranslationForDestination, -- no phone number for this destination
    circuitInUse, -- being used to talk to another destination
    circuitNotReady, -- dial the phone or connect modems (non-auto-dial case)
    noDialingHardware, dialerHardwareProblem};
  SocketStatus: TYPE = RECORD [
    localAddr: System.NetworkAddress, state: State, incompleteGets: CARDINAL];
  State: TYPE = {active, aborted};

  WaitTime: TYPE = OISCPTypes.WaitTime; -- msecs

  -- constants used by the client.
  uniqueNetworkAddr: READONLY System.NetworkAddress;
  defaultWaitTime: WaitTime = 60000; -- msecs
  maxInternetOISPktLength: CARDINAL = 576; -- in bytes and includes header

  -- interface

  -- exported by SocketImpl.
  -- procedures
  AssignNetworkAddress: PROCEDURE RETURNS [System.NetworkAddress];
  Create: PROCEDURE [
    local: System.NetworkAddress, send: CARDINAL ← 1,
    -- maximum no. of send buffers used at one time
    receive: CARDINAL ← 2, -- maximum no. of receive buffers used at one time
    reserve: CARDINAL ← 0, -- more buffers can be allocated but not used
    privateBuffers: BOOLEAN ← TRUE]
    -- True => the buffers will be ALLOCATED for this channel;  False => buffers will be shared will the system's buffers (and no new buffers will be allocated; examples of these are the EchoServer and NetworkStream Listeners).  Be careful - False values can deadlock the system;  users should only use one buffer at a time and return it asap without trying to grab other resources (or other buffers).
     RETURNS [ChannelHandle];
  Delete: PROCEDURE [cH: ChannelHandle];
  Abort: PROCEDURE [cH: ChannelHandle];
  Reset: PROCEDURE [cH: ChannelHandle];
  GetStatus: PROCEDURE [cH: ChannelHandle] RETURNS [SocketStatus];
  SetWaitTime: PROCEDURE [cH: ChannelHandle, time: WaitTime];
  -- sending and receiving packets - they are in real buffers  
  PutPacket: PROCEDURE [cH: ChannelHandle, b: BufferDefs.OisBuffer];
  -- asynchronous, return is immediate;  when the buffer is finally sent the dispatcher calls b.requeueProcedure[b] to relinquish system ownership of the buffer.  If the error ChannelAborted ocurs then the caller still own the buffer, b.  This procedure does not attemp to broadcast a packets to ALL nets; use PutPacketToAllConnectedNets for that.
  PutPacketToAllConnectedNets: PROCEDURE [cH: ChannelHandle, b: BufferDefs.OisBuffer];  -- this procedure broadcast a packet to all hosts on all locally connected nets. The user only need supply the destination socket number of the packet.
  GetPacket: PROCEDURE [cH: ChannelHandle] RETURNS [b: BufferDefs.OisBuffer];
  -- this waits - for a packet to arrive or a TimeOut or an ChannelAborted.
  -- errors
  TimeOut: ERROR; -- error when timeout ocurrs on blocked call like TransferWait
  ChannelAborted: ERROR; -- error when state is aborted
  ChannelError: ERROR;
  -- error when bad software structuring, or bad parameter to calls

  END.

LOG

(trimmed to Teak)
Time: January 22, 1980  8:57 PM  By: Dalal  Action: modified SocketStatus.
Time: January 26, 1980  10:12 AM  By: Dalal  Action: made ChannelHandle LONG.
Time: March 11, 1980  3:21 PM  By: BLyon  Action: Put, Get use PhysicalRecordHandles instead of CrateHandles. Added  Reset.
Time: June 18, 1980  2:23 PM  By: BLyon  Action: use System instead of SpecialSystem;
uniqueNetworkAddr from CONSTANT to READONLY, ChannelHandle & GetHandle are opaque types.
Time: August 6, 1980  10:17 AM  By: Garlick  Action: Added several TransferStatus's for circuit-oriented network errors.
Time: October 10, 1980  4:50 PM  By: Garlick  Action: Added TransferStatus noAnswerOrBusy 
Time: January 6, 1981  2:21 PM  By: BLyon  Action: Post Mokelumne rework.