瀏覽代碼

+ Linux.fpstatx, resolves #36501

git-svn-id: trunk@43837 -
florian 5 年之前
父節點
當前提交
d425a85f8d
共有 6 個文件被更改,包括 120 次插入5 次删除
  1. 1 0
      .gitattributes
  2. 75 1
      rtl/linux/linux.pp
  3. 14 1
      rtl/linux/ostypes.inc
  4. 2 2
      tests/Makefile
  5. 1 1
      tests/Makefile.fpc
  6. 27 0
      tests/test/units/linux/tstatx.pp

+ 1 - 0
.gitattributes

@@ -15557,6 +15557,7 @@ tests/test/units/fpwidestring/twide2fpwidestring.pp svneol=native#text/pascal
 tests/test/units/fpwidestring/twide6fpwidestring.pp svneol=native#text/pascal
 tests/test/units/fpwidestring/twide7fpwidestring.pp svneol=native#text/pascal
 tests/test/units/lineinfo/tlininfo.pp svneol=native#text/plain
+tests/test/units/linux/tstatx.pp svneol=native#text/pascal
 tests/test/units/math/tcmpnan.pp svneol=native#text/plain
 tests/test/units/math/tdivmod.pp svneol=native#text/plain
 tests/test/units/math/tmask.inc svneol=native#text/plain

+ 75 - 1
rtl/linux/linux.pp

@@ -29,8 +29,17 @@ interface
 uses
   BaseUnix, unixtype;
 
-Const
+const
   O_CLOEXEC = $80000;
+
+type
+  { used by newer Linux headers }
+  __u16 = Word;
+  __s16 = Smallint;
+  __u32 = DWord;
+  __s32 = Longint;
+  __u64 = QWord;
+  __s64 = Int64;
   
 type
   TSysInfo = record
