File : posix-file_status.adb
------------------------------------------------------------------------------
-- --
-- FLORIST (FSU Implementation of POSIX.5) COMPONENTS --
-- --
-- P O S I X . F I L E _ S T A T U S --
-- --
-- B o d y --
-- --
-- --
-- Copyright (c) 1996, 1997 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.Calendar,
POSIX.Implementation,
POSIX.IO,
POSIX.Permissions,
POSIX.Permissions.Implementation,
POSIX.Process_Identification,
System,
Unchecked_Conversion;
package body POSIX.File_Status is
use POSIX.C;
use POSIX.Calendar;
use POSIX.Implementation;
use POSIX.Permissions.Implementation;
function To_User_ID is
new Unchecked_Conversion (uid_t, POSIX.Process_Identification.User_ID);
function To_Group_ID is
new Unchecked_Conversion (gid_t, POSIX.Process_Identification.Group_ID);
function Duration_To_POSIX_Time is new Unchecked_Conversion
(Duration, POSIX_Time);
function stat (path : char_ptr; buf : stat_ptr) return int;
pragma Import (C, stat, stat_LINKNAME);
function fstat (fildes : int; buf : stat_ptr) return int;
pragma Import (C, fstat, "fstat_mod");
-- pragma Import (C, fstat, fstat_LINKNAME);
-- .... We had to provide a redefined function for this in posix-macro.c
-- See the file for more info.
-----------------------
-- Get_File_Status --
-----------------------
function Get_File_Status (Pathname : POSIX.Pathname)
return Status is
S : aliased struct_stat;
Pathname_With_NUL : POSIX_String := Pathname & NUL;
begin
Check (stat
(Pathname_With_NUL (Pathname_With_NUL'First)'Unchecked_Access,
S'Unchecked_Access));
return Status (S);
end Get_File_Status;
-----------------------
-- Get_File_Status --
-----------------------
function Get_File_Status (File : POSIX.IO.File_Descriptor)
return Status is
S : aliased struct_stat;
begin
Check (fstat (int (File), S'Unchecked_Access));
return Status (S);
end Get_File_Status;
-------------------------
-- Permission_Set_Of --
-------------------------
function Permission_Set_Of (File_Status : Status)
return POSIX.Permissions.Permission_Set is
begin
return Form_Ada_Permission (struct_stat (File_Status).st_mode);
end Permission_Set_Of;
------------------
-- File_ID_Of --
------------------
function File_ID_Of (File_Status : Status)
return File_ID is
begin
return File_ID (struct_stat (File_Status).st_ino);
end File_ID_Of;
--------------------
-- Device_ID_Of --
--------------------
function Device_ID_Of (File_Status : Status)
return Device_ID is
begin
return Device_ID (struct_stat (File_Status).st_dev);
end Device_ID_Of;
---------------------
-- Link_Count_Of --
---------------------
function Link_Count_Of (File_Status : Status)
return Links is
begin
return Links (struct_stat (File_Status).st_nlink);
end Link_Count_Of;
----------------
-- Owner_Of --
----------------
function Owner_Of (File_Status : Status)
return POSIX.Process_Identification.User_ID is
begin
return To_User_ID (struct_stat (File_Status).st_uid);
end Owner_Of;
----------------
-- Group_Of --
----------------
function Group_Of (File_Status : Status)
return POSIX.Process_Identification.Group_ID is
begin
return To_Group_ID (struct_stat (File_Status).st_gid);
end Group_Of;
---------------
-- Size_Of --
---------------
function Size_Of (File_Status : Status)
return POSIX.IO_Count is
begin
-- If the file is not a regular file Get_Error_Code shall be
-- set to "Invalid_Argument" and a "POSIX_Error" should be
-- raised. (POSIX.5 5.3.2.3 (875)).
if not Is_Regular_File (File_Status) then
Set_Error_Code (Invalid_Argument);
raise POSIX_Error;
end if;
return IO_Count (struct_stat (File_Status).st_size);
end Size_Of;
---------------------------
-- Last_Access_Time_Of --
---------------------------
function Last_Access_Time_Of (File_Status : Status)
return POSIX_Time is
begin
return Duration_To_POSIX_Time (Duration
(struct_stat (File_Status).st_atime));
end Last_Access_Time_Of;
---------------------------------
-- Last_Modification_Time_Of --
---------------------------------
function Last_Modification_Time_Of (File_Status : Status)
return POSIX_Time is
begin
return Duration_To_POSIX_Time
(Duration (struct_stat (File_Status).st_mtime));
end Last_Modification_Time_Of;
----------------------------------
-- Last_Status_Change_Time_Of --
----------------------------------
function Last_Status_Change_Time_Of (File_Status : Status)
return POSIX_Time is
begin
return Duration_To_POSIX_Time
(Duration (struct_stat (File_Status).st_ctime));
end Last_Status_Change_Time_Of;
--------------------
-- Is_Directory --
--------------------
function s_isdir (mode : mode_t) return int;
pragma Import (C, s_isdir, "s_isdir");
function Is_Directory (File_Status : Status)
return Boolean is
begin
return s_isdir (struct_stat (File_Status).st_mode) /= 0;
end Is_Directory;
---------------------------------
-- Is_Character_Special_File --
---------------------------------
function s_ischr (mode : mode_t) return int;
pragma Import (C, s_ischr, "s_ischr");
function Is_Character_Special_File (File_Status : Status)
return Boolean is
begin
return s_ischr (struct_stat (File_Status).st_mode) /= 0;
end Is_Character_Special_File;
-----------------------------
-- Is_Block_Special_File --
-----------------------------
function s_isblk (mode : mode_t) return int;
pragma Import (C, s_isblk, "s_isblk");
function Is_Block_Special_File (File_Status : Status)
return Boolean is
begin
return s_isblk (struct_stat (File_Status).st_mode) /= 0;
end Is_Block_Special_File;
------------------------
-- Is_Symbolic_Link --
------------------------
function s_islnk (mode : mode_t) return int;
pragma Import (C, s_islnk, "s_islnk");
function Is_Symbolic_Link (File_Status : Status)
return Boolean is
begin
return s_islnk (struct_stat (File_Status).st_mode) /= 0;
end Is_Symbolic_Link;
-----------------------
-- Is_Regular_FIle --
-----------------------
function s_isreg (mode : mode_t) return int;
pragma Import (C, s_isreg, "s_isreg");
function Is_Regular_File (File_Status : Status)
return Boolean is
begin
return s_isreg (struct_stat (File_Status).st_mode) /= 0;
end Is_Regular_File;
-----------------
-- Is_Socket --
-----------------
function s_issock (mode : mode_t) return int;
pragma Import (C, s_issock, "s_issock");
function Is_Socket (File_Status : Status)
return Boolean is
begin
return s_issock (struct_stat (File_Status).st_mode) /= 0;
end Is_Socket;
---------------
-- Is_FIFO --
---------------
function s_isfifo (mode : mode_t) return int;
pragma Import (C, s_isfifo, "s_isfifo");
function Is_FIFO (File_Status : Status)
return Boolean is
begin
return s_isfifo (struct_stat (File_Status).st_mode) /= 0;
end Is_FIFO;
-------------------
-- To_Stat_Ptr --
-------------------
function To_Stat_Ptr is new Unchecked_Conversion (System.Address, stat_ptr);
------------------------
-- Is_Shared_Memory --
------------------------
function s_typeisshm (buf : stat_ptr) return int;
pragma Import (C, s_typeisshm, "s_typeisshm");
function Is_Shared_Memory (File_Status : in Status)
return Boolean is
begin
return s_typeisshm
(To_Stat_Ptr (File_Status'Address)) /= 0;
end Is_Shared_Memory;
------------------------
-- Is_Message_Queue --
------------------------
function s_typeismq (buf : stat_ptr) return int;
pragma Import (C, s_typeismq, "s_typeismq");
function Is_Message_Queue (File_Status : in Status)
return Boolean is
begin
return s_typeismq
(To_Stat_Ptr (File_Status'Address)) /= 0;
end Is_Message_Queue;
--------------------
-- Is_Semaphore --
--------------------
function s_typeissem (buf : stat_ptr) return int;
pragma Import (C, s_typeissem, "s_typeissem");
function Is_Semaphore (File_Status : in Status)
return Boolean is
begin
return s_typeissem
(To_Stat_Ptr (File_Status'Address)) /= 0;
end Is_Semaphore;
end POSIX.File_Status;