summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorKacper <kacper@mail.openlinux.dev>2025-12-25 15:13:54 +0100
committerKacper <kacper@mail.openlinux.dev>2025-12-25 15:13:54 +0100
commit8834571b202cf4dc9c649cfb096c213b6ecf1566 (patch)
tree1cde1c0f0b823391d3d289ac89591c13be8cbb3b /lib
parent46fadf4bf14360be046b9b770ddf205fad96a0a7 (diff)
Move __dirent.h to libc/dirent.h
Diffstat (limited to 'lib')
-rw-r--r--lib/libc/dirent/closedir.c10
-rw-r--r--lib/libc/dirent/fdopendir.c14
-rw-r--r--lib/libc/dirent/readdir_r.c57
-rw-r--r--lib/libc/errno/errno.c8
-rw-r--r--lib/libc/internal/deinit/deinit.c6
-rw-r--r--lib/libc/internal/deinit/tls.c2
-rw-r--r--lib/libc/internal/include/__dirent.h24
-rw-r--r--lib/libc/internal/include/internal/io_uring.h6
-rw-r--r--lib/libc/internal/include/libc/dirent.h20
-rw-r--r--lib/libc/stdlib/calloc.c5
-rw-r--r--lib/libc/unistd/write.c7
11 files changed, 70 insertions, 89 deletions
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 <dirent.h> // for DIR, closedir
-#include <errno.h> // for EBADF, errno
-#include <stdlib.h> // for free
-#include <unistd.h> // for close
+#include <dirent.h> // for DIR, closedir
+#include <errno.h> // for EBADF, errno
+#include <libc/dirent.h> // for __DIR
+#include <stdlib.h> // for free
+#include <unistd.h> // 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 <dirent.h> // for DIR, fdopendir
-#include <errno.h> // for EBADF, errno
-#include <stdlib.h> // for calloc
+#include <dirent.h>
+#include <errno.h>
+#include <libc/dirent.h>
+#include <stdlib.h>
+#include <sys/cdefs.h>
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 <dirent.h> // for dirent, ssize_t, DIR, readdir_r
-#include <errno.h> // for EINVAL, errno
-#include <stddef.h> // for NULL, offsetof
-#include <string.h> // for memcpy, size_t, memset
-#include <syscall.h> // for __syscall_3, syscall
-
-int readdir_r(DIR *restrict dirp, struct dirent *restrict entry,
- struct dirent **restrict result)
+#include <dirent.h> // for dirent, ssize_t, DIR, readdir_r
+#include <errno.h> // for EINVAL, errno
+#include <libc/dirent.h> // for linux_dirent64
+#include <stddef.h> // for NULL, offsetof
+#include <string.h> // for memcpy, size_t, memset
+#include <syscall.h> // 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 <threads.h>
-/* 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 <libc.h>
#include <sys/mman.h>
-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 <stdint.h>
-#include <stdio.h>
-#include <sys/types.h>
-
-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 <stdint.h>
+#include <stdio.h>
+#include <sys/types.h>
+
+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 <errno.h> // for errno, EINVAL, ENOMEM
#include <stdlib.h> // for calloc, malloc
#include <string.h> // 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 <stddef.h>
-#include <syscall.h> // for __syscall_3, syscall
-#include <unistd.h> // for size_t, ssize_t, write
+#include <syscall.h>
+#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count)
{