File : posix-sockets.ads
pragma Source_Reference (1, "posix-sockets.gps");
------------------------------------------------------------------------------
-- --
-- POSIX Ada95 Bindings for Protocol Independent Interfaces (P1003.5c) --
-- --
-- P O S I X . S o c k e t s --
-- --
-- S p e c --
-- --
-- --
-- This file is part of an implementation of an Ada95 API for the sockets --
-- and network support services found in P1003.1g -- Protocol Independent --
-- Interfaces. It is integrated with the FSU Implementation of POSIX.5b --
-- (FLORIST), an Ada API for POSIX OS services for use with the GNAT Ada --
-- compiler and the FSU Gnu Ada Runtime Library (GNARL). --
-- --
-- This package specification contains some text extracted from IEEE STD --
-- 1003.5: 1990, Information Technology -- POSIX Ada Language Interfaces --
-- Part 1: Binding for System Application Program Interface, as amended --
-- by IEEE STD 1003.5b: 1996, Amendment 1: Realtime Extensions, and as --
-- further amended by IEEE Draft STD 1003.5c: 1997, Amendment 2: Protocol --
-- Independent Interfaces, copyright 1997 by the Institute of Electrical --
-- and Electronics Engineers, Inc. --
-- --
-- The package specifications in the IEEE standards cited above represent --
-- only a portion of the documents and are not to be interpreted --
-- outside the context of the documents. The standards must be used in --
-- conjunction with the package specifications in order to claim --
-- conformance. The IEEE takes no responsibility for and will assume no --
-- liability for damages resulting from the reader's misinterpretation of --
-- said information resulting from its out-of-context nature. To order --
-- copies of the IEEE standards, please contact the IEEE Service Center --
-- at 445 Hoes Lane, PO Box 1331, Piscataway, NJ 08855-1331; via phone at --
-- 1-800-678-IEEE, 908-981-1393; or via fax at 908-981-9667. --
-- --
-- These package specifications are distributed in the hope that they --
-- will be useful, but WITHOUT ANY WARRANTY; without even the implied --
-- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. --
-- --
------------------------------------------------------------------------------
with POSIX,
POSIX.C,
POSIX.IO,
POSIX.Limits,
System;
package POSIX.Sockets is
use POSIX.C,
POSIX.C.Sockets;
type Socket_Type is range 0 .. SOCK_SEQPACKET;
Stream_Socket : constant Socket_Type := SOCK_STREAM;
Datagram_Socket : constant Socket_Type := SOCK_DGRAM;
Raw_Socket : constant Socket_Type := SOCK_RAW;
Sequenced_Packet_Socket : constant Socket_Type := SOCK_SEQPACKET;
Unspecified_Socket_Type : constant Socket_Type := 0;
type Protocol_Family is range PF_UNSPEC .. PF_MAX;
Unspecified_Protocol : constant Protocol_Family := PF_UNSPEC;
type Protocol_Number is range 0 .. 65535;
Default_Protocol : constant Protocol_Number := 0;
type Socket_Address_Pointer is private;
type Socket_Message is private;
subtype IO_Vector_Range is Positive range
1 .. POSIX.Limits.Socket_IO_Vector_Maxima'Last;
type IO_Vector_Array is array
(IO_Vector_Range range <>) of POSIX.IO.IO_Vector;
procedure Set_Socket_Name
(Message : in out Socket_Message;
Name : in Socket_Address_Pointer);
type IO_Vector_Array_Pointer is access all IO_Vector_Array;
procedure Set_IO_Vector_Array
(Message : in out Socket_Message;
Pointer : in IO_Vector_Array_Pointer);
function Get_IO_Vector_Array (Message : Socket_Message)
return IO_Vector_Array_Pointer;
type Message_Option_Set is new POSIX.Option_Set;
Peek_Only : constant Message_Option_Set;
Process_OOB_Data : constant Message_Option_Set;
Wait_For_All_Data : constant Message_Option_Set;
Do_Not_Route : constant Message_Option_Set;
type Message_Status_Set is new POSIX.Option_Set;
Received_OOB_Data : constant Message_Status_Set;
End_Of_Message : constant Message_Status_Set;
Message_Truncated : constant Message_Status_Set;
Ancillary_Data_Lost : constant Message_Status_Set;
procedure Set_Message_Options
(Message : in out Socket_Message;
Options : in Message_Option_Set);
function Get_Message_Status (Message : Socket_Message)
return Message_Status_Set;
procedure Set_Ancillary_Data
(Message : in out Socket_Message;
Data : in System.Address;
Length : in Positive);
procedure Get_Ancillary_Data
(Message : in Socket_Message;
Data : out System.Address;
Length : out POSIX.IO_Count);
procedure Accept_Connection
(Socket : in POSIX.IO.File_Descriptor;
Connection_Socket : out POSIX.IO.File_Descriptor;
Name : out Socket_Address_Pointer);
function Accept_Connection (Socket : POSIX.IO.File_Descriptor)
return POSIX.IO.File_Descriptor;
procedure Bind
(Socket : in POSIX.IO.File_Descriptor;
Name : in Socket_Address_Pointer);
procedure Connect
(Socket : in POSIX.IO.File_Descriptor;
Peer : in Socket_Address_Pointer);
procedure Specify_Peer
(Socket : in POSIX.IO.File_Descriptor;
Peer : in Socket_Address_Pointer);
procedure Unspecify_Peer
(Socket : in POSIX.IO.File_Descriptor);
function Create
(Domain : Protocol_Family;
Of_Type : Socket_Type;
Protocol : Protocol_Number := Default_Protocol)
return POSIX.IO.File_Descriptor;
procedure Create_Pair
(Peer1 : out POSIX.IO.File_Descriptor;
Peer2 : out POSIX.IO.File_Descriptor;
Domain : in Protocol_Family;
Of_Type : in Socket_Type;
Protocol : in Protocol_Number := Default_Protocol);
type Socket_Address_Info is private;
type Socket_Address_Info_List is limited private;
procedure Make_Empty
(Info_Item : in out Socket_Address_Info_List);
type Address_Flags is new POSIX.Option_Set;
Use_For_Binding : constant Address_Flags;
Canonical_Name : constant Address_Flags;
procedure Set_Flags
(Info_Item : in out Socket_Address_Info;
Flags : in Address_Flags);
function Get_Flags (Info_Item : Socket_Address_Info)
return Address_Flags;
procedure Set_Family
(Info_Item : in out Socket_Address_Info;
Family : in Protocol_Family);
function Get_Family (Info_Item : Socket_Address_Info)
return Protocol_Family;
procedure Set_Socket_Type
(Info_Item : in out Socket_Address_Info;
To : in Socket_Type);
function Get_Socket_Type (Info_Item : Socket_Address_Info)
return Socket_Type;
procedure Set_Protocol_Number
(Info_Item : in out Socket_Address_Info;
Protocol : in Protocol_Number);
function Get_Protocol_Number (Info_Item : Socket_Address_Info)
return Protocol_Number;
function Get_Canonical_Name (Info_Item : Socket_Address_Info)
return POSIX.POSIX_String;
procedure Get_Socket_Address_Info
(Name : in POSIX.POSIX_String;
Service : in POSIX.POSIX_String;
Info : in out Socket_Address_Info_List);
procedure Get_Socket_Address_Info
(Name : in POSIX.POSIX_String;
Service : in POSIX.POSIX_String;
Request : in Socket_Address_Info;
Info : in out Socket_Address_Info_List);
generic
with procedure Action
(Info : in Socket_Address_Info;
Quit : in out Boolean);
procedure For_Every_Item (List : in Socket_Address_Info_List);
function Get_Socket_Error_Status (Socket : POSIX.IO.File_Descriptor)
return POSIX.Error_Code;
function Get_Socket_Type (Socket : POSIX.IO.File_Descriptor)
return Socket_Type;
type Socket_Option_Value is (Enabled, Disabled);
function Get_Socket_Broadcast (Socket : POSIX.IO.File_Descriptor)
return Socket_Option_Value;
procedure Set_Socket_Broadcast
(Socket : in POSIX.IO.File_Descriptor;
To : in Socket_Option_Value);
function Get_Socket_Debugging (Socket : POSIX.IO.File_Descriptor)
return Socket_Option_Value;
procedure Set_Socket_Debugging
(Socket : in POSIX.IO.File_Descriptor;
To : in Socket_Option_Value);
function Get_Socket_Routing (Socket : POSIX.IO.File_Descriptor)
return Socket_Option_Value;
procedure Set_Socket_Routing
(Socket : in POSIX.IO.File_Descriptor;
To : in Socket_Option_Value);
function Get_Socket_Keep_Alive (Socket : POSIX.IO.File_Descriptor)
return Socket_Option_Value;
procedure Set_Socket_Keep_Alive
(Socket : in POSIX.IO.File_Descriptor;
To : in Socket_Option_Value);
subtype Linger_Time is Seconds range 0 .. Seconds'Last;
function Get_Socket_Linger_Time (Socket : POSIX.IO.File_Descriptor)
return Linger_Time;
procedure Set_Socket_Linger_Time
(Socket : in POSIX.IO.File_Descriptor;
To : in Linger_Time);
function Get_Socket_OOB_Data_Inline (Socket : POSIX.IO.File_Descriptor)
return Socket_Option_Value;
procedure Set_Socket_OOB_Data_Inline
(Socket : in POSIX.IO.File_Descriptor;
To : in Socket_Option_Value);
function Get_Socket_Receive_Buffer_Size (Socket : POSIX.IO.File_Descriptor)
return POSIX.IO_Count;
procedure Set_Socket_Receive_Buffer_Size
(Socket : in POSIX.IO.File_Descriptor;
To : in POSIX.IO_Count);
function Get_Socket_Receive_Low_Water_Mark
(Socket : POSIX.IO.File_Descriptor) return POSIX.IO_Count;
procedure Set_Socket_Receive_Low_Water_Mark
(Socket : in POSIX.IO.File_Descriptor;
To : in POSIX.IO_Count);
function Get_Socket_Receive_Timeout (Socket : POSIX.IO.File_Descriptor)
return Duration;
procedure Set_Socket_Receive_Timeout
(Socket : in POSIX.IO.File_Descriptor;
To : in Duration);
function Get_Socket_Reuse_Addresses (Socket : POSIX.IO.File_Descriptor)
return Socket_Option_Value;
procedure Set_Socket_Reuse_Addresses
(Socket : in POSIX.IO.File_Descriptor;
To : in Socket_Option_Value);
function Get_Socket_Send_Buffer_Size (Socket : POSIX.IO.File_Descriptor)
return POSIX.IO_Count;
procedure Set_Socket_Send_Buffer_Size
(Socket : in POSIX.IO.File_Descriptor;
To : in POSIX.IO_Count);
function Get_Socket_Send_Low_Water_Mark (Socket : POSIX.IO.File_Descriptor)
return POSIX.IO_Count;
procedure Set_Socket_Send_Low_Water_Mark
(Socket : in POSIX.IO.File_Descriptor;
To : in POSIX.IO_Count);
function Get_Socket_Send_Timeout (Socket : POSIX.IO.File_Descriptor)
return Duration;
procedure Set_Socket_Send_Timeout
(Socket : in POSIX.IO.File_Descriptor;
To : in Duration);
function Is_A_Socket (File : POSIX.IO.File_Descriptor)
return Boolean;
Connection_Queue_Length_Maximum : constant := SOMAXCONN;
subtype Connection_Queue_Length is natural
range 0 .. Connection_Queue_Length_Maximum;
procedure Listen
(Socket : in POSIX.IO.File_Descriptor;
Backlog : in Connection_Queue_Length := Connection_Queue_Length'Last);
procedure Receive
(Socket : in POSIX.IO.File_Descriptor;
Buffer : in System.Address;
Octets_Requested : in POSIX.IO_Count;
Octets_Received : out POSIX.IO_Count;
Masked_Signals : in POSIX.Signal_Masking;
Options : in Message_Option_Set
:= Message_Option_Set (POSIX.Empty_Set));
procedure Receive
(Socket : in POSIX.IO.File_Descriptor;
Buffer : in System.Address;
Octets_Requested : in POSIX.IO_Count;
Octets_Received : out POSIX.IO_Count;
Options : in Message_Option_Set
:= Message_Option_Set (POSIX.Empty_Set));
procedure Receive
(Socket : in POSIX.IO.File_Descriptor;
Buffer : in System.Address;
Octets_Requested : in POSIX.IO_Count;
Octets_Received : out POSIX.IO_Count;
From : out Socket_Address_Pointer;
Masked_Signals : in POSIX.Signal_Masking;
Options : in Message_Option_Set
:= Message_Option_Set (POSIX.Empty_Set));
procedure Receive
(Socket : in POSIX.IO.File_Descriptor;
Buffer : in System.Address;
Octets_Requested : in POSIX.IO_Count;
Octets_Received : out POSIX.IO_Count;
From : out Socket_Address_Pointer;
Options : in Message_Option_Set
:= Message_Option_Set (POSIX.Empty_Set));
procedure Receive_Message
(Socket : in POSIX.IO.File_Descriptor;
Message : in out Socket_Message;
Octets_Received : out POSIX.IO_Count;
Masked_Signals : in POSIX.Signal_Masking;
Options : in Message_Option_Set
:= Message_Option_Set (POSIX.Empty_Set));
procedure Receive_Message
(Socket : in POSIX.IO.File_Descriptor;
Message : in out Socket_Message;
Octets_Received : out POSIX.IO_Count;
Options : in Message_Option_Set
:= Message_Option_Set (POSIX.Empty_Set));
procedure Send
(Socket : in POSIX.IO.File_Descriptor;
Buffer : in System.Address;
Octets_To_Send : in POSIX.IO_Count;
Octets_Sent : out POSIX.IO_Count;
Masked_Signals : in POSIX.Signal_Masking;
Options : in Message_Option_Set
:= Message_Option_Set (POSIX.Empty_Set));
procedure Send
(Socket : in POSIX.IO.File_Descriptor;
Buffer : in System.Address;
Octets_To_Send : in POSIX.IO_Count;
Octets_Sent : out POSIX.IO_Count;
Options : in Message_Option_Set
:= Message_Option_Set (POSIX.Empty_Set));
procedure Send
(Socket : in POSIX.IO.File_Descriptor;
Buffer : in System.Address;
Octets_To_Send : in POSIX.IO_Count;
Octets_Sent : out POSIX.IO_Count;
To : in Socket_Address_Pointer;
Masked_Signals : in POSIX.Signal_Masking;
Options : in Message_Option_Set
:= Message_Option_Set (POSIX.Empty_Set));
procedure Send
(Socket : in POSIX.IO.File_Descriptor;
Buffer : in System.Address;
Octets_To_Send : in POSIX.IO_Count;
Octets_Sent : out POSIX.IO_Count;
To : in Socket_Address_Pointer;
Options : in Message_Option_Set
:= Message_Option_Set (POSIX.Empty_Set));
procedure Send_Message
(Socket : in POSIX.IO.File_Descriptor;
Message : in Socket_Message;
Octets_Sent : out POSIX.IO_Count;
Masked_Signals : in POSIX.Signal_Masking;
Options : in Message_Option_Set
:= Message_Option_Set (POSIX.Empty_Set));
procedure Send_Message
(Socket : in POSIX.IO.File_Descriptor;
Message : in Socket_Message;
Octets_Sent : out POSIX.IO_Count;
Options : in Message_Option_Set
:= Message_Option_Set (POSIX.Empty_Set));
type Shutdown_Mode is
(Further_Receives_Disallowed,
Further_Sends_Disallowed,
Further_Sends_And_Receives_Disallowed);
procedure Shutdown
(Socket : in POSIX.IO.File_Descriptor;
Mode : in Shutdown_Mode);
function Socket_Is_At_OOB_Mark (Socket : POSIX.IO.File_Descriptor)
return Boolean;
private
type Socket_Address (Length : POSIX.C.size_t) is record
C : aliased POSIX.C.Sockets.struct_sockaddr;
end record;
type Socket_Address_Pointer is access all Socket_Address;
type Socket_Address_Info is record
C : aliased POSIX.C.Sockets.struct_addrinfo;
end record;
type Socket_Message is record
C : aliased POSIX.C.Sockets.struct_msghdr :=
struct_msghdr ' (msg_name => null,
msg_namelen => 0,
msg_iov => null,
msg_iovlen => 0,
msg_control => null,
msg_controllen => 0,
msg_flags => 0);
io_vector_array_ptr : IO_Vector_Array_Pointer := null;
end record;
type Socket_Address_Info_List is record
C : aliased POSIX.C.Sockets.struct_addrinfo;
end record;
Peek_Only : constant Message_Option_Set :=
Message_Option_Set (POSIX.Option_Set'(Option => MSG_PEEK));
Process_OOB_Data : constant Message_Option_Set :=
Message_Option_Set (POSIX.Option_Set'(Option => MSG_OOB));
Wait_For_All_Data : constant Message_Option_Set :=
Message_Option_Set (POSIX.Option_Set'(Option => MSG_WAITALL));
Do_Not_Route : constant Message_Option_Set :=
Message_Option_Set (POSIX.Option_Set'(Option => MSG_DONTROUTE));
Received_OOB_Data : constant Message_Status_Set :=
Message_Status_Set (POSIX.Option_Set'(Option => MSG_OOB));
End_Of_Message : constant Message_Status_Set :=
Message_Status_Set (POSIX.Option_Set'(Option => MSG_EOR));
Message_Truncated : constant Message_Status_Set :=
Message_Status_Set (POSIX.Option_Set'(Option => MSG_TRUNC));
Ancillary_Data_Lost : constant Message_Status_Set :=
Message_Status_Set (POSIX.Option_Set'(Option => MSG_CTRUNC));
Use_For_Binding : constant Address_Flags :=
Address_Flags (POSIX.Option_Set'(Option => AI_PASSIVE));
Canonical_Name : constant Address_Flags :=
Address_Flags (POSIX.Option_Set'(Option => AI_CANONNAME));
end POSIX.Sockets;