File : posix-io.ads
------------------------------------------------------------------------------
-- --
-- FLORIST (FSU Implementation of POSIX.5) COMPONENTS --
-- --
-- P O S I X . I O --
-- --
-- S p e c --
-- --
-- --
-- Copyright (c) 1996-1998 Florida State University (FSU) --
-- All Rights Reserved. --
-- --
-- This file is a component of FLORIST, an implementation of an Ada API --
-- for the POSIX OS services, for use with the GNAT Ada compiler and --
-- the FSU Gnu Ada Runtime Library (GNARL). The interface is intended --
-- to be close to that specified in IEEE STD 1003.5: 1990 and IEEE STD --
-- 1003.5b: 1996. --
-- --
-- FLORIST 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. --
-- --
-- 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. --
-- --
------------------------------------------------------------------------------
-- [$Revision: 1.1.1.1 $]
with Ada.Streams,
POSIX,
POSIX.C,
POSIX.Implementation,
POSIX.Permissions,
POSIX.Process_Identification,
System;
pragma Elaborate_All (POSIX);
package POSIX.IO is
type File_Descriptor is
range 0 .. POSIX.Open_Files_Maxima'Last - 1;
for File_Descriptor'Size use POSIX.C.int'Size;
Standard_Input : constant File_Descriptor := 0;
Standard_Output : constant File_Descriptor := 1;
Standard_Error : constant File_Descriptor := 2;
type IO_Offset is new POSIX.C.off_t;
-- File Modes and Options
type File_Mode is (Read_Only, Write_Only, Read_Write);
type Open_Option_Set is new POSIX.Option_Set;
-- Empty_Set, "+" and unary and binary "-" are derived operations
Non_Blocking : constant Open_Option_Set;
Append : constant Open_Option_Set;
Truncate : constant Open_Option_Set;
Exclusive : constant Open_Option_Set;
Not_Controlling_Terminal : constant Open_Option_Set;
File_Synchronized : constant Open_Option_Set;
Data_Synchronized : constant Open_Option_Set;
Read_Synchronized : constant Open_Option_Set;
-- Operations to open or close file descriptors
function Open
(Name : POSIX.Pathname;
Mode : File_Mode;
Options : Open_Option_Set := -- Empty_Set;
Open_Option_Set (POSIX.Empty_Set);
-- Conversion is only to work around a GNAT3.09 problem.
Masked_Signals : POSIX.Signal_Masking := POSIX.RTS_Signals)
return File_Descriptor;
function Open_Or_Create
(Name : POSIX.Pathname;
Mode : File_Mode;
Permissions : POSIX.Permissions.Permission_Set;
Options : Open_Option_Set := -- Empty_Set;
Open_Option_Set (POSIX.Empty_Set);
-- Conversion is only to work around a GNAT3.09 problem.
Masked_Signals : POSIX.Signal_Masking := POSIX.RTS_Signals)
return File_Descriptor;
function Is_Open (File : File_Descriptor) return Boolean;
procedure Close
(File : in File_Descriptor;
Masked_Signals : in POSIX.Signal_Masking
:= POSIX.RTS_Signals);
function Duplicate
(File : File_Descriptor;
Target : File_Descriptor := 0)
return File_Descriptor;
function Duplicate_and_Close
(File : File_Descriptor;
Target : File_Descriptor := 0;
Masked_Signals : POSIX.Signal_Masking := POSIX.RTS_Signals)
return File_Descriptor;
procedure Create_Pipe
(Read_End : out File_Descriptor;
Write_End : out File_Descriptor);
-- File Input/Output operations
subtype IO_Buffer is POSIX.POSIX_String;
procedure Read
(File : in File_Descriptor;
Buffer : out IO_Buffer;
Last : out POSIX.IO_Count;
Masked_Signals : in POSIX.Signal_Masking
:= POSIX.RTS_Signals);
procedure NONSTANDARD_Read
(File : in File_Descriptor;
Buffer : out IO_Buffer;
Last : out Natural;
Masked_Signals : in POSIX.Signal_Masking
:= POSIX.RTS_Signals);
procedure Read
(File : in File_Descriptor;
Buffer : out Ada.Streams.Stream_Element_Array;
Last : out Ada.Streams.Stream_Element_Offset;
Masked_Signals : in POSIX.Signal_Masking
:= POSIX.RTS_Signals);
procedure Write
(File : in File_Descriptor;
Buffer : in IO_Buffer;
Last : out POSIX.IO_Count;
Masked_Signals : in POSIX.Signal_Masking
:= POSIX.RTS_Signals);
procedure NONSTANDARD_Write
(File : in File_Descriptor;
Buffer : in IO_Buffer;
Last : out Natural;
Masked_Signals : in POSIX.Signal_Masking
:= POSIX.RTS_Signals);
procedure Write
(File : in File_Descriptor;
Buffer : in Ada.Streams.Stream_Element_Array;
Last : out Ada.Streams.Stream_Element_Offset;
Masked_Signals : in POSIX.Signal_Masking
:= POSIX.RTS_Signals);
generic
type T is private;
procedure Generic_Read
(File : in File_Descriptor;
Item : out T;
Masked_Signals : in POSIX.Signal_Masking
:= POSIX.RTS_Signals);
generic
type T is private;
procedure Generic_Write
(File : in File_Descriptor;
Item : in T;
Masked_Signals : in POSIX.Signal_Masking
:= POSIX.RTS_Signals);
-- File position operations
type Position is
(From_Beginning, From_Current_Position, From_End_Of_File);
procedure Seek
(File : in File_Descriptor;
Offset : in IO_Offset;
Result : out IO_Offset;
Starting_Point : in Position := From_Beginning);
function File_Size (File : File_Descriptor)
return POSIX.IO_Count;
function File_Position (File : File_Descriptor)
return IO_Offset;
-- Terminal operations
function Is_A_Terminal (File : File_Descriptor)
return Boolean;
function Get_Terminal_Name (File : File_Descriptor)
return POSIX.Pathname;
-- File Control operations
procedure Get_File_Control
(File : in File_Descriptor;
Mode : out File_Mode;
Options : out Open_Option_Set);
procedure Set_File_Control
(File : in File_Descriptor;
Options : in Open_Option_Set);
function Get_Close_On_Exec (File : File_Descriptor)
return Boolean;
procedure Set_Close_On_Exec
(File : in File_Descriptor;
To : in Boolean := True);
procedure Change_Permissions
(File : in POSIX.IO.File_Descriptor;
Permission : in POSIX.Permissions.Permission_Set);
procedure Truncate_File
(File : in POSIX.IO.File_Descriptor;
Length : in POSIX.IO_Count);
procedure Synchronize_File (File : in POSIX.IO.File_Descriptor);
procedure Synchronize_Data (File : in POSIX.IO.File_Descriptor);
-- POSIX.5c/D4 additions
-- 6.1.1 Sockets Option Flags from P1003.5c
Signal_When_Socket_Ready : constant Open_Option_Set;
-- 6.1.12 Sockets File Ownership procedures from P1003.5c
procedure Get_Owner
(File : in File_Descriptor;
Process : out POSIX.Process_Identification.Process_ID;
Group : out POSIX.Process_Identification.Process_Group_ID);
procedure Set_Socket_Process_Owner
(File : in File_Descriptor;
Process : in POSIX.Process_Identification.Process_ID);
procedure Set_Socket_Group_Owner
(File : in File_Descriptor;
Group : in POSIX.Process_Identification.Process_Group_ID);
type IO_Vector is limited private;
procedure Set_Buffer
(Vector : in out IO_Vector;
Buffer : in System.Address;
Length : in Positive);
procedure Get_Buffer
(Vector : in IO_Vector;
Buffer : out System.Address;
Length : out POSIX.IO_Count);
private
Non_Blocking : constant Open_Option_Set
:= Open_Option_Set (Option_Set'(Option => POSIX.C.O_NONBLOCK));
Append : constant Open_Option_Set
:= Open_Option_Set (Option_Set' (Option => POSIX.C.O_APPEND));
-- .... Change POSIX.5?
-- This Append hides operation on String_Lists, and vice versa,
-- if we "use" both this package and POSIX.
Truncate : constant Open_Option_Set
:= Open_Option_Set (Option_Set' (Option => POSIX.C.O_TRUNC));
Exclusive : constant Open_Option_Set
:= Open_Option_Set (Option_Set' (Option => POSIX.C.O_EXCL));
Not_Controlling_Terminal : constant Open_Option_Set
:= Open_Option_Set (Option_Set' (Option => POSIX.C.O_NOCTTY));
File_Synchronized : constant Open_Option_Set
:= Open_Option_Set (Option_Set' (Option => POSIX.C.O_SYNC));
Data_Synchronized : constant Open_Option_Set
:= Open_Option_Set (Option_Set' (Option => POSIX.C.O_DSYNC));
Read_Synchronized : constant Open_Option_Set
:= Open_Option_Set (Option_Set' (Option => POSIX.C.O_RSYNC));
-- P1003.5c/D4 additions
Signal_When_Socket_Ready : constant Open_Option_Set :=
Open_Option_Set (POSIX.Empty_Set);
type IO_Vector is record
C : aliased POSIX.C.Sockets.struct_iovec :=
POSIX.C.Sockets.struct_iovec ' (iov_base => null,
iov_len => 0);
end record;
end POSIX.IO;