diff --git a/kernel/ps4_kernel_file.pas b/kernel/ps4_kernel_file.pas index 38e40906..b9d4dd4c 100644 --- a/kernel/ps4_kernel_file.pas +++ b/kernel/ps4_kernel_file.pas @@ -66,6 +66,9 @@ function ps4_ioctl(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_truncate(path:PChar;length:Int64):Integer; SysV_ABI_CDecl; +function ps4_sceKernelTruncate(path:PChar;length:Int64):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; @@ -651,6 +654,65 @@ begin Result:=px2sce(Result); end; +function _sys_truncate(path:PChar;length:Int64):Integer; +var + fn:RawByteString; +begin + Result:=0; + + if (path=nil) then Exit(EINVAL); + if (length<=0) then Exit(EINVAL); + + if (path[0]=#0) then + begin + Exit(ENOENT); + end; + + Writeln(SysLogPrefix,'truncate:',path,' ',length); + + fn:=''; + Result:=parse_filename(path,fn); + + Case Result of + PT_ROOT:Exit(EACCES); //TODO + PT_FILE:; + PT_DEV :Exit(EACCES); + else + Exit(EACCES); + end; + + if FileExists(fn) then + begin + Result:=_sys_file_trunc(fn,length); + end else + begin + if DirectoryExists(fn) then + begin + Result:=EISDIR; + end else + begin + Result:=ENOENT; + end; + end; +end; + +function ps4_truncate(path:PChar;length:Int64):Integer; SysV_ABI_CDecl; +begin + _sig_lock; + Result:=_set_errno(_sys_truncate(path,length)); + _sig_unlock; +end; + +function ps4_sceKernelTruncate(path:PChar;length:Int64):Integer; SysV_ABI_CDecl; +begin + _sig_lock; + Result:=_sys_truncate(path,length); + _sig_unlock; + + _set_errno(Result); + Result:=px2sce(Result); +end; + function _sys_mkdir(path:PChar;mode:Integer):Integer; var fn:RawByteString; diff --git a/kernel/ps4_libkernel.pas b/kernel/ps4_libkernel.pas index 9b3c3f1c..3a66dc2c 100644 --- a/kernel/ps4_libkernel.pas +++ b/kernel/ps4_libkernel.pas @@ -1718,6 +1718,9 @@ begin lib^.set_proc($13A6A8DF8C0FC3E5,@ps4_stat); lib^.set_proc($795F70003DAB8880,@ps4_sceKernelStat); + lib^.set_proc($6B2AEDB3323B1818,@ps4_truncate); + lib^.set_proc($5A5C8403FB0B0DFD,@ps4_sceKernelTruncate); + lib^.set_proc($246322A3EDB52F87,@ps4_mkdir); lib^.set_proc($D7F2C52E6445C713,@ps4_sceKernelMkdir); diff --git a/sys/sys_file.pas b/sys/sys_file.pas index 08bd8de4..5ba732b5 100644 --- a/sys/sys_file.pas +++ b/sys/sys_file.pas @@ -16,6 +16,7 @@ uses function _sys_file_open(const path:RawByteString;flags,mode:Integer):Integer; function _sys_file_stat(Const path:RawByteString;stat:PSceKernelStat):Integer; +function _sys_file_trunc(Const path:RawByteString;length:Int64):Integer; implementation @@ -169,13 +170,26 @@ var begin f:=nil; Result:=__sys_file_open(path,O_RDONLY,0,f); - if (Result<>0) then Exit(-Result); + if (Result<>0) then Exit; Result:=f.fstat(stat); f.Destroy; end; +function _sys_file_trunc(Const path:RawByteString;length:Int64):Integer; +var + f:TFile; +begin + f:=nil; + Result:=__sys_file_open(path,O_RDWR,0,f); + if (Result<>0) then Exit; + + Result:=f.ftruncate(length); + + f.Destroy; +end; + // Constructor TFile.Create;