Merge pull request #3005 from babyhuey/feat/libkernel-preadv
feat(libkernel): implement preadv and pwritev
This commit is contained in:
commit
c051e83c4e
|
|
@ -885,6 +885,16 @@ int64_t APS5_VABI sceKernelPwritev(int d, const KernelIovec* iov, int iovcnt, in
|
|||
|
||||
#endif
|
||||
|
||||
int64_t APS5_VABI preadv_nid_postfix(int d, const KernelIovec* iov, int iovcnt, int64_t offset) {
|
||||
const auto result = sceKernelPreadv(d, iov, iovcnt, offset);
|
||||
return result < 0 ? PosixFailure(static_cast<int>(result) & 0xffff) : result;
|
||||
}
|
||||
|
||||
int64_t APS5_VABI pwritev_nid_postfix(int d, const KernelIovec* iov, int iovcnt, int64_t offset) {
|
||||
const auto result = sceKernelPwritev(d, iov, iovcnt, offset);
|
||||
return result < 0 ? PosixFailure(static_cast<int>(result) & 0xffff) : result;
|
||||
}
|
||||
|
||||
int APS5_VABI sceKernelRename(const char* from, const char* to) {
|
||||
if (from == nullptr || to == nullptr) throw std::invalid_argument("sceKernelRename: path is null");
|
||||
const auto source = ResolvePath_nid_no_patch(from);
|
||||
|
|
|
|||
|
|
@ -36,6 +36,9 @@ std::int64_t APS5_VABI sceKernelReadv(int, const GuestIovec*, int);
|
|||
std::int64_t APS5_VABI sceKernelWritev(int, const GuestIovec*, int);
|
||||
std::int64_t APS5_VABI sceKernelPreadv(int, const GuestIovec*, int, std::int64_t);
|
||||
std::int64_t APS5_VABI sceKernelPwritev(int, const GuestIovec*, int, std::int64_t);
|
||||
std::int64_t APS5_VABI preadv_nid_postfix(int, const GuestIovec*, int, std::int64_t);
|
||||
std::int64_t APS5_VABI pwritev_nid_postfix(int, const GuestIovec*, int, std::int64_t);
|
||||
int* APS5_VABI __error_nid_postfix();
|
||||
std::int64_t APS5_VABI sceKernelPread(int, void*, std::size_t, std::int64_t);
|
||||
std::int64_t APS5_VABI sceKernelPwrite(int, const void*, std::size_t, std::int64_t);
|
||||
int APS5_VABI sceKernelFtruncate(int, std::int64_t);
|
||||
|
|
@ -123,6 +126,30 @@ int main() {
|
|||
Require(sceKernelPwritev(file, writes, 2, -1) == ErrorEinval);
|
||||
Require(Contents(path) == "01ABCDE7ABCDE");
|
||||
|
||||
Require(sceKernelLseek(file, 4, 0) == 4);
|
||||
Require(preadv_nid_postfix(file, reads, 2, 1) == 7);
|
||||
Require(std::memcmp(first, "1AB", 3) == 0 && std::memcmp(second, "CDE7", 4) == 0);
|
||||
Require(sceKernelLseek(file, 0, 1) == 4);
|
||||
Require(preadv_nid_postfix(file, reads, 2, 13) == 0);
|
||||
Require(preadv_nid_postfix(file, reads, 2, -1) == -1 && *__error_nid_postfix() == 22);
|
||||
Require(preadv_nid_postfix(file, reads, -1, 0) == -1 && *__error_nid_postfix() == 22);
|
||||
Require(preadv_nid_postfix(file, nullptr, 1, 0) == -1 && *__error_nid_postfix() == 14);
|
||||
Require(pwritev_nid_postfix(file, writes, 2, 8) == 5);
|
||||
Require(sceKernelLseek(file, 0, 1) == 4);
|
||||
Require(Contents(path) == "01ABCDE7ABCDE");
|
||||
char x[] = "X";
|
||||
char y[] = "Y";
|
||||
GuestIovec marks[2] = {{x, 1}, {y, 1}};
|
||||
Require(pwritev_nid_postfix(file, marks, 2, 0) == 2);
|
||||
Require(Contents(path) == "XYABCDE7ABCDE");
|
||||
char zero[] = "0";
|
||||
char one[] = "1";
|
||||
GuestIovec restore[2] = {{zero, 1}, {one, 1}};
|
||||
Require(pwritev_nid_postfix(file, restore, 2, 0) == 2);
|
||||
Require(sceKernelLseek(file, 0, 1) == 4);
|
||||
Require(pwritev_nid_postfix(file, writes, 2, -1) == -1 && *__error_nid_postfix() == 22);
|
||||
Require(pwritev_nid_postfix(file, nullptr, 1, 0) == -1 && *__error_nid_postfix() == 14);
|
||||
|
||||
char byte = 0;
|
||||
Require(sceKernelPread(file, &byte, 1, 2) == 1 && byte == 'A');
|
||||
Require(sceKernelPread(file, nullptr, 0, 0) == 0);
|
||||
|
|
|
|||
Loading…
Reference in New Issue