@@ -472,6 +481,64 @@ function clock_settime(clk_id : clockid_t; tp : ptimespec) : cint; {$ifdef FPC_U
 function setregid(rgid,egid : uid_t): cint; {$ifdef FPC_USE_LIBC} cdecl; external name 'setregid'; {$ENDIF} 
 function setreuid(ruid,euid : uid_t): cint; {$ifdef FPC_USE_LIBC} cdecl; external name 'setreuid'; {$ENDIF} 
 
+Const
+  STATX_TYPE = $00000001;
+  STATX_MODE = $00000002;
+  STATX_NLINK = $00000004;
+  STATX_UID = $00000008;
+  STATX_GID = $00000010;
+  STATX_ATIME = $00000020;
+  STATX_MTIME = $00000040;
+  STATX_CTIME = $00000080;
+  STATX_INO = $00000100;
+  STATX_SIZE = $00000200;
+  STATX_BLOCKS = $00000400;
+  STATX_BASIC_STATS = $000007ff;
+  STATX_BTIME = $00000800;
+  STATX_ALL = $00000fff;
+  STATX__RESERVED = $80000000;
+  STATX_ATTR_COMPRESSED = $00000004;
+  STATX_ATTR_IMMUTABLE = $00000010;
+  STATX_ATTR_APPEND = $00000020;
+  STATX_ATTR_NODUMP = $00000040;
+  STATX_ATTR_ENCRYPTED = $00000800;
+  STATX_ATTR_AUTOMOUNT = $00001000;
+
+Type
+  statx_timestamp = record
+    tv_sec : __s64;
+    tv_nsec : __u32;
+    __reserved : __s32;
+  end;
+  pstatx_timestamp = ^statx_timestamp;
+
+  statx = record
+    stx_mask : __u32;
+    stx_blksize : __u32;
+    stx_attributes : __u64;
+    stx_nlink : __u32;
+    stx_uid : __u32;
+    stx_gid : __u32;
+    stx_mode : __u16;
+    __spare0 : array[0..0] of __u16;
+    stx_ino : __u64;
+    stx_size : __u64;
+    stx_blocks : __u64;
+    stx_attributes_mask : __u64;
+    stx_atime : statx_timestamp;
+    stx_btime : statx_timestamp;
+    stx_ctime : statx_timestamp;
+    stx_mtime : statx_timestamp;
+    stx_rdev_major : __u32;
+    stx_rdev_minor : __u32;
+    stx_dev_major : __u32;
+    stx_dev_minor : __u32;
+    __spare2 : array[0..13] of __u64;
+  end;
+  pstatx = ^statx;
+
+  function Fpstatx(dfd: cint; filename: pchar; flags,mask: cuint; var buf: statx):cint; {$ifdef FPC_USE_LIBC} cdecl; external name 'statx'; {$ENDIF}
+
 implementation
 
 
@@ -770,5 +837,12 @@ begin
   setreuid:=do_syscall(syscall_nr_setreuid,ruid,euid);
 end;
 
+
+function Fpstatx(dfd: cint; filename: pchar; flags,mask: cuint; var buf: statx):cint;
+begin
+  Fpstatx:=do_syscall(syscall_nr_statx,TSysParam(dfd),TSysParam(filename),TSysParam(flags),TSysParam(mask),TSysParam(@buf));
+end;
+
 {$endif}
+
 end.

+ 14 - 1
rtl/linux/ostypes.inc

@@ -292,9 +292,19 @@ CONST
 {$endif not (cpusparc or cpusparc64)}
 
     AT_FDCWD = -100;
+    AT_SYMLINK_NOFOLLOW = $100;
     AT_REMOVEDIR = $200;
+    AT_SYMLINK_FOLLOW = $400;
+    AT_NO_AUTOMOUNT = $800;
+    AT_EMPTY_PATH = $1000;
+    AT_STATX_SYNC_TYPE = $6000;
+    AT_STATX_SYNC_AS_STAT = $0000;
+    AT_STATX_FORCE_SYNC = $2000;
+    AT_STATX_DONT_SYNC = $4000;
+    AT_RECURSIVE = $8000;
+
+    { SIGCHLD or CLONE_CHILD_CLEARTID or CLONE_CHILD_SETTID }
     clone_flags_fork = $01200011;
-      { SIGCHLD | CLONE_CHILD_CLEARTID | CLONE_CHILD_SETTID }
 
 {$if defined(cpuarm) or defined(cpualpha) or defined(cpublackfin) or defined(cpum68k) or defined(aarch64) or defined(riscv32) or defined(riscv64)}
     O_LARGEFILE =   $20000;
@@ -338,6 +348,9 @@ CONST
   S_IFREG = 32768; { regular }
   S_IFLNK = 40960; { symbolic link }
   S_IFSOCK= 49152; { socket }
+  S_ISUID = &4000;
+  S_ISGID = &2000;
+  S_ISVTX = &1000;
 
   { Constansts for MMAP }
  {$IFDEF FPC_IS_SYSTEM}

+ 2 - 2
tests/Makefile

@@ -1837,7 +1837,7 @@ fpc_shared:
 ifdef HASSHAREDLIB
 	$(MAKE) all CREATESHARED=1 LINKSHARED=1 CREATESMART=1
 ifneq ($(SHARED_BUILD),n)
-	$(PPUMOVE) -q $(SHARED_LIBUNITS) -i$(COMPILER_UNITTARGETDIR) -o$(SHARED_FULLNAME) -d$(COMPILER_UNITTARGETDIR)
+	$(PPUMOVE) -q $(SHARED_LIBUNITS) -i$(COMPILER_UNITTARGETDIR) -o$(SHARED_FULLNAME) -d$(COMPILER_UNITTARGETDIR) -P$(BINUTILSPREFIX)
 endif
 else
 	@$(ECHO) Shared Libraries not supported
@@ -2238,7 +2238,7 @@ export LOG:=$(TEST_OUTPUTDIR)/log
 endif
 LOGFILES=$(TEST_OUTPUTDIR)/log $(TEST_OUTPUTDIR)/longlog $(TEST_OUTPUTDIR)/faillist
 LOGEXT=.testlog .tbslog .tbflog .webtbslog .webtbflog
-TESTUNITDIRS=system dos crt objects strings sysutils math sharemem strutils matrix lineinfo ucomplex fpwidestring cpu fmtbcd windows classes character dateutil fpcunit softfpu variants sortbase sortalgs
+TESTUNITDIRS=system dos crt objects strings sysutils math sharemem strutils matrix lineinfo ucomplex fpwidestring cpu fmtbcd windows classes character dateutil fpcunit softfpu variants sortbase sortalgs linux
 TESTDIRECTDIRS=
 TESTSUBDIRS=cg cg/variants cg/cdecl cpu16 cpu16/i8086 library opt $(addprefix units/,$(TESTUNITDIRS))
 TESTPACKAGESDIRS=win-base webtbs hash fcl-registry fcl-process zlib fcl-db fcl-xml cocoaint bzip2

+ 1 - 1
tests/Makefile.fpc

@@ -154,7 +154,7 @@ LOGFILES=$(TEST_OUTPUTDIR)/log $(TEST_OUTPUTDIR)/longlog $(TEST_OUTPUTDIR)/faill
 LOGEXT=.testlog .tbslog .tbflog .webtbslog .webtbflog
 
 # Subdirs available in the test subdir
-TESTUNITDIRS=system dos crt objects strings sysutils math sharemem strutils matrix lineinfo ucomplex fpwidestring cpu fmtbcd windows classes character dateutil fpcunit softfpu variants sortbase sortalgs
+TESTUNITDIRS=system dos crt objects strings sysutils math sharemem strutils matrix lineinfo ucomplex fpwidestring cpu fmtbcd windows classes character dateutil fpcunit softfpu variants sortbase sortalgs linux
 TESTDIRECTDIRS=
 TESTSUBDIRS=cg cg/variants cg/cdecl cpu16 cpu16/i8086 library opt $(addprefix units/,$(TESTUNITDIRS))
 TESTPACKAGESDIRS=win-base webtbs hash fcl-registry fcl-process zlib fcl-db fcl-xml cocoaint bzip2

+ 27 - 0
tests/test/units/linux/tstatx.pp

@@ -0,0 +1,27 @@
+{ %target=linux }
+uses
+  ctypes,baseunix,linux;
+  
+var
+  mystatx : statx;
+  res : cint;
+  f : text;
+  
+begin
+  assign(f,'test.txt');
+  rewrite(f);
+  write(f,'ccccc');
+  close(f);
+  res:=fpstatx(AT_FDCWD,'test.txt',AT_SYMLINK_NOFOLLOW,STATX_ALL,mystatx);
+  erase(f);
+  if res<>0 then
+    begin
+      halt(1);
+    end;
+  writeln('statx.stx_mask = %',binstr(mystatx.stx_mask,32));
+  writeln('statx.size = ',mystatx.stx_size);
+  if mystatx.stx_size<>5 then
+    halt(1);
+  writeln('statx.mode = %',binstr(mystatx.stx_mode,16));
+  writeln('ok');
+end.