drgn/libdrgn/io.c
Omar Sandoval b8cdfff250 libdrgn: add read(2) and pread(2) wrappers that don't return short reads
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>
2022-08-26 12:43:20 -07:00

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;
}