mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-13 05:29:34 +02:00
* commit ACM's fpc.diff, resolves mantis #37220 and FreeBSD 12/13 syscall port
This commit is contained in:
parent
4118173e1d
commit
99e3789fa3
@ -374,38 +374,46 @@ begin
|
||||
FPutime:=do_syscall(syscall_nr_utimes,TSysParam(path),TSysParam(tvp));
|
||||
end;
|
||||
|
||||
function __pipe_call(sysnr:TSysParam):TSysResult; {$ifdef cpui386}oldfpccall{$endif} external name 'FPC_DOSYS0';
|
||||
{$if (defined (freebsd))}
|
||||
function FPpipe(var fildes : tfildes; flags:cint):cint;
|
||||
|
||||
{$if (defined(freebsd) or defined (dragonfly)) and (defined(CPUi386) or defined(CPUX86_64))}
|
||||
{$define PIPE_RESULT_IN_EAX_AND_EDX}
|
||||
{$endif}
|
||||
Function FPpipe(var fildes : tfildes):cint;
|
||||
{$ifndef PIPE_RESULT_IN_EAX_AND_EDX}
|
||||
begin
|
||||
fppipe:=do_syscall(syscall_nr_pipe,TSysParam(@fildes));
|
||||
fppipe:=do_syscall(syscall_nr_pipe2,TSysParam(@fildes), TSysParam(flags));
|
||||
end;
|
||||
{$else}
|
||||
var
|
||||
a, b: cInt;
|
||||
begin
|
||||
asm
|
||||
{$ifdef CPUi386}
|
||||
pushl syscall_nr_pipe
|
||||
call __pipe_call
|
||||
movl %eax, a
|
||||
movl %edx, b
|
||||
{$else}
|
||||
movq syscall_nr_pipe, %rdi
|
||||
call __pipe_call
|
||||
movl %eax, a
|
||||
movl %edx, b
|
||||
{$endif}
|
||||
end;
|
||||
function __pipe_call(sysnr:TSysParam):TSysResult; {$ifdef cpui386}oldfpccall{$endif} external name 'FPC_DOSYS0';
|
||||
|
||||
fpPipe := a; // eax is in a, no matter if it worked or not
|
||||
fildes[0] := a;
|
||||
fildes[1] := b;
|
||||
end;
|
||||
{$if (defined (dragonfly) and (defined(CPUi386) or defined(CPUX86_64))}
|
||||
{$define PIPE_RESULT_IN_EAX_AND_EDX}
|
||||
{$endif}
|
||||
Function FPpipe(var fildes : tfildes):cint;
|
||||
{$ifndef PIPE_RESULT_IN_EAX_AND_EDX}
|
||||
begin
|
||||
fppipe:=do_syscall(syscall_nr_pipe,TSysParam(@fildes));
|
||||
end;
|
||||
{$else}
|
||||
var
|
||||
a, b: cInt;
|
||||
begin
|
||||
asm
|
||||
{$ifdef CPUi386}
|
||||
pushl syscall_nr_pipe
|
||||
call __pipe_call
|
||||
movl %eax, a
|
||||
movl %edx, b
|
||||
{$else}
|
||||
movq syscall_nr_pipe, %rdi
|
||||
call __pipe_call
|
||||
movl %eax, a
|
||||
movl %edx, b
|
||||
{$endif}
|
||||
end;
|
||||
|
||||
fpPipe := a; // eax is in a, no matter if it worked or not
|
||||
fildes[0] := a;
|
||||
fildes[1] := b;
|
||||
end;
|
||||
{$endif}
|
||||
{$endif}
|
||||
|
||||
function FPfcntl(fildes:cint;Cmd:cint;Arg:cint):cint;
|
||||
@ -498,8 +506,15 @@ Function fpLstat(path:pchar;Info:pstat):cint;
|
||||
Get all information on a link (the link itself), and return it in info.
|
||||
}
|
||||
|
||||
const
|
||||
AT_FDCWD=-100;
|
||||
AT_SYMLINK_NOFOLLOW=$0200;
|
||||
begin
|
||||
fpLStat:=do_syscall(syscall_nr_lstat,TSysParam(path),TSysParam(info));
|
||||
{$ifdef freebsd}
|
||||
fpLStat:=do_syscall(syscall_nr_fstatat,AT_FDCWD,TSysParam(path),TSysParam(Info),AT_SYMLINK_NOFOLLOW);
|
||||
{$else}
|
||||
fpLStat:=do_syscall(syscall_nr_lstat,TSysParam(path),TSysParam(info));
|
||||
{$endif}
|
||||
end;
|
||||
|
||||
function fpNice(N:cint):cint;
|
||||
|
@ -76,9 +76,9 @@ FreeBSD: same implementation as NetBSD.
|
||||
|
||||
begin
|
||||
{$ifdef CPU64}
|
||||
Fplseek:=do_syscall(syscall_nr___syscall,syscall_nr_lseek,TSysParam(fd),0,Offset,whence);
|
||||
Fplseek:=do_syscall(syscall_nr___syscall,syscall_nr_lseek,TSysParam(fd),Offset,whence);
|
||||
{$else}
|
||||
Fplseek:=do_syscall(syscall_nr___syscall,syscall_nr_lseek,0,TSysParam(fd),0,
|
||||
Fplseek:=do_syscall(syscall_nr___syscall,syscall_nr_lseek,0,TSysParam(fd),
|
||||
{$ifdef ENDIAN_BIG}hi(offset),lo(offset){$endif}
|
||||
{$ifdef ENDIAN_LITTLE}lo(Offset),hi(offset){$endif},
|
||||
Whence);
|
||||
@ -90,9 +90,9 @@ function Fpftruncate(fd : cint; flength : off_t): cint; [public, alias : 'FPC_SY
|
||||
|
||||
begin
|
||||
{$ifdef CPU64}
|
||||
Fpftruncate:=Do_syscall(syscall_nr___syscall,syscall_nr_ftruncate, fd ,0 ,flength);
|
||||
Fpftruncate:=Do_syscall(syscall_nr___syscall,syscall_nr_ftruncate, fd ,flength);
|
||||
{$else}
|
||||
Fpftruncate:=Do_syscall(syscall_nr___syscall,syscall_nr_ftruncate,0,fd,0,lo(flength),hi(flength));
|
||||
Fpftruncate:=Do_syscall(syscall_nr___syscall,syscall_nr_ftruncate,0,fd,lo(flength),hi(flength));
|
||||
{$endif}
|
||||
|
||||
end;
|
||||
@ -102,9 +102,9 @@ Function Fpmmap(start:pointer;len:size_t;prot:cint;flags:cint;fd:cint;offst:off_
|
||||
|
||||
begin
|
||||
{$ifdef CPU64}
|
||||
Fpmmap:=pointer(ptruint(do_syscall(TSysParam(syscall_nr_mmap),TSysParam(Start),TSysParam(Len),TSysParam(Prot),TSysParam(Flags),TSysParam(fd),0,TSysParam(offst))));
|
||||
Fpmmap:=pointer(ptruint(do_syscall(TSysParam(syscall_nr_mmap),TSysParam(Start),TSysParam(Len),TSysParam(Prot),TSysParam(Flags),TSysParam(fd),TSysParam(offst))));
|
||||
{$else}
|
||||
Fpmmap:=pointer(ptruint(do_syscall(syscall_nr_mmap,TSysParam(Start),Len,Prot,Flags,fd,0,
|
||||
Fpmmap:=pointer(ptruint(do_syscall(syscall_nr_mmap,TSysParam(Start),Len,Prot,Flags,fd,
|
||||
{$ifdef FPC_BIG_ENDIAN} hi(offst),lo(offst){$endif}
|
||||
{$ifdef FPC_LITTLE_ENDIAN} lo(offst),hi(offst){$endif}
|
||||
)));
|
||||
@ -138,13 +138,25 @@ begin
|
||||
Fprename:=do_syscall(syscall_nr_rename,TSysParam(old),TSysParam(newpath));
|
||||
end;
|
||||
|
||||
function Fpstat(const path: pchar; var buf : stat):cint; [public, alias : 'FPC_SYSC_STAT'];
|
||||
Function fpFstatat(fd: cint; path: pchar; var sb: stat; flag: cint):cint;
|
||||
|
||||
begin
|
||||
Fpstat:=do_syscall(syscall_nr_stat,TSysParam(path),TSysParam(@buf));
|
||||
fpFStatat:=do_syscall(syscall_nr_fstatat,fd,TSysParam(path),TSysParam(@sb),flag);
|
||||
end;
|
||||
|
||||
|
||||
function Fpstat(const path: pchar; var buf : stat):cint; [public, alias : 'FPC_SYSC_STAT'];
|
||||
|
||||
const
|
||||
AT_FDCWD=-100;
|
||||
begin
|
||||
{$ifdef freebsd}
|
||||
Fpstat:=FpFstatat(AT_FDCWD, path, buf, 0);
|
||||
{$else}
|
||||
Fpstat:=do_syscall(syscall_nr_stat,TSysParam(path),TSysParam(@buf));
|
||||
{$endif}
|
||||
end;
|
||||
|
||||
{*****************************************************************************
|
||||
--- Directory:Directory related calls ---
|
||||
*****************************************************************************}
|
||||
@ -171,6 +183,13 @@ end;
|
||||
|
||||
const DIRBLKSIZ=1024;
|
||||
|
||||
{$ifdef freebsd}
|
||||
function FpGetdirentries(fd : cint; buf : pchar; nbytes : clong) : cint;
|
||||
|
||||
begin
|
||||
FpGetdirentries:=do_syscall(syscall_nr_getdirentries,fd,TSysParam(buf), nbytes);
|
||||
end;
|
||||
{$endif}
|
||||
|
||||
function Fpfstat(fd : cint; var sb : stat): cint; forward;
|
||||
|
||||
@ -247,7 +266,11 @@ function readbuffer:longint;
|
||||
|
||||
var retval :longint;
|
||||
begin
|
||||
Retval:=do_syscall(syscall_nr_getdents,TSysParam(dirp^.dd_fd),TSysParam(@dirp^.dd_buf^),DIRBLKSIZ {sizeof(getdentsbuffer)});
|
||||
{$ifdef freebsd}
|
||||
Retval:=FpGetdirentries(dirp^.dd_fd, @dirp^.dd_buf^, DIRBLKSIZ {sizeof(getdentsbuffer)});
|
||||
{$else}
|
||||
Retval:=do_syscall(syscall_nr_getdents,TSysParam(dirp^.dd_fd),TSysParam(@dirp^.dd_buf^),DIRBLKSIZ {sizeof(getdentsbuffer)});
|
||||
{$endif}
|
||||
dirp^.dd_rewind:=TSysParam(dirp^.dd_buf);
|
||||
if retval=0 then
|
||||
begin
|
||||
|
@ -16,8 +16,8 @@ const
|
||||
{More or less checked/in use FreeBSD syscalls}
|
||||
syscall_nr_readv = 120;
|
||||
syscall_nr_writev = 121;
|
||||
syscall_nr_pread = 173;
|
||||
syscall_nr_pwrite = 174;
|
||||
syscall_nr_pread = 475;
|
||||
syscall_nr_pwrite = 476;
|
||||
syscall_nr_semsys = 169;
|
||||
syscall_nr_msgsys = 170;
|
||||
syscall_nr_shmsys = 171;
|
||||
@ -48,15 +48,17 @@ const
|
||||
syscall_nr_fcntl = 92;
|
||||
syscall_nr_flock = 131;
|
||||
syscall_nr_fork = 2;
|
||||
syscall_nr_fstat = 189;
|
||||
syscall_nr_fstat = 551;
|
||||
syscall_nr_fstatat = 552;
|
||||
syscall_nr_statfs4 = 157; // COMPAT4x
|
||||
syscall_nr_fstatfs4 = 158; // COMPAT4x
|
||||
syscall_nr_getfsstat = 395;
|
||||
syscall_nr_getfsstat = 557;
|
||||
syscall_nr_statfs = 396;
|
||||
syscall_nr_fstatfs = 397;
|
||||
syscall_nr_fsync = 95;
|
||||
syscall_nr_ftruncate = 201;
|
||||
syscall_nr_ftruncate = 480;
|
||||
syscall_nr_getdents = 272;
|
||||
syscall_nr_getdirentries = 554;
|
||||
syscall_nr_getegid = 43;
|
||||
syscall_nr_geteuid = 25;
|
||||
syscall_nr_getgid = 47;
|
||||
@ -71,13 +73,14 @@ const
|
||||
syscall_nr_kill = 37;
|
||||
syscall_nr_link = 9;
|
||||
syscall_nr_listen = 106;
|
||||
syscall_nr_lseek = 199;
|
||||
syscall_nr_lseek = 478;
|
||||
syscall_nr_lstat = 190;
|
||||
syscall_nr_mkdir = 136;
|
||||
syscall_nr_mknod = 14;
|
||||
syscall_nr_mmap = 197;
|
||||
syscall_nr_mmap = 477;
|
||||
syscall_nr_open = 5;
|
||||
syscall_nr_pipe = 42;
|
||||
syscall_nr_pipe2 = 542;
|
||||
syscall_nr_poll = 209;
|
||||
syscall_nr_read = 3;
|
||||
syscall_nr_readlink = 58;
|
||||
|
@ -49,8 +49,9 @@ Function AssignPipe(var pipe_in,pipe_out:cint):cint; [public, alias : 'FPC_SYSC_
|
||||
}
|
||||
var
|
||||
pip : tfildes;
|
||||
flags : cint;
|
||||
begin
|
||||
assignPipe:=fppipe(pip);
|
||||
assignPipe:=fppipe(pip, 0);
|
||||
pipe_in:=pip[0];
|
||||
pipe_out:=pip[1];
|
||||
end;
|
||||
|
@ -34,7 +34,11 @@ Type TGrpArr = Array [0..0] of TGid; { C style array workarounds}
|
||||
Function FpChmod (path : pChar; Mode : TMode): cInt;
|
||||
Function FpChown (path : pChar; owner : TUid; group : TGid): cInt;
|
||||
Function FpUtime (path : pChar; times : putimbuf): cInt;
|
||||
{$if defined(freebsd)}
|
||||
Function FpPipe (var fildes : tfildes; flags : cInt):cInt;
|
||||
{$else}
|
||||
Function FpPipe (var fildes : tfildes):cInt;
|
||||
{$endif}
|
||||
Function FpDup (fildes : cInt): cInt; external name 'FPC_SYSC_DUP';
|
||||
Function FpDup2 (fildes, fildes2 : cInt): cInt; external name 'FPC_SYSC_DUP2';
|
||||
Function FpTimes (var buffer : tms): TClock;
|
||||
|
Loading…
Reference in New Issue
Block a user