mirror of https://github.com/red-prig/fpPS4.git
1074 lines
20 KiB
Plaintext
1074 lines
20 KiB
Plaintext
unit ps4_kernel_file;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
windows,
|
|
sys_path,
|
|
sys_fd,
|
|
sys_file,
|
|
sys_dev,
|
|
sys_dir,
|
|
Classes,
|
|
SysUtils;
|
|
|
|
function ps4_open(path:PChar;flags,mode:Integer):Integer; SysV_ABI_CDecl;
|
|
function ps4_sceKernelOpen(path:PChar;flags,mode:Integer):Integer; SysV_ABI_CDecl;
|
|
|
|
function ps4_close(fd:Integer):Integer; SysV_ABI_CDecl;
|
|
function ps4_sceKernelClose(fd:Integer):Integer; SysV_ABI_CDecl;
|
|
|
|
function ps4_lseek(fd:Integer;offset:Int64;whence:Integer):Int64; SysV_ABI_CDecl;
|
|
function ps4_sceKernelLseek(fd:Integer;offset:Int64;whence:Integer):Int64; SysV_ABI_CDecl;
|
|
|
|
function ps4_read(fd:Integer;data:Pointer;size:Int64):Int64; SysV_ABI_CDecl;
|
|
function ps4_sceKernelRead(fd:Integer;buf:Pointer;nbytes:Int64):Int64; SysV_ABI_CDecl;
|
|
|
|
function ps4_pread(fd:Integer;data:Pointer;size,offset:Int64):Int64; SysV_ABI_CDecl;
|
|
function ps4_sceKernelPread(fd:Integer;buf:Pointer;nbytes,offset:Int64):Int64; SysV_ABI_CDecl;
|
|
|
|
function ps4_readv(fd:Integer;vector:p_iovec;count:Integer):Int64; SysV_ABI_CDecl;
|
|
function ps4_sceKernelReadv(fd:Integer;iov:p_iovec;iovcnt:Integer):Int64; SysV_ABI_CDecl;
|
|
|
|
function ps4_write(fd:Integer;data:Pointer;size:Int64):Int64; SysV_ABI_CDecl;
|
|
function ps4_sceKernelWrite(fd:Integer;buf:Pointer;nbytes:Int64):Int64; SysV_ABI_CDecl;
|
|
|
|
function ps4_pwrite(fd:Integer;data:Pointer;size,offset:Int64):Int64; SysV_ABI_CDecl;
|
|
function ps4_sceKernelPwrite(fd:Integer;buf:Pointer;nbytes,offset:Int64):Int64; SysV_ABI_CDecl;
|
|
|
|
function ps4_ftruncate(fd:Integer;size:Int64):Integer; SysV_ABI_CDecl;
|
|
function ps4_sceKernelFtruncate(fd:Integer;size:Int64):Integer; SysV_ABI_CDecl;
|
|
|
|
function ps4_fstat(fd:Integer;stat:PSceKernelStat):Integer; SysV_ABI_CDecl;
|
|
function ps4_sceKernelFstat(fd:Integer;stat:PSceKernelStat):Integer; SysV_ABI_CDecl;
|
|
|
|
function ps4_getdirentries(fd:Integer;buf:Pointer;nbytes:Int64;basep:PInt64):Int64; SysV_ABI_CDecl;
|
|
function ps4_getdents(fd:Integer;buf:Pointer;nbytes:Int64):Int64; SysV_ABI_CDecl;
|
|
function ps4_sceKernelGetdirentries(fd:Integer;buf:Pointer;nbytes:Int64;basep:PInt64):Int64; SysV_ABI_CDecl;
|
|
function ps4_sceKernelGetdents(fd:Integer;buf:Pointer;nbytes:Int64):Int64; SysV_ABI_CDecl
|
|
;
|
|
function ps4_fsync(fd:Integer):Integer; SysV_ABI_CDecl;
|
|
function ps4_sceKernelFsync(fd:Integer):Integer; SysV_ABI_CDecl;
|
|
|
|
function ps4_fcntl(fd,cmd:Integer;param1:ptruint):Integer; SysV_ABI_CDecl;
|
|
function ps4_sceKernelFcntl(fd,cmd:Integer;param1:ptruint):Integer; SysV_ABI_CDecl;
|
|
|
|
function ps4_stat(path:PChar;stat:PSceKernelStat):Integer; SysV_ABI_CDecl;
|
|
function ps4_sceKernelStat(path:PChar;stat:PSceKernelStat):Integer; SysV_ABI_CDecl;
|
|
|
|
function ps4_mkdir(path:PChar;mode:Integer):Integer; SysV_ABI_CDecl;
|
|
function ps4_sceKernelMkdir(path:PChar;mode:Integer):Integer; SysV_ABI_CDecl;
|
|
|
|
function ps4_unlink(path:PChar):Integer; SysV_ABI_CDecl;
|
|
function ps4_sceKernelUnlink(path:PChar):Integer; SysV_ABI_CDecl;
|
|
|
|
function ps4_rmdir(path:PChar):Integer; SysV_ABI_CDecl;
|
|
function ps4_sceKernelRmdir(path:PChar):Integer; SysV_ABI_CDecl;
|
|
|
|
function ps4_rename(from,pto:PChar):Integer; SysV_ABI_CDecl;
|
|
function ps4_sceKernelRename(from,pto:PChar):Integer; SysV_ABI_CDecl;
|
|
|
|
function ps4_sceKernelCheckReachability(path:PChar):Integer; SysV_ABI_CDecl;
|
|
|
|
function ps4_access(path:PChar;mode:Integer):Integer; SysV_ABI_CDecl;
|
|
|
|
function ps4_getdtablesize:Integer; SysV_ABI_CDecl;
|
|
function ps4_sceKernelGetFsSandboxRandomWord:PChar; SysV_ABI_CDecl;
|
|
|
|
implementation
|
|
|
|
uses
|
|
sys_kernel,
|
|
sys_signal;
|
|
|
|
function _sys_open(path:PChar;flags,mode:Integer):Integer;
|
|
const
|
|
WR_RDWR=O_WRONLY or O_RDWR;
|
|
|
|
var
|
|
rp:RawByteString;
|
|
begin
|
|
Result:=0;
|
|
if (path=nil) then Exit(-EINVAL);
|
|
|
|
Writeln(SysLogPrefix, 'open:',path,' ',flags,' (',OctStr(mode,3),')');
|
|
|
|
if ((flags and WR_RDWR)=WR_RDWR) then
|
|
begin
|
|
Exit(-EINVAL);
|
|
end;
|
|
|
|
if (path[0]=#0) then
|
|
begin
|
|
Exit(-ENOENT);
|
|
end;
|
|
|
|
rp:='';
|
|
Result:=parse_filename(path,rp);
|
|
|
|
Case Result of
|
|
PT_ROOT:
|
|
begin
|
|
Result:=_sys_root_open(rp,flags,mode);
|
|
end;
|
|
PT_FILE:
|
|
begin
|
|
if DirectoryExists(rp) then
|
|
begin
|
|
Result:=_sys_dir_open(rp,flags,mode);
|
|
end else
|
|
begin
|
|
if (flags and O_DIRECTORY)<>0 then
|
|
begin
|
|
Exit(-ENOTDIR);
|
|
end;
|
|
Result:=_sys_file_open(rp,flags,mode);
|
|
end;
|
|
end;
|
|
PT_DEV:
|
|
begin
|
|
Result:=_sys_dev_open(rp,flags,mode);
|
|
end;
|
|
else
|
|
Exit(-EACCES);
|
|
end;
|
|
|
|
end;
|
|
|
|
function ps4_open(path:PChar;flags,mode:Integer):Integer; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_sys_open(path,flags,mode);
|
|
_sig_unlock;
|
|
|
|
if (Result<0) then
|
|
begin
|
|
Result:=_set_errno(-Result);
|
|
end else
|
|
begin
|
|
_set_errno(0);
|
|
end;
|
|
end;
|
|
|
|
function ps4_sceKernelOpen(path:PChar;flags,mode:Integer):Integer; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_sys_open(path,flags,mode);
|
|
_sig_unlock;
|
|
|
|
if (Result<0) then
|
|
begin
|
|
Result:=-Result;
|
|
_set_errno(Result);
|
|
Result:=px2sce(Result);
|
|
end else
|
|
begin
|
|
_set_errno(0);
|
|
end;
|
|
end;
|
|
|
|
function ps4_close(fd:Integer):Integer; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_set_errno(_sys_close(fd));
|
|
_sig_unlock;
|
|
end;
|
|
|
|
function ps4_sceKernelClose(fd:Integer):Integer; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_sys_close(fd);
|
|
_sig_unlock;
|
|
|
|
_set_errno(Result);
|
|
Result:=px2sce(Result);
|
|
end;
|
|
|
|
function ps4_lseek(fd:Integer;offset:Int64;whence:Integer):Int64; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_sys_lseek(fd,offset,whence);
|
|
_sig_unlock;
|
|
|
|
if (Result<0) then
|
|
begin
|
|
Result:=_set_errno(-Result);
|
|
end else
|
|
begin
|
|
_set_errno(0);
|
|
end;
|
|
end;
|
|
|
|
function ps4_sceKernelLseek(fd:Integer;offset:Int64;whence:Integer):Int64; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_sys_lseek(fd,offset,whence);
|
|
_sig_unlock;
|
|
|
|
if (Result<0) then
|
|
begin
|
|
Result:=-Result;
|
|
_set_errno(Result);
|
|
Result:=px2sce(Result);
|
|
end else
|
|
begin
|
|
_set_errno(0);
|
|
end;
|
|
end;
|
|
|
|
function ps4_read(fd:Integer;data:Pointer;size:Int64):Int64; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_sys_read(fd,data,size);
|
|
_sig_unlock;
|
|
|
|
if (Result<0) then
|
|
begin
|
|
Result:=_set_errno(-Result);
|
|
end else
|
|
begin
|
|
_set_errno(0);
|
|
end;
|
|
end;
|
|
|
|
function ps4_sceKernelRead(fd:Integer;buf:Pointer;nbytes:Int64):Int64; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_sys_read(fd,buf,nbytes);
|
|
_sig_unlock;
|
|
|
|
if (Result<0) then
|
|
begin
|
|
Result:=-Result;
|
|
_set_errno(Result);
|
|
Result:=px2sce(Result);
|
|
end else
|
|
begin
|
|
_set_errno(0);
|
|
end;
|
|
end;
|
|
|
|
function ps4_pread(fd:Integer;data:Pointer;size,offset:Int64):Int64; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_sys_pread(fd,data,size,offset);
|
|
_sig_unlock;
|
|
|
|
if (Result<0) then
|
|
begin
|
|
Result:=_set_errno(-Result);
|
|
end else
|
|
begin
|
|
_set_errno(0);
|
|
end;
|
|
end;
|
|
|
|
function ps4_sceKernelPread(fd:Integer;buf:Pointer;nbytes,offset:Int64):Int64; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_sys_pread(fd,buf,nbytes,offset);
|
|
_sig_unlock;
|
|
|
|
if (Result<0) then
|
|
begin
|
|
Result:=-Result;
|
|
_set_errno(Result);
|
|
Result:=px2sce(Result);
|
|
end else
|
|
begin
|
|
_set_errno(0);
|
|
end;
|
|
end;
|
|
|
|
function ps4_readv(fd:Integer;vector:p_iovec;count:Integer):Int64; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_sys_readv(fd,vector,count);
|
|
_sig_unlock;
|
|
|
|
if (Result<0) then
|
|
begin
|
|
Result:=_set_errno(-Result);
|
|
end else
|
|
begin
|
|
_set_errno(0);
|
|
end;
|
|
end;
|
|
|
|
function ps4_sceKernelReadv(fd:Integer;iov:p_iovec;iovcnt:Integer):Int64; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_sys_readv(fd,iov,iovcnt);
|
|
_sig_unlock;
|
|
|
|
if (Result<0) then
|
|
begin
|
|
Result:=-Result;
|
|
_set_errno(Result);
|
|
Result:=px2sce(Result);
|
|
end else
|
|
begin
|
|
_set_errno(0);
|
|
end;
|
|
end;
|
|
|
|
function ps4_write(fd:Integer;data:Pointer;size:Int64):Int64; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_sys_write(fd,data,size);
|
|
_sig_unlock;
|
|
|
|
if (Result<0) then
|
|
begin
|
|
Result:=_set_errno(-Result);
|
|
end else
|
|
begin
|
|
_set_errno(0);
|
|
end;
|
|
end;
|
|
|
|
function ps4_sceKernelWrite(fd:Integer;buf:Pointer;nbytes:Int64):Int64; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_sys_write(fd,buf,nbytes);
|
|
_sig_unlock;
|
|
|
|
if (Result<0) then
|
|
begin
|
|
Result:=-Result;
|
|
_set_errno(Result);
|
|
Result:=px2sce(Result);
|
|
end else
|
|
begin
|
|
_set_errno(0);
|
|
end;
|
|
end;
|
|
|
|
function ps4_pwrite(fd:Integer;data:Pointer;size,offset:Int64):Int64; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_sys_pwrite(fd,data,size,offset);
|
|
_sig_unlock;
|
|
|
|
if (Result<0) then
|
|
begin
|
|
Result:=_set_errno(-Result);
|
|
end else
|
|
begin
|
|
_set_errno(0);
|
|
end;
|
|
end;
|
|
|
|
function ps4_sceKernelPwrite(fd:Integer;buf:Pointer;nbytes,offset:Int64):Int64; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_sys_pwrite(fd,buf,nbytes,offset);
|
|
_sig_unlock;
|
|
|
|
if (Result<0) then
|
|
begin
|
|
Result:=-Result;
|
|
_set_errno(Result);
|
|
Result:=px2sce(Result);
|
|
end else
|
|
begin
|
|
_set_errno(0);
|
|
end;
|
|
end;
|
|
|
|
function ps4_ftruncate(fd:Integer;size:Int64):Integer; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_set_errno(_sys_ftruncate(fd,size));
|
|
_sig_unlock;
|
|
end;
|
|
|
|
function ps4_sceKernelFtruncate(fd:Integer;size:Int64):Integer; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_sys_ftruncate(fd,size);
|
|
_sig_unlock;
|
|
|
|
_set_errno(Result);
|
|
Result:=px2sce(Result);
|
|
end;
|
|
|
|
function ps4_fstat(fd:Integer;stat:PSceKernelStat):Integer; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_set_errno(_sys_fstat(fd,stat));
|
|
_sig_unlock;
|
|
end;
|
|
|
|
function ps4_sceKernelFstat(fd:Integer;stat:PSceKernelStat):Integer; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_sys_fstat(fd,stat);
|
|
_sig_unlock;
|
|
|
|
_set_errno(Result);
|
|
Result:=px2sce(Result);
|
|
end;
|
|
|
|
function ps4_getdirentries(fd:Integer;buf:Pointer;nbytes:Int64;basep:PInt64):Int64; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_sys_getdirentries(fd,buf,nbytes,basep);
|
|
_sig_unlock;
|
|
|
|
if (Result<0) then
|
|
begin
|
|
Result:=_set_errno(-Result);
|
|
end else
|
|
begin
|
|
_set_errno(0);
|
|
end;
|
|
end;
|
|
|
|
function ps4_getdents(fd:Integer;buf:Pointer;nbytes:Int64):Int64; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_sys_getdirentries(fd,buf,nbytes,nil);
|
|
_sig_unlock;
|
|
|
|
if (Result<0) then
|
|
begin
|
|
Result:=_set_errno(-Result);
|
|
end else
|
|
begin
|
|
_set_errno(0);
|
|
end;
|
|
end;
|
|
|
|
function ps4_sceKernelGetdirentries(fd:Integer;buf:Pointer;nbytes:Int64;basep:PInt64):Int64; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_sys_getdirentries(fd,buf,nbytes,basep);
|
|
_sig_unlock;
|
|
|
|
if (Result<0) then
|
|
begin
|
|
Result:=-Result;
|
|
_set_errno(Result);
|
|
Result:=px2sce(Result);
|
|
end else
|
|
begin
|
|
_set_errno(0);
|
|
end;
|
|
end;
|
|
|
|
function ps4_sceKernelGetdents(fd:Integer;buf:Pointer;nbytes:Int64):Int64; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_sys_getdirentries(fd,buf,nbytes,nil);
|
|
_sig_unlock;
|
|
|
|
if (Result<0) then
|
|
begin
|
|
Result:=-Result;
|
|
_set_errno(Result);
|
|
Result:=px2sce(Result);
|
|
end else
|
|
begin
|
|
_set_errno(0);
|
|
end;
|
|
end;
|
|
|
|
function ps4_fsync(fd:Integer):Integer; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_set_errno(_sys_fsync(fd));
|
|
_sig_unlock;
|
|
end;
|
|
|
|
function ps4_sceKernelFsync(fd:Integer):Integer; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_sys_fsync(fd);
|
|
_sig_unlock;
|
|
|
|
_set_errno(Result);
|
|
Result:=px2sce(Result);
|
|
end;
|
|
|
|
function ps4_fcntl(fd,cmd:Integer;param1:ptruint):Integer; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_set_errno(_sys_fcntl(fd,cmd,param1));
|
|
_sig_unlock;
|
|
end;
|
|
|
|
function ps4_sceKernelFcntl(fd,cmd:Integer;param1:ptruint):Integer; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_sys_fcntl(fd,cmd,param1);
|
|
_sig_unlock;
|
|
|
|
_set_errno(Result);
|
|
Result:=px2sce(Result);
|
|
end;
|
|
|
|
function _sys_stat(path:PChar;stat:PSceKernelStat):Integer;
|
|
var
|
|
rp:RawByteString;
|
|
begin
|
|
if (path=nil) or (stat=nil) then Exit(EINVAL);
|
|
|
|
if (path[0]=#0) then
|
|
begin
|
|
Exit(ENOENT);
|
|
end;
|
|
|
|
//Writeln('stat:',path);
|
|
|
|
rp:='';
|
|
Result:=parse_filename(path,rp);
|
|
|
|
stat^:=Default(SceKernelStat);
|
|
|
|
Case Result of
|
|
PT_ROOT:
|
|
begin
|
|
Result:=_sys_root_stat(rp,stat);
|
|
end;
|
|
PT_FILE:
|
|
begin
|
|
if DirectoryExists(rp) then
|
|
begin
|
|
Result:=_sys_dir_stat(rp,stat);
|
|
end else
|
|
begin
|
|
Result:=_sys_file_stat(rp,stat);
|
|
end;
|
|
end;
|
|
PT_DEV:
|
|
begin
|
|
Result:=_sys_dev_stat(rp,stat);
|
|
end;
|
|
else
|
|
Exit(EACCES);
|
|
end;
|
|
end;
|
|
|
|
function ps4_stat(path:PChar;stat:PSceKernelStat):Integer; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_set_errno(_sys_stat(path,stat));
|
|
_sig_unlock;
|
|
end;
|
|
|
|
function ps4_sceKernelStat(path:PChar;stat:PSceKernelStat):Integer; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_sys_stat(path,stat);
|
|
_sig_unlock;
|
|
|
|
_set_errno(Result);
|
|
Result:=px2sce(Result);
|
|
end;
|
|
|
|
function _sys_mkdir(path:PChar;mode:Integer):Integer;
|
|
var
|
|
fn:RawByteString;
|
|
err:DWORD;
|
|
begin
|
|
Result:=0;
|
|
|
|
if (path=nil) then Exit(EINVAL);
|
|
|
|
if (path[0]=#0) then
|
|
begin
|
|
Exit(ENOENT);
|
|
end;
|
|
|
|
Writeln('mkdir:',path);
|
|
|
|
fn:='';
|
|
Result:=parse_filename(path,fn);
|
|
|
|
Case Result of
|
|
PT_ROOT:Exit(EEXIST); //TODO
|
|
PT_FILE:;
|
|
PT_DEV :Exit(EACCES);
|
|
else
|
|
Exit(EACCES);
|
|
end;
|
|
|
|
err:=SwCreateDir(fn);
|
|
|
|
if (err<>0) then
|
|
begin
|
|
Case err of
|
|
ERROR_INVALID_DRIVE,
|
|
ERROR_PATH_NOT_FOUND,
|
|
ERROR_FILE_NOT_FOUND:
|
|
Exit(ENOENT);
|
|
|
|
ERROR_ACCESS_DENIED,
|
|
ERROR_SHARING_VIOLATION,
|
|
ERROR_LOCK_VIOLATION,
|
|
ERROR_SHARING_BUFFER_EXCEEDED:
|
|
Exit(EACCES);
|
|
|
|
ERROR_BUFFER_OVERFLOW:
|
|
Exit(ENAMETOOLONG);
|
|
|
|
ERROR_NOT_ENOUGH_MEMORY:
|
|
Exit(ENOMEM);
|
|
|
|
ERROR_ALREADY_EXISTS,
|
|
ERROR_FILE_EXISTS:
|
|
Exit(EEXIST);
|
|
|
|
ERROR_DISK_FULL:
|
|
Exit(ENOSPC);
|
|
|
|
else
|
|
Exit(EIO);
|
|
end;
|
|
end;
|
|
|
|
Result:=0;
|
|
end;
|
|
|
|
function ps4_mkdir(path:PChar;mode:Integer):Integer; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_set_errno(_sys_mkdir(path,mode));
|
|
_sig_unlock;
|
|
end;
|
|
|
|
function ps4_sceKernelMkdir(path:PChar;mode:Integer):Integer; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_sys_mkdir(path,mode);
|
|
_sig_unlock;
|
|
|
|
_set_errno(Result);
|
|
Result:=px2sce(Result);
|
|
end;
|
|
|
|
Function SwDeleteFile(Const path:RawByteString):DWORD;
|
|
var
|
|
W:WideString;
|
|
begin
|
|
Result:=0;
|
|
_sig_lock;
|
|
W:=UTF8Decode(path);
|
|
if not DeleteFileW(PWideChar(W)) then
|
|
begin
|
|
Result:=GetLastError;
|
|
end;
|
|
_sig_unlock;
|
|
end;
|
|
|
|
function _sys_unlink(path:PChar):Integer;
|
|
var
|
|
fn:RawByteString;
|
|
err:DWORD;
|
|
begin
|
|
Result:=0;
|
|
|
|
if (path=nil) then Exit(EINVAL);
|
|
|
|
if (path[0]=#0) then
|
|
begin
|
|
Exit(ENOENT);
|
|
end;
|
|
|
|
Writeln('unlink:',path);
|
|
|
|
fn:='';
|
|
Result:=parse_filename(path,fn);
|
|
|
|
Case Result of
|
|
PT_ROOT:Exit(EACCES); //TODO
|
|
PT_FILE:;
|
|
PT_DEV :Exit(EACCES);
|
|
else
|
|
Exit(EACCES);
|
|
end;
|
|
|
|
err:=SwDeleteFile(fn);
|
|
|
|
if (err<>0) then
|
|
begin
|
|
Case err of
|
|
ERROR_INVALID_DRIVE,
|
|
ERROR_PATH_NOT_FOUND,
|
|
ERROR_FILE_NOT_FOUND:
|
|
Exit(ENOENT);
|
|
|
|
ERROR_ACCESS_DENIED,
|
|
ERROR_SHARING_VIOLATION,
|
|
ERROR_LOCK_VIOLATION,
|
|
ERROR_SHARING_BUFFER_EXCEEDED:
|
|
Exit(EACCES);
|
|
|
|
ERROR_BUFFER_OVERFLOW:
|
|
Exit(ENAMETOOLONG);
|
|
|
|
ERROR_NOT_ENOUGH_MEMORY:
|
|
Exit(ENOMEM);
|
|
|
|
ERROR_ALREADY_EXISTS,
|
|
ERROR_FILE_EXISTS:
|
|
Exit(EEXIST);
|
|
|
|
ERROR_DISK_FULL:
|
|
Exit(ENOSPC);
|
|
|
|
else
|
|
Exit(EIO);
|
|
end;
|
|
end;
|
|
|
|
Result:=0;
|
|
end;
|
|
|
|
function ps4_unlink(path:PChar):Integer; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_set_errno(_sys_unlink(path));
|
|
_sig_unlock;
|
|
end;
|
|
|
|
function ps4_sceKernelUnlink(path:PChar):Integer; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_sys_unlink(path);
|
|
_sig_unlock;
|
|
|
|
_set_errno(Result);
|
|
Result:=px2sce(Result);
|
|
end;
|
|
|
|
Function SwRemoveDirectory(Const path:RawByteString):DWORD;
|
|
var
|
|
W:WideString;
|
|
begin
|
|
Result:=0;
|
|
_sig_lock;
|
|
W:=UTF8Decode(path);
|
|
if not RemoveDirectoryW(PWideChar(W)) then
|
|
begin
|
|
Result:=GetLastError;
|
|
end;
|
|
_sig_unlock;
|
|
end;
|
|
|
|
function _sys_rmdir(path:PChar):Integer;
|
|
var
|
|
fn:RawByteString;
|
|
err:DWORD;
|
|
begin
|
|
Result:=0;
|
|
|
|
if (path=nil) then Exit(EINVAL);
|
|
|
|
if (path[0]=#0) then
|
|
begin
|
|
Exit(ENOENT);
|
|
end;
|
|
|
|
Writeln('rmdir:',path);
|
|
|
|
fn:='';
|
|
Result:=parse_filename(path,fn);
|
|
|
|
Case Result of
|
|
PT_ROOT:Exit(EACCES); //TODO
|
|
PT_FILE:;
|
|
PT_DEV :Exit(EACCES);
|
|
else
|
|
Exit(EACCES);
|
|
end;
|
|
|
|
err:=SwRemoveDirectory(fn);
|
|
|
|
if (err<>0) then
|
|
begin
|
|
Case err of
|
|
ERROR_DIRECTORY,
|
|
ERROR_INVALID_DRIVE,
|
|
ERROR_PATH_NOT_FOUND,
|
|
ERROR_FILE_NOT_FOUND:
|
|
Exit(ENOENT);
|
|
|
|
ERROR_CURRENT_DIRECTORY,
|
|
ERROR_ACCESS_DENIED,
|
|
ERROR_SHARING_VIOLATION,
|
|
ERROR_LOCK_VIOLATION,
|
|
ERROR_SHARING_BUFFER_EXCEEDED:
|
|
Exit(EACCES);
|
|
|
|
ERROR_BUFFER_OVERFLOW:
|
|
Exit(ENAMETOOLONG);
|
|
|
|
ERROR_NOT_ENOUGH_MEMORY:
|
|
Exit(ENOMEM);
|
|
|
|
ERROR_ALREADY_EXISTS,
|
|
ERROR_FILE_EXISTS:
|
|
Exit(EEXIST);
|
|
|
|
ERROR_DISK_FULL:
|
|
Exit(ENOSPC);
|
|
|
|
ERROR_DIR_NOT_EMPTY:
|
|
Exit(ENOTEMPTY);
|
|
|
|
else
|
|
Exit(EIO);
|
|
end;
|
|
end;
|
|
|
|
Result:=0;
|
|
end;
|
|
|
|
function ps4_rmdir(path:PChar):Integer; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_set_errno(_sys_rmdir(path));
|
|
_sig_unlock;
|
|
end;
|
|
|
|
function ps4_sceKernelRmdir(path:PChar):Integer; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_sys_rmdir(path);
|
|
_sig_unlock;
|
|
|
|
_set_errno(Result);
|
|
Result:=px2sce(Result);
|
|
end;
|
|
|
|
Function SwMoveFileEx(Const f,t:RawByteString):DWORD;
|
|
var
|
|
Wf,Wt:WideString;
|
|
begin
|
|
Result:=0;
|
|
_sig_lock;
|
|
|
|
Wf:=UTF8Decode(f);
|
|
Wt:=UTF8Decode(t);
|
|
|
|
if not MoveFileExW(PWideChar(Wf),PWideChar(Wt),MOVEFILE_REPLACE_EXISTING or MOVEFILE_COPY_ALLOWED) then
|
|
begin
|
|
Result:=GetLastError;
|
|
end;
|
|
_sig_unlock;
|
|
end;
|
|
|
|
function _sys_rename(from,pto:PChar):Integer;
|
|
var
|
|
ffrom,fto:RawByteString;
|
|
err:DWORD;
|
|
begin
|
|
Result:=0;
|
|
|
|
if (from=nil) or (pto=nil) then Exit(EINVAL);
|
|
|
|
if (from[0]=#0) or (pto[0]=#0) then
|
|
begin
|
|
Exit(ENOENT);
|
|
end;
|
|
|
|
Writeln('rename:',from,'->',pto);
|
|
|
|
ffrom:='';
|
|
Result:=parse_filename(from,ffrom);
|
|
|
|
Case Result of
|
|
PT_ROOT:Exit(EACCES); //TODO
|
|
PT_FILE:;
|
|
PT_DEV :Exit(EACCES);
|
|
else
|
|
Exit(EACCES);
|
|
end;
|
|
|
|
fto:='';
|
|
Result:=parse_filename(pto,fto);
|
|
|
|
Case Result of
|
|
PT_ROOT:Exit(EACCES); //TODO
|
|
PT_FILE:;
|
|
PT_DEV :Exit(EACCES);
|
|
else
|
|
Exit(EACCES);
|
|
end;
|
|
|
|
err:=SwMoveFileEx(ffrom,fto);
|
|
|
|
if (err<>0) then
|
|
begin
|
|
Case err of
|
|
ERROR_DIRECTORY,
|
|
ERROR_INVALID_DRIVE,
|
|
ERROR_PATH_NOT_FOUND,
|
|
ERROR_FILE_NOT_FOUND:
|
|
Exit(ENOENT);
|
|
|
|
ERROR_CURRENT_DIRECTORY,
|
|
ERROR_ACCESS_DENIED,
|
|
ERROR_SHARING_VIOLATION,
|
|
ERROR_LOCK_VIOLATION,
|
|
ERROR_SHARING_BUFFER_EXCEEDED:
|
|
Exit(EACCES);
|
|
|
|
ERROR_BUFFER_OVERFLOW:
|
|
Exit(ENAMETOOLONG);
|
|
|
|
ERROR_NOT_ENOUGH_MEMORY:
|
|
Exit(ENOMEM);
|
|
|
|
ERROR_ALREADY_EXISTS,
|
|
ERROR_FILE_EXISTS:
|
|
Exit(EEXIST);
|
|
|
|
ERROR_DISK_FULL:
|
|
Exit(ENOSPC);
|
|
|
|
else
|
|
Exit(EIO);
|
|
end;
|
|
end;
|
|
|
|
Result:=0;
|
|
end;
|
|
|
|
function ps4_rename(from,pto:PChar):Integer; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_set_errno(_sys_rename(from,pto));
|
|
_sig_unlock;
|
|
end;
|
|
|
|
function ps4_sceKernelRename(from,pto:PChar):Integer; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_sys_rename(from,pto);
|
|
_sig_unlock;
|
|
|
|
_set_errno(Result);
|
|
Result:=px2sce(Result);
|
|
end;
|
|
|
|
function ps4_sceKernelCheckReachability(path:PChar):Integer; SysV_ABI_CDecl;
|
|
var
|
|
fn:RawByteString;
|
|
ex:Boolean;
|
|
begin
|
|
Result:=0;
|
|
|
|
if (path=nil) then Exit(_set_sce_errno(SCE_KERNEL_ERROR_EINVAL));
|
|
if (path[0]=#0) then
|
|
begin
|
|
Exit(_set_sce_errno(SCE_KERNEL_ERROR_ENOENT));
|
|
end;
|
|
|
|
Writeln('sceKernelCheckReachability:',path);
|
|
|
|
fn:='';
|
|
_sig_lock;
|
|
Result:=parse_filename(path,fn);
|
|
_sig_unlock;
|
|
|
|
Case Result of
|
|
PT_ROOT:Exit(_set_sce_errno(0)); //TODO dir exists
|
|
PT_FILE:;
|
|
PT_DEV :Exit(_set_sce_errno(0));
|
|
else
|
|
Exit(_set_sce_errno(SCE_KERNEL_ERROR_EACCES));
|
|
end;
|
|
|
|
_sig_lock;
|
|
ex:=FileExists(fn) or DirectoryExists(fn);
|
|
_sig_unlock;
|
|
|
|
if ex then
|
|
begin
|
|
Result:=0;
|
|
_set_errno(0);
|
|
end else
|
|
begin
|
|
Result:=_set_sce_errno(SCE_KERNEL_ERROR_ENOENT);
|
|
end;
|
|
|
|
end;
|
|
|
|
//access function
|
|
const
|
|
F_OK = $00; // test for existence of file
|
|
X_OK = $01; // test for execute or search permission
|
|
W_OK = $02; // test for write permission
|
|
R_OK = $04; // test for read permission
|
|
|
|
A_ALL=F_OK or X_OK or W_OK or R_OK;
|
|
|
|
function sys_access(path:PChar;mode:Integer):Integer;
|
|
var
|
|
fn:RawByteString;
|
|
begin
|
|
Result:=0;
|
|
|
|
if (path=nil) then Exit(EFAULT);
|
|
|
|
if (path[0]=#0) then
|
|
begin
|
|
Exit(ENOENT);
|
|
end;
|
|
|
|
if ((mode and (not A_ALL))<>0) then
|
|
begin
|
|
Exit(EINVAL);
|
|
end;
|
|
|
|
fn:='';
|
|
Result:=parse_filename(path,fn);
|
|
|
|
Case Result of
|
|
PT_ROOT:Exit(0); //TODO test dir exits
|
|
PT_FILE:;
|
|
PT_DEV :Exit(0);
|
|
else
|
|
Exit(EACCES);
|
|
end;
|
|
|
|
if FileExists(fn) or DirectoryExists(fn) then
|
|
begin
|
|
Result:=0;
|
|
end else
|
|
begin
|
|
Result:=ENOENT;
|
|
end;
|
|
|
|
end;
|
|
|
|
function ps4_access(path:PChar;mode:Integer):Integer; SysV_ABI_CDecl;
|
|
begin
|
|
_sig_lock;
|
|
Result:=_set_errno(sys_access(path,mode));
|
|
_sig_unlock;
|
|
end;
|
|
|
|
function ps4_getdtablesize:Integer; SysV_ABI_CDecl;
|
|
begin
|
|
Result:=High(Integer);
|
|
_set_errno(0);
|
|
end;
|
|
|
|
const
|
|
fs_word:Pchar='sys';
|
|
|
|
function ps4_sceKernelGetFsSandboxRandomWord:PChar; SysV_ABI_CDecl;
|
|
begin
|
|
//__sys_randomized_path
|
|
Result:=fs_word;
|
|
end;
|
|
|
|
end.
|
|
|