# libc Reference This page documents the current BoredOS userland libc surface from `src/userland/libc/`. BoredOS libc is a compact implementation focused on the APIs used by in-tree apps. It is not a full glibc replacement. ## Header Overview | Header | Focus | |---|---| | `stdlib.h` | allocation, conversion, process helpers | | `string.h` | memory/string primitives | | `stdio.h` | `FILE*` and formatted I/O | | `unistd.h` | POSIX-like fd/process calls | | `fcntl.h` | open/fcntl flags, `dup`, `pipe` | | `input.h` | keyboard keycode constants | | `signal.h` | signal handlers and masks | | `sys/stat.h` | `stat`/`fstat` and file mode bits | | `sys/types.h` | core typedefs (`pid_t`, `ssize_t`, ...) | | `sys/wait.h` | `waitpid` and wait macros | | `errno.h` | errno values | | `time.h` | time/date utilities | | `math.h` | floating-point math helpers | | `libui.h` | GUI/window drawing API | ## stdlib.h Implemented core functions: - Memory: `malloc`, `free`, `calloc`, `realloc` - Memory aliases: `memset`, `memcpy` - Conversions: `atoi`, `itoa`, `strtod`, `abs` - Output: `puts`, `printf` - Process/environment: `exit`, `_exit`, `sleep`, `chdir`, `getcwd`, `access`, `system`, `getenv`, `abort` Notes: - `sleep` is millisecond-based and maps to kernel sleep command. - `system` is a stub-style helper in this libc, not a full shell launcher equivalent. ## string.h Implemented C string/memory set includes: - Memory: `memmove`, `memcmp`, `memcpy`, `memset`, `memchr` - Search: `strchr`, `strrchr`, `strpbrk`, `strstr` - Span: `strspn`, `strcspn` - Compare: `strcmp`, `strncmp`, `strcasecmp`, `strncasecmp`, `strcoll` - Build/copy: `strlen`, `strcpy`, `strcat`, `strdup` - Errors: `strerror` ## stdio.h Provided API includes: - Stream open/close: `fopen`, `freopen`, `fclose` - Read/write: `fread`, `fwrite`, `fgets`, `fputs`, `getc`, `fputc`, `putchar` - Positioning: `fseek`, `ftell`, `filelength` - Formatting: `fprintf`, `vfprintf`, `snprintf`, `vsnprintf`, `sprintf`, `sscanf` - Stream state: `feof`, `ferror`, `clearerr`, `fflush`, `ungetc` - Temp/filesystem helpers: `remove`, `rename`, `tmpfile`, `tmpnam` ## unistd.h Provided POSIX-like interfaces: - FD I/O: `read`, `write`, `close`, `lseek`, `isatty` - Filesystem: `unlink` - Exec family: `execv`, `execve`, `execvp`, `execl`, `execlp`, `execle` - Process wait: `waitpid` Also defines: - `SEEK_SET`, `SEEK_CUR`, `SEEK_END` - `F_OK`, `X_OK`, `W_OK`, `R_OK` ## fcntl.h Flags and fd control: - Open flags: `O_RDONLY`, `O_WRONLY`, `O_RDWR`, `O_CREAT`, `O_EXCL`, `O_TRUNC`, `O_APPEND`, `O_NONBLOCK`, `O_ACCMODE` - fcntl ops: `F_GETFL`, `F_SETFL` - FD flag: `FD_CLOEXEC` (declared) Functions: - `open` - `fcntl` - `dup` - `dup2` - `pipe` ## input.h Defines keyboard/control keycode constants used by apps that process Current constants include: - Arrow keys: `KEY_UP`, `KEY_DOWN`, `KEY_LEFT`, `KEY_RIGHT` - Controls: `KEY_ENTER`, `KEY_BACKSPACE`, `KEY_ESCAPE`, `KEY_SPACE`, `KEY_ALT`, `KEY_CTRL_L`, `KEY_TAB` ## signal.h Current signal surface: - Basic handler API: `signal`, `raise`, `kill` - POSIX-style API: `sigaction`, `sigprocmask`, `sigpending` - Types: `sighandler_t`, `sigset_t`, `struct sigaction` - Constants: `SIGINT`, `SIGTERM`, `SIGKILL`, `SIG_DFL`, `SIG_IGN`, `SIG_ERR` - Mask ops: `SIG_BLOCK`, `SIG_UNBLOCK`, `SIG_SETMASK` - Action flags: `SA_RESTART`, `SA_NODEFER`, `SA_RESETHAND` ## ctype.h Character classification and case conversion: - `isdigit`, `isalpha`, `isalnum`, `isspace` - `isupper`, `islower`, `isxdigit` - `iscntrl`, `ispunct`, `isprint`, `isgraph` - `tolower`, `toupper` ## locale.h Locale stubs and conventions: - `struct lconv` - `setlocale` - `localeconv` - `LC_ALL` ## limits.h Integer and floating-point limit macros: - `CHAR_BIT`, `INT_MIN`, `INT_MAX`, `UINT_MAX` - `LONG_MIN`, `LONG_MAX`, `ULONG_MAX` - `LLONG_MIN`, `LLONG_MAX`, `ULLONG_MAX` - `DBL_MAX` ## setjmp.h Non-local jump support: - `jmp_buf` - `setjmp` - `longjmp` ## time.h Time/date APIs and types: - Types: `time_t`, `clock_t`, `struct tm` - Constants: `CLOCKS_PER_SEC` - Functions: `time`, `clock`, `localtime`, `gmtime`, `strftime`, `mktime` ## libui.h Windowing and drawing API used by GUI apps: - Window/event: `ui_window_create`, `ui_get_event`, `ui_mark_dirty`, `ui_window_set_title`, `ui_window_set_resizable` - Drawing: `ui_draw_rect`, `ui_draw_rounded_rect_filled`, `ui_draw_string`, `ui_draw_string_bitmap`, `ui_draw_image` - Text metrics/scaled text: `ui_get_string_width`, `ui_get_font_height`, `ui_draw_string_scaled`, `ui_draw_string_scaled_sloped`, `ui_get_string_width_scaled`, `ui_get_font_height_scaled` - System UI helpers: `ui_get_screen_size`, `ui_set_font` ## sys/stat.h and sys/types.h `sys/stat.h` provides: - `struct stat` - `stat`, `fstat`, `mkdir` - mode/type macros (`S_IFREG`, `S_IFDIR`, `S_ISREG`, `S_ISDIR`, permission bits) Note: - `access` is declared in `stdlib.h` in this libc. `sys/types.h` provides: - `ssize_t`, `off_t`, `mode_t`, `pid_t`, `uid_t`, `gid_t` ## sys/wait.h - `waitpid` - `WNOHANG` - status macros: `WEXITSTATUS`, `WIFEXITED`, `WTERMSIG`, `WIFSIGNALED` ## errno.h Defined errno values include: - Generic/input: `EINVAL`, `EDOM`, `ERANGE`, `E2BIG` - File/path: `ENOENT`, `EEXIST`, `EISDIR`, `ENOTDIR`, `EBADF` - Runtime/state: `ENOMEM`, `EACCES`, `EIO`, `EAGAIN`, `EINTR`, `ECHILD`, `EBUSY`, `EPIPE`, `ESPIPE`, `ENOSYS`, `ENOTSUP` ## Relationship to raw syscalls - libc high-level I/O and process APIs are backed by wrappers in `src/userland/libc/syscall.c`. - Full syscall command IDs and multiplexer details are documented in `docs/appdev/syscalls.md`. ## Practical Guidance - Prefer libc APIs (`open`, `read`, `write`, `waitpid`, `sigaction`) for portability inside BoredOS userland. - Use raw wrapper calls from `syscall.h` only for capabilities that do not yet have higher-level libc wrappers. - Avoid numeric `sys_system(...)` command literals in app code; use `SYSTEM_CMD_*` macros.