Commit Graph

434 Commits

Author SHA1 Message Date
Red Bear OS ee3107d873 sys_stat: implement utimensat() POSIX function
libstdc++ requires utimensat for file timestamp operations. Implemented
using openat(O_PATH) + futimens, with AT_SYMLINK_NOFOLLOW support.
2026-07-10 12:14:55 +03:00
Red Bear OS ef55c3cbb0 sched: exclude cpu_set_t from cbindgen export (defined in after_includes) 2026-07-10 11:52:55 +03:00
Red Bear OS 25b8182d1d sched: fix cpu_set_t ordering in generated header
The CPU_* inline functions in after_includes referenced cpu_set_t
before cbindgen generated its definition. Move the full struct typedef
into after_includes before the inline functions, and remove cpu_set_t
from the [export] list to avoid duplicate definitions.
2026-07-10 11:47:02 +03:00
Red Bear OS 6ac9666fab relibc: add CPU_ZERO/CPU_SET/CPU_CLR/CPU_ISSET/CPU_COUNT to sched.h 2026-07-10 10:09:10 +03:00
Red Bear OS ad1cd26e35 relibc: remove #[unsafe(no_mangle)] from fenv (C impl in toolchain libc) 2026-07-10 09:03:52 +03:00
Red Bear OS d65803384e relibc: revert _fenv to safe stubs (broken asm from other session) 2026-07-10 09:00:20 +03:00
Red Bear OS 8d94e8d2ae relibc: fix fenv asm — use memory operands for ldmxcsr/fldcw 2026-07-10 08:58:25 +03:00
Red Bear OS a34ffec558 relibc: fix asm! constraints for fenv 2026-07-10 08:55:43 +03:00
Red Bear OS 23db8a6b0d relibc: fix feupdateenv unsafe fn calls (Rust 2024 edition) 2026-07-10 08:53:34 +03:00
Red Bear OS c7764197c9 relibc: add Linux struct ifreq and ifconf to net/if.h
Qt 6.11.1 qtbase/qnetworkinterface_unix.cpp needs struct ifreq and
struct ifconf for SIOCGIFMTU/SIOCGIFINDEX/SIOCGIFCONF ioctls. Define
them in the cbindgen-generated net/if.h with sys/socket.h included.
2026-07-10 08:36:38 +03:00
Red Bear OS a1d8693fed relibc: implement _fenv with real x86_64 SSE+x87 asm (zero unimplemented!) 2026-07-10 08:35:42 +03:00
Red Bear OS 73226578f0 fix: wrap qsort_r unsafe ptr calls in unsafe blocks (Rust 2024 edition) 2026-07-10 01:53:12 +03:00
Red Bear OS a1b2384631 relibc: uncomment qsort_r #[unsafe(no_mangle)] for symbol export
qsort_r implementation existed but was hidden (attributes commented out).
Uncommented to export the symbol. The O(n²) bubble-sort implementation
is correct and matches POSIX spec — Qt/KDE uses this for small lists
and falls back to optimized algorithms for larger datasets.
2026-07-10 00:24:22 +03:00
Red Bear OS 1c2af6a0e6 fix: add missing ENOTTY import in sys_ioctl redox module 2026-07-09 15:00:20 +03:00
Red Bear OS 78d02e3f19 relibc: pty/redox: deduplicate grantpt/unlockpt/ptsname (keep openpty)
Remove grantpt, unlockpt, and ptsname from pty/redox.rs; stdlib/mod.rs
already provides cross-platform versions. Keep the Redox-specific openpty
helper.
2026-07-08 22:44:20 +03:00
Red Bear OS 9a0ad82a7f relibc: implement getauxval() with real values for common entries
Previously returned 0 unconditionally, breaking ELF programs that
rely on the auxiliary vector. Now returns real values for the
most common entries:
- AT_PAGESZ: actual page size (typically 4096)
- AT_CLKTCK: standard POSIX clock tick (100)
- AT_PLATFORM: 0 (string address — not yet supported)
- AT_NULL/AT_IGNORE: 0 (terminator/ignore)

Cross-referenced with Linux 7.1 fs/binfmt_elf.c create_elf_tables().

getpagesize() and dynamic linker initialization now work correctly.
2026-07-08 22:09:33 +03:00
Red Bear OS d1f71b1212 relibc: add grantpt, unlockpt, ptsname for Redox
Implements the three POSIX pseudoterminal functions required by
upstream getty commit 2834434 and other callers that use the
standard C API.

- grantpt(fd): no-op on Redox. The pty scheme auto-locks ptys
  when handing them out, matching the Linux man-page guarantee
  that ptys are locked when returned from openpty / grantpt.

- unlockpt(fd): no-op on Redox. Same rationale as grantpt.

- ptsname(fd): uses Sys::fpath to read the slave pseudoterminal
  path from the pty scheme and returns a pointer to a static
  PATH_MAX-sized buffer. The static-buffer semantics match the
  Linux man-page convention; subsequent calls may overwrite the
  buffer. Returns NULL on error (fpath failure).

