ci2_try interface and implementation skeleton

This commit is contained in:
2026-06-25 20:42:52 -05:00
parent c76bc6da90
commit ae29e4a72d
5 changed files with 1609 additions and 1 deletions
+807
View File
@@ -0,0 +1,807 @@
/* - | Copyright / About | ----------------------------------------------------
Copyright (c) 2026 Randy Jordan
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
This is the ci2_try.h interface. The functions all are just wrappers for the
general c libraries. If they fail they raise an exception with macro magic. All
other functions that may raise an exception are in include/platform/mem. It's
not recommended to use these functions, as they are hard to debug and it's not
a robust way to handle errors.
* --------------------------------------------------------------------------*/
#ifndef CI2_TRY_H
#define CI2_TRY_H
#include "../ci2_platform.h"
#include <fcntl.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
/* fcntl.h */
CI2_DEF int
ci2_try_creat(const char* path, mode_t mode);
CI2_DEF int
ci2_try_fcntl(int fd, int cmd, long args);
CI2_DEF int
ci2_try_open(const char* pathname, int flags, mode_t mode);
/* socket.h */
CI2_DEF int
ci2_try_accept(int, struct sockaddr* restrict, socklen_t* restrict);
CI2_DEF int
ci2_try_bind(int, const struct sockaddr*, socklen_t);
CI2_DEF int
ci2_try_connect(int, const struct sockaddr*, socklen_t);
CI2_DEF int
ci2_try_getpeername(int, struct sockaddr* restrict, socklen_t* restrict);
CI2_DEF int
ci2_try_getsockname(int, struct sockaddr* restrict, socklen_t* restrict);
CI2_DEF int
ci2_try_getsockopt(int, int, int, void* restrict, socklen_t* restrict);
CI2_DEF int
ci2_try_listen(int, int);
CI2_DEF ssize_t
ci2_try_recv(int, void*, size_t, int);
CI2_DEF ssize_t
ci2_try_recvfrom(int,
void* restrict,
size_t,
int,
struct sockaddr* restrict,
socklen_t* restrict);
CI2_DEF ssize_t
ci2_try_recvmsg(int, struct msghdr*, int);
CI2_DEF ssize_t
ci2_try_send(int, const void*, size_t, int);
CI2_DEF ssize_t
ci2_try_sendmsg(int, const struct msghdr*, int);
CI2_DEF ssize_t
ci2_try_sendto(int,
const void*,
size_t,
int,
const struct sockaddr*,
socklen_t);
CI2_DEF int
ci2_try_setsockopt(int, int, int, const void*, socklen_t);
CI2_DEF int
ci2_try_shutdown(int, int);
CI2_DEF int
ci2_try_sockatmark(int);
CI2_DEF int
ci2_try_socket(int, int, int);
CI2_DEF int
ci2_try_socketpair(int, int, int, int[2]);
/* sys/stat.h */
CI2_DEF int
ci2_try_chmod(const char*, mode_t);
CI2_DEF int
ci2_try_fchmod(int, mode_t);
CI2_DEF int
ci2_try_fchmodat(int, const char*, mode_t, int);
CI2_DEF int
ci2_try_fstat(int, struct stat*);
CI2_DEF int
ci2_try_fstatat(int, const char* restrict, struct stat* restrict, int);
CI2_DEF int
ci2_try_futimens(int, const struct timespec[2]);
CI2_DEF int
ci2_try_lstat(const char* restrict, struct stat* restrict);
CI2_DEF int
ci2_try_mkdir(const char*, mode_t);
CI2_DEF int
ci2_try_mkdirat(int, const char*, mode_t);
CI2_DEF int
ci2_try_mkfifo(const char*, mode_t);
CI2_DEF int
ci2_try_mkfifoat(int, const char*, mode_t);
CI2_DEF int
ci2_try_mknod(const char*, mode_t, dev_t);
CI2_DEF int
ci2_try_mknodat(int, const char*, mode_t, dev_t);
CI2_DEF int
ci2_try_stat(const char* restrict, struct stat* restrict);
CI2_DEF mode_t ci2_try_umask(mode_t);
CI2_DEF int
ci2_try_utimensat(int, const char*, const struct timespec[2], int);
/* unistd.h */
CI2_DEF int
ci2_try_access(const char*, int);
CI2_DEF unsigned
ci2_try_alarm(unsigned);
CI2_DEF int
ci2_try_chdir(const char*);
CI2_DEF int
ci2_try_chown(const char*, uid_t, gid_t);
CI2_DEF int
ci2_try_close(int);
CI2_DEF size_t
ci2_try_confstr(int, char*, size_t);
CI2_DEF char*
ci2_try_crypt(const char*, const char*);
CI2_DEF int
ci2_try_dup(int);
CI2_DEF int
ci2_try_dup2(int, int);
CI2_DEF void
ci2_try_exit(int);
CI2_DEF void
ci2_try_encrypt(char[64], int);
CI2_DEF int
ci2_try_execl(const char*, const char*, ...);
CI2_DEF int
ci2_try_execle(const char*, const char*, ...);
CI2_DEF int
ci2_try_execlp(const char*, const char*, ...);
CI2_DEF int
ci2_try_execv(const char*, char* const[]);
CI2_DEF int
ci2_try_execve(const char*, char* const[], char* const[]);
CI2_DEF int
ci2_try_execvp(const char*, char* const[]);
CI2_DEF int
ci2_try_faccessat(int, const char*, int, int);
CI2_DEF int
ci2_try_fchdir(int);
CI2_DEF int
ci2_try_fchown(int, uid_t, gid_t);
CI2_DEF int
ci2_try_fchownat(int, const char*, uid_t, gid_t, int);
CI2_DEF int
ci2_try_fdatasync(int);
CI2_DEF int
ci2_try_fexecve(int, char* const[], char* const[]);
CI2_DEF pid_t
ci2_try_fork(void);
CI2_DEF long
ci2_try_fpathconf(int, int);
CI2_DEF int
ci2_try_fsync(int);
CI2_DEF int
ci2_try_ftruncate(int, off_t);
CI2_DEF char*
ci2_try_getcwd(char*, size_t);
CI2_DEF gid_t
ci2_try_getegid(void);
CI2_DEF uid_t
ci2_try_geteuid(void);
CI2_DEF gid_t
ci2_try_getgid(void);
CI2_DEF int
ci2_try_getgroups(int, gid_t[]);
CI2_DEF long
ci2_try_gethostid(void);
CI2_DEF int
ci2_try_gethostname(char*, size_t);
CI2_DEF char*
ci2_try_getlogin(void);
CI2_DEF int
ci2_try_getlogin_r(char*, size_t);
CI2_DEF int
ci2_try_getopt(int, char* const[], const char*);
CI2_DEF pid_t ci2_try_getpgid(pid_t);
CI2_DEF pid_t
ci2_try_getpgrp(void);
CI2_DEF pid_t
ci2_try_getpid(void);
CI2_DEF pid_t
ci2_try_getppid(void);
CI2_DEF pid_t ci2_try_getsid(pid_t);
CI2_DEF uid_t
ci2_try_getuid(void);
CI2_DEF int
ci2_try_isatty(int);
CI2_DEF int
ci2_try_lchown(const char*, uid_t, gid_t);
CI2_DEF int
ci2_try_link(const char*, const char*);
CI2_DEF int
ci2_try_linkat(int, const char*, int, const char*, int);
CI2_DEF int
ci2_try_lockf(int, int, off_t);
CI2_DEF off_t
ci2_try_lseek(int, off_t, int);
CI2_DEF int
ci2_try_nice(int);
CI2_DEF long
ci2_try_pathconf(const char*, int);
CI2_DEF int
ci2_try_pause(void);
CI2_DEF int
ci2_try_pipe(int[2]);
CI2_DEF ssize_t
ci2_try_pread(int, void*, size_t, off_t);
CI2_DEF ssize_t
ci2_try_pwrite(int, const void*, size_t, off_t);
CI2_DEF ssize_t
ci2_try_read(int, void*, size_t);
CI2_DEF ssize_t
ci2_try_readlink(const char* restrict, char* restrict, size_t);
CI2_DEF ssize_t
ci2_try_readlinkat(int, const char* restrict, char* restrict, size_t);
CI2_DEF int
ci2_try_rmdir(const char*);
CI2_DEF int ci2_try_setegid(gid_t);
CI2_DEF int ci2_try_seteuid(uid_t);
CI2_DEF int ci2_try_setgid(gid_t);
CI2_DEF int ci2_try_setpgid(pid_t, pid_t);
CI2_DEF pid_t
ci2_try_setpgrp(void);
CI2_DEF int ci2_try_setregid(gid_t, gid_t);
CI2_DEF int ci2_try_setreuid(uid_t, uid_t);
CI2_DEF pid_t
ci2_try_setsid(void);
CI2_DEF int ci2_try_setuid(uid_t);
CI2_DEF unsigned
ci2_try_sleep(unsigned);
CI2_DEF void
ci2_try_swab(const void* restrict, void* restrict, ssize_t);
CI2_DEF int
ci2_try_symlink(const char*, const char*);
CI2_DEF int
ci2_try_symlinkat(const char*, int, const char*);
CI2_DEF void
ci2_try_sync(void);
CI2_DEF long
ci2_try_sysconf(int);
CI2_DEF pid_t
ci2_try_tcgetpgrp(int);
CI2_DEF int
ci2_try_tcsetpgrp(int, pid_t);
CI2_DEF int
ci2_try_truncate(const char*, off_t);
CI2_DEF char*
ci2_try_ttyname(int);
CI2_DEF int
ci2_try_ttyname_r(int, char*, size_t);
CI2_DEF int
ci2_try_unlink(const char*);
CI2_DEF int
ci2_try_unlinkat(int, const char*, int);
CI2_DEF ssize_t
ci2_try_write(int, const void*, size_t);
/* stdio.h */
CI2_DEF void
ci2_try_clearerr(FILE*);
CI2_DEF char*
ci2_try_ctermid(char*);
CI2_DEF int
ci2_try_dprintf(int, const char* restrict, ...);
CI2_DEF int
ci2_try_fclose(FILE*);
CI2_DEF FILE*
ci2_try_fdopen(int, const char*);
CI2_DEF int
ci2_try_feof(FILE*);
CI2_DEF int
ci2_try_ferror(FILE*);
CI2_DEF int
ci2_try_fflush(FILE*);
CI2_DEF int
ci2_try_fgetc(FILE*);
CI2_DEF int
ci2_try_fgetpos(FILE* restrict, fpos_t* restrict);
CI2_DEF char*
ci2_try_fgets(char* restrict, int, FILE* restrict);
CI2_DEF int
ci2_try_fileno(FILE*);
CI2_DEF void
ci2_try_flockfile(FILE*);
CI2_DEF FILE*
ci2_try_fmemopen(void* restrict, size_t, const char* restrict);
CI2_DEF FILE*
ci2_try_fopen(const char* restrict, const char* restrict);
CI2_DEF int
ci2_try_fprintf(FILE* restrict, const char* restrict, ...);
CI2_DEF int
ci2_try_fputc(int, FILE*);
CI2_DEF int
ci2_try_fputs(const char* restrict, FILE* restrict);
CI2_DEF size_t
ci2_try_fread(void* restrict, size_t, size_t, FILE* restrict);
CI2_DEF FILE*
ci2_try_freopen(const char* restrict, const char* restrict, FILE* restrict);
CI2_DEF int
ci2_try_fscanf(FILE* restrict, const char* restrict, ...);
CI2_DEF int
ci2_try_fseek(FILE*, long, int);
CI2_DEF int
ci2_try_fseeko(FILE*, off_t, int);
CI2_DEF int
ci2_try_fsetpos(FILE*, const fpos_t*);
CI2_DEF long
ci2_try_ftell(FILE*);
CI2_DEF off_t
ci2_try_ftello(FILE*);
CI2_DEF int
ci2_try_ftrylockfile(FILE*);
CI2_DEF void
ci2_try_funlockfile(FILE*);
CI2_DEF size_t
ci2_try_fwrite(const void* restrict, size_t, size_t, FILE* restrict);
CI2_DEF int
ci2_try_getc(FILE*);
CI2_DEF int
ci2_try_getchar(void);
CI2_DEF int
ci2_try_getc_unlocked(FILE*);
CI2_DEF int
ci2_try_getchar_unlocked(void);
CI2_DEF ssize_t
ci2_try_getdelim(char** restrict, size_t* restrict, int, FILE* restrict);
CI2_DEF ssize_t
ci2_try_getline(char** restrict, size_t* restrict, FILE* restrict);
CI2_DEF char*
ci2_try_gets(char*);
CI2_DEF FILE*
ci2_try_open_memstream(char**, size_t*);
CI2_DEF int
ci2_try_pclose(FILE*);
CI2_DEF void
ci2_try_perror(const char*);
CI2_DEF FILE*
ci2_try_popen(const char*, const char*);
CI2_DEF int
ci2_try_printf(const char* restrict, ...);
CI2_DEF int
ci2_try_putc(int, FILE*);
CI2_DEF int
ci2_try_putchar(int);
CI2_DEF int
ci2_try_putc_unlocked(int, FILE*);
CI2_DEF int
ci2_try_putchar_unlocked(int);
CI2_DEF int
ci2_try_puts(const char*);
CI2_DEF int
ci2_try_remove(const char*);
CI2_DEF int
ci2_try_rename(const char*, const char*);
CI2_DEF int
ci2_try_renameat(int, const char*, int, const char*);
CI2_DEF void
ci2_try_rewind(FILE*);
CI2_DEF int
ci2_try_scanf(const char* restrict, ...);
CI2_DEF void
ci2_try_setbuf(FILE* restrict, char* restrict);
CI2_DEF int
ci2_try_setvbuf(FILE* restrict, char* restrict, int, size_t);
CI2_DEF int
ci2_try_snprintf(char* restrict, size_t, const char* restrict, ...);
CI2_DEF int
ci2_try_sprintf(char* restrict, const char* restrict, ...);
CI2_DEF int
ci2_try_sscanf(const char* restrict, const char* restrict, ...);
CI2_DEF char*
ci2_try_tempnam(const char*, const char*);
CI2_DEF FILE*
ci2_try_tmpfile(void);
CI2_DEF char*
ci2_try_tmpnam(char*);
CI2_DEF int
ci2_try_ungetc(int, FILE*);
CI2_DEF int
ci2_try_vdprintf(int, const char* restrict, va_list);
CI2_DEF int
ci2_try_vfprintf(FILE* restrict, const char* restrict, va_list);
CI2_DEF int
ci2_try_vfscanf(FILE* restrict, const char* restrict, va_list);
CI2_DEF int
ci2_try_vprintf(const char* restrict, va_list);
CI2_DEF int
ci2_try_vscanf(const char* restrict, va_list);
CI2_DEF int
ci2_try_vsnprintf(char* restrict, size_t, const char* restrict, va_list);
CI2_DEF int
ci2_try_vsprintf(char* restrict, const char* restrict, va_list);
CI2_DEF int
ci2_try_vsscanf(const char* restrict, const char* restrict, va_list);
/* stdlib.h */
CI2_DEF void
ci2_try_Exit(int);
CI2_DEF long
ci2_try_a64l(const char*);
CI2_DEF void
ci2_try_abort(void);
CI2_DEF int
ci2_try_abs(int);
CI2_DEF int
ci2_try_atexit(void (*)(void));
CI2_DEF double
ci2_try_atof(const char*);
CI2_DEF int
ci2_try_atoi(const char*);
CI2_DEF long
ci2_try_atol(const char*);
CI2_DEF long long
ci2_try_atoll(const char*);
CI2_DEF void*
ci2_try_bsearch(const void*,
const void*,
size_t,
size_t,
int (*)(const void*, const void*));
CI2_DEF void*
ci2_try_calloc(size_t, size_t);
CI2_DEF div_t
ci2_try_div(int, int);
CI2_DEF double
ci2_try_drand48(void);
CI2_DEF double
ci2_try_erand48(unsigned short[3]);
CI2_DEF void
ci2_try_exit(int);
CI2_DEF void
ci2_try_free(void*);
CI2_DEF char*
ci2_try_getenv(const char*);
CI2_DEF int
ci2_try_getsubopt(char**, char* const*, char**);
CI2_DEF int
ci2_try_grantpt(int);
CI2_DEF char*
ci2_try_initstate(unsigned, char*, size_t);
CI2_DEF long
ci2_try_jrand48(unsigned short[3]);
CI2_DEF char*
ci2_try_l64a(long);
CI2_DEF long
ci2_try_labs(long);
CI2_DEF void
ci2_try_lcong48(unsigned short[7]);
CI2_DEF ldiv_t
ci2_try_ldiv(long, long);
CI2_DEF long long
ci2_try_llabs(long long);
CI2_DEF lldiv_t
ci2_try_lldiv(long long, long long);
CI2_DEF long
ci2_try_lrand48(void);
CI2_DEF void*
ci2_try_malloc(size_t);
CI2_DEF int
ci2_try_mblen(const char*, size_t);
CI2_DEF size_t
ci2_try_mbstowcs(wchar_t* restrict, const char* restrict, size_t);
CI2_DEF int
ci2_try_mbtowc(wchar_t* restrict, const char* restrict, size_t);
CI2_DEF char*
ci2_try_mkdtemp(char*);
CI2_DEF int
ci2_try_mkstemp(char*);
CI2_DEF long
ci2_try_mrand48(void);
CI2_DEF long
ci2_try_nrand48(unsigned short[3]);
CI2_DEF int
ci2_try_posix_memalign(void**, size_t, size_t);
CI2_DEF int
ci2_try_posix_openpt(int);
CI2_DEF char*
ci2_try_ptsname(int);
CI2_DEF int
ci2_try_putenv(char*);
CI2_DEF void
ci2_try_qsort(void*, size_t, size_t, int (*)(const void*, const void*));
CI2_DEF int
ci2_try_rand(void);
CI2_DEF int
ci2_try_rand_r(unsigned*);
CI2_DEF long
ci2_try_random(void);
CI2_DEF void*
ci2_try_realloc(void*, size_t);
CI2_DEF char*
ci2_try_realpath(const char* restrict, char* restrict);
CI2_DEF unsigned short*
ci2_try_seed48(unsigned short[3]);
CI2_DEF int
ci2_try_setenv(const char*, const char*, int);
CI2_DEF void
ci2_try_setkey(const char*);
CI2_DEF char*
ci2_try_setstate(char*);
CI2_DEF void
ci2_try_srand(unsigned);
CI2_DEF void
ci2_try_srand48(long);
CI2_DEF void
ci2_try_srandom(unsigned);
CI2_DEF double
ci2_try_strtod(const char* restrict, char** restrict);
CI2_DEF float
ci2_try_strtof(const char* restrict, char** restrict);
CI2_DEF long
ci2_try_strtol(const char* restrict, char** restrict, int);
CI2_DEF long double
ci2_try_strtold(const char* restrict, char** restrict);
CI2_DEF long long
ci2_try_strtoll(const char* restrict, char** restrict, int);
CI2_DEF unsigned long
ci2_try_strtoul(const char* restrict, char** restrict, int);
CI2_DEF unsigned long long
ci2_try_strtoull(const char* restrict, char** restrict, int);
CI2_DEF int
ci2_try_system(const char*);
CI2_DEF int
ci2_try_unlockpt(int);
CI2_DEF int
ci2_try_unsetenv(const char*);
CI2_DEF size_t
ci2_try_wcstombs(char* restrict, const wchar_t* restrict, size_t);
CI2_DEF int
ci2_try_wctomb(char*, wchar_t);
#endif // ci2_try.h