Commit 618ee783 authored by Adrian Hunter's avatar Adrian Hunter Committed by Arnaldo Carvalho de Melo
Browse files

libperf: Add preadn()



Add preadn() to provide pread() and readn() semantics.

Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: https://lore.kernel.org/r/ab8918a4-7ac8-a37e-2e2c-28438c422d87@intel.com


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 237c96b8
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -9,4 +9,6 @@ extern unsigned int page_size;
ssize_t readn(int fd, void *buf, size_t n);
ssize_t writen(int fd, const void *buf, size_t n);

ssize_t preadn(int fd, void *buf, size_t n, off_t offs);

#endif /* __LIBPERF_INTERNAL_CPUMAP_H */
+20 −0
Original line number Diff line number Diff line
@@ -38,6 +38,26 @@ ssize_t readn(int fd, void *buf, size_t n)
	return ion(true, fd, buf, n);
}

ssize_t preadn(int fd, void *buf, size_t n, off_t offs)
{
	size_t left = n;

	while (left) {
		ssize_t ret = pread(fd, buf, left, offs);

		if (ret < 0 && errno == EINTR)
			continue;
		if (ret <= 0)
			return ret;

		left -= ret;
		buf  += ret;
		offs += ret;
	}

	return n;
}

/*
 * Write exactly 'n' bytes or return an error.
 */