Proper xxread and xwrite implementation

This commit is contained in:
topjohnwu 2021-01-17 01:42:45 -08:00
parent 1f4c595cd3
commit 79140c7636
2 changed files with 23 additions and 9 deletions

View File

@ -27,6 +27,6 @@ android.injected.testOnly=false
kapt.incremental.apt=true kapt.incremental.apt=true
# Magisk # Magisk
magisk.versionCode=21303 magisk.versionCode=21304
magisk.ndkVersion=21d magisk.ndkVersion=21d
magisk.fullNdkVersion=21.3.6528147 magisk.fullNdkVersion=21.3.6528147

View File

@ -61,12 +61,24 @@ int xopenat(int dirfd, const char *pathname, int flags, mode_t mode) {
return fd; return fd;
} }
// Write exact same size as count
ssize_t xwrite(int fd, const void *buf, size_t count) { ssize_t xwrite(int fd, const void *buf, size_t count) {
int ret = write(fd, buf, count); size_t write_sz = 0;
if (count != ret) { ssize_t ret;
PLOGE("write"); do {
ret = write(fd, (byte *) buf + write_sz, count - write_sz);
if (ret < 0) {
if (errno == EINTR)
continue;
PLOGE("write");
return ret;
}
write_sz += ret;
} while (write_sz != count && ret != 0);
if (write_sz != count) {
PLOGE("write (%zu != %zu)", count, write_sz);
} }
return ret; return write_sz;
} }
// Read error other than EOF // Read error other than EOF
@ -81,15 +93,17 @@ ssize_t xread(int fd, void *buf, size_t count) {
// Read exact same size as count // Read exact same size as count
ssize_t xxread(int fd, void *buf, size_t count) { ssize_t xxread(int fd, void *buf, size_t count) {
size_t read_sz = 0; size_t read_sz = 0;
int ret = -1; ssize_t ret;
while (read_sz != count && ret != 0) { do {
ret = read(fd, buf, count); ret = read(fd, (byte *) buf + read_sz, count - read_sz);
if (ret < 0) { if (ret < 0) {
if (errno == EINTR)
continue;
PLOGE("read"); PLOGE("read");
return ret; return ret;
} }
read_sz += ret; read_sz += ret;
} } while (read_sz != count && ret != 0);
if (read_sz != count) { if (read_sz != count) {
PLOGE("read (%zu != %zu)", count, read_sz); PLOGE("read (%zu != %zu)", count, read_sz);
} }