File : posix-configurable_file_limits.adb
------------------------------------------------------------------------------
-- --
-- FLORIST (FSU Implementation of POSIX.5) COMPONENTS --
-- --
-- P O S I X . C O N F I G U R A B L E _ F I L E _ L I M I T S --
-- --
-- B o d y --
-- --
-- --
-- Copyright (c) 1996 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 POSIX.C,
POSIX.IO,
POSIX.Implementation,
POSIX.Limits;
package body POSIX.Configurable_File_Limits is
use POSIX.C;
use POSIX.Implementation;
-------------------------
-- Local Subprograms --
-------------------------
function pathconf (path : char_ptr; name : int) return long;
pragma Import (C, pathconf, pathconf_LINKNAME);
function fpathconf (fd : int; name : int) return long;
pragma Import (C, fpathconf, fpathconf_LINKNAME);
function Is_Limited
(Pathname : POSIX.Pathname;
PC_Code : int) return Boolean;
function Is_Limited
(File : POSIX.IO.File_Descriptor;
PC_Code : int) return Boolean;
function Is_Supported
(Pathname : POSIX.Pathname;
PC_Code : int) return Boolean;
function Is_Supported
(File : POSIX.IO.File_Descriptor;
PC_Code : int) return Boolean;
function Limit
(Pathname : POSIX.Pathname;
PC_Code : int;
Default_Maximum : long) return long;
function Limit
(File : POSIX.IO.File_Descriptor;
PC_Code : int;
Default_Maximum : long) return long;
function Is_Limited
(Pathname : POSIX.Pathname;
PC_Code : int) return Boolean is
Pathname_With_NUL : POSIX_String := Pathname & NUL;
begin
Store_Errno (0);
-- -1 without errno unchanged -> no limit
-- -1 with errno -> bad name or other error
-- other values -> there exists a limit
if pathconf (Pathname_With_NUL
(Pathname_With_NUL'First)'Unchecked_Access, PC_Code) = -1 then
if Fetch_Errno /= 0 then Raise_POSIX_Error; end if;
return False;
else return True;
end if;
end Is_Limited;
function Is_Limited
(File : POSIX.IO.File_Descriptor;
PC_Code : int) return Boolean is
begin
Store_Errno (0);
if fpathconf (int (File), PC_Code) = -1 then
if Fetch_Errno /= 0 then Raise_POSIX_Error; end if;
return False;
else return True;
end if;
end Is_Limited;
function Limit
(Pathname : POSIX.Pathname;
PC_Code : int;
Default_Maximum : long) return long is
Pathname_With_NUL : POSIX_String := Pathname & NUL;
Result : long;
begin
Result := pathconf
(Pathname_With_NUL (Pathname_With_NUL'First)'Unchecked_Access, PC_Code);
if Result = -1 then
if Fetch_Errno /= 0 then Raise_POSIX_Error; end if;
return Default_Maximum;
else return Result;
end if;
end Limit;
function Limit
(File : POSIX.IO.File_Descriptor;
PC_Code : int;
Default_Maximum : long) return long is
Result : long;
begin
Result := fpathconf (int (File), PC_Code);
if Result = -1 then
if Fetch_Errno /= 0 then Raise_POSIX_Error; end if;
return Default_Maximum;
else return Result;
end if;
end Limit;
function Is_Supported
(Pathname : POSIX.Pathname;
PC_Code : int) return Boolean is
Pathname_With_NUL : POSIX_String := Pathname & NUL;
begin
return pathconf (Pathname_With_NUL
(Pathname_With_NUL'First)'Unchecked_Access, PC_Code) /= 0;
end Is_Supported;
function Is_Supported
(File : POSIX.IO.File_Descriptor;
PC_Code : int) return Boolean is
begin return fpathconf (int (File), PC_Code) /= 0;
end Is_Supported;
-------------------
-- Link Limits --
-------------------
function Link_Is_Limited (Pathname : POSIX.Pathname)
return Boolean is
begin
return Is_Limited (Pathname, PC_LINK_MAX);
end Link_Is_Limited;
function Link_Is_Limited (File : POSIX.IO.File_Descriptor)
return Boolean is
begin
return Is_Limited (File, PC_LINK_MAX);
end Link_Is_Limited;
function Link_Limit (Pathname : POSIX.Pathname)
return Link_Limit_Maxima is
begin
return Link_Limit_Maxima (Limit
(Pathname, PC_LINK_MAX, long (Link_Limit_Maxima'Last)));
end Link_Limit;
function Link_Limit (File : POSIX.IO.File_Descriptor)
return Link_Limit_Maxima is
begin
return Link_Limit_Maxima (Limit
(File, PC_LINK_MAX, long (Link_Limit_Maxima'Last)));
end Link_Limit;
------------------------
-- Input Line Limits --
------------------------
function Input_Line_Is_Limited (Pathname : POSIX.Pathname)
return Boolean is
begin
return Is_Limited (Pathname, PC_MAX_CANON);
end Input_Line_Is_Limited;
function Input_Line_Is_Limited (File : POSIX.IO.File_Descriptor)
return Boolean is
begin
return Is_Limited (File, PC_MAX_CANON);
end Input_Line_Is_Limited;
function Input_Line_Limit (Pathname : POSIX.Pathname)
return Input_Line_Limit_Maxima is
begin
return Input_Line_Limit_Maxima (Limit
(Pathname, PC_MAX_CANON, long (Input_Line_Limit_Maxima'Last)));
end Input_Line_Limit;
function Input_Line_Limit (File : POSIX.IO.File_Descriptor)
return Input_Line_Limit_Maxima is
begin
return Input_Line_Limit_Maxima (Limit
(File, PC_MAX_CANON, long (Input_Line_Limit_Maxima'Last)));
end Input_Line_Limit;
-------------------------
-- Input Queue Limits --
-------------------------
function Input_Queue_Is_Limited (Pathname : POSIX.Pathname)
return Boolean is
begin
return Is_Limited (Pathname, PC_MAX_INPUT);
end Input_Queue_Is_Limited;
function Input_Queue_Is_Limited (File : POSIX.IO.File_Descriptor)
return Boolean is
begin
return Is_Limited (File, PC_MAX_INPUT);
end Input_Queue_Is_Limited;
function Input_Queue_Limit (Pathname : POSIX.Pathname)
return Input_Queue_Limit_Maxima is
begin
return Input_Queue_Limit_Maxima (Limit
(Pathname, PC_MAX_INPUT, long (Input_Queue_Limit_Maxima'Last)));
end Input_Queue_Limit;
function Input_Queue_Limit (File : POSIX.IO.File_Descriptor)
return Input_Queue_Limit_Maxima is
begin
return Input_Queue_Limit_Maxima (Limit
(File, PC_MAX_INPUT, long (Input_Queue_Limit_Maxima'Last)));
end Input_Queue_Limit;
------------------------------------
-- Filename And Pathname Limits --
------------------------------------
function Filename_Is_Limited (Pathname : POSIX.Pathname)
return Boolean is
begin
return Is_Limited (Pathname, PC_NAME_MAX);
end Filename_Is_Limited;
function Filename_Is_Limited (File : POSIX.IO.File_Descriptor)
return Boolean is
begin
return Is_Limited (File, PC_NAME_MAX);
end Filename_Is_Limited;
function Filename_Limit (Pathname : POSIX.Pathname)
return Filename_Limit_Maxima is
begin
return Filename_Limit_Maxima (Limit
(Pathname, PC_NAME_MAX, long (Filename_Limit_Maxima'Last)));
end Filename_Limit;
function Filename_Limit (File : POSIX.IO.File_Descriptor)
return Filename_Limit_Maxima is
begin
return Filename_Limit_Maxima (Limit
(File, PC_NAME_MAX, long (Filename_Limit_Maxima'Last)));
end Filename_Limit;
function Pathname_Is_Limited (Pathname : POSIX.Pathname)
return Boolean is
begin
return Is_Limited (Pathname, PC_PATH_MAX);
end Pathname_Is_Limited;
function Pathname_Is_Limited (File : POSIX.IO.File_Descriptor)
return Boolean is
begin
return Is_Limited (File, PC_PATH_MAX);
end Pathname_Is_Limited;
function Pathname_Limit (Pathname : POSIX.Pathname)
return Pathname_Limit_Maxima is
begin
return Pathname_Limit_Maxima (Limit
(Pathname, PC_PATH_MAX, long (Pathname_Limit_Maxima'Last)));
end Pathname_Limit;
function Pathname_Limit (File : POSIX.IO.File_Descriptor)
return Pathname_Limit_Maxima is
begin
return Pathname_Limit_Maxima (Limit
(File, PC_PATH_MAX, long (Pathname_Limit_Maxima'Last)));
end Pathname_Limit;
--------------------------
-- Pipe Length Limits --
--------------------------
function Pipe_Length_Is_Limited (Pathname : POSIX.Pathname)
return Boolean is
begin
return Is_Limited (Pathname, PC_PIPE_BUF);
end Pipe_Length_Is_Limited;
function Pipe_Length_Is_Limited (File : POSIX.IO.File_Descriptor)
return Boolean is
begin
return Is_Limited (File, PC_PIPE_BUF);
end Pipe_Length_Is_Limited;
function Pipe_Length_Limit (Pathname : POSIX.Pathname)
return Pipe_Limit_Maxima is
begin
return Pipe_Limit_Maxima (Limit
(Pathname, PC_PIPE_BUF, long (Pipe_Limit_Maxima'Last)));
end Pipe_Length_Limit;
function Pipe_Length_Limit (File : POSIX.IO.File_Descriptor)
return Pipe_Limit_Maxima is
begin
return Pipe_Limit_Maxima (Limit
(File, PC_PIPE_BUF, long (Pipe_Limit_Maxima'Last)));
end Pipe_Length_Limit;
--------------------------------
-- Change Owner Restriction --
--------------------------------
function Change_Owner_Is_Restricted (Pathname : POSIX.Pathname)
return Change_Owner_Restriction is
begin
return Is_Supported (Pathname, PC_CHOWN_RESTRICTED);
end Change_Owner_Is_Restricted;
function Change_Owner_Is_Restricted (File : POSIX.IO.File_Descriptor)
return Change_Owner_Restriction is
begin
return Is_Supported (File, PC_CHOWN_RESTRICTED);
end Change_Owner_Is_Restricted;
---------------------------
-- Filename Truncation --
---------------------------
function Filename_Is_Truncated (Pathname : POSIX.Pathname)
return Filename_Truncation is
begin
return Is_Supported (Pathname, PC_NO_TRUNC);
end Filename_Is_Truncated;
function Filename_Is_Truncated (File : POSIX.IO.File_Descriptor)
return Filename_Truncation is
begin
return Is_Supported (File, PC_NO_TRUNC);
end Filename_Is_Truncated;
-----------------------
-- Synchronized IO --
-----------------------
function Synchronized_IO_Is_Supported (Pathname : POSIX.Pathname)
return Boolean is
begin
return Is_Supported (Pathname, PC_SYNC_IO);
end Synchronized_IO_Is_Supported;
function Synchronized_IO_Is_Supported (File : POSIX.IO.File_Descriptor)
return Boolean is
begin
return Is_Supported (File, PC_SYNC_IO);
end Synchronized_IO_Is_Supported;
-----------------------
-- Asynchronous IO --
-----------------------
function Asynchronous_IO_Is_Supported (Pathname : POSIX.Pathname)
return Boolean is
begin
return Is_Supported (Pathname, PC_ASYNC_IO);
end Asynchronous_IO_Is_Supported;
function Asynchronous_IO_Is_Supported (File : POSIX.IO.File_Descriptor)
return Boolean is
begin
return Is_Supported (File, PC_ASYNC_IO);
end Asynchronous_IO_Is_Supported;
----------------------
-- Prioritized IO --
----------------------
function Prioritized_IO_Is_Supported (Pathname : POSIX.Pathname)
return Boolean is
begin
return Is_Supported (Pathname, PC_PRIO_IO);
end Prioritized_IO_Is_Supported;
function Prioritized_IO_Is_Supported (File : POSIX.IO.File_Descriptor)
return Boolean is
begin
return Is_Supported (File, PC_PRIO_IO);
end Prioritized_IO_Is_Supported;
-- POSIX.5c [D2] additions
function Socket_Buffer_Is_Limited (File : POSIX.IO.File_Descriptor)
return Boolean is
begin
return Is_Limited (File, PC_SOCK_MAXBUF);
end Socket_Buffer_Is_Limited;
function Socket_Buffer_Is_Limited (Pathname : POSIX.Pathname)
return Boolean is
begin
return Is_Limited (Pathname, PC_SOCK_MAXBUF);
end Socket_Buffer_Is_Limited;
function Socket_Buffer_Limit (Pathname : POSIX.Pathname)
return POSIX.Limits.Socket_Buffer_Maxima is
begin
return POSIX.Limits.Socket_Buffer_Maxima (Limit
(Pathname, PC_SOCK_MAXBUF,
long (POSIX.Limits.Socket_Buffer_Maxima'Last)));
end Socket_Buffer_Limit;
function Socket_Buffer_Limit (File : POSIX.IO.File_Descriptor)
return POSIX.Limits.Socket_Buffer_Maxima is
begin
return POSIX.Limits.Socket_Buffer_Maxima (Limit
(File, PC_SOCK_MAXBUF, long (POSIX.Limits.Socket_Buffer_Maxima'Last)));
end Socket_Buffer_Limit;
end POSIX.Configurable_File_Limits;