Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
R
riscv-gcc-1
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
riscv-gcc-1
Commits
92c708d2
Commit
92c708d2
authored
May 21, 2008
by
Thomas Quinot
Committed by
Arnaud Charlet
May 21, 2008
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
New file.
From-SVN: r135709
parent
765f7c95
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
409 additions
and
0 deletions
+409
-0
gcc/ada/ChangeLog
+4
-0
gcc/ada/g-sothco.adb
+79
-0
gcc/ada/g-sothco.ads
+326
-0
No files found.
gcc/ada/ChangeLog
View file @
92c708d2
2008
-
05
-
21
Thomas
Quinot
<
quinot
@
adacore
.
com
>
*
g
-
sothco
.
ads
,
g
-
sothco
.
adb
:
New
files
.
2008
-
05
-
20
Thomas
Quinot
<
quinot
@
adacore
.
com
>
2008
-
05
-
20
Thomas
Quinot
<
quinot
@
adacore
.
com
>
*
Makefile
.
rtl
(
GNAT
.
Sockets
.
Thin_Common
):
New
unit
.
*
Makefile
.
rtl
(
GNAT
.
Sockets
.
Thin_Common
):
New
unit
.
gcc/ada/g-sothco.adb
0 → 100644
View file @
92c708d2
------------------------------------------------------------------------------
--
--
--
GNAT
COMPILER
COMPONENTS
--
--
--
--
G
N
A
T
.
S
O
C
K
E
T
S
.
T
H
I
N
_
C
O
M
M
O
N
--
--
--
--
B
o
d
y
--
--
--
--
Copyright
(
C
)
2008
,
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
-
--
--
ware
Foundation
;
either
version
2
,
or
(
at
your
option
)
any
later
ver
-
--
--
sion
.
GNAT
is
distributed
in
the
hope
that
it
will
be
useful
,
but
WITH
-
--
--
OUT
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
GNAT
;
see
file
COPYING
.
If
not
,
write
--
--
to
the
Free
Software
Foundation
,
51
Franklin
Street
,
Fifth
Floor
,
--
--
Boston
,
MA
02110
-
1301
,
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
.
--
--
--
--
GNAT
was
originally
developed
by
the
GNAT
team
at
New
York
University
.
--
--
Extensive
contributions
were
provided
by
Ada
Core
Technologies
Inc
.
--
--
--
------------------------------------------------------------------------------
package
body
GNAT
.
Sockets
.
Thin_Common
is
-----------------
--
Set_Address
--
-----------------
procedure
Set_Address
(
Sin
:
Sockaddr_In_Access
;
Address
:
In_Addr
)
is
begin
Sin
.
Sin_Addr
:=
Address
;
end
Set_Address
;
----------------
--
Set_Family
--
----------------
procedure
Set_Family
(
Length_And_Family
:
out
Sockaddr_Length_And_Family
;
Family
:
Family_Type
)
is
C_Family
:
C
.
int
renames
Families
(
Family
);
Has_Sockaddr_Len
:
constant
Boolean
:=
Constants
.
Has_Sockaddr_Len
/=
0
;
begin
if
Has_Sockaddr_Len
then
Length_And_Family
.
Length
:=
Lengths
(
Family
);
Length_And_Family
.
Char_Family
:=
C
.
unsigned_char
(
C_Family
);
else
Length_And_Family
.
Short_Family
:=
C
.
unsigned_short
(
C_Family
);
end
if
;
end
Set_Family
;
--------------
--
Set_Port
--
--------------
procedure
Set_Port
(
Sin
:
Sockaddr_In_Access
;
Port
:
C
.
unsigned_short
)
is
begin
Sin
.
Sin_Port
:=
Port
;
end
Set_Port
;
end
GNAT
.
Sockets
.
Thin_Common
;
gcc/ada/g-sothco.ads
0 → 100644
View file @
92c708d2
------------------------------------------------------------------------------
--
--
--
GNAT
COMPILER
COMPONENTS
--
--
--
--
G
N
A
T
.
S
O
C
K
E
T
S
.
T
H
I
N
_
C
O
M
M
O
N
--
--
--
--
S
p
e
c
--
--
--
--
Copyright
(
C
)
2008
,
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
-
--
--
ware
Foundation
;
either
version
2
,
or
(
at
your
option
)
any
later
ver
-
--
--
sion
.
GNAT
is
distributed
in
the
hope
that
it
will
be
useful
,
but
WITH
-
--
--
OUT
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
GNAT
;
see
file
COPYING
.
If
not
,
write
--
--
to
the
Free
Software
Foundation
,
51
Franklin
Street
,
Fifth
Floor
,
--
--
Boston
,
MA
02110
-
1301
,
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
.
--
--
--
--
GNAT
was
originally
developed
by
the
GNAT
team
at
New
York
University
.
--
--
Extensive
contributions
were
provided
by
Ada
Core
Technologies
Inc
.
--
--
--
------------------------------------------------------------------------------
--
This
is
the
target
-
independent
part
of
the
thin
sockets
mapping
.
--
This
package
should
not
be
directly
with
'ed by an applications program.
with Ada.Unchecked_Conversion;
with Interfaces.C;
with Interfaces.C.Pointers;
with Interfaces.C.Strings;
with GNAT.Sockets.Constants;
package GNAT.Sockets.Thin_Common is
package C renames Interfaces.C;
use type C.int;
-- This is so we can declare the Failure constant below
Success : constant C.int := 0;
Failure : constant C.int := -1;
type time_t is
range -2 ** (8 * Constants.SIZEOF_tv_sec - 1)
.. 2 ** (8 * Constants.SIZEOF_tv_sec - 1) - 1;
for time_t'
Size
use
8
*
Constants
.
SIZEOF_tv_sec
;
pragma
Convention
(
C
,
time_t
);
type
suseconds_t
is
range
-
2
**
(
8
*
Constants
.
SIZEOF_tv_usec
-
1
)
..
2
**
(
8
*
Constants
.
SIZEOF_tv_usec
-
1
)
-
1
;
for
suseconds_t
'Size use 8 * Constants.SIZEOF_tv_usec;
pragma Convention (C, suseconds_t);
type Timeval is record
Tv_Sec : time_t;
Tv_Usec : suseconds_t;
end record;
pragma Convention (C, Timeval);
type Timeval_Access is access all Timeval;
pragma Convention (C, Timeval_Access);
Immediat : constant Timeval := (0, 0);
-------------------------------------------
-- Mapping tables to low level constants --
-------------------------------------------
Families : constant array (Family_Type) of C.int :=
(Family_Inet => Constants.AF_INET,
Family_Inet6 => Constants.AF_INET6);
Lengths : constant array (Family_Type) of C.unsigned_char :=
(Family_Inet => Constants.SIZEOF_sockaddr_in,
Family_Inet6 => Constants.SIZEOF_sockaddr_in6);
----------------------------
-- Generic socket address --
----------------------------
-- Common header
-- All socket address types (struct sockaddr, struct sockaddr_storage,
-- and protocol specific address types) start with the same 2-byte header,
-- which is either a length and a family (one byte each) or just a two-byte
-- family. The following unchecked union describes the two possible layouts
-- and is meant to be constrained with Constants.Have_Sockaddr_Len.
type Sockaddr_Length_And_Family
(Has_Sockaddr_Len : Boolean := False)
is record
case Has_Sockaddr_Len is
when True =>
Length : C.unsigned_char;
Char_Family : C.unsigned_char;
when False =>
Short_Family : C.unsigned_short;
end case;
end record;
pragma Unchecked_Union (Sockaddr_Length_And_Family);
pragma Convention (C, Sockaddr_Length_And_Family);
procedure Set_Family
(Length_And_Family : out Sockaddr_Length_And_Family;
Family : Family_Type);
-- Set the family component to the appropriate value for Family, and also
-- set Length accordingly if applicable on this platform.
type Sockaddr is record
Sa_Family : Sockaddr_Length_And_Family;
-- Address family (and address length on some platforms)
Sa_Data : C.char_array (1 .. 14) := (others => C.nul);
-- Family-specific data
-- Note that some platforms require that all unused (reserved) bytes
-- in addresses be initialized to 0 (e.g. VxWorks).
end record;
pragma Convention (C, Sockaddr);
-- Generic socket address
type Sockaddr_Access is access all Sockaddr;
pragma Convention (C, Sockaddr_Access);
-- Access to socket address
----------------------------
-- AF_INET socket address --
----------------------------
type In_Addr is record
S_B1, S_B2, S_B3, S_B4 : C.unsigned_char;
end record;
for In_Addr'
Alignment
use
C
.
int
'Alignment;
pragma Convention (C, In_Addr);
-- IPv4 address, represented as a network-order C.int. Note that the
-- underlying operating system may assume that values of this type have
-- C.int alignment, so we need to provide a suitable alignment clause here.
function To_In_Addr is new Ada.Unchecked_Conversion (C.int, In_Addr);
function To_Int is new Ada.Unchecked_Conversion (In_Addr, C.int);
type In_Addr_Access is access all In_Addr;
pragma Convention (C, In_Addr_Access);
-- Access to internet address
Inaddr_Any : aliased constant In_Addr := (others => 0);
-- Any internet address (all the interfaces)
type In_Addr_Access_Array is array (C.size_t range <>)
of aliased In_Addr_Access;
pragma Convention (C, In_Addr_Access_Array);
package In_Addr_Access_Pointers is new C.Pointers
(C.size_t, In_Addr_Access, In_Addr_Access_Array, null);
-- Array of internet addresses
type Sockaddr_In is record
Sin_Family : Sockaddr_Length_And_Family;
-- Address family (and address length on some platforms)
Sin_Port : C.unsigned_short;
-- Port in network byte order
Sin_Addr : In_Addr;
-- IPv4 address
Sin_Zero : C.char_array (1 .. 8) := (others => C.nul);
-- Padding
-- Note that some platforms require that all unused (reserved) bytes
-- in addresses be initialized to 0 (e.g. VxWorks).
end record;
pragma Convention (C, Sockaddr_In);
-- Internet socket address
type Sockaddr_In_Access is access all Sockaddr_In;
pragma Convention (C, Sockaddr_In_Access);
-- Access to internet socket address
procedure Set_Port
(Sin : Sockaddr_In_Access;
Port : C.unsigned_short);
pragma Inline (Set_Port);
-- Set Sin.Sin_Port to Port
procedure Set_Address
(Sin : Sockaddr_In_Access;
Address : In_Addr);
pragma Inline (Set_Address);
-- Set Sin.Sin_Addr to Address
---------------------
-- Service entries --
---------------------
type Chars_Ptr_Array is array (C.size_t range <>) of
aliased C.Strings.chars_ptr;
package Chars_Ptr_Pointers is
new C.Pointers (C.size_t, C.Strings.chars_ptr, Chars_Ptr_Array,
C.Strings.Null_Ptr);
-- Arrays of C (char *)
type Servent is record
S_Name : C.Strings.chars_ptr;
S_Aliases : Chars_Ptr_Pointers.Pointer;
S_Port : C.int;
S_Proto : C.Strings.chars_ptr;
end record;
pragma Convention (C, Servent);
-- Service entry
type Servent_Access is access all Servent;
pragma Convention (C, Servent_Access);
-- Access to service entry
------------------
-- Host entries --
------------------
type Hostent is record
H_Name : C.Strings.chars_ptr;
H_Aliases : Chars_Ptr_Pointers.Pointer;
H_Addrtype : Constants.H_Addrtype_T;
H_Length : Constants.H_Length_T;
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
----------------------------
-- Socket sets management --
----------------------------
type Int_Access is access all C.int;
pragma Convention (C, Int_Access);
-- Access to C integers
procedure Free_Socket_Set (Set : Fd_Set_Access);
-- Free system-dependent socket set
procedure Get_Socket_From_Set
(Set : Fd_Set_Access;
Socket : Int_Access;
Last : Int_Access);
-- Get last socket in Socket and remove it from the socket set. The
-- parameter Last is a maximum value of the largest socket. This hint is
-- used to avoid scanning very large socket sets. After a call to
-- Get_Socket_From_Set, Last is set back to the real largest socket in the
-- socket set.
procedure Insert_Socket_In_Set
(Set : Fd_Set_Access;
Socket : C.int);
-- Insert socket in the socket set
function Is_Socket_In_Set
(Set : Fd_Set_Access;
Socket : C.int) return C.int;
-- Check whether Socket is in the socket set, return a non-zero
-- value if it is, zero if it is not.
procedure Last_Socket_In_Set
(Set : Fd_Set_Access;
Last : Int_Access);
-- Find the largest socket in the socket set. This is needed for select().
-- When Last_Socket_In_Set is called, parameter Last is a maximum value of
-- the largest socket. This hint is used to avoid scanning very large
-- socket sets. After the call, Last is set back to the real largest socket
-- in the socket set.
function New_Socket_Set
(Set : Fd_Set_Access) return Fd_Set_Access;
-- Allocate a new socket set which is a system-dependent structure and
-- initialize by copying Set if it is non-null, by making it empty
-- otherwise.
procedure Remove_Socket_From_Set
(Set : Fd_Set_Access;
Socket : C.int);
-- Remove socket from the socket set
------------------------------------------
-- Pairs of signalling file descriptors --
------------------------------------------
type Two_Ints is array (0 .. 1) of C.int;
pragma Convention (C, Two_Ints);
-- Container for two int values
subtype Fd_Pair is Two_Ints;
-- Two_Ints as used for Create_Signalling_Fds: a pair of connected file
-- descriptors, one of which (the "read end" of the connection) being used
-- for reading, the other one (the "write end") being used for writing.
Read_End : constant := 0;
Write_End : constant := 1;
-- Indices into an Fd_Pair value providing access to each of the connected
-- file descriptors.
private
pragma Import (C, Free_Socket_Set, "__gnat_free_socket_set");
pragma Import (C, Get_Socket_From_Set, "__gnat_get_socket_from_set");
pragma Import (C, Is_Socket_In_Set, "__gnat_is_socket_in_set");
pragma Import (C, Last_Socket_In_Set, "__gnat_last_socket_in_set");
pragma Import (C, New_Socket_Set, "__gnat_new_socket_set");
pragma Import (C, Insert_Socket_In_Set, "__gnat_insert_socket_in_set");
pragma Import (C, Remove_Socket_From_Set, "__gnat_remove_socket_from_set");
end GNAT.Sockets.Thin_Common;
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment