浏览代码

OpenBSD support for OS version specific syscall numbers

git-svn-id: trunk@29136 -
pierre 10 年之前
父节点
当前提交
7ffca97a68
共有 5 个文件被更改,包括 151 次插入66 次删除
  1. 24 9
      rtl/bsd/ossysc.inc
  2. 3 21
      rtl/bsd/ostypes.inc
  3. 57 0
      rtl/openbsd/ptypes.inc
  4. 30 1
      rtl/openbsd/setsysnr.inc
  5. 37 35
      rtl/openbsd/sysnr.inc

+ 24 - 9
rtl/bsd/ossysc.inc

@@ -212,6 +212,10 @@ begin
   dispose(dirp);
   dispose(dirp);
 end;
 end;
 
 
+var
+  use_openbsd_getdirentries_49 : boolean = false;
+  use_getdirentries_syscall : boolean = true;
+
 function Fpreaddir(dirp : pdir) : pdirent; [public, alias : 'FPC_SYSC_READDIR'];
 function Fpreaddir(dirp : pdir) : pdirent; [public, alias : 'FPC_SYSC_READDIR'];
 
 
 {Different from Linux, Readdir on BSD is based on Getdents, due to the
 {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;
 function readbuffer:longint;
 
 
 var retval :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 }
   { 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;
     basep : clong;
-{$endif not USE_GETDIRENTRIES_I49_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}
+{$endif FPC_USE_GETDIRENTRIES_SYSCALL}
+begin
+{$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)});
+{$else not FPC_USE_GETDIRENTRIES_SYSCALL}
  Retval:=do_syscall(syscall_nr_getdents,TSysParam(dirp^.dd_fd),TSysParam(@dirp^.dd_buf^),DIRBLKSIZ {sizeof(getdentsbuffer)});
  Retval:=do_syscall(syscall_nr_getdents,TSysParam(dirp^.dd_fd),TSysParam(@dirp^.dd_buf^),DIRBLKSIZ {sizeof(getdentsbuffer)});
-{$endif not USE_GETDIRENTRIES_SYSCALL}
+{$endif not FPC_USE_GETDIRENTRIES_SYSCALL}
    dirp^.dd_rewind:=TSysParam(dirp^.dd_buf);
    dirp^.dd_rewind:=TSysParam(dirp^.dd_buf);
    if retval=0 then
    if retval=0 then
     begin
     begin

+ 3 - 21
rtl/bsd/ostypes.inc

@@ -63,9 +63,6 @@ TYPE
 
 
   { file characteristics services }
   { file characteristics services }
    stat    = record { the types are real}
    stat    = record { the types are real}
-{$ifdef openbsd}
-        st_mode       : mode_t;            // inode protection mode
-{$endif}
         st_dev        : dev_t;             // inode's device
         st_dev        : dev_t;             // inode's device
 {$ifdef darwinarm}
 {$ifdef darwinarm}
         st_mode       : mode_t;            // inode protection mode
         st_mode       : mode_t;            // inode protection mode
@@ -78,15 +75,16 @@ TYPE
         st_ino        : ino_t;             // inode's number
         st_ino        : ino_t;             // inode's number
 {$else not netbsd}
 {$else not netbsd}
         st_ino        : ino_t;             // inode's number
         st_ino        : ino_t;             // inode's number
-{$ifndef openbsd}
         st_mode       : mode_t;            // inode protection mode
         st_mode       : mode_t;            // inode protection mode
-{$endif}
 {$endif not netbsd}
 {$endif not netbsd}
         st_nlink      : nlink_t;           // number of hard links
         st_nlink      : nlink_t;           // number of hard links
 {$endif}
 {$endif}
         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
+{$ifdef openbsd}
+        st_padd0      : cint;
+{$endif}
         st_atime      : time_t;            // time of last access
         st_atime      : time_t;            // time of last access
         st_atimensec  : clong;             // nsec of last access
         st_atimensec  : clong;             // nsec of last access
         st_mtime      : time_t;            // time of last data modification
         st_mtime      : time_t;            // time of last data modification
@@ -123,20 +121,10 @@ TYPE
   { directory services }
   { directory services }
 {$ifndef darwinarm}
 {$ifndef darwinarm}
    dirent  = record
    dirent  = record
-      {$ifdef openbsd}
-        d_fileno      : ino_t;                       
-      {$else}
         d_fileno      : cuint32;                        // file number of entry
         d_fileno      : cuint32;                        // file number of entry
-      {$endif}
-{$ifdef openbsd}
-	d_off         : off_t;
-{$endif}
         d_reclen      : cuint16;                        // length of this record
         d_reclen      : cuint16;                        // length of this record
         d_type        : cuint8;                         // file type, see below
         d_type        : cuint8;                         // file type, see below
         d_namlen      : cuint8;                         // length of string in d_name
         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
         d_name        : array[0..(255 + 1)-1] of char;  // name must be no longer than this
    end;
    end;
 {$else not darwinarm}
 {$else not darwinarm}
@@ -161,11 +149,6 @@ TYPE
         dd_size   : clong;        // amount of data returned by getdirentries
         dd_size   : clong;        // amount of data returned by getdirentries
         dd_buf    : pchar;        // data buffer
         dd_buf    : pchar;        // data buffer
         dd_len    : cint;         // size of data buffer
         dd_len    : cint;         // size of data buffer
-{$ifdef openbsd}
-	dd_curpos : off_t;
-	dd_lock   : pointer;
-	dd_rewind : clong;
-{$else}
 {$ifdef netbsdpowerpc}
 {$ifdef netbsdpowerpc}
         dd_pad1   : cint;
         dd_pad1   : cint;
         dd_seek   : cint64;        // magic cookie returned by getdirentries
         dd_seek   : cint64;        // magic cookie returned by getdirentries
@@ -178,7 +161,6 @@ TYPE
         __dd_lock : pthread_mutex_t; // for thread locking
         __dd_lock : pthread_mutex_t; // for thread locking
         __dd_td : pointer;        // telldir position recording
         __dd_td : pointer;        // telldir position recording
 {$endif}
 {$endif}
-{$endif not openbsd}
    end;
    end;
    TDir    = dir;
    TDir    = dir;
    pDir    = ^dir;
    pDir    = ^dir;

+ 57 - 0
rtl/openbsd/ptypes.inc

@@ -233,3 +233,60 @@ const
    Prio_Process = 0;
    Prio_Process = 0;
    Prio_PGrp    = 1;
    Prio_PGrp    = 1;
    Prio_User    = 2;
    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;
+

+ 30 - 1
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;
 procedure SetSyscallNumbers;
 
 
 Var
 Var
@@ -103,6 +122,16 @@ Begin
   else if version > 5001 then
   else if version > 5001 then
     syscall_nr___tfork := syscall_nr___tfork_52;
     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;
 end;

+ 37 - 35
rtl/openbsd/sysnr.inc

@@ -175,6 +175,9 @@ Const
 (* 158 *)    syscall_nr_ofstatfs = 158; (* from 2.6 to 2.9 release *)
 (* 158 *)    syscall_nr_ofstatfs = 158; (* from 2.6 to 2.9 release *)
 (* 161 *)    syscall_nr_getfh = 161;
 (* 161 *)    syscall_nr_getfh = 161;
 (* 165 *)    syscall_nr_sysarch = 165;
 (* 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;
 (* 173 *)    syscall_nr_pread = 173;
 (* 174 *)    syscall_nr_pwrite = 174;
 (* 174 *)    syscall_nr_pwrite = 174;
 (* 175 *)    syscall_nr_ntp_gettime = 175;
 (* 175 *)    syscall_nr_ntp_gettime = 175;
@@ -317,44 +320,43 @@ Const
 (* 330 *)    syscall_nr___get_tcb = 330;
 (* 330 *)    syscall_nr___get_tcb = 330;
 
 
 
 
-{$if not declared (cint) }
-type
-  cint = longint;
-{$endif}
-
 { Aliases }
 { Aliases }
 var
 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 }
 { The variables above need to be changed at startup }
 
 
 {$define FPC_HAS_SETSYSNR_INC}
 {$define FPC_HAS_SETSYSNR_INC}
+{$define FPC_USE_GETDIRENTRIES_SYSCALL}
+{$define FPC_USE_GETDIRENTRIES_I49_SYSCALL}