commit bb953343daf4a229c1538a2bce2d0266f11a808c
parent 04700ad5b7b89dcf7b50c6e0a2284e522271ee4f
Author: Henry Wilson <henry@henryandlizzy.uk>
Date: Sun, 21 Dec 2025 21:12:08 +0000
Interpret errno
Diffstat:
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;