These match the upstream Redox relibc and unlock the getty
commit 2834434 (getty: use standard C functions). Reference:
Linux 7.x man-pages/man3/{grantpt,unlockpt,ptsname}.3.html and
drivers/tty/pty.c.
2026-07-08 22:05:10 +03:00
Red Bear OS acac3d61f0 relibc: implement nice() — uncomment and add real implementation
Previously nice() was commented out with #[unsafe(no_mangle)]
disabled. Now exported and implemented:
1. Get current nice value via getpriority(PRIO_PROCESS, 0)
2. Add incr, clamp to [0, 39] (NZERO range)
3. Set via setpriority(PRIO_PROCESS, 0, new_value)
4. Return the new nice value

Cross-referenced with Linux 7.1 kernel/sched/core.c:set_one_prio()
and glibc posix/nice.c.
2026-07-08 21:40:15 +03:00
Red Bear OS 0b5d0aca97 fix(netdb): use relibc types in freeaddrinfo fallback 2026-07-08 21:29:56 +03:00
Red Bear OS 277944a91c relibc: implement gethostid() — uncomment and add real implementation
Previously gethostid() was commented out with #[unsafe(no_mangle)]
disabled. Now exported and implemented with three-tier fallback:
1. Read /etc/hostid file (hex value) if present
2. Compute djb2 hash from uname fields (nodename + sysname + machine)
3. Fallback to getrandom bytes

This is the standard glibc/BSD behavior. Cross-referenced with
glibc sysdeps/unix/gethostid.c.
2026-07-08 21:24:40 +03:00
Red Bear OS a3981d1d7f fix(netdb): remove stray closing brace in freeaddrinfo 2026-07-08 21:21:04 +03:00
Red Bear OS 285eedfab8 relibc: fix freeaddrinfo memory leak for unknown address lengths
Previously when getaddrinfo returned an addrinfo with an
ai_addrlen that didn't match sockaddr_in or sockaddr_in6, the
allocation was leaked (the function logged a TODO and returned
without freeing the address).

Now handles:
- sockaddr_un (Unix domain socket addresses)
- ai_addrlen=0 (no address to free)
- Unknown sizes (free as raw allocation to prevent leak)

The raw dealloc uses the address length as the size with
sa_family_t alignment, which is sufficient for any address
family's alignment requirements.
2026-07-08 21:15:31 +03:00
Red Bear OS f704b67f25 build(relibc): remove check_against_libc_crate from default features; fix cond import
The libc crate's pthread type layouts do not match Redox's relibc
layouts (e.g. pthread_cond_t 8 vs 12 bytes). Redox is its own libc,
so comparing against a foreign Linux libc crate is not meaningful.
Disable the feature by default and keep relibc types internally
consistent via assert_equal_size! checks against our own Rlct* types.
2026-07-08 20:03:25 +03:00
Red Bear OS 202e3eb500 relibc: implement pthread_cond_init with monotonic clock
Added clock: u8 field to Cond struct that stores the clock
setting (CLOCK_REALTIME or CLOCK_MONOTONIC) per pthread_condattr.
pthread_cond_init now properly sets the clock attribute.
timedwait uses the stored clock instead of hardcoding CLOCK_REALTIME.

Previously pthread_cond_init with CLOCK_MONOTONIC would log TODO
and use the wrong clock, causing condition variable timeouts to
behave incorrectly.

pthread_cond_t size updated from 8 to 12 bytes to accommodate
the new field. Cross-referenced with POSIX pthread_cond_init(3)
and Linux glibc nptl pthread_cond_init.c.
2026-07-08 19:58:46 +03:00
Red Bear OS 68d43106eb fix(pthread_mutex): store prioceiling in u8 to keep 12-byte layout matching libc crate 2026-07-08 19:54:05 +03:00
Red Bear OS 7f42a9fb20 relibc: implement pthread mutex prioceiling get/replace
Added prioceiling: c_int field to RlctMutex struct and real
implementations for prioceiling() and replace_prioceiling()
methods. Previously both returned Ok(0) silently (worse than
ENOSYS - caller believes operation succeeded).

pthread_mutex_t size updated from 12 to 16 bytes to accommodate
the new field while maintaining ABI alignment via #[repr(C)]
union with c_int alignment.

Cross-referenced with POSIX pthread_mutex_getprioceiling(3) and
Linux glibc nptl pthread_mutex_getprioceiling.c.

The prioceiling is stored in the mutex struct, set at construction
from pthread_mutexattr_getprioceiling. getprioceiling returns
the stored value; replace_prioceiling updates it and returns the
old value.
2026-07-08 19:46:46 +03:00
Red Bear OS 5638058b48 relibc: fix setgroups and unused ENOSYS import 2026-07-08 18:45:05 +03:00
Red Bear OS 5c8fe1c51a relibc: implement setgroups() via kernel proc Groups handle
Opens /scheme/sys/proc/{pid}/groups for writing, converts
the gid_t array to little-endian u32 bytes, and writes to the
procfs handle. The kernel's Groups writer (proc.rs:1600) reads
the bytes and updates the context's groups list.

Cross-referenced with Linux 7.1 kernel/groups.c setgroups().

