From 8834571b202cf4dc9c649cfb096c213b6ecf1566 Mon Sep 17 00:00:00 2001 From: Kacper Date: Thu, 25 Dec 2025 15:13:54 +0100 Subject: Move __dirent.h to libc/dirent.h --- lib/libc/dirent/closedir.c | 10 ++--- lib/libc/dirent/fdopendir.c | 14 ++++--- lib/libc/dirent/readdir_r.c | 57 +++++++++++---------------- lib/libc/errno/errno.c | 8 ++-- lib/libc/internal/deinit/deinit.c | 6 +++ lib/libc/internal/deinit/tls.c | 2 +- lib/libc/internal/include/__dirent.h | 24 ----------- lib/libc/internal/include/internal/io_uring.h | 6 --- lib/libc/internal/include/libc/dirent.h | 20 +++++++++- lib/libc/stdlib/calloc.c | 5 +-- lib/libc/unistd/write.c | 7 +--- 11 files changed, 70 insertions(+), 89 deletions(-) create mode 100644 lib/libc/internal/deinit/deinit.c delete mode 100644 lib/libc/internal/include/__dirent.h delete mode 100644 lib/libc/internal/include/internal/io_uring.h (limited to 'lib/libc') diff --git a/lib/libc/dirent/closedir.c b/lib/libc/dirent/closedir.c index 873364c2..bc2efb08 100644 --- a/lib/libc/dirent/closedir.c +++ b/lib/libc/dirent/closedir.c @@ -1,8 +1,8 @@ -#include <__dirent.h> // for __DIR -#include // for DIR, closedir -#include // for EBADF, errno -#include // for free -#include // for close +#include // for DIR, closedir +#include // for EBADF, errno +#include // for __DIR +#include // for free +#include // for close int closedir(DIR *dirp) { diff --git a/lib/libc/dirent/fdopendir.c b/lib/libc/dirent/fdopendir.c index c0e3492b..145d7404 100644 --- a/lib/libc/dirent/fdopendir.c +++ b/lib/libc/dirent/fdopendir.c @@ -1,20 +1,22 @@ #include "stddef.h" // for NULL -#include <__dirent.h> // for __DIR -#include // for DIR, fdopendir -#include // for EBADF, errno -#include // for calloc +#include +#include +#include +#include +#include DIR *fdopendir(int fildes) { struct __DIR *dir; - if (fildes < 0) { + if (__predict_false(fildes < 0)) { errno = EBADF; return NULL; } - if ((dir = calloc(1, sizeof(struct __DIR))) == NULL) { + dir = calloc(1, sizeof(struct __DIR)); + if (__predict_false(dir == NULL)) { return NULL; } diff --git a/lib/libc/dirent/readdir_r.c b/lib/libc/dirent/readdir_r.c index c7bffdea..049865f2 100644 --- a/lib/libc/dirent/readdir_r.c +++ b/lib/libc/dirent/readdir_r.c @@ -2,21 +2,20 @@ #include "sys/types.h" // for off_t -#include <__dirent.h> // for linux_dirent64 -#include // for dirent, ssize_t, DIR, readdir_r -#include // for EINVAL, errno -#include // for NULL, offsetof -#include // for memcpy, size_t, memset -#include // for __syscall_3, syscall - -int readdir_r(DIR *restrict dirp, struct dirent *restrict entry, - struct dirent **restrict result) +#include // for dirent, ssize_t, DIR, readdir_r +#include // for EINVAL, errno +#include // for linux_dirent64 +#include // for NULL, offsetof +#include // for memcpy, size_t, memset +#include // for __syscall_3, syscall + +int readdir_r(DIR *restrict dirp, struct dirent *restrict entry, struct dirent **restrict result) { struct linux_dirent64 *ldir = (void *)dirp->buffer; ssize_t nread; int ret; - if (dirp == NULL || entry == NULL || result == NULL) { + if (dirp == NULL || entry == NULL || (void *)result == NULL) { return EINVAL; } @@ -28,19 +27,15 @@ int readdir_r(DIR *restrict dirp, struct dirent *restrict entry, /* Validate buffer bounds */ if (dirp->offset >= (off_t)sizeof(dirp->buffer) || - dirp->offset + (off_t)sizeof(struct linux_dirent64) > - (off_t)sizeof(dirp->buffer)) { + dirp->offset + (off_t)sizeof(struct linux_dirent64) > (off_t)sizeof(dirp->buffer)) { dirp->cached = 0; *result = NULL; return 0; } /* Validate record length */ - if (ldir->d_reclen < - offsetof(struct linux_dirent64, d_name) + 1 || - dirp->offset + (off_t)ldir->d_reclen > - (off_t)sizeof(dirp->buffer) || - ldir->d_reclen == 0) { + if (ldir->d_reclen < offsetof(struct linux_dirent64, d_name) + 1 || + dirp->offset + (off_t)ldir->d_reclen > (off_t)sizeof(dirp->buffer) || ldir->d_reclen == 0) { dirp->cached = 0; *result = NULL; return 0; @@ -49,16 +44,14 @@ int readdir_r(DIR *restrict dirp, struct dirent *restrict entry, entry->d_ino = ldir->d_ino; /* Calculate available space for name */ - size_t max_name_len = ldir->d_reclen - - offsetof(struct linux_dirent64, d_name); + size_t max_name_len = ldir->d_reclen - offsetof(struct linux_dirent64, d_name); if (max_name_len > sizeof(entry->d_name) - 1) { max_name_len = sizeof(entry->d_name) - 1; } /* Find actual string length, bounded by available space */ size_t name_len = 0; - while (name_len < max_name_len && - ldir->d_name[name_len] != '\0') { + while (name_len < max_name_len && ldir->d_name[name_len] != '\0') { name_len++; } @@ -75,8 +68,7 @@ int readdir_r(DIR *restrict dirp, struct dirent *restrict entry, dirp->cached = 0; dirp->offset = 0; - ret = syscall(getdents64, dirp->fildes, dirp->buffer, - sizeof(dirp->buffer)); + ret = syscall(getdents64, dirp->fildes, dirp->buffer, sizeof(dirp->buffer)); if (ret < 0) return errno; @@ -90,8 +82,8 @@ int readdir_r(DIR *restrict dirp, struct dirent *restrict entry, /* Validate first entry bounds */ if (nread < (ssize_t)sizeof(struct linux_dirent64) || - ldir->d_reclen < offsetof(struct linux_dirent64, d_name) + 1 || - ldir->d_reclen > nread || ldir->d_reclen == 0) { + ldir->d_reclen < offsetof(struct linux_dirent64, d_name) + 1 || ldir->d_reclen > nread || + ldir->d_reclen == 0) { *result = NULL; return EINVAL; } @@ -100,8 +92,7 @@ int readdir_r(DIR *restrict dirp, struct dirent *restrict entry, entry->d_ino = ldir->d_ino; /* Calculate available space for name */ - size_t max_name_len = - ldir->d_reclen - offsetof(struct linux_dirent64, d_name); + size_t max_name_len = ldir->d_reclen - offsetof(struct linux_dirent64, d_name); if (max_name_len > sizeof(entry->d_name) - 1) { max_name_len = sizeof(entry->d_name) - 1; } @@ -119,16 +110,12 @@ int readdir_r(DIR *restrict dirp, struct dirent *restrict entry, /* Count the amount of remaining entries we have cached from getdents. */ for (ssize_t buffer_offset = ldir->d_reclen; buffer_offset < nread;) { - struct linux_dirent64 *next_ldir = - (void *)(dirp->buffer + buffer_offset); + struct linux_dirent64 *next_ldir = (void *)(dirp->buffer + buffer_offset); /* Validate entry bounds to prevent infinite loops */ - if (buffer_offset + (ssize_t)sizeof(struct linux_dirent64) > - nread || - next_ldir->d_reclen < - offsetof(struct linux_dirent64, d_name) + 1 || - buffer_offset + next_ldir->d_reclen > nread || - next_ldir->d_reclen == 0) { + if (buffer_offset + (ssize_t)sizeof(struct linux_dirent64) > nread || + next_ldir->d_reclen < offsetof(struct linux_dirent64, d_name) + 1 || + buffer_offset + next_ldir->d_reclen > nread || next_ldir->d_reclen == 0) { break; } diff --git a/lib/libc/errno/errno.c b/lib/libc/errno/errno.c index 56925b9f..08d5dd83 100644 --- a/lib/libc/errno/errno.c +++ b/lib/libc/errno/errno.c @@ -3,9 +3,11 @@ #include -/* Ensure TLS is initialized if errno is used */ -extern void __init_tls(void); -void *__force_tls_init = (void *) __init_tls; +extern void __libc_init_tls(void); +void *__libc_force_init_tls = (void *)__libc_init_tls; + +extern void __libc_deinit_tls(void); +void *__libc_force_deinit_tls = (void *)__libc_deinit_tls; int *__errno(void) { diff --git a/lib/libc/internal/deinit/deinit.c b/lib/libc/internal/deinit/deinit.c new file mode 100644 index 00000000..e89e6a0c --- /dev/null +++ b/lib/libc/internal/deinit/deinit.c @@ -0,0 +1,6 @@ +extern void __libc_deinit_tls(); + +void __libc_deinit(void) +{ + __libc_deinit_tls(); +} diff --git a/lib/libc/internal/deinit/tls.c b/lib/libc/internal/deinit/tls.c index 438f0122..0eb78aeb 100644 --- a/lib/libc/internal/deinit/tls.c +++ b/lib/libc/internal/deinit/tls.c @@ -1,7 +1,7 @@ #include #include -void __deinit_tls(void) +void __libc_deinit_tls(void) { int r; diff --git a/lib/libc/internal/include/__dirent.h b/lib/libc/internal/include/__dirent.h deleted file mode 100644 index 4f9ead80..00000000 --- a/lib/libc/internal/include/__dirent.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef __LIBC_DIRENT_H -#define __LIBC_DIRENT_H - -#include -#include -#include - -struct linux_dirent64 { - uint64_t d_ino; - int64_t d_off; - unsigned short d_reclen; - unsigned char d_type; - char d_name[]; -}; - -struct __DIR { - int fildes; - int cached; - off_t tell; - off_t offset; - char buffer[BUFSIZ] __attribute__((__aligned__(8))); -}; - -#endif diff --git a/lib/libc/internal/include/internal/io_uring.h b/lib/libc/internal/include/internal/io_uring.h deleted file mode 100644 index e7369146..00000000 --- a/lib/libc/internal/include/internal/io_uring.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef __INTERNAL_IO_URING_H -#define __INTERNAL_IO_URING_H - -void __io_uring_init(void); - -#endif diff --git a/lib/libc/internal/include/libc/dirent.h b/lib/libc/internal/include/libc/dirent.h index 296cc91e..4f9ead80 100644 --- a/lib/libc/internal/include/libc/dirent.h +++ b/lib/libc/internal/include/libc/dirent.h @@ -1,6 +1,24 @@ #ifndef __LIBC_DIRENT_H #define __LIBC_DIRENT_H -struct __DIR {}; +#include +#include +#include + +struct linux_dirent64 { + uint64_t d_ino; + int64_t d_off; + unsigned short d_reclen; + unsigned char d_type; + char d_name[]; +}; + +struct __DIR { + int fildes; + int cached; + off_t tell; + off_t offset; + char buffer[BUFSIZ] __attribute__((__aligned__(8))); +}; #endif diff --git a/lib/libc/stdlib/calloc.c b/lib/libc/stdlib/calloc.c index 89e16f80..b472d446 100644 --- a/lib/libc/stdlib/calloc.c +++ b/lib/libc/stdlib/calloc.c @@ -1,5 +1,3 @@ -#include "stddef.h" // for NULL - #include // for errno, EINVAL, ENOMEM #include // for calloc, malloc #include // for size_t, memset @@ -19,7 +17,8 @@ void *calloc(size_t nelem, size_t elsize) return NULL; } - if ((ptr = malloc(total)) != NULL) { + ptr = malloc(total); + if (ptr != NULL) { memset(ptr, 0, total); } diff --git a/lib/libc/unistd/write.c b/lib/libc/unistd/write.c index 85dfaff2..9e8ce260 100644 --- a/lib/libc/unistd/write.c +++ b/lib/libc/unistd/write.c @@ -1,8 +1,5 @@ - - -#include -#include // for __syscall_3, syscall -#include // for size_t, ssize_t, write +#include +#include ssize_t write(int fd, const void *buf, size_t count) { -- cgit v1.2.3