summaryrefslogtreecommitdiff
path: root/gcc/ada
diff options
context:
space:
mode:
authorPascal Obry <obry@adacore.com>2005-07-07 11:41:29 +0200
committerArnaud Charlet <charlet@gcc.gnu.org>2005-07-07 11:41:29 +0200
commit2366e7c600b5d2306acfd13b4324d77cea66859d (patch)
tree42d3d9e228b315764a37741113a5eb88a8f05e7b /gcc/ada
parent41f12ed0a94c98482e4f7fe97d2be03db8faaa77 (diff)
downloadgcc-2366e7c600b5d2306acfd13b4324d77cea66859d.tar.gz
g-socthi-mingw.adb (C_Inet_Addr): New body used to convert the returned type on Windows.
2005-07-07 Pascal Obry <obry@adacore.com> * g-socthi-mingw.adb (C_Inet_Addr): New body used to convert the returned type on Windows. * g-socthi-mingw.ads (C_Inet_Addr): Remove pragma Import for this routine. * g-socket.adb (Inet_Addr): Check for empty Image and raises an exception in this case. Simplify the code as "Image (Image'Range)" = "Image". From-SVN: r101691
Diffstat (limited to 'gcc/ada')
-rw-r--r--gcc/ada/g-socket.adb72
-rw-r--r--gcc/ada/g-socthi-mingw.adb27
-rw-r--r--gcc/ada/g-socthi-mingw.ads3
3 files changed, 61 insertions, 41 deletions
diff --git a/gcc/ada/g-socket.adb b/gcc/ada/g-socket.adb
index 6d309e4b19a..a5626474990 100644
--- a/gcc/ada/g-socket.adb
+++ b/gcc/ada/g-socket.adb
@@ -117,8 +117,8 @@ package body GNAT.Sockets is
function Resolve_Error
(Error_Value : Integer;
From_Errno : Boolean := True) return Error_Type;
- -- Associate an enumeration value (error_type) to en error value
- -- (errno). From_Errno prevents from mixing h_errno with errno.
+ -- Associate an enumeration value (error_type) to en error value (errno).
+ -- From_Errno prevents from mixing h_errno with errno.
function To_Name (N : String) return Name_Type;
function To_String (HN : Name_Type) return String;
@@ -143,11 +143,10 @@ package body GNAT.Sockets is
function Image
(Val : Inet_Addr_VN_Type;
Hex : Boolean := False) return String;
- -- Output an array of inet address components either in
- -- hexadecimal or in decimal mode.
+ -- Output an array of inet address components in hex or decimal mode
function Is_IP_Address (Name : String) return Boolean;
- -- Return true when Name is an IP address in standard dot notation.
+ -- Return true when Name is an IP address in standard dot notation
function To_In_Addr (Addr : Inet_Addr_Type) return Thin.In_Addr;
function To_Inet_Addr (Addr : In_Addr) return Inet_Addr_Type;
@@ -163,12 +162,11 @@ package body GNAT.Sockets is
-- Separate Val in seconds and microseconds
procedure Raise_Socket_Error (Error : Integer);
- -- Raise Socket_Error with an exception message describing
- -- the error code.
+ -- Raise Socket_Error with an exception message describing the error code
procedure Raise_Host_Error (Error : Integer);
- -- Raise Host_Error exception with message describing error code
- -- (note hstrerror seems to be obsolete).
+ -- Raise Host_Error exception with message describing error code (note
+ -- hstrerror seems to be obsolete).
procedure Narrow (Item : in out Socket_Set_Type);
-- Update Last as it may be greater than the real last socket
@@ -434,8 +432,8 @@ package body GNAT.Sockets is
Raise_Socket_Error (Socket_Errno);
end if;
- -- If Select was resumed because of read signalling socket,
- -- read this data and remove socket from set.
+ -- If Select was resumed because of read signalling socket, read this
+ -- data and remove socket from set.
if Is_Set (RSet, Selector.R_Sig_Socket) then
Clear (RSet, Selector.R_Sig_Socket);
@@ -457,8 +455,7 @@ package body GNAT.Sockets is
Status := Expired;
end if;
- -- Update RSet, WSet and ESet in regard to their new socket
- -- sets.
+ -- Update RSet, WSet and ESet in regard to their new socket sets
Narrow (RSet);
Narrow (WSet);
@@ -499,7 +496,6 @@ package body GNAT.Sockets is
Socket : Socket_Type)
is
Last : aliased C.int := C.int (Item.Last);
-
begin
if Item.Last /= No_Socket then
Remove_Socket_From_Set (Item.Set, C.int (Socket));
@@ -519,7 +515,6 @@ package body GNAT.Sockets is
begin
begin
Close_Socket (Selector.R_Sig_Socket);
-
exception
when Socket_Error =>
null;
@@ -527,7 +522,6 @@ package body GNAT.Sockets is
begin
Close_Socket (Selector.W_Sig_Socket);
-
exception
when Socket_Error =>
null;
@@ -616,7 +610,6 @@ package body GNAT.Sockets is
when N_Bytes_To_Read =>
Request.Size := Natural (Arg);
-
end case;
end Control_Socket;
@@ -651,13 +644,14 @@ package body GNAT.Sockets is
begin
-- We open two signalling sockets. One of them is used to send data to
- -- send data to the other, which is included in a C_Select socket set.
- -- The communication is used to force the call to C_Select to complete,
- -- and the waiting task to resume its execution.
+ -- the other, which is included in a C_Select socket set. The
+ -- communication is used to force the call to C_Select to complete, and
+ -- the waiting task to resume its execution.
-- Create a listening socket
S0 := C_Socket (Constants.AF_INET, Constants.SOCK_STREAM, 0);
+
if S0 = Failure then
Raise_Socket_Error (Socket_Errno);
end if;
@@ -671,6 +665,7 @@ package body GNAT.Sockets is
Sin.Sin_Port := 0;
Res := C_Bind (S0, Sin'Address, Len);
+
if Res = Failure then
Err := Socket_Errno;
Res := C_Close (S0);
@@ -819,10 +814,8 @@ package body GNAT.Sockets is
begin
if Stream = null then
raise Socket_Error;
-
elsif Stream.all in Datagram_Socket_Stream_Type then
return Datagram_Socket_Stream_Type (Stream.all).From;
-
else
return Get_Peer_Name (Stream_Socket_Stream_Type (Stream.all).Socket);
end if;
@@ -898,7 +891,6 @@ package body GNAT.Sockets is
declare
HE : constant Host_Entry_Type := To_Host_Entry (Res.all);
-
begin
Task_Lock.Unlock;
return HE;
@@ -1154,7 +1146,6 @@ package body GNAT.Sockets is
procedure Img10 (V : Inet_Addr_Comp_Type) is
Img : constant String := V'Img;
Len : constant Natural := Img'Length - 1;
-
begin
Buffer (Length .. Length + Len - 1) := Img (2 .. Img'Last);
Length := Length + Len;
@@ -1243,8 +1234,14 @@ package body GNAT.Sockets is
-- has the same in_addr_t value as Failure, and thus cannot be
-- properly returned by inet_addr(3).
- if Image (Image'Range) = "255.255.255.255" then
+ if Image = "255.255.255.255" then
return Broadcast_Inet_Addr;
+
+ -- Special case for an empty Image as on some platforms (e.g. Windows)
+ -- calling Inet_Addr("") will not return an error.
+
+ elsif Image = "" then
+ Raise_Socket_Error (Constants.EINVAL);
end if;
Img := New_String (Image);
@@ -1457,8 +1454,8 @@ package body GNAT.Sockets is
Last := Index;
- -- Exit when all or zero data received. Zero means that
- -- the socket peer is closed.
+ -- Exit when all or zero data received. Zero means that the socket
+ -- peer is closed.
exit when Index < First or else Index = Max;
@@ -1484,8 +1481,8 @@ package body GNAT.Sockets is
Receive_Socket (Stream.Socket, Item (First .. Max), Index);
Last := Index;
- -- Exit when all or zero data received. Zero means that
- -- the socket peer is closed.
+ -- Exit when all or zero data received. Zero means that the socket
+ -- peer is closed.
exit when Index < First or else Index = Max;
@@ -1964,7 +1961,6 @@ package body GNAT.Sockets is
function Stream (Socket : Socket_Type) return Stream_Access is
S : Stream_Socket_Stream_Access;
-
begin
S := new Stream_Socket_Stream_Type;
S.Socket := Socket;
@@ -1992,13 +1988,13 @@ package body GNAT.Sockets is
Aliases : constant Chars_Ptr_Array :=
Chars_Ptr_Pointers.Value (E.H_Aliases);
- -- H_Aliases points to a list of name aliases. The list is
- -- terminated by a NULL pointer.
+ -- H_Aliases points to a list of name aliases. The list is terminated by
+ -- a NULL pointer.
Addresses : constant In_Addr_Access_Array :=
In_Addr_Access_Pointers.Value (E.H_Addr_List);
- -- H_Addr_List points to a list of binary addresses (in network
- -- byte order). The list is terminated by a NULL pointer.
+ -- H_Addr_List points to a list of binary addresses (in network byte
+ -- order). The list is terminated by a NULL pointer.
--
-- H_Length is not used because it is currently only set to 4.
-- H_Addrtype is always AF_INET
@@ -2201,8 +2197,8 @@ package body GNAT.Sockets is
Index,
Stream.To);
- -- Exit when all or zero data sent. Zero means that the
- -- socket has been closed by peer.
+ -- Exit when all or zero data sent. Zero means that the socket has
+ -- been closed by peer.
exit when Index < First or else Index = Max;
@@ -2230,8 +2226,8 @@ package body GNAT.Sockets is
loop
Send_Socket (Stream.Socket, Item (First .. Max), Index);
- -- Exit when all or zero data sent. Zero means that the
- -- socket has been closed by peer.
+ -- Exit when all or zero data sent. Zero means that the socket has
+ -- been closed by peer.
exit when Index < First or else Index = Max;
diff --git a/gcc/ada/g-socthi-mingw.adb b/gcc/ada/g-socthi-mingw.adb
index c90f2077595..9c12bdfbf31 100644
--- a/gcc/ada/g-socthi-mingw.adb
+++ b/gcc/ada/g-socthi-mingw.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 2001-2004 Ada Core Technologies, Inc. --
+-- Copyright (C) 2001-2005 AdaCore --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@@ -409,6 +409,31 @@ package body GNAT.Sockets.Thin is
return Res;
end C_Select;
+ -----------------
+ -- C_Inet_Addr --
+ -----------------
+
+ function C_Inet_Addr
+ (Cp : C.Strings.chars_ptr) return C.int
+ is
+ use type C.unsigned_long;
+
+ function Internal_Inet_Addr
+ (Cp : C.Strings.chars_ptr) return C.unsigned_long;
+ pragma Import (Stdcall, Internal_Inet_Addr, "inet_addr");
+
+ Res : C.unsigned_long;
+ begin
+ Res := Internal_Inet_Addr (Cp);
+
+ if Res = C.unsigned_long'Last then
+ -- This value is returned in case of error
+ return -1;
+ else
+ return C.int (Internal_Inet_Addr (Cp));
+ end if;
+ end C_Inet_Addr;
+
--------------
-- C_Writev --
--------------
diff --git a/gcc/ada/g-socthi-mingw.ads b/gcc/ada/g-socthi-mingw.ads
index 34f387bdf5c..71fe4fe638d 100644
--- a/gcc/ada/g-socthi-mingw.ads
+++ b/gcc/ada/g-socthi-mingw.ads
@@ -6,7 +6,7 @@
-- --
-- S p e c --
-- --
--- Copyright (C) 2001-2004 Ada Core Technologies, Inc. --
+-- Copyright (C) 2001-2005 AdaCore --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@@ -395,7 +395,6 @@ private
pragma Import (Stdcall, C_Getservbyport, "getservbyport");
pragma Import (Stdcall, C_Getsockname, "getsockname");
pragma Import (Stdcall, C_Getsockopt, "getsockopt");
- pragma Import (Stdcall, C_Inet_Addr, "inet_addr");
pragma Import (Stdcall, C_Ioctl, "ioctlsocket");
pragma Import (Stdcall, C_Listen, "listen");
pragma Import (Stdcall, C_Recv, "recv");