ascii-chat 0.11.33
Video chat in your terminal
Loading...
Searching...
No Matches
musl_c23_compat.c
Go to the documentation of this file.
1
14#include <stdlib.h>
15#include <stdio.h>
16#include <stdarg.h>
17#include <wchar.h>
18#include <limits.h>
19
20// Declare musl's actual strto* functions using asm labels to bypass glibc's C23
21// header redirect (e.g. strtoul → __isoc23_strtoul), which would cause infinite
22// recursion since this file IS the __isoc23_* implementation.
23extern long musl_strtol(const char *, char **, int) __asm__("strtol");
24extern long long musl_strtoll(const char *, char **, int) __asm__("strtoll");
25extern unsigned long musl_strtoul(const char *, char **, int) __asm__("strtoul");
26extern unsigned long long musl_strtoull(const char *, char **, int) __asm__("strtoull");
27
31long __isoc23_strtol(const char *str, char **endptr, int base) {
32 return musl_strtol(str, endptr, base);
33}
34
38long long __isoc23_strtoll(const char *str, char **endptr, int base) {
39 return musl_strtoll(str, endptr, base);
40}
41
45unsigned long __isoc23_strtoul(const char *str, char **endptr, int base) {
46 return musl_strtoul(str, endptr, base);
47}
48
52unsigned long long __isoc23_strtoull(const char *str, char **endptr, int base) {
53 return musl_strtoull(str, endptr, base);
54}
55
67long __isoc23_wcstol(const wchar_t *str, wchar_t **endptr, int base) {
68 return wcstol(str, endptr, base);
69}
70
78long long __isoc23_wcstoll(const wchar_t *str, wchar_t **endptr, int base) {
79 return wcstoll(str, endptr, base);
80}
81
89unsigned long __isoc23_wcstoul(const wchar_t *str, wchar_t **endptr, int base) {
90 return wcstoul(str, endptr, base);
91}
92
100unsigned long long __isoc23_wcstoull(const wchar_t *str, wchar_t **endptr, int base) {
101 return wcstoull(str, endptr, base);
102}
103
114int __isoc23_scanf(const char *format, ...) {
115 va_list args;
116 va_start(args, format);
117 int result = vscanf(format, args);
118 va_end(args);
119 return result;
120}
121
129int __isoc23_fscanf(FILE *stream, const char *format, ...) {
130 va_list args;
131 va_start(args, format);
132 int result = vfscanf(stream, format, args);
133 va_end(args);
134 return result;
135}
136
144int __isoc23_sscanf(const char *str, const char *format, ...) {
145 va_list args;
146 va_start(args, format);
147 int result = vsscanf(str, format, args);
148 va_end(args);
149 return result;
150}
151
158int __isoc23_vscanf(const char *format, va_list args) {
159 return vscanf(format, args);
160}
161
169int __isoc23_vfscanf(FILE *stream, const char *format, va_list args) {
170 return vfscanf(stream, format, args);
171}
172
180int __isoc23_vsscanf(const char *str, const char *format, va_list args) {
181 return vsscanf(str, format, args);
182}
183
194int __isoc23_wscanf(const wchar_t *format, ...) {
195 va_list args;
196 va_start(args, format);
197 int result = vwscanf(format, args);
198 va_end(args);
199 return result;
200}
201
209int __isoc23_fwscanf(FILE *stream, const wchar_t *format, ...) {
210 va_list args;
211 va_start(args, format);
212 int result = vfwscanf(stream, format, args);
213 va_end(args);
214 return result;
215}
216
224int __isoc23_swscanf(const wchar_t *str, const wchar_t *format, ...) {
225 va_list args;
226 va_start(args, format);
227 int result = vswscanf(str, format, args);
228 va_end(args);
229 return result;
230}
231
238int __isoc23_vwscanf(const wchar_t *format, va_list args) {
239 return vwscanf(format, args);
240}
241
249int __isoc23_vfwscanf(FILE *stream, const wchar_t *format, va_list args) {
250 return vfwscanf(stream, format, args);
251}
252
260int __isoc23_vswscanf(const wchar_t *str, const wchar_t *format, va_list args) {
261 return vswscanf(str, format, args);
262}
263
268#include <stdint.h>
269#include <string.h>
270#include <unistd.h>
271#include <fcntl.h>
272#include <sys/syscall.h>
273
283void arc4random_buf(void *buf, size_t nbytes) {
284 if (nbytes == 0 || buf == NULL) {
285 return;
286 }
287
288/* Prefer getrandom syscall: available in Linux 3.17+, no file descriptor needed */
289#ifdef SYS_getrandom
290 long result = syscall(SYS_getrandom, buf, nbytes, 0);
291 if (result == (long)nbytes) {
292 return;
293 }
294#endif
295
296 /* Fallback to /dev/urandom device */
297 int fd = open("/dev/urandom", O_RDONLY);
298 if (fd >= 0) {
299 ssize_t n = read(fd, buf, nbytes);
300 close(fd);
301 if (n == (ssize_t)nbytes) {
302 return;
303 }
304 }
305
306 /* Fatal error: unable to obtain random bytes */
307 abort();
308}
309
346int initstate_r(unsigned int seed, char *statebuf, size_t statelen, struct random_data *buf) {
347 (void)seed;
348 // Validate parameters match glibc interface
349 if (!statebuf || !buf || statelen < 32) {
350 return -1;
351 }
352
353 // Initialize buffer (though random_r() doesn't actually use it)
354 memset(statebuf, 0, statelen);
355
356 return 0;
357}
358
383int random_r(struct random_data *restrict buf, int32_t *restrict result) {
384 if (buf == NULL || result == NULL) {
385 return -1;
386 }
387
388 /* Obtain cryptographically secure random bytes from kernel */
389 uint32_t random_bytes;
390 arc4random_buf(&random_bytes, sizeof(random_bytes));
391
392 /* Convert to 31-bit positive integer matching glibc behavior
393 glibc's random_r returns values in range [0, 2^31) */
394 *result = (int32_t)((random_bytes >> 1) & 0x7FFFFFFF);
395
396 return 0;
397}
unsigned int uint32_t
Definition common.h:58
int __isoc23_wscanf(const wchar_t *format,...)
Wide character formatted input functions.
void arc4random_buf(void *buf, size_t nbytes)
glibc-specific random functions for expat and fontconfig compatibility
int __isoc23_scanf(const char *format,...)
Formatted input functions.
long __isoc23_wcstol(const wchar_t *str, wchar_t **endptr, int base)
Wide string to integer conversion.
Application limits and constraints.
unsigned long long __isoc23_strtoull(const char *str, char **endptr, int base)
Convert string to unsigned long long (C23 compatible)
int __isoc23_sscanf(const char *str, const char *format,...)
Read formatted input from string (C23 compatible)
unsigned long __isoc23_strtoul(const char *str, char **endptr, int base)
Convert string to unsigned long (C23 compatible)
long musl_strtol(const char *, extern long long musl_strtoll(const char char **, int)
int __isoc23_swscanf(const wchar_t *str, const wchar_t *format,...)
Read formatted wide input from string (C23 compatible)
int __isoc23_vswscanf(const wchar_t *str, const wchar_t *format, va_list args)
Read formatted wide input from string (va_list variant, C23 compatible)
int __isoc23_vscanf(const char *format, va_list args)
Read formatted input from stdin (va_list variant, C23 compatible)
int random_r(struct random_data *restrict buf, int32_t *restrict result)
Generate cryptographically secure random number (glibc compatibility stub for musl)
long long __isoc23_strtoll(const char *str, char **endptr, int base)
Convert string to long long (C23 compatible)
int __isoc23_fscanf(FILE *stream, const char *format,...)
Read formatted input from file stream (C23 compatible)
int __isoc23_fwscanf(FILE *stream, const wchar_t *format,...)
Read formatted wide input from file stream (C23 compatible)
long long __isoc23_wcstoll(const wchar_t *str, wchar_t **endptr, int base)
Convert wide string to long long (C23 compatible)
int __isoc23_vwscanf(const wchar_t *format, va_list args)
Read formatted wide input from stdin (va_list variant, C23 compatible)
int initstate_r(unsigned int seed, char *statebuf, size_t statelen, struct random_data *buf)
Initialize reentrant random state (glibc compatibility stub for musl)
int __isoc23_vsscanf(const char *str, const char *format, va_list args)
Read formatted input from string (va_list variant, C23 compatible)
int __isoc23_vfscanf(FILE *stream, const char *format, va_list args)
Read formatted input from file stream (va_list variant, C23 compatible)
int __isoc23_vfwscanf(FILE *stream, const wchar_t *format, va_list args)
Read formatted wide input from file stream (va_list variant, C23 compatible)
unsigned long long __isoc23_wcstoull(const wchar_t *str, wchar_t **endptr, int base)
Convert wide string to unsigned long long (C23 compatible)
unsigned long __isoc23_wcstoul(const wchar_t *str, wchar_t **endptr, int base)
Convert wide string to unsigned long (C23 compatible)
action_args_t args