0001
0002 #include <unistd.h>
0003 #include <stdbool.h>
0004 #include <errno.h>
0005 #include <linux/kernel.h>
0006 #include <internal/lib.h>
0007
0008 unsigned int page_size;
0009
0010 static ssize_t ion(bool is_read, int fd, void *buf, size_t n)
0011 {
0012 void *buf_start = buf;
0013 size_t left = n;
0014
0015 while (left) {
0016
0017 ssize_t ret = is_read ? read(fd, buf, left) :
0018 write(fd, buf, left);
0019
0020 if (ret < 0 && errno == EINTR)
0021 continue;
0022 if (ret <= 0)
0023 return ret;
0024
0025 left -= ret;
0026 buf += ret;
0027 }
0028
0029 BUG_ON((size_t)(buf - buf_start) != n);
0030 return n;
0031 }
0032
0033
0034
0035
0036 ssize_t readn(int fd, void *buf, size_t n)
0037 {
0038 return ion(true, fd, buf, n);
0039 }
0040
0041 ssize_t preadn(int fd, void *buf, size_t n, off_t offs)
0042 {
0043 size_t left = n;
0044
0045 while (left) {
0046 ssize_t ret = pread(fd, buf, left, offs);
0047
0048 if (ret < 0 && errno == EINTR)
0049 continue;
0050 if (ret <= 0)
0051 return ret;
0052
0053 left -= ret;
0054 buf += ret;
0055 offs += ret;
0056 }
0057
0058 return n;
0059 }
0060
0061
0062
0063
0064 ssize_t writen(int fd, const void *buf, size_t n)
0065 {
0066
0067 return ion(false, fd, (void *)buf, n);
0068 }