diff --git a/rtl/bsd/ossysc.inc b/rtl/bsd/ossysc.inc index 267bff29e1..d1be689bbb 100644 --- a/rtl/bsd/ossysc.inc +++ b/rtl/bsd/ossysc.inc @@ -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 diff --git a/rtl/bsd/ostypes.inc b/rtl/bsd/ostypes.inc index b14ef26bb7..97d8923cb1 100644 --- a/rtl/bsd/ostypes.inc +++ b/rtl/bsd/ostypes.inc @@ -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; diff --git a/rtl/openbsd/ptypes.inc b/rtl/openbsd/ptypes.inc index 0ed3d78501..399264e63a 100644 --- a/rtl/openbsd/ptypes.inc +++ b/rtl/openbsd/ptypes.inc @@ -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; + diff --git a/rtl/openbsd/setsysnr.inc b/rtl/openbsd/setsysnr.inc index f006a7ae10..fc766d2420 100644 --- a/rtl/openbsd/setsysnr.inc +++ b/rtl/openbsd/setsysnr.inc @@ -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; diff --git a/rtl/openbsd/sysnr.inc b/rtl/openbsd/sysnr.inc index 7480348f03..b33a08091e 100644 --- a/rtl/openbsd/sysnr.inc +++ b/rtl/openbsd/sysnr.inc @@ -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}