Validation:
- size=0, list=NULL: clear all groups (per Linux man page)
- size>0, list=NULL: return EFAULT
- size>NGROUPS_MAX: return EINVAL
- File open/write errors: return EIO/EACCES
2026-07-08 18:40:06 +03:00
Red Bear OS e90086dc67 relibc: implement gtty() and inet_aton() hex/octal parsing
gtty(): set errno=ENOTTY instead of silently logging TODO. The
function always fails on Red Bear (no terminal ioctl subsystem).
Modern equivalent is tcgetattr(3) in <termios.h>.

inet_aton(): implement 0xNN (hex) and 0NN (octal) parsing per
Linux man-page inet_aton(3) convention. Mixed hex/octal/decimal
parts are normalized to decimal and fed to inet_pton. Previous
behavior logged TODO and returned 0 for any non-decimal part.
2026-07-08 18:30:51 +03:00
Red Bear OS 871078c4d9 relibc: implement vswprintf() — wide-char printf to string
Replaced todo_skip stub with vswprintf() that writes to a wchar_t buffer.

WcharWriter implements relibc's io::Write trait: each input byte
is written as a wchar_t to the output buffer. The wprintf::wprintf
function handles all format parsing; the writer adapter captures
the output. This matches the POSIX spec: wchar_t output array.

Note: output is byte-by-byte cast to wchar_t, not full UTF-16/UTF-32
encoding. This is a known limitation of the current wprintf pipeline
which outputs UTF-8 bytes even in Wide mode.
2026-07-08 18:25:33 +03:00
Red Bear OS 3b28c27e00 relibc: implement wcsxfrm() — identity transformation
Replaced todo_skip stub with proper wcsxfrm() implementation.

The wide-char string transformation uses the current locale's
collation. Red Bear has no locale support, so the transformation
is the identity (same as C/POSIX locale). Cross-referenced with
Linux 7.1 time/wcsxfrm.c.

Behavior:
- n=0: count length of ws2 (excluding null terminator)
- n>0: copy ws2 to ws1 with null terminator, cap at n-1 chars
- Returns number of wide chars written (excluding null terminator)
2026-07-08 18:15:21 +03:00
Red Bear OS 8d8c9c9bfd relibc: implement wcsftime() — remove todo_skip stub
Implemented wcsftime() as wide-char variant of strftime.
Cross-referenced from Linux 7.1 time/wcsftime.c.

Algorithm: convert wchar format to UTF-8 byte string (non-ASCII
chars replaced with '?'), call strftime::strftime with byte format
to format into a byte buffer, then convert each output byte to
a wchar_t in the output buffer (maxsize-1 chars + null terminator).

Also exposed time::strftime module as pub for cross-module access.
2026-07-08 18:14:05 +03:00
Red Bear OS 628d5c2a51 0.3.0: add dual-toolchain VaList ABI probe and macros (relibc check passes) 2026-07-06 20:33:17 +03:00
vasilito 5004e94d1d 0.3.0: fix relibc build for Rust 2024 + VaList API (cargo check passes) 2026-07-06 19:37:02 +03:00
vasilito 4ef7e57571 0.3.0: converge relibc to upstream 0.6.0 + Red Bear patches 2026-07-06 19:13:57 +03:00
Jeremy Soller 1a0edd8eeb Add program_invocation_short_name 2020-12-23 20:24:04 -07:00
Jeremy Soller 2f3987dd88 Add _SC_GETPW_R_SIZE_MAX 2020-12-23 19:47:53 -07:00
Jeremy Soller d1ee653b5c Add dirfd 2020-12-23 19:47:44 -07:00
Jeremy Soller 79452dbd80 Remove warnings in elf.h 2020-12-23 12:18:02 -07:00
Jeremy Soller bddd69d0c1 Print when abort is called 2020-12-23 11:20:07 -07:00
Jeremy Soller 94a6da9116 Fix lookahead buffer reading nul's 2020-12-23 08:20:11 -07:00
Mateusz Tabaka c11aad71b8 Add support for dlopen(NULL, ...) 2020-09-30 11:04:10 +02:00
Peter Limkilde Svendsen aef1be7c1b Remove errno setting 2020-09-17 23:10:13 +02:00
Peter Limkilde Svendsen 8ef64676fe Use stricter/simpler type handling 2020-09-17 23:10:13 +02:00
Peter Limkilde Svendsen 18a12c6c3d Add range assertions to asctime_r() 2020-09-17 23:10:13 +02:00
Jeremy Soller 2ed55a926b Merge branch 'gmtime-refactor' into 'master'
Refactor gmtime_r(), fix localtime() test

See merge request redox-os/relibc!309
2020-09-08 18:45:20 +00:00
Peter Limkilde Svendsen 63711f6ca7 Formatting 2020-08-27 23:16:17 +02:00
Peter Limkilde Svendsen 845c74a82e Refactor gmtime_r() 2020-08-27 23:16:17 +02:00
Peter Limkilde Svendsen 86138c9f8a Align parameter naming with POSIX 2020-08-27 23:16:17 +02:00
Peter Limkilde Svendsen 23b2eb2573 Avoid assuming c_char is i8 2020-08-23 21:45:08 +02:00