liblinux++

Log | Files | Refs

commit bb953343daf4a229c1538a2bce2d0266f11a808c
parent 04700ad5b7b89dcf7b50c6e0a2284e522271ee4f
Author: Henry Wilson <henry@henryandlizzy.uk>
Date:   Sun, 21 Dec 2025 21:12:08 +0000

Interpret errno

Diffstat:
Mcat.c | 6+++---
Mlinux.h | 9++++++++-
Mpaste.c | 8++++----
Mtac.c | 8++++----
4 files changed, 19 insertions(+), 12 deletions(-)

diff --git a/cat.c b/cat.c @@ -7,7 +7,7 @@ static void cat(int fd) for (;;) { int n = read(fd, buf, sizeof(buf)); - if (n < 0) + if (get_errno(n)) exit(2); if (n == 0) return; @@ -20,8 +20,8 @@ int main(int argc, char* argv[]) { for (int i = 1; i < argc; ++i) { - int fd = openat(AT_FDCWD, argv[i], 0, /*O_RDONLY*/0); - if (fd < 0) + int fd = openat(AT_FDCWD, argv[i], 0, O_RDONLY); + if (get_errno(fd)) return 1; cat(fd); close(fd); diff --git a/linux.h b/linux.h @@ -56,4 +56,11 @@ struct linux_dirent64 { }; extern ssize_t getdents64(int fd, struct linux_dirent64 dirp[], size_t count); -extern void* mmap(void* addr, unsigned long len, unsigned long prot, unsigned long flags, unsigned long fd, unsigned long off); +extern intptr_t mmap(void* addr, unsigned long len, unsigned long prot, unsigned long flags, unsigned long fd, unsigned long off); + +static unsigned get_errno(ssize_t ret) +{ + if (0 > ret && ret >= -0xFFFF) + return -ret; + return 0; +} diff --git a/paste.c b/paste.c @@ -28,12 +28,12 @@ int main(int argc, char* argv[]) for (int i = 1; i < argc; ++i) { int fd = openat(AT_FDCWD, argv[i], 0, 0); - if (fd < 0) + if (get_errno(fd)) return 1; - struct input* m = mmap(mappable + n_inputs++, sizeof(struct input), PROT_READ | PROT_WRITE, MAP_FIXED | MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); - if ((long long)m < 0) + intptr_t m = mmap(mappable + n_inputs++, sizeof(struct input), PROT_READ | PROT_WRITE, MAP_FIXED | MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + if (get_errno(m)) return 2; - m->fd = fd; + ((struct input*)m)->fd = fd; } for (;;) diff --git a/tac.c b/tac.c @@ -8,7 +8,7 @@ static int rd(int const fd, char* const start, char const* const end) while (pos != end) { int n = read(fd, pos, end - pos); - if (n < 0) + if (get_errno(n)) exit(2); if (n == 0) break; @@ -22,7 +22,7 @@ static void wr(int const fd, char const* start, char const* const end) while (start != end) { int n = write(fd, start, end - start); - if (n < 0) + if (get_errno(n)) exit(3); start += n; } @@ -36,8 +36,8 @@ int main() while (len == cap) { - void* m = mmap(buf + cap, cap ?: 0x1000, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); - if ((intptr_t)m < 0) + intptr_t m = mmap(buf + cap, cap ?: 0x1000, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + if (get_errno(m)) return 1; cap += cap ?: 0x1000;