Darwin: use recent versions of stat(fs) records when available

When the RTL is built for Mac OS X 10.6 or newer, use the new versions
and the corresponding alternate system library functions.

Also extracted the Darwin stat record definition to reduce the
ifdef hell.
This commit is contained in:
Jonas Maebe 2022-06-25 17:29:48 +02:00
parent 0122044226
commit 1f328cf362
4 changed files with 58 additions and 23 deletions

View File

@ -30,7 +30,7 @@
{$endif} {$endif}
{$endif} {$endif}
{$if (defined(darwin) and (defined(cpuarm) or defined(cpuaarch64))) or defined(iphonesim)} {$if defined(darwin) and (defined(cpuarm) or defined(cpuaarch64) or defined(iphonesim) or (defined(MAC_OS_X_VERSION_MIN_REQUIRED) and (MAC_OS_X_VERSION_MIN_REQUIRED >= 1060))) }
{$define darwin_new_iostructs} {$define darwin_new_iostructs}
{$endif} {$endif}
@ -63,7 +63,38 @@ TYPE
{ file characteristics services } { file characteristics services }
stat = record { the types are real} stat = record { the types are real}
{$if defined(dragonfly)} {$if defined(darwin)}
st_dev : dev_t; // inode's device
{$ifdef darwin_new_iostructs}
st_mode : mode_t; // inode protection mode
st_nlink : nlink_t; // number of hard links
st_ino : ino_t; // inode's number
{$else not darwin_new_iostructs}
st_ino : ino_t; // inode's number
st_mode : mode_t; // inode protection mode
st_nlink : nlink_t; // number of hard links
{$endif not darwin_new_iostructs}
st_uid : uid_t; // user ID of the file's owner
st_gid : gid_t; // group ID of the file's group
st_rdev : dev_t; // device type
st_atime : time_t; // time of last access
st_atimensec : clong; // nsec of last access
st_mtime : time_t; // time of last data modification
st_mtimensec : clong; // nsec of last data modification
st_ctime : time_t; // time of last file status change
st_ctimensec : clong; // nsec of last file status change
{$ifdef darwin_new_iostructs}
st_birthtime : time_t; // File creation time
st_birthtimensec : clong; // nsec of file creation time
{$endif}
st_size : off_t; // file size, in bytes
st_blocks : cint64; // blocks allocated for file
st_blksize : cuint32; // optimal blocksize for I/O
st_flags : cuint32; // user defined flags for file
st_gen : cuint32; // file generation number
st_lspare : cuint32; // RESERVED: DO NOT USE!
st_qspare : array[0..1] Of cint64;
{$elseif defined(dragonfly)}
st_ino : ino_t; // inode's number st_ino : ino_t; // inode's number
st_nlink : nlink_t; // number of hard links st_nlink : nlink_t; // number of hard links
st_dev : dev_t; // inode's device st_dev : dev_t; // inode's device
@ -148,11 +179,6 @@ TYPE
st_spare : array [0..10-1] of cuint64; st_spare : array [0..10-1] of cuint64;
{$else} {$else}
st_dev : dev_t; // inode's device st_dev : dev_t; // inode's device
{$ifdef darwin_new_iostructs}
st_mode : mode_t; // inode protection mode
st_nlink : nlink_t; // number of hard links
st_ino : ino_t; // inode's number
{$else not darwin_new_iostructs}
{$ifdef netbsd_use_stat30} {$ifdef netbsd_use_stat30}
{ order is inverted for better alignment probably } { order is inverted for better alignment probably }
st_mode : mode_t; // inode protection mode st_mode : mode_t; // inode protection mode
@ -162,7 +188,6 @@ TYPE
st_mode : mode_t; // inode protection mode st_mode : mode_t; // inode protection mode
{$endif not netbsd} {$endif not netbsd}
st_nlink : nlink_t; // number of hard links st_nlink : nlink_t; // number of hard links
{$endif not darwin_new_iostructs}
st_uid : uid_t; // user ID of the file's owner st_uid : uid_t; // user ID of the file's owner
st_gid : gid_t; // group ID of the file's group st_gid : gid_t; // group ID of the file's group
st_rdev : dev_t; // device type st_rdev : dev_t; // device type
@ -172,10 +197,6 @@ TYPE
st_mtimensec : clong; // nsec of last data modification st_mtimensec : clong; // nsec of last data modification
st_ctime : time_t; // time of last file status change st_ctime : time_t; // time of last file status change
st_ctimensec : clong; // nsec of last file status change st_ctimensec : clong; // nsec of last file status change
{$ifdef darwin_new_iostructs}
st_birthtime : time_t; // File creation time
st_birthtimensec : clong; // nsec of file creation time
{$endif}
{$ifdef netbsdPowerpc} {$ifdef netbsdPowerpc}
st_padd1 : cint; st_padd1 : cint;
{$endif} {$endif}

View File

@ -22,6 +22,11 @@
{$i ctypes.inc} {$i ctypes.inc}
{$packrecords c} {$packrecords c}
{$if defined(darwin) and (defined(cpuarm) or defined(cpuaarch64) or defined(iphonesim) or (defined(MAC_OS_X_VERSION_MIN_REQUIRED) and (MAC_OS_X_VERSION_MIN_REQUIRED >= 1060)))}
{$define darwin_new_iostructs}
{$endif}
type type
{ the following type definitions are compiler dependant } { the following type definitions are compiler dependant }
{ and system dependant } { and system dependant }
@ -35,10 +40,10 @@ type
pGid = ^gid_t; pGid = ^gid_t;
TIOCtlRequest = cuLong; TIOCtlRequest = cuLong;
{$if not defined(cpuarm) and not defined(aarch64) and not defined(iphonesim)} {$ifdef darwin_new_iostructs}
ino_t = cuint32; { used for file serial numbers }
{$else}
ino_t = cuint64; ino_t = cuint64;
{$else}
ino_t = cuint32; { used for file serial numbers }
{$endif} {$endif}
TIno = ino_t; TIno = ino_t;
pIno = ^ino_t; pIno = ^ino_t;

View File

@ -33,9 +33,14 @@ Type TGrpArr = Array [0..0] of TGid; { C style array workarounds}
const const
{$if (defined(linux) and defined(cpu32) and not defined(fs32bit)) or defined(aix)} {$if (defined(linux) and defined(cpu32) and not defined(fs32bit)) or defined(aix)}
suffix64bit = '64'; suffix64bit = '64';
{$else} darwinsuffix64bit = '';
{$elseif defined(darwin_new_iostructs)}
suffix64bit = ''; suffix64bit = '';
{$endif} darwinsuffix64bit = '$INODE64';
{$else}
suffix64bit = '';
darwinsuffix64bit = '';
{$endif}
function FPSigProcMask(how:cint;nset : psigset;oset : psigset):cint;cdecl; external clib name 'sigprocmask'; function FPSigProcMask(how:cint;nset : psigset;oset : psigset):cint;cdecl; external clib name 'sigprocmask';
function FPSigProcMask(how:cint;const nset : sigset;var oset : sigset):cint;cdecl; external clib name 'sigprocmask'; function FPSigProcMask(how:cint;const nset : sigset;var oset : sigset):cint;cdecl; external clib name 'sigprocmask';
@ -88,7 +93,7 @@ const
Function FpKill (pid : TPid; sig: cInt): cInt; cdecl; external clib name 'kill'; Function FpKill (pid : TPid; sig: cInt): cInt; cdecl; external clib name 'kill';
function FpUname (var name: utsname): cint; cdecl; external clib name 'uname'; function FpUname (var name: utsname): cint; cdecl; external clib name 'uname';
function FpOpendir (dirname : pchar): pdir; cdecl; external clib name 'opendir'{$ifdef aix}+suffix64bit{$endif}; function FpOpendir (dirname : pchar): pdir; cdecl; external clib name 'opendir'{$ifdef aix}+suffix64bit{$endif};
Function FpReaddir (var dirp : Dir) : pDirent;cdecl; external clib name 'readdir'+suffix64bit; Function FpReaddir (var dirp : Dir) : pDirent;cdecl; external clib name 'readdir'+suffix64bit+darwinsuffix64bit;
Function FpClosedir (var dirp : Dir): cInt; cdecl; external clib name 'closedir'{$ifdef aix}+suffix64bit{$endif}; Function FpClosedir (var dirp : Dir): cInt; cdecl; external clib name 'closedir'{$ifdef aix}+suffix64bit{$endif};
function FpChdir (path : pchar): cint; cdecl; external clib name 'chdir'; function FpChdir (path : pchar): cint; cdecl; external clib name 'chdir';
{ emulate the bunxovl version that automatically passes { emulate the bunxovl version that automatically passes
@ -106,9 +111,9 @@ const
function FpStat (path: pchar; var buf : stat): cint;inline; function FpStat (path: pchar; var buf : stat): cint;inline;
{$endif FPC_IS_SYSTEM} {$endif FPC_IS_SYSTEM}
{$else linux} {$else linux}
function FpFstat (fd : cint; var sb : stat): cint; cdecl; external clib name 'fstat'+suffix64bit; function FpFstat (fd : cint; var sb : stat): cint; cdecl; external clib name 'fstat'+suffix64bit+darwinsuffix64bit;
Function fpLstat (path:pchar;Info:pstat):cint; cdecl; external clib name 'lstat'+suffix64bit; Function fpLstat (path:pchar;Info:pstat):cint; cdecl; external clib name 'lstat'+suffix64bit+darwinsuffix64bit;
function FpStat (path: pchar; var buf : stat): cint; cdecl; external clib name 'stat'+suffix64bit; function FpStat (path: pchar; var buf : stat): cint; cdecl; external clib name 'stat'+suffix64bit+darwinsuffix64bit;
{$endif linux} {$endif linux}
function FpAccess (pathname : pchar; amode : cint): cint; cdecl; external clib name 'access'; function FpAccess (pathname : pchar; amode : cint): cint; cdecl; external clib name 'access';
function FpClose (fd : cint): cint; cdecl; external clib name 'close'; function FpClose (fd : cint): cint; cdecl; external clib name 'close';

View File

@ -15,6 +15,10 @@
type filedesarray=array[0..1] of cint; type filedesarray=array[0..1] of cint;
{$if defined(darwin) and (defined(cpuarm) or defined(cpuaarch64) or defined(iphonesim) or (defined(MAC_OS_X_VERSION_MIN_REQUIRED) and (MAC_OS_X_VERSION_MIN_REQUIRED >= 1060)))}
{$define darwin_new_iostructs}
{$endif}
{$if defined(solaris) or defined(aix)} {$if defined(solaris) or defined(aix)}
Function fpFlock (fd,mode : longint) : cint;{$ifdef IN_SYSTEM}forward;{$endif IN_SYSTEM} Function fpFlock (fd,mode : longint) : cint;{$ifdef IN_SYSTEM}forward;{$endif IN_SYSTEM}
{$else solaris or aix} {$else solaris or aix}
@ -26,7 +30,7 @@ Function fpFlock (fd,mode : longint) : cint; cdecl; external clib name 'flock';
{$if defined(beos) or defined(solaris) } {$if defined(beos) or defined(solaris) }
Function fpfStatFS(Fd:Longint; Info:pstatfs):cint; cdecl; external clib name 'fstatvfs'; Function fpfStatFS(Fd:Longint; Info:pstatfs):cint; cdecl; external clib name 'fstatvfs';
{$else beos or solaris } {$else beos or solaris }
Function fpfStatFS(Fd:Longint; Info:pstatfs):cint; cdecl; external clib name 'fstatfs'; Function fpfStatFS(Fd:Longint; Info:pstatfs):cint; cdecl; external clib name 'fstatfs'{$ifdef darwin_new_iostructs}+'$INODE64'{$endif};
{$endif beos or solaris } {$endif beos or solaris }
Function fpfsync (fd : cint) : cint; cdecl; external clib name 'fsync'; Function fpfsync (fd : cint) : cint; cdecl; external clib name 'fsync';
@ -34,7 +38,7 @@ Function fpfsync (fd : cint) : cint; cdecl; external clib name 'fsync';
{$if defined(beos) or defined(solaris) } {$if defined(beos) or defined(solaris) }
Function fpStatFS (Path:pchar; Info:pstatfs):cint; cdecl; external clib name 'statvfs'; Function fpStatFS (Path:pchar; Info:pstatfs):cint; cdecl; external clib name 'statvfs';
{$else beos or solaris } {$else beos or solaris }
Function fpStatFS (Path:pchar; Info:pstatfs):cint; cdecl; external clib name 'statfs'; Function fpStatFS (Path:pchar; Info:pstatfs):cint; cdecl; external clib name 'statfs'{$ifdef darwin_new_iostructs}+'$INODE64'{$endif};
{$endif beos or solaris } {$endif beos or solaris }
function pipe (var fildes: filedesarray):cint; cdecl; external clib name 'pipe'; function pipe (var fildes: filedesarray):cint; cdecl; external clib name 'pipe';