mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-07 12:07:58 +02:00
OpenBSD support for OS version specific syscall numbers
git-svn-id: trunk@29136 -
This commit is contained in:
parent
1d1215ede3
commit
7ffca97a68
@ -212,6 +212,10 @@ begin
|
||||
dispose(dirp);
|
||||
end;
|
||||
|
||||
var
|
||||
use_openbsd_getdirentries_49 : boolean = false;
|
||||
use_getdirentries_syscall : boolean = true;
|
||||
|
||||
function Fpreaddir(dirp : pdir) : pdirent; [public, alias : 'FPC_SYSC_READDIR'];
|
||||
|
||||
{Different from Linux, Readdir on BSD is based on Getdents, due to the
|
||||
@ -223,18 +227,29 @@ with blockmode have this higher?}
|
||||
function readbuffer:longint;
|
||||
|
||||
var retval :longint;
|
||||
{$ifdef USE_GETDIRENTRIES_I49_SYSCALL}
|
||||
{$ifdef FPC_USE_GETDIRENTRIES_SYSCALL}
|
||||
basepp : pointer;
|
||||
{$ifdef FPC_USE_GETDIRENTRIES_I49_SYSCALL}
|
||||
{ OpenBSD i49 getDirEntries system call uses off_t type for last parameter }
|
||||
basep : off_t;
|
||||
{$else not USE_GETDIRENTRIES_I49_SYSCALL}
|
||||
basep_off_t : off_t;
|
||||
{$endif not FPC_USE_GETDIRENTRIES_I49_SYSCALL}
|
||||
basep : clong;
|
||||
{$endif not USE_GETDIRENTRIES_I49_SYSCALL}
|
||||
{$endif FPC_USE_GETDIRENTRIES_SYSCALL}
|
||||
begin
|
||||
{$ifdef USE_GETDIRENTRIES_SYSCALL}
|
||||
Retval:=do_syscall(syscall_nr_getdirentries,TSysParam(dirp^.dd_fd),TSysParam(@dirp^.dd_buf^),DIRBLKSIZ {sizeof(getdentsbuffer)},TSysParam(@basep));
|
||||
{$else not USE_GETDIRENTRIES_SYSCALL}
|
||||
{$ifdef FPC_USE_GETDIRENTRIES_SYSCALL}
|
||||
{$ifdef FPC_USE_GETDIRENTRIES_I49_SYSCALL}
|
||||
if use_openbsd_getdirentries_49 then
|
||||
basepp:=@basep_off_t
|
||||
else
|
||||
{$endif FPC_USE_GETDIRENTRIES_I49_SYSCALL}
|
||||
basepp:=@basep;
|
||||
if use_getdirentries_syscall then
|
||||
Retval:=do_syscall(syscall_nr_getdirentries,TSysParam(dirp^.dd_fd),TSysParam(@dirp^.dd_buf^),DIRBLKSIZ {sizeof(getdentsbuffer)},TSysParam(basepp))
|
||||
else
|
||||
Retval:=do_syscall(syscall_nr_getdents,TSysParam(dirp^.dd_fd),TSysParam(@dirp^.dd_buf^),DIRBLKSIZ {sizeof(getdentsbuffer)});
|
||||
{$endif not USE_GETDIRENTRIES_SYSCALL}
|
||||
{$else not FPC_USE_GETDIRENTRIES_SYSCALL}
|
||||
Retval:=do_syscall(syscall_nr_getdents,TSysParam(dirp^.dd_fd),TSysParam(@dirp^.dd_buf^),DIRBLKSIZ {sizeof(getdentsbuffer)});
|
||||
{$endif not FPC_USE_GETDIRENTRIES_SYSCALL}
|
||||
dirp^.dd_rewind:=TSysParam(dirp^.dd_buf);
|
||||
if retval=0 then
|
||||
begin
|
||||
|
@ -63,9 +63,6 @@ TYPE
|
||||
|
||||
{ file characteristics services }
|
||||
stat = record { the types are real}
|
||||
{$ifdef openbsd}
|
||||
st_mode : mode_t; // inode protection mode
|
||||
{$endif}
|
||||
st_dev : dev_t; // inode's device
|
||||
{$ifdef darwinarm}
|
||||
st_mode : mode_t; // inode protection mode
|
||||
@ -78,15 +75,16 @@ TYPE
|
||||
st_ino : ino_t; // inode's number
|
||||
{$else not netbsd}
|
||||
st_ino : ino_t; // inode's number
|
||||
{$ifndef openbsd}
|
||||
st_mode : mode_t; // inode protection mode
|
||||
{$endif}
|
||||
{$endif not netbsd}
|
||||
st_nlink : nlink_t; // number of hard links
|
||||
{$endif}
|
||||
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
|
||||
{$ifdef openbsd}
|
||||
st_padd0 : cint;
|
||||
{$endif}
|
||||
st_atime : time_t; // time of last access
|
||||
st_atimensec : clong; // nsec of last access
|
||||
st_mtime : time_t; // time of last data modification
|
||||
@ -123,20 +121,10 @@ TYPE
|
||||
{ directory services }
|
||||
{$ifndef darwinarm}
|
||||
dirent = record
|
||||
{$ifdef openbsd}
|
||||
d_fileno : ino_t;
|
||||
{$else}
|
||||
d_fileno : cuint32; // file number of entry
|
||||
{$endif}
|
||||
{$ifdef openbsd}
|
||||
d_off : off_t;
|
||||
{$endif}
|
||||
d_reclen : cuint16; // length of this record
|
||||
d_type : cuint8; // file type, see below
|
||||
d_namlen : cuint8; // length of string in d_name
|
||||
{$ifdef openbsd}
|
||||
d_padding : array[1..4] of cuint8;
|
||||
{$endif}
|
||||
d_name : array[0..(255 + 1)-1] of char; // name must be no longer than this
|
||||
end;
|
||||
{$else not darwinarm}
|
||||
@ -161,11 +149,6 @@ TYPE
|
||||
dd_size : clong; // amount of data returned by getdirentries
|
||||
dd_buf : pchar; // data buffer
|
||||
dd_len : cint; // size of data buffer
|
||||
{$ifdef openbsd}
|
||||
dd_curpos : off_t;
|
||||
dd_lock : pointer;
|
||||
dd_rewind : clong;
|
||||
{$else}
|
||||
{$ifdef netbsdpowerpc}
|
||||
dd_pad1 : cint;
|
||||
dd_seek : cint64; // magic cookie returned by getdirentries
|
||||
@ -178,7 +161,6 @@ TYPE
|
||||
__dd_lock : pthread_mutex_t; // for thread locking
|
||||
__dd_td : pointer; // telldir position recording
|
||||
{$endif}
|
||||
{$endif not openbsd}
|
||||
end;
|
||||
TDir = dir;
|
||||
pDir = ^dir;
|
||||
|
@ -233,3 +233,60 @@ const
|
||||
Prio_Process = 0;
|
||||
Prio_PGrp = 1;
|
||||
Prio_User = 2;
|
||||
|
||||
{ OpenBSD 5.5 specific variants }
|
||||
|
||||
{ file characteristics services }
|
||||
type
|
||||
stat_55 = record { the types are real}
|
||||
st_mode : mode_t; // inode protection mode
|
||||
st_dev : dev_t; // inode's device
|
||||
st_ino : ino_t; // inode's number
|
||||
st_nlink : nlink_t; // number of hard links
|
||||
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
|
||||
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_birthtime : time_t; // File creation time
|
||||
st_birthtimensec : clong; // nsec of file creation time
|
||||
st_qspare : array[0..1] Of cint64;
|
||||
end;
|
||||
TStat_55 = stat_55;
|
||||
pStat_55 = ^stat_55;
|
||||
|
||||
{ directory services }
|
||||
dirent_55 = record
|
||||
d_fileno : ino_t;
|
||||
d_off : off_t;
|
||||
d_reclen : cuint16; // length of this record
|
||||
d_type : cuint8; // file type, see below
|
||||
d_namlen : cuint8; // length of string in d_name
|
||||
d_padding : array[1..4] of cuint8;
|
||||
d_name : array[0..(255 + 1)-1] of char; // name must be no longer than this
|
||||
end;
|
||||
TDirent_55 = dirent_55;
|
||||
pDirent_55 = ^dirent_55;
|
||||
|
||||
dir_55 = record
|
||||
dd_fd : cint; // file descriptor associated with directory
|
||||
dd_loc : clong; // offset in current buffer
|
||||
dd_size : clong; // amount of data returned by getdirentries
|
||||
dd_buf : pchar; // data buffer
|
||||
dd_len : cint; // size of data buffer
|
||||
dd_curpos : off_t;
|
||||
dd_lock : pointer;
|
||||
dd_rewind : clong;
|
||||
end;
|
||||
TDir_55 = dir_55;
|
||||
pDir_55 = ^dir_55;
|
||||
|
||||
|
@ -1,4 +1,23 @@
|
||||
|
||||
{$ifdef FPC_COMPILING_SYSCALL_UNIT}
|
||||
|
||||
{ these variables are used inside osysc.inc file
|
||||
but needed here also if compiling syscall unit. }
|
||||
{$i errno.inc}
|
||||
{$i ptypes.inc}
|
||||
|
||||
{$endif FPC_COMPILING_SYSCALL_UNIT}
|
||||
|
||||
{$ifndef FPC_IS_SYSTEM}
|
||||
var
|
||||
use_openbsd_getdirentries_49 : boolean = false;
|
||||
use_getdirentries_syscall : boolean = true;
|
||||
|
||||
function geterrno:longint; external name 'FPC_SYS_GETERRNO';
|
||||
procedure seterrno(err:longint); external name 'FPC_SYS_SETERRNO';
|
||||
|
||||
{$endif FPC_IS_SYSTEM}
|
||||
|
||||
procedure SetSyscallNumbers;
|
||||
|
||||
Var
|
||||
@ -103,6 +122,16 @@ Begin
|
||||
else if version > 5001 then
|
||||
syscall_nr___tfork := syscall_nr___tfork_52;
|
||||
|
||||
|
||||
if version >= 5005 then
|
||||
begin
|
||||
{ FIXME: what should we do here? }
|
||||
syscall_nr_getdirentries := -1;
|
||||
use_getdirentries_syscall:=false;
|
||||
end
|
||||
else if version >= 4009 then
|
||||
begin
|
||||
syscall_nr_getdirentries := syscall_nr_getdirentries_49;
|
||||
use_openbsd_getdirentries_49:=true;
|
||||
end;
|
||||
|
||||
end;
|
||||
|
@ -175,6 +175,9 @@ Const
|
||||
(* 158 *) syscall_nr_ofstatfs = 158; (* from 2.6 to 2.9 release *)
|
||||
(* 161 *) syscall_nr_getfh = 161;
|
||||
(* 165 *) syscall_nr_sysarch = 165;
|
||||
(* 169 *) syscall_nr_semsys = 169; (* old compat_10, but required for ipcbsd.inc rtl-extra compilation *)
|
||||
(* 170 *) syscall_nr_msgsys = 170; (* old compat_10, but required for ipcbsd.inc rtl-extra compilation *)
|
||||
(* 171 *) syscall_nr_shmsys = 171; (* old compat_10, but required for ipcbsd.inc rtl-extra compilation *)
|
||||
(* 173 *) syscall_nr_pread = 173;
|
||||
(* 174 *) syscall_nr_pwrite = 174;
|
||||
(* 175 *) syscall_nr_ntp_gettime = 175;
|
||||
@ -317,44 +320,43 @@ Const
|
||||
(* 330 *) syscall_nr___get_tcb = 330;
|
||||
|
||||
|
||||
{$if not declared (cint) }
|
||||
type
|
||||
cint = longint;
|
||||
{$endif}
|
||||
|
||||
{ Aliases }
|
||||
var
|
||||
syscall_nr_waitpid : cint = syscall_nr_wait4; // 7, added: ease of notation purposes
|
||||
syscall_nr_setitimer : cint = syscall_nr_setitimer_20;
|
||||
syscall_nr_getitimer : cint = syscall_nr_getitimer_20;
|
||||
syscall_nr_select : cint = syscall_nr_select_20;
|
||||
syscall_nr_gettimeofday : cint = syscall_nr_gettimeofday_20;
|
||||
syscall_nr_settimeofday : cint = syscall_nr_settimeofday_20;
|
||||
syscall_nr_clock_gettime : cint = syscall_nr_clock_gettime_20;
|
||||
syscall_nr_clock_settime : cint = syscall_nr_clock_settime_20;
|
||||
syscall_nr_clock_getres : cint = syscall_nr_clock_getres_20;
|
||||
syscall_nr_getrusage : cint = syscall_nr_getrusage_20;
|
||||
syscall_nr_utimes : cint = syscall_nr_utimes_20;
|
||||
syscall_nr_futimes : cint = syscall_nr_futimes_20;
|
||||
syscall_nr_statfs : cint = syscall_nr_statfs_26;
|
||||
syscall_nr_fstatfs : cint = syscall_nr_fstatfs_26;
|
||||
syscall_nr_stat : cint = syscall_nr_stat_36;
|
||||
syscall_nr_fstat : cint = syscall_nr_fstat_36;
|
||||
syscall_nr_lstat : cint = syscall_nr_lstat_36;
|
||||
syscall_nr_fhstat : cint = syscall_nr_fhstat_36;
|
||||
syscall_nr_fstatat : cint = syscall_nr_fstatat_50;
|
||||
syscall_nr_fhstatfs : cint = syscall_nr_fhstatfs_20;
|
||||
syscall_nr_nanosleep : cint = syscall_nr_nanosleep_20;
|
||||
syscall_nr_kevent : cint = syscall_nr_kevent_29;
|
||||
syscall_nr_pipe : cint = syscall_nr_pipe_26;
|
||||
syscall_nr_sigaltstack : cint = syscall_nr_sigaltstack_35;
|
||||
syscall_nr___tfork : cint = -1;
|
||||
syscall_nr_msgctl : cint = syscall_nr_msgctl_36;
|
||||
syscall_nr_semop : cint = syscall_nr_semop_36;
|
||||
syscall_nr___semctl : cint = syscall_nr___semctl_36;
|
||||
syscall_nr_shmctl : cint = syscall_nr_shmctl_36;
|
||||
syscall_nr_shmget : cint = syscall_nr_shmget_36;
|
||||
syscall_nr_waitpid : longint = syscall_nr_wait4; // 7, added: ease of notation purposes
|
||||
|
||||
syscall_nr_setitimer : longint = syscall_nr_setitimer_20;
|
||||
syscall_nr_getitimer : longint = syscall_nr_getitimer_20;
|
||||
syscall_nr_select : longint = syscall_nr_select_20;
|
||||
syscall_nr_gettimeofday : longint = syscall_nr_gettimeofday_20;
|
||||
syscall_nr_settimeofday : longint = syscall_nr_settimeofday_20;
|
||||
syscall_nr_clock_gettime : longint = syscall_nr_clock_gettime_20;
|
||||
syscall_nr_clock_settime : longint = syscall_nr_clock_settime_20;
|
||||
syscall_nr_clock_getres : longint = syscall_nr_clock_getres_20;
|
||||
syscall_nr_getrusage : longint = syscall_nr_getrusage_20;
|
||||
syscall_nr_utimes : longint = syscall_nr_utimes_20;
|
||||
syscall_nr_futimes : longint = syscall_nr_futimes_20;
|
||||
syscall_nr_statfs : longint = syscall_nr_statfs_26;
|
||||
syscall_nr_fstatfs : longint = syscall_nr_fstatfs_26;
|
||||
syscall_nr_stat : longint = syscall_nr_stat_36;
|
||||
syscall_nr_fstat : longint = syscall_nr_fstat_36;
|
||||
syscall_nr_lstat : longint = syscall_nr_lstat_36;
|
||||
syscall_nr_fhstat : longint = syscall_nr_fhstat_36;
|
||||
syscall_nr_fstatat : longint = syscall_nr_fstatat_50;
|
||||
syscall_nr_fhstatfs : longint = syscall_nr_fhstatfs_20;
|
||||
syscall_nr_nanosleep : longint = syscall_nr_nanosleep_20;
|
||||
syscall_nr_kevent : longint = syscall_nr_kevent_29;
|
||||
syscall_nr_pipe : longint = syscall_nr_pipe_26;
|
||||
syscall_nr_sigaltstack : longint = syscall_nr_sigaltstack_35;
|
||||
syscall_nr___tfork : longint = -1;
|
||||
syscall_nr_msgctl : longint = syscall_nr_msgctl_36;
|
||||
syscall_nr_semop : longint = syscall_nr_semop_36;
|
||||
syscall_nr___semctl : longint = syscall_nr___semctl_36;
|
||||
syscall_nr_shmctl : longint = syscall_nr_shmctl_36;
|
||||
syscall_nr_shmget : longint = syscall_nr_shmget_36;
|
||||
syscall_nr_getdirentries : longint = syscall_nr_getdirentries_20;
|
||||
{ The variables above need to be changed at startup }
|
||||
|
||||
{$define FPC_HAS_SETSYSNR_INC}
|
||||
{$define FPC_USE_GETDIRENTRIES_SYSCALL}
|
||||
{$define FPC_USE_GETDIRENTRIES_I49_SYSCALL}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user