mirror of
https://github.com/JakeHillion/drgn.git
synced 2024-12-22 17:23:06 +00:00
b8cdfff250
We have a couple of loops that deal with short reads/EINTR from read(2) and pread(2), and upcoming changes would need to add more. Add some wrappers to abstract this away. drgn_read_memory_file() still needs the loop so it can fault on the exact offset that returns EIO. Signed-off-by: Omar Sandoval <osandov@osandov.com>
51 lines
862 B
C
51 lines
862 B
C
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
#include <errno.h>
|
|
#include <limits.h>
|
|
#include <unistd.h>
|
|
|
|
#include "io.h"
|
|
|
|
ssize_t read_all(int fd, void *buf, size_t count)
|
|
{
|
|
if (count > SSIZE_MAX) {
|
|
errno = EINVAL;
|
|
return -1;
|
|
}
|
|
size_t n = 0;
|
|
while (n < count) {
|
|
ssize_t r = read(fd, (char *)buf + n, count - n);
|
|
if (r < 0) {
|
|
if (errno == EINTR)
|
|
continue;
|
|
return r;
|
|
} else if (r == 0) {
|
|
break;
|
|
}
|
|
n += r;
|
|
}
|
|
return n;
|
|
}
|
|
|
|
ssize_t pread_all(int fd, void *buf, size_t count, off_t offset)
|
|
{
|
|
if (count > SSIZE_MAX) {
|
|
errno = EINVAL;
|
|
return -1;
|
|
}
|
|
size_t n = 0;
|
|
while (n < count) {
|
|
ssize_t r = pread(fd, (char *)buf + n, count - n, offset + n);
|
|
if (r < 0) {
|
|
if (errno == EINTR)
|
|
continue;
|
|
return r;
|
|
} else if (r == 0) {
|
|
break;
|
|
}
|
|
n += r;
|
|
}
|
|
return n;
|
|
}
|