447 lines
13 KiB
Plaintext
447 lines
13 KiB
Plaintext
-----------------------------------------------------------------------------
|
|
-- --
|
|
-- ADASOCKETS COMPONENTS --
|
|
-- --
|
|
-- S O C K E T S . T H I N --
|
|
-- --
|
|
-- S p e c --
|
|
-- --
|
|
-- Copyright (C) 1998-2023 Samuel Tardieu <sam@rfc1149.net> --
|
|
-- Copyright (C) 1999-2003 Télécom ParisTech --
|
|
-- --
|
|
-- AdaSockets 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. AdaSockets 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 AdaSockets; see file COPYING. If not, write to the Free --
|
|
-- Software Foundation, 59 Temple Place - Suite 330, Boston, MA --
|
|
-- 02111-1307, USA. --
|
|
-- --
|
|
-- As a special exception, if other files instantiate generics from --
|
|
-- this unit, or you link this unit with other files to produce an --
|
|
-- executable, this unit does not by itself cause the resulting --
|
|
-- executable to be covered by the GNU General Public License. This --
|
|
-- exception does not however invalidate any other reasons why the --
|
|
-- executable file might be covered by the GNU Public License. --
|
|
-- --
|
|
-- The main repository for this software is located at: --
|
|
-- http://www.rfc1149.net/devel/adasockets.html --
|
|
-- --
|
|
-- If you have any question, please use the issues tracker at: --
|
|
-- https://github.com/samueltardieu/adasockets/issues --
|
|
-- --
|
|
-----------------------------------------------------------------------------
|
|
|
|
with GNAT.OS_Lib;
|
|
with Interfaces.C.Pointers;
|
|
with Interfaces.C.Strings;
|
|
with Sockets.Types; use Sockets.Types;
|
|
with System.Storage_Elements;
|
|
|
|
package Sockets.Thin is
|
|
|
|
package C renames Interfaces.C;
|
|
package Strings renames C.Strings;
|
|
generic package Pointers renames C.Pointers;
|
|
|
|
use type C.int;
|
|
-- This is an ugly hack to be able to declare the Failure constant
|
|
-- below.
|
|
|
|
Success : constant C.int := 0;
|
|
Failure : constant C.int := -1;
|
|
|
|
type Int_Access is access all C.int;
|
|
pragma Convention (C, Int_Access);
|
|
-- Access to C integers
|
|
|
|
type pid_t is new C.int;
|
|
pragma Convention (C, pid_t);
|
|
|
|
type mode_t is new C.int;
|
|
pragma Convention (C, mode_t);
|
|
|
|
type key_t is new C.int;
|
|
pragma Convention (C, key_t);
|
|
|
|
type Chars_Ptr_Array is array (C.size_t range <>) of
|
|
aliased Strings.chars_ptr;
|
|
|
|
package Chars_Ptr_Pointers is
|
|
new Pointers (C.size_t, Strings.chars_ptr, Chars_Ptr_Array,
|
|
Strings.Null_Ptr);
|
|
-- Arrays of C (char *)
|
|
|
|
type In_Addr_Access_Array is array (Positive range <>)
|
|
of aliased In_Addr_Access;
|
|
pragma Convention (C, In_Addr_Access_Array);
|
|
package In_Addr_Access_Pointers is
|
|
new Pointers (Positive, In_Addr_Access, In_Addr_Access_Array,
|
|
null);
|
|
-- Array of internet addresses
|
|
|
|
type Sockaddr_Access is access all Sockaddr;
|
|
pragma Convention (C, Sockaddr_Access);
|
|
-- Access to socket address
|
|
|
|
type Sockaddr_In_Access is access all Sockaddr_In;
|
|
pragma Convention (C, Sockaddr_In_Access);
|
|
-- Access to internet socket address
|
|
|
|
type Ip_Mreq is record
|
|
Imr_Multiaddr : In_Addr;
|
|
Imr_Interface : In_Addr := Inaddr_Any;
|
|
end record;
|
|
pragma Convention (C, Ip_Mreq);
|
|
-- Multicast structure
|
|
|
|
type Hostent is record
|
|
H_Name : Strings.chars_ptr;
|
|
H_Aliases : Chars_Ptr_Pointers.Pointer;
|
|
H_Addrtype : C.int;
|
|
H_Length : C.int;
|
|
H_Addr_List : In_Addr_Access_Pointers.Pointer;
|
|
end record;
|
|
pragma Convention (C, Hostent);
|
|
-- Host entry
|
|
|
|
type Hostent_Access is access all Hostent;
|
|
pragma Convention (C, Hostent_Access);
|
|
-- Access to host entry
|
|
|
|
type Iovec is record
|
|
Iov_Base : System.Address;
|
|
Iov_Len : System.Storage_Elements.Storage_Offset;
|
|
end record;
|
|
pragma Convention (C, Iovec);
|
|
-- Iovec C type
|
|
|
|
type Msghdr is record
|
|
Msg_Name : System.Address;
|
|
Msg_Namelen : C.int;
|
|
Msg_Iov : System.Address;
|
|
Msg_Iovlen : C.int;
|
|
Msg_Accrights : System.Address;
|
|
Msg_Accrightslen : C.int;
|
|
end record;
|
|
pragma Convention (C, Msghdr);
|
|
-- Message header
|
|
|
|
type Msghdr_Access is access all Msghdr;
|
|
pragma Convention (C, Msghdr_Access);
|
|
-- Access to message header.
|
|
|
|
type Two_Int is array (0 .. 1) of C.int;
|
|
pragma Convention (C, Two_Int);
|
|
-- Used with socketpair()
|
|
|
|
type Pollfd is record
|
|
Fd : C.int;
|
|
Events : C.short;
|
|
Revents : C.short;
|
|
end record;
|
|
pragma Convention (C, Pollfd);
|
|
|
|
type Pollfd_Array is array (Positive range <>) of Pollfd;
|
|
pragma Convention (C, Pollfd_Array);
|
|
|
|
function C_Accept
|
|
(S : C.int;
|
|
Addr : System.Address;
|
|
Addrlen : access C.int)
|
|
return C.int;
|
|
|
|
function C_Bind
|
|
(S : C.int;
|
|
Name : System.Address;
|
|
Namelen : C.int)
|
|
return C.int;
|
|
|
|
function C_Close (Fildes : C.int) return C.int;
|
|
|
|
function C_Connect
|
|
(S : C.int;
|
|
Name : System.Address;
|
|
Namelen : C.int)
|
|
return C.int;
|
|
|
|
function C_Dup2 (Fildes, Fildes2 : C.int) return C.int;
|
|
|
|
function C_Fcntl
|
|
(Fildes : C.int;
|
|
Cmd : C.int;
|
|
Arg : C.int := 0)
|
|
return C.int;
|
|
|
|
function C_Getenv
|
|
(Name : Strings.chars_ptr)
|
|
return Strings.chars_ptr;
|
|
|
|
function C_Gethostbyaddr
|
|
(Addr : Strings.chars_ptr;
|
|
Length : C.int;
|
|
Typ : C.int)
|
|
return Hostent_Access;
|
|
|
|
function C_Gethostbyname
|
|
(Name : Strings.chars_ptr)
|
|
return Hostent_Access;
|
|
|
|
function C_Gethostname
|
|
(Name : Strings.chars_ptr;
|
|
Namelen : C.int)
|
|
return C.int;
|
|
|
|
function C_Gethostname
|
|
(Name : System.Address;
|
|
Namelen : C.int)
|
|
return C.int;
|
|
|
|
function C_Getpeername
|
|
(S : C.int;
|
|
Name : System.Address;
|
|
Namelen : access C.int)
|
|
return C.int;
|
|
|
|
function C_Getpid return pid_t;
|
|
|
|
function C_Getsockname
|
|
(S : C.int;
|
|
Name : Sockaddr_Access;
|
|
Namelen : access C.int)
|
|
return C.int;
|
|
|
|
function C_Getsockname
|
|
(S : C.int;
|
|
Name : System.Address;
|
|
Namelen : access C.int)
|
|
return C.int;
|
|
|
|
function C_Getsockopt
|
|
(S : C.int;
|
|
Level : C.int;
|
|
Optname : C.int;
|
|
Optval : Strings.chars_ptr;
|
|
Optlen : access C.int)
|
|
return C.int;
|
|
|
|
function C_Getsockopt
|
|
(S : C.int;
|
|
Level : C.int;
|
|
Optname : C.int;
|
|
Optval : System.Address;
|
|
Optlen : access C.int)
|
|
return C.int;
|
|
|
|
function C_Inet_Addr
|
|
(Cp : Strings.chars_ptr)
|
|
return Types.In_Addr;
|
|
|
|
function C_Inet_Network
|
|
(Cp : Strings.chars_ptr)
|
|
return Interfaces.Unsigned_32;
|
|
|
|
function C_Inet_Makeaddr
|
|
(Net : C.int;
|
|
Lna : C.int)
|
|
return In_Addr;
|
|
|
|
function C_Inet_Lnaof (I : In_Addr) return C.int;
|
|
|
|
function C_Inet_Netof (I : In_Addr) return C.int;
|
|
|
|
function C_Inet_Ntoa (I : In_Addr) return Strings.chars_ptr;
|
|
|
|
function C_Inet_Aton
|
|
(Cp : Strings.chars_ptr;
|
|
I : In_Addr_Access)
|
|
return C.int;
|
|
|
|
function C_Kill (Pid : pid_t; Sig : C.int) return C.int;
|
|
|
|
function C_Listen (S, Backlog : C.int) return C.int;
|
|
|
|
function C_Msgget
|
|
(Key : key_t;
|
|
Msgflg : C.int)
|
|
return C.int;
|
|
|
|
function C_Msgrcv
|
|
(Msqid : C.int;
|
|
Msgp : Strings.chars_ptr;
|
|
Msgsz : C.int;
|
|
Msgtyp : C.long;
|
|
Msgflg : C.int)
|
|
return C.int;
|
|
|
|
function C_Msgsnd
|
|
(Msqid : C.int;
|
|
Msgp : Strings.chars_ptr;
|
|
Msgsz : C.int;
|
|
Msgflg : C.int)
|
|
return C.int;
|
|
|
|
function C_Open
|
|
(Path : Strings.chars_ptr;
|
|
Oflag : C.int;
|
|
Mode : mode_t := 0)
|
|
return C.int;
|
|
|
|
function C_Socketpair (Domain : C.int;
|
|
Typ : C.int;
|
|
Protocol : C.int;
|
|
Filedes : System.Address)
|
|
return C.int;
|
|
|
|
function C_Poll
|
|
(Fds : System.Address;
|
|
Nfds : C.unsigned_long;
|
|
Timeout : C.int)
|
|
return C.int;
|
|
|
|
function C_Read
|
|
(Fildes : C.int;
|
|
Buf : System.Address;
|
|
Nbyte : C.int)
|
|
return C.int;
|
|
|
|
function C_Readv
|
|
(Fildes : C.int;
|
|
Iov : System.Address;
|
|
Iovcnt : C.int)
|
|
return C.int;
|
|
|
|
function C_Recv (S : C.int; Buf : System.Address; Len, Flags : C.int)
|
|
return C.int;
|
|
|
|
function C_Recvfrom
|
|
(S : C.int;
|
|
Buf : System.Address;
|
|
Len : C.int;
|
|
Flags : C.int;
|
|
From : System.Address;
|
|
Fromlen : access C.int)
|
|
return C.int;
|
|
|
|
function C_Recvmsg
|
|
(S : C.int;
|
|
Msg : Msghdr_Access;
|
|
Flags : C.int)
|
|
return C.int;
|
|
|
|
function C_Send
|
|
(S : C.int;
|
|
Msg : System.Address;
|
|
Len : C.int;
|
|
Flags : C.int)
|
|
return C.int;
|
|
|
|
function C_Sendmsg
|
|
(S : C.int;
|
|
Msg : Msghdr_Access;
|
|
Flags : C.int)
|
|
return C.int;
|
|
|
|
function C_Sendto
|
|
(S : C.int;
|
|
Msg : System.Address;
|
|
Len : C.int;
|
|
Flags : C.int;
|
|
To : System.Address;
|
|
Tolen : C.int)
|
|
return C.int;
|
|
|
|
function C_Setsid return pid_t;
|
|
|
|
function C_Setsockopt
|
|
(S : C.int;
|
|
Level : C.int;
|
|
Optname : C.int;
|
|
Optval : System.Address;
|
|
Optlen : C.int)
|
|
return C.int;
|
|
|
|
procedure C_Shutdown
|
|
(S : C.int;
|
|
How : C.int);
|
|
|
|
function C_Socket (Domain, Typ, Protocol : C.int) return C.int;
|
|
|
|
function C_Strerror (Errnum : C.int) return Strings.chars_ptr;
|
|
|
|
function C_Write
|
|
(Fildes : C.int;
|
|
Buf : System.Address;
|
|
Nbyte : C.int)
|
|
return C.int;
|
|
|
|
function C_Writev
|
|
(Fildes : C.int;
|
|
Iov : System.Address;
|
|
Iovcnt : C.int)
|
|
return C.int;
|
|
|
|
function C_Ioctl
|
|
(S : C.int;
|
|
Req : C.int;
|
|
Arg : access C.int)
|
|
return C.int;
|
|
|
|
function Errno return Integer;
|
|
|
|
private
|
|
|
|
pragma Import (C, C_Accept, "accept");
|
|
pragma Import (C, C_Bind, "bind");
|
|
pragma Import (C, C_Close, "close");
|
|
pragma Import (C, C_Connect, "connect");
|
|
pragma Import (C, C_Dup2, "dup2");
|
|
pragma Import (C, C_Fcntl, "fcntl");
|
|
pragma Import (C, C_Getenv, "getenv");
|
|
pragma Import (C, C_Gethostbyaddr, "gethostbyaddr");
|
|
pragma Import (C, C_Gethostbyname, "gethostbyname");
|
|
pragma Import (C, C_Gethostname, "gethostname");
|
|
pragma Import (C, C_Getpeername, "getpeername");
|
|
pragma Import (C, C_Getpid, "getpid");
|
|
pragma Import (C, C_Getsockname, "getsockname");
|
|
pragma Import (C, C_Getsockopt, "getsockopt");
|
|
pragma Import (C, C_Inet_Addr, "inet_addr");
|
|
pragma Import (C, C_Inet_Network, "inet_network");
|
|
pragma Import (C, C_Inet_Makeaddr, "inet_makeaddr");
|
|
pragma Import (C, C_Inet_Lnaof, "inet_lnaof");
|
|
pragma Import (C, C_Inet_Netof, "inet_netof");
|
|
pragma Import (C, C_Inet_Ntoa, "inet_ntoa");
|
|
pragma Import (C, C_Inet_Aton, "inet_aton");
|
|
pragma Import (C, C_Kill, "kill");
|
|
pragma Import (C, C_Listen, "listen");
|
|
pragma Import (C, C_Msgget, "msgget");
|
|
pragma Import (C, C_Msgrcv, "msgrcv");
|
|
pragma Import (C, C_Msgsnd, "msgsnd");
|
|
pragma Import (C, C_Open, "open");
|
|
pragma Import (C, C_Socketpair, "socketpair");
|
|
pragma Import (C, C_Poll, "poll");
|
|
pragma Import (C, C_Read, "read");
|
|
pragma Import (C, C_Readv, "readv");
|
|
pragma Import (C, C_Recv, "recv");
|
|
pragma Import (C, C_Recvfrom, "recvfrom");
|
|
pragma Import (C, C_Recvmsg, "recvmsg");
|
|
pragma Import (C, C_Send, "send");
|
|
pragma Import (C, C_Sendmsg, "sendmsg");
|
|
pragma Import (C, C_Sendto, "sendto");
|
|
pragma Import (C, C_Setsid, "setsid");
|
|
pragma Import (C, C_Setsockopt, "setsockopt");
|
|
pragma Import (C, C_Shutdown, "shutdown");
|
|
pragma Import (C, C_Socket, "socket");
|
|
pragma Import (C, C_Strerror, "strerror");
|
|
pragma Import (C, C_Write, "write");
|
|
pragma Import (C, C_Writev, "writev");
|
|
pragma Import (C, C_Ioctl, "ioctl");
|
|
|
|
function Errno return Integer renames GNAT.OS_Lib.Errno;
|
|
|
|
end Sockets.Thin;
|