293 lines
12 KiB
C
293 lines
12 KiB
C
#ifndef COSMOPOLITAN_LIBC_CALLS_SYSCALLS_H_
|
|
#define COSMOPOLITAN_LIBC_CALLS_SYSCALLS_H_
|
|
#include "libc/calls/struct/timespec.h"
|
|
#include "libc/calls/typedef/sighandler_t.h"
|
|
#include "libc/dce.h"
|
|
#include "libc/fmt/pflink.h"
|
|
#include "libc/sysv/consts/s.h"
|
|
#include "libc/sysv/consts/sig.h"
|
|
|
|
#define EOF -1 /* end of file */
|
|
#define WEOF -1u /* end of file (multibyte) */
|
|
#define _IOFBF 0 /* fully buffered */
|
|
#define _IOLBF 1 /* line buffered */
|
|
#define _IONBF 2 /* no buffering */
|
|
#define SEEK_SET 0 /* relative to beginning */
|
|
#define SEEK_CUR 1 /* relative to current position */
|
|
#define SEEK_END 2 /* relative to end */
|
|
|
|
#define SIG_ERR ((void (*)(int))(-1))
|
|
#define SIG_DFL ((void *)0)
|
|
#define SIG_IGN ((void *)1)
|
|
|
|
#define MAP_FAILED ((void *)__SIZE_MAX__)
|
|
|
|
#define ARCH_SET_GS 0x1001
|
|
#define ARCH_SET_FS 0x1002
|
|
#define ARCH_GET_FS 0x1003
|
|
#define ARCH_GET_GS 0x1004
|
|
|
|
#define MAP_HUGE_2MB (21 << MAP_HUGE_SHIFT)
|
|
#define MAP_HUGE_1GB (30 << MAP_HUGE_SHIFT)
|
|
|
|
#define S_ISDIR(mode) (((mode)&S_IFMT) == S_IFDIR)
|
|
#define S_ISCHR(mode) (((mode)&S_IFMT) == S_IFCHR)
|
|
#define S_ISBLK(mode) (((mode)&S_IFMT) == S_IFBLK)
|
|
#define S_ISREG(mode) (((mode)&S_IFMT) == S_IFREG)
|
|
#define S_ISFIFO(mode) (((mode)&S_IFMT) == S_IFIFO)
|
|
#define S_ISLNK(mode) (((mode)&S_IFMT) == S_IFLNK)
|
|
#define S_ISSOCK(mode) (((mode)&S_IFMT) == S_IFSOCK)
|
|
|
|
#define WCOREDUMP(s) ((s)&0x80)
|
|
#define WEXITSTATUS(s) (((s)&0xff00) >> 8)
|
|
#define WIFCONTINUED(s) ((s) == 0xffff)
|
|
#define WIFEXITED(s) (!WTERMSIG(s))
|
|
#define WIFSIGNALED(s) (((s)&0xffff) - 1U < 0xffu)
|
|
#define WIFSTOPPED(s) ((short)((((s)&0xffff) * 0x10001) >> 8) > 0x7f00)
|
|
#define WSTOPSIG(s) WEXITSTATUS(s)
|
|
#define WTERMSIG(s) ((s)&0x7f)
|
|
|
|
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
|
COSMOPOLITAN_C_START_
|
|
/*───────────────────────────────────────────────────────────────────────────│─╗
|
|
│ cosmopolitan § system calls ─╬─│┼
|
|
╚────────────────────────────────────────────────────────────────────────────│*/
|
|
|
|
struct dirstream;
|
|
struct iovec;
|
|
struct rlimit;
|
|
struct rusage;
|
|
struct sigaction;
|
|
struct siginfo;
|
|
struct sigset;
|
|
struct stat;
|
|
struct sysinfo;
|
|
struct tms;
|
|
struct ucontext;
|
|
struct utsname;
|
|
|
|
typedef int sig_atomic_t;
|
|
typedef struct dirstream DIR;
|
|
|
|
extern const struct sigset kSigsetFull;
|
|
extern const struct sigset kSigsetEmpty;
|
|
|
|
DIR *fdopendir(int) nodiscard;
|
|
DIR *opendir(const char *) nodiscard;
|
|
bool fileexists(const char *);
|
|
bool isdirectory(const char *);
|
|
bool isexecutable(const char *);
|
|
bool isregularfile(const char *);
|
|
bool32 isatty(int) nosideeffect;
|
|
bool32 ischardev(int) nosideeffect;
|
|
char *get_current_dir_name(void) nodiscard;
|
|
char *getcwd(char *, size_t) paramsnonnull();
|
|
char *realpath(const char *, char *);
|
|
char *replaceuser(const char *) nodiscard;
|
|
char *slurp(const char *, size_t *) nodiscard;
|
|
char *ttyname(int);
|
|
const char *commandv(const char *);
|
|
int access(const char *, int) nothrow paramsnonnull();
|
|
int arch_prctl();
|
|
int chdir(const char *) paramsnonnull();
|
|
int chmod(const char *, uint32_t);
|
|
int chown(const char *, uint32_t, uint32_t) paramsnonnull();
|
|
int close(int);
|
|
int closedir(DIR *);
|
|
int copyfile(const char *, const char *, bool);
|
|
int creat(const char *, uint32_t) nodiscard;
|
|
int dirfd(DIR *);
|
|
int dup(int) nodiscard;
|
|
int dup2(int, int);
|
|
int dup3(int, int, int);
|
|
int execl(const char *, const char *, ...) nullterminated();
|
|
int execle(const char *, const char *, ...) nullterminated((1));
|
|
int execlp(const char *, const char *, ...) nullterminated();
|
|
int execv(const char *, char *const[]) paramsnonnull();
|
|
int execve(const char *, char *const[], char *const[]) paramsnonnull();
|
|
int execvp(const char *, char *const[]) paramsnonnull();
|
|
int execvpe(const char *, char *const[], char *const[]) paramsnonnull();
|
|
int faccessat(int, const char *, int, uint32_t);
|
|
int fadvise(int, uint64_t, uint64_t, int);
|
|
int fallocate(int, int32_t, int64_t, int64_t);
|
|
int fchmod(int, uint32_t) nothrow;
|
|
int fchmodat(int, const char *, uint32_t, uint32_t);
|
|
int fchown(int, uint32_t, uint32_t);
|
|
int fchownat(int, const char *, uint32_t, uint32_t, uint32_t);
|
|
int fcntl();
|
|
int fdatasync(int);
|
|
int filecmp(const char *, const char *);
|
|
int flock(int, int);
|
|
int fork(void);
|
|
int fstat(int, struct stat *) paramsnonnull();
|
|
int fstatat(int, const char *, struct stat *, uint32_t);
|
|
int fsync(int);
|
|
int ftruncate(int, int64_t);
|
|
int getppid(void);
|
|
int getpriority(int, unsigned);
|
|
int getrlimit(int, struct rlimit *);
|
|
int getrusage(int, struct rusage *);
|
|
int kill(int, int);
|
|
int killpg(int, int);
|
|
int link(const char *, const char *) nothrow;
|
|
int linkat(int, const char *, int, const char *, uint32_t);
|
|
int lstat(const char *, struct stat *) paramsnonnull();
|
|
int madvise(void *, uint64_t, int);
|
|
int mkdir(const char *, uint32_t);
|
|
int mkdirat(int, const char *, uint32_t);
|
|
int mkfifo(const char *, uint32_t);
|
|
int mknod(const char *, uint32_t, uint64_t);
|
|
int mknodat(int, const char *, int32_t, uint64_t);
|
|
int mlock(const void *, size_t);
|
|
int mlock2(const void *, size_t, int);
|
|
int mlockall(int);
|
|
int mprotect(void *, uint64_t, int) paramsnonnull() privileged;
|
|
int msync(void *, size_t, int);
|
|
int munlock(const void *, size_t);
|
|
int munlockall(void);
|
|
int munmap(void *, uint64_t);
|
|
int munmap_s(void *, uint64_t);
|
|
int nice(int);
|
|
int open(const char *, int, ...) nodiscard;
|
|
int openanon(char *, unsigned) nodiscard;
|
|
int openat();
|
|
int pause(void);
|
|
int personality(uint64_t);
|
|
int pipe(int[hasatleast 2]) paramsnonnull() nodiscard;
|
|
int pipe2(int[hasatleast 2], int) paramsnonnull() nodiscard;
|
|
int posix_fadvise(int, uint64_t, uint64_t, int);
|
|
int posix_fallocate(int, int64_t, int64_t);
|
|
int posix_madvise(void *, uint64_t, int);
|
|
int raise(int);
|
|
int readlink(const char *, char *, size_t);
|
|
int remove(const char *);
|
|
int rename(const char *, const char *);
|
|
int renameat(int, const char *, int, const char *);
|
|
int renameat2(long, const char *, long, const char *, int);
|
|
int rmdir(const char *);
|
|
int sched_getaffinity(int, uint64_t, void *);
|
|
int sched_setaffinity(int, uint64_t, const void *);
|
|
int sched_yield(void);
|
|
int setpgid(int, int);
|
|
int setpriority(int, unsigned, int);
|
|
int setrlimit(int, const struct rlimit *);
|
|
int setsid(void);
|
|
int setuid(uint32_t);
|
|
int setgid(uint32_t);
|
|
int seteuid(uint32_t);
|
|
int setegid(uint32_t);
|
|
int setreuid(uint32_t, uint32_t);
|
|
int setregid(uint32_t, uint32_t);
|
|
int setresuid(uint32_t, uint32_t, uint32_t);
|
|
int setresgid(uint32_t, uint32_t, uint32_t);
|
|
int sigaction(int, const struct sigaction *, struct sigaction *);
|
|
int sigignore(int);
|
|
int sigprocmask(int, const struct sigset *, struct sigset *);
|
|
int sigsuspend(const struct sigset *);
|
|
int stat(const char *, struct stat *) paramsnonnull();
|
|
int symlink(const char *, const char *);
|
|
int symlinkat(const char *, int, const char *);
|
|
int sync_file_range(int, int64_t, int64_t, unsigned);
|
|
int sysinfo(struct sysinfo *) paramsnonnull();
|
|
int touch(const char *, uint32_t);
|
|
int truncate(const char *, uint64_t);
|
|
int ttyname_r(int, char *, size_t);
|
|
int uname(struct utsname *);
|
|
int unlink(const char *);
|
|
int unlink_s(const char **);
|
|
int unlinkat(int, const char *, int);
|
|
int vfork(void);
|
|
int wait(int *);
|
|
int wait3(int *, int, struct rusage *);
|
|
int wait4(int, int *, int, struct rusage *);
|
|
int waitpid(int, int *, int);
|
|
int64_t lseek(int, int64_t, int);
|
|
int64_t pread(int, void *, size_t, int64_t);
|
|
int64_t preadv(int, struct iovec *, int, int64_t);
|
|
int64_t pwrite(int, const void *, size_t, int64_t);
|
|
int64_t pwritev(int, const struct iovec *, int, int64_t);
|
|
int64_t syscall();
|
|
long telldir(DIR *);
|
|
int getpid(void);
|
|
long times(struct tms *);
|
|
sighandler_t signal(int, sighandler_t);
|
|
size_t GetFileSize(const char *);
|
|
size_t getfiledescriptorsize(int);
|
|
ssize_t copy_file_range(int, long *, int, long *, size_t, uint32_t);
|
|
ssize_t copyfd(int, int64_t *, int, int64_t *, size_t, uint32_t);
|
|
ssize_t read(int, void *, size_t);
|
|
ssize_t readlinkat(int, const char *, char *, size_t);
|
|
ssize_t splice(int, int64_t *, int, int64_t *, size_t, uint32_t);
|
|
ssize_t vmsplice(int, const struct iovec *, int64_t, uint32_t);
|
|
ssize_t write(int, const void *, size_t);
|
|
struct dirent *readdir(DIR *);
|
|
uint32_t getegid(void) nosideeffect;
|
|
uint32_t geteuid(void) nosideeffect;
|
|
uint32_t getgid(void) nosideeffect;
|
|
uint32_t getpgrp(void) nosideeffect;
|
|
uint32_t getsid(int) nosideeffect;
|
|
uint32_t gettid(void) nosideeffect;
|
|
uint32_t getuid(void) nosideeffect;
|
|
uint32_t umask(int32_t);
|
|
void *getprocaddressmodule(const char *, const char *);
|
|
void *mmap(void *, uint64_t, int32_t, int32_t, int32_t, int64_t) vallocesque;
|
|
void *mremap(void *, uint64_t, uint64_t, int32_t, void *);
|
|
|
|
#define getcwd(BUF, SIZE) \
|
|
(isconstant(BUF) && (&(BUF)[0] == NULL) ? get_current_dir_name() \
|
|
: getcwd(BUF, SIZE))
|
|
|
|
/*───────────────────────────────────────────────────────────────────────────│─╗
|
|
│ cosmopolitan § system calls » formatting ─╬─│┼
|
|
╚────────────────────────────────────────────────────────────────────────────│*/
|
|
|
|
int dprintf(int, const char *, ...) printfesque(2) paramsnonnull((2));
|
|
int vdprintf(int, const char *, va_list) paramsnonnull();
|
|
|
|
/*───────────────────────────────────────────────────────────────────────────│─╗
|
|
│ cosmopolitan § system calls » link-time optimizations ─╬─│┼
|
|
╚────────────────────────────────────────────────────────────────────────────│*/
|
|
#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
|
|
|
|
void _init_onntconsoleevent(void);
|
|
void _init_onwincrash(void);
|
|
|
|
#define __SIGACTION(FN, SIG, ...) \
|
|
({ \
|
|
if (SupportsWindows()) { \
|
|
if (isconstant(SIG)) { \
|
|
switch (SIG) { \
|
|
case SIGINT: \
|
|
case SIGQUIT: \
|
|
case SIGHUP: \
|
|
case SIGTERM: \
|
|
YOINK(_init_onntconsoleevent); \
|
|
break; \
|
|
case SIGTRAP: \
|
|
case SIGILL: \
|
|
case SIGSEGV: \
|
|
case SIGABRT: \
|
|
case SIGFPE: \
|
|
YOINK(_init_onwincrash); \
|
|
break; \
|
|
default: \
|
|
break; \
|
|
} \
|
|
} else { \
|
|
YOINK(_init_onntconsoleevent); \
|
|
YOINK(_init_onwincrash); \
|
|
} \
|
|
} \
|
|
(FN)(SIG, __VA_ARGS__); \
|
|
})
|
|
|
|
#define dprintf(FD, FMT, ...) (dprintf)(FD, PFLINK(FMT), ##__VA_ARGS__)
|
|
#define sigaction(SIG, ACT, OLD) __SIGACTION(sigaction, SIG, ACT, OLD)
|
|
#define signal(SIG, HAND) __SIGACTION(signal, SIG, HAND)
|
|
#define vdprintf(FD, FMT, VA) (vdprintf)(FD, PFLINK(FMT), VA)
|
|
|
|
#endif /* GNU && !ANSI */
|
|
COSMOPOLITAN_C_END_
|
|
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
|
#endif /* COSMOPOLITAN_LIBC_CALLS_SYSCALLS_H_ */
|