1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213
|
------------------------------------------------------------------------------
-- --
-- GNATSOCKS --
-- --
-- S o c k e t s --
-- --
-- S p e c --
-- --
-- --
-- Copyright (c) 1997-1998 Florida State University (FSU), --
-- All Rights Reserved. --
-- --
-- This file is a component of GNATSOCKS, an Ada interfaces to socket I/O --
-- services, for use with the GNAT Ada compiler. --
-- --
-- GNATSOCKS is free software; you can redistribute it and/or modify it --
-- under terms of the GNU General Public License as published by the --
-- Free Software Foundation; either version 2, or (at your option) any --
-- later version. FLORIST is distributed in the hope that it will be --
-- useful, but WITHOUT ANY WARRANTY; without even the implied warranty --
-- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --
-- General Public License for more details. You should have received a --
-- copy of the GNU General Public License distributed with GNARL; see --
-- file COPYING. If not, write to the Free Software Foundation, 59 --
-- Temple Place - Suite 330, Boston, MA 02111-1307, USA. --
-- --
-- --
-- --
-- --
-- --
-- --
-- --
-- --
------------------------------------------------------------------------------
-- [$Revision: 254317 $]
------------------------------------------------------------------------
-- This package is intended to provide convenient access to socket I/O.
-- It still needs design, documentation, and implementation work.
-- For example, there is no specification what happens if an error occurs
-- for each of the operations.
with Ada.Finalization,
Ada.Streams,
Ada.Tags,
POSIX,
POSIX.C;
package Sockets is
--------------------------------------
type Socket_Address is abstract tagged private;
--------------------------------------
type Socket is abstract tagged limited private;
procedure Close (Sock : in out Socket'Class);
-- closes the socket
function Get_Address
(cock : in Socket'Class) return Socket_Address is abstract;
-- gets address of socket
--------------------------------------
type Input_Stream is new Ada.Streams.Root_Stream_Type with private;
type Input_Stream_Ptr is access all Input_Stream;
type Output_Stream is new Ada.Streams.Root_Stream_Type with private;
type Output_Stream_Ptr is access all Output_Stream;
--------------------------------------
type Stream_Socket is new Socket with private;
procedure Open
(Sock : in out Stream_Socket;
Addr : Socket_Address'Class);
-- creates a stream socket and connects it to the specified address
function Get_Input_Stream (Sock : Stream_Socket) return Input_Stream_Ptr;
function Get_Output_Stream (Sock : Stream_Socket) return Output_Stream_Ptr;
--------------------------------------
type Server_Socket is new Socket with private;
procedure Open
(Sock : in out Server_Socket;
Addr : Socket_Address'Class;
Count : Natural := 0);
-- creates a server socket on the specified port
-- with the specified backlog count
procedure Accept_Connection
(Server : Server_Socket;
Stream : in out Stream_Socket'Class;
Peer : in out Socket_Address'Class);
-- accept connection addressed to Server socket, and
-- open Stream socket to handle the connection.
--------------------------------------
-- This part is "in progress".
type Datagram_Socket is new Socket with private;
-- connectionless
procedure Open
(Sock : in out Datagram_Socket;
Addr : in Socket_Address'Class);
-- creates a datagram socket on the specified port
-- with the specified local address
procedure Send
(Sock : in Datagram_Socket;
Addr : in Socket_Address'Class;
Data : in String);
-- sends Data to the specified address Addr
procedure Receive
(Sock : in Datagram_Socket;
Addr : out Socket_Address'Class;
Buff : in out String;
Last : out Natural);
-- receives data into Buff
-- Last is the index of the last position in Buff that is used.
-- Addr receives the sender's address.
private
function Address
(Addr : Socket_Address)
return POSIX.C.Sockets.sockaddr_ptr is abstract;
function Length (Addr : Socket_Address) return POSIX.C.int is abstract;
function Valid (Addr : Socket_Address) return Boolean is abstract;
function Protocol_Family
(Addr : Socket_Address) return POSIX.C.int is abstract;
type Socket_Address is abstract tagged null record;
-----------------------------------
type Socket is new Ada.Finalization.Limited_Controlled with record
fd : POSIX.C.int := 0;
-- file descriptor of an open socket, of nonzero
tag : Ada.Tags.Tag;
-- tag of the socket address type used to open the socket, of fd /= 0
-- This is used to check that other operations use only addresses
-- that are in the same family.
end record;
procedure Finalize (Sock : in out Socket);
-----------------------------------
type Stream_Socket_Ptr is access all Stream_Socket;
type Input_Stream is new Ada.Streams.Root_Stream_Type with record
sock : Stream_Socket_Ptr;
end record;
type Output_Stream is new Ada.Streams.Root_Stream_Type with record
sock : Stream_Socket_Ptr;
end record;
type Stream_Socket is new Socket with record
in_stream : aliased Input_Stream;
out_stream : aliased Output_Stream;
in_ptr : Input_Stream_Ptr;
-- points to in_stream
out_ptr : Output_Stream_Ptr;
-- points to out_stream
-- These pointers are needed to implement
-- functions Get_InputStream and Get_OutputStream.
end record;
procedure Read
(Stream : in out Input_Stream;
Item : out Ada.Streams.Stream_Element_Array;
Last : out Ada.Streams.Stream_Element_Offset);
procedure Write
(Stream : in out Input_Stream;
Item : in Ada.Streams.Stream_Element_Array);
procedure Read
(Stream : in out Output_Stream;
Item : out Ada.Streams.Stream_Element_Array;
Last : out Ada.Streams.Stream_Element_Offset);
procedure Write
(Stream : in out Output_Stream;
Item : in Ada.Streams.Stream_Element_Array);
-----------------------------------
type Server_Socket is new Socket with null record;
-----------------------------------
type Datagram_Socket is new Socket with null record;
end Sockets;
|