You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1042 lines
25 KiB
1042 lines
25 KiB
#pragma once
|
|
|
|
#define BISCUIT_RELEASE "REARDEN"
|
|
#define BISCUIT_VERSION "0.0.0"
|
|
|
|
#include <littypes.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define STDIN_FILENO 0
|
|
#define STDOUT_FILENO 1
|
|
#define STDERR_FILENO 2
|
|
#define EOF (-1)
|
|
|
|
#define ERRNO_FIRST 1
|
|
#define EPERM 1
|
|
#define ENOENT 2
|
|
#define ESRCH 3
|
|
#define EINTR 4
|
|
#define EIO 5
|
|
#define E2BIG 7
|
|
#define EBADF 9
|
|
#define ECHILD 10
|
|
#define EAGAIN 11
|
|
#define EWOULDBLOCK EAGAIN
|
|
#define ENOMEM 12
|
|
#define EACCES 13
|
|
#define EFAULT 14
|
|
#define EBUSY 16
|
|
#define EEXIST 17
|
|
#define EXDEV 18
|
|
#define ENODEV 19
|
|
#define ENOTDIR 20
|
|
#define EISDIR 21
|
|
#define EINVAL 22
|
|
#define ENFILE 23
|
|
#define EMFILE 24
|
|
#define ENOSPC 28
|
|
#define ESPIPE 29
|
|
#define EPIPE 32
|
|
#define ERANGE 34
|
|
#define ENAMETOOLONG 36
|
|
#define ENOSYS 38
|
|
#define ENOTEMPTY 39
|
|
#define EDESTADDRREQ 40
|
|
#define EAFNOSUPPORT 47
|
|
#define EADDRINUSE 48
|
|
#define EADDRNOTAVAIL 49
|
|
#define ENETDOWN 50
|
|
#define ENETUNREACH 51
|
|
#define ECONNABORTED 53
|
|
#define ELOOP 62
|
|
#define EHOSTDOWN 64
|
|
#define EHOSTUNREACH 65
|
|
#define EOVERFLOW 75
|
|
#define ENOTSOCK 88
|
|
#define EOPNOTSUPP 95
|
|
#define ECONNRESET 104
|
|
#define EISCONN 106
|
|
#define ENOTCONN 107
|
|
#define ETIMEDOUT 110
|
|
#define ECONNREFUSED 111
|
|
#define EINPROGRESS 115
|
|
#define ERRNO_LAST 115
|
|
|
|
#define MAP_FAILED ((void *)(long) -1)
|
|
|
|
#define MAP_SHARED 0x01
|
|
#define MAP_PRIVATE 0x02
|
|
#define MAP_ANON 0x20
|
|
#define MAP_ANONYMOUS MAP_ANON
|
|
|
|
#define PROT_NONE 0x0
|
|
#define PROT_READ 0x1
|
|
#define PROT_WRITE 0x2
|
|
#define PROT_EXEC 0x4
|
|
|
|
#define FORK_PROCESS 0x1
|
|
#define FORK_THREAD 0x2
|
|
|
|
#define MAXBUF 4096
|
|
#define PIPE_BUF 4096
|
|
|
|
#define MAJOR(x) ((long)((ulong)x >> 40))
|
|
#define MINOR(x) ((long)(((ulong)x >> 32) & 0xff))
|
|
#define MKDEV(x, y) ((dev_t)((ulong)x << 40 | (ulong)y << 32))
|
|
|
|
/*
|
|
* system calls
|
|
*/
|
|
#define FD_WORDS 16
|
|
// bits
|
|
#define FD_SETSIZE (FD_WORDS*8*8)
|
|
|
|
typedef struct {
|
|
ulong mask[FD_WORDS];
|
|
} fd_set;
|
|
|
|
#define FD_ZERO(ft) memset((ft), 0, sizeof(fd_set))
|
|
#define FD_SET(n, ft) (ft)->mask[n/64] |= 1ull << (n%64)
|
|
#define FD_CLR(n, ft) (ft)->mask[n/64] &= ~(1ull << (n%64))
|
|
#define FD_ISSET(n, ft) (((ft)->mask[n/64] & (1ull << (n%64))) != 0)
|
|
|
|
struct iovec {
|
|
void *iov_base;
|
|
size_t iov_len;
|
|
};
|
|
|
|
struct pollfd {
|
|
int fd;
|
|
#define POLLRDNORM 0x1
|
|
#define POLLRDBAND 0x2
|
|
#define POLLIN (POLLRDNORM | POLLRDBAND)
|
|
#define POLLPRI 0x4
|
|
#define POLLWRNORM 0x8
|
|
#define POLLOUT POLLWRNORM
|
|
#define POLLWRBAND 0x10
|
|
// revents only, whose status is always reported
|
|
#define POLLERR 0x20
|
|
#define POLLHUP 0x40
|
|
#define POLLNVAL 0x80
|
|
ushort events;
|
|
ushort revents;
|
|
};
|
|
|
|
struct timeval {
|
|
time_t tv_sec;
|
|
time_t tv_usec;
|
|
};
|
|
|
|
struct tm {
|
|
int tm_sec;
|
|
int tm_min;
|
|
int tm_hour;
|
|
int tm_mday;
|
|
int tm_mon;
|
|
int tm_year;
|
|
int tm_wday;
|
|
int tm_yday;
|
|
int tm_isdst;
|
|
};
|
|
|
|
struct timezone {
|
|
};
|
|
|
|
struct timespec {
|
|
time_t tv_sec;
|
|
long tv_nsec;
|
|
};
|
|
|
|
extern long timezone;
|
|
|
|
struct rlimit {
|
|
rlim_t rlim_cur;
|
|
rlim_t rlim_max;
|
|
};
|
|
|
|
struct rusage {
|
|
struct timeval ru_utime;
|
|
struct timeval ru_stime;
|
|
};
|
|
|
|
union sigval {
|
|
int sival_int;
|
|
void *sival_ptr;
|
|
};
|
|
|
|
typedef struct {
|
|
int si_signo;
|
|
int si_code;
|
|
int si_errno;
|
|
pid_t si_pid;
|
|
uid_t si_uid;
|
|
void *si_addr;
|
|
int si_status;
|
|
long si_band;
|
|
union sigval si_value;
|
|
} siginfo_t;
|
|
|
|
struct sigaction {
|
|
void (*sa_handler)(int);
|
|
void (*sa_sigaction)(int, siginfo_t *, void *);
|
|
sigset_t sa_mask;
|
|
#define sigemptyset(ss) (*ss = 0)
|
|
#define sigfillset(ss) (*ss = -1)
|
|
#define sigaddset(ss, s) (*ss |= (1ull << s))
|
|
#define sigdelset(ss, s) (*ss &= ~(1ull << s))
|
|
#define sigismember(ss, s) (*ss & (1ull << s))
|
|
int sa_flags;
|
|
#define SA_SIGINFO 1
|
|
};
|
|
|
|
struct sockaddr {
|
|
uchar sa_len;
|
|
uchar sa_family;
|
|
char sa_data[];
|
|
};
|
|
|
|
struct sockaddr_un {
|
|
uchar sun_len;
|
|
uchar sun_family;
|
|
char sun_path[104];
|
|
};
|
|
|
|
#define SUN_LEN(x) (sizeof(struct sockaddr_un))
|
|
|
|
typedef uint32_t in_addr_t;
|
|
typedef uint16_t in_port_t;
|
|
|
|
struct sockaddr_in {
|
|
uchar sin_len;
|
|
uchar sin_family;
|
|
in_port_t sin_port;
|
|
struct {
|
|
in_addr_t s_addr;
|
|
} sin_addr;
|
|
};
|
|
|
|
struct sockaddr_storage {
|
|
uchar ss_len;
|
|
uchar ss_family;
|
|
char ss_data[sizeof(struct sockaddr_un) - 2];
|
|
};
|
|
|
|
#define INADDR_ANY ((uint32_t)0)
|
|
|
|
struct stat {
|
|
dev_t st_dev;
|
|
ino_t st_ino;
|
|
ulong st_nlink;
|
|
|
|
mode_t st_mode;
|
|
uid_t st_uid;
|
|
gid_t st_gid;
|
|
uint32_t _pad0;
|
|
|
|
dev_t st_rdev;
|
|
off_t st_size;
|
|
ulong st_blksize;
|
|
blkcnt_t st_blocks;
|
|
|
|
time_t st_atime;
|
|
ulong st_atimensec;
|
|
time_t st_mtime;
|
|
ulong st_mtimensec;
|
|
time_t st_ctime;
|
|
ulong st_ctimensec;
|
|
};
|
|
|
|
#define S_IFMT 00170000
|
|
#define S_IFSOCK 0140000
|
|
#define S_IFLNK 0120000
|
|
#define S_IFREG 0100000
|
|
#define S_IFBLK 0060000
|
|
#define S_IFDIR 0040000
|
|
#define S_IFCHR 0020000
|
|
#define S_IFIFO 0010000
|
|
|
|
#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
|
|
#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
|
|
#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
|
|
#define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
|
|
#define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
|
|
#define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
|
|
#define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
|
|
|
|
// wrj: S_ISDEV is non-standard. just guess:
|
|
#define S_ISDEV(m) (((m) & S_IFMT) == S_IFBLK \
|
|
|| ((m) & S_IFMT) == S_IFCHR \
|
|
|| ((m) & S_IFMT) == S_IFSOCK)
|
|
|
|
//#define S_IFMT (0xffff0000ul)
|
|
//#define S_IFREG (1ul << 16)
|
|
//#define S_IFDIR (2ul << 16)
|
|
//#define S_IFIFO (3ul << 16)
|
|
//#define S_IFLNK (4ul << 16)
|
|
//#define S_IFBLK (5ul << 16)
|
|
//
|
|
//// XXX cleanup modes/dev majors
|
|
//#define S_ISDIR(mode) ((mode & S_IFMT) == S_IFDIR)
|
|
//#define S_ISDEV(mode) (MAJOR(mode) != 0)
|
|
//#define S_ISFIFO(mode) ((mode & S_IFMT) == S_IFIFO)
|
|
//#define S_ISREG(mode) ((mode & S_IFMT) == S_IFREG)
|
|
//#define S_ISSOCK(mode) (MAJOR(mode) == 2)
|
|
//#define S_ISLNK(mode) ((mode & S_IFMT) == S_IFLNK)
|
|
//#define S_ISBLK(mode) (MAJOR(mode) == S_IFBLK)
|
|
|
|
// please never use these
|
|
#define S_ISUID (04000)
|
|
#define S_ISGID (02000)
|
|
#define S_IRWXU (00700)
|
|
#define S_IRUSR (00400)
|
|
#define S_IWUSR (00200)
|
|
#define S_IXUSR (00100)
|
|
#define S_IRWXG (00070)
|
|
#define S_IRGRP (00040)
|
|
#define S_IWGRP (00020)
|
|
#define S_IXGRP (00010)
|
|
#define S_IRWXO (00007)
|
|
#define S_IROTH (00004)
|
|
#define S_IWOTH (00002)
|
|
#define S_IXOTH (00001)
|
|
|
|
struct tfork_t {
|
|
void *tf_tcb;
|
|
// tf_tid is merely a convenient way for a new thread to learn its tid.
|
|
void *tf_tid;
|
|
void *tf_stack;
|
|
};
|
|
|
|
int accept(int, struct sockaddr *, socklen_t*);
|
|
// access(2) cannot be a wrapper around stat(2) because access(2) uses real-id
|
|
// instead of effective-id
|
|
int access(const char *, int);
|
|
#define R_OK (1 << 0)
|
|
#define W_OK (1 << 1)
|
|
#define X_OK (1 << 2)
|
|
int bind(int, const struct sockaddr *, socklen_t);
|
|
int connect(int, const struct sockaddr *, socklen_t);
|
|
int chmod(const char *, mode_t);
|
|
int close(int);
|
|
int chdir(const char *);
|
|
int dup(int);
|
|
int dup2(int, int);
|
|
void _exit(int)
|
|
__attribute__((noreturn));
|
|
int execv(const char *, char * const[]);
|
|
int execve(const char *, char * const[], char * const[]);
|
|
int execvp(const char *, char * const[]);
|
|
pid_t fork(void);
|
|
int fstat(int, struct stat *);
|
|
int ftruncate(int, off_t);
|
|
int futex(const int, void *, void *, int, const struct timespec *);
|
|
#define FUTEX_SLEEP 1
|
|
#define FUTEX_WAKE 2
|
|
#define FUTEX_CNDGIVE 3
|
|
|
|
char *getcwd(char *, size_t);
|
|
pid_t getpid(void);
|
|
pid_t getppid(void);
|
|
|
|
int getrlimit(int, struct rlimit *);
|
|
#define RLIMIT_NOFILE 1
|
|
#define RLIMIT_CORE 2
|
|
#define RLIM_INFINITY ULONG_MAX
|
|
int getrusage(int, struct rusage *);
|
|
#define RUSAGE_SELF 1
|
|
#define RUSAGE_CHILDREN 2
|
|
int getsockopt(int, int, int, void *, socklen_t *);
|
|
#define SHUT_WR (1 << 0)
|
|
#define SHUT_RD (1 << 1)
|
|
int shutdown(int, int);
|
|
int gettimeofday(struct timeval *, struct timezone *);
|
|
long gettid(void);
|
|
|
|
int fcntl(int, int, ...);
|
|
#define F_GETFL 1
|
|
#define F_SETFL 2
|
|
#define F_GETFD 3
|
|
#define F_SETFD 4
|
|
#define F_SETLK 5
|
|
#define F_SETLKW 6
|
|
#define F_SETOWN 7
|
|
|
|
#define FD_CLOEXEC 0x4
|
|
|
|
int kill(int, int);
|
|
int link(const char *, const char *);
|
|
int listen(int, int);
|
|
off_t lseek(int, off_t, int);
|
|
#define SEEK_SET 1
|
|
#define SEEK_CUR 2
|
|
#define SEEK_END 4
|
|
|
|
int mkdir(const char *, long);
|
|
int mknod(const char *, mode_t, dev_t);
|
|
void *mmap(void *, size_t, int, int, int, long);
|
|
int munmap(void *, size_t);
|
|
int nanosleep(const struct timespec *, struct timespec *);
|
|
int open(const char *, int, ...);
|
|
#define O_RDONLY 0
|
|
#define O_WRONLY 1
|
|
#define O_RDWR 2
|
|
#define O_CREAT 0x40
|
|
#define O_EXCL 0x80
|
|
#define O_TRUNC 0x200
|
|
#define O_APPEND 0x400
|
|
#define O_NONBLOCK 0x800
|
|
#define O_DIRECTORY 0x10000
|
|
#define O_CLOEXEC 0x80000
|
|
|
|
int pause(void);
|
|
int pipe(int[2]);
|
|
int pipe2(int[2], int);
|
|
int poll(struct pollfd *, nfds_t, int);
|
|
ssize_t pread(int, void *, size_t, off_t);
|
|
ssize_t pwrite(int, const void *, size_t, off_t);
|
|
ssize_t read(int, void*, size_t);
|
|
ssize_t readv(int, const struct iovec *, int);
|
|
int reboot(void);
|
|
ssize_t recv(int, void *, size_t, int);
|
|
ssize_t recvfrom(int, void *, size_t, int, struct sockaddr *, socklen_t *);
|
|
|
|
struct msghdr {
|
|
void *msg_name;
|
|
socklen_t msg_namelen;
|
|
struct iovec *msg_iov;
|
|
int msg_iovlen;
|
|
uint msg_flags;
|
|
void *msg_control;
|
|
socklen_t msg_controllen;
|
|
};
|
|
|
|
struct cmsghdr {
|
|
socklen_t cmsg_len;
|
|
int cmsg_level;
|
|
int cmsg_type;
|
|
#define SCM_RIGHTS 1
|
|
char _data[];
|
|
};
|
|
|
|
#define MSG_TRUNC (1 << 0)
|
|
#define MSG_CTRUNC (1 << 1)
|
|
|
|
#define CMSG_FIRSTHDR(m) \
|
|
(((m)->msg_controllen > 0) ? (struct cmsghdr *)(m)->msg_control : NULL)
|
|
#define CMSG_NXTHDR(m, c) \
|
|
(((char *)c + c->cmsg_len == \
|
|
(char *)(m)->msg_control + (m)->msg_controllen) ? \
|
|
NULL : (struct cmsghdr *)((char *)c + c->cmsg_len))
|
|
#define CMSG_DATA(c) ((uchar *)&(c)->_data)
|
|
#define ROUND2(x, n) ((x + (n - 1)) & ~(n - 1))
|
|
#define CMSG_LEN(x) (ROUND2(sizeof(struct cmsghdr) + x, 8ul))
|
|
#define CMSG_SPACE(x) CMSG_LEN(x)
|
|
|
|
ssize_t recvmsg(int, struct msghdr *, int);
|
|
int rename(const char *, const char *);
|
|
int rmdir(const char *);
|
|
int select(int, fd_set*, fd_set*, fd_set*, struct timeval *);
|
|
ssize_t send(int, const void *, size_t, int);
|
|
ssize_t sendto(int, const void *, size_t, int, const struct sockaddr *,
|
|
socklen_t);
|
|
ssize_t sendmsg(int, struct msghdr *, int);
|
|
int setrlimit(int, const struct rlimit *);
|
|
pid_t setsid(void);
|
|
// levels
|
|
#define SOL_SOCKET 1
|
|
#define IPPROTO_TCP 2
|
|
// socket options
|
|
#define SO_SNDBUF 1
|
|
#define SO_SNDTIMEO 2
|
|
#define SO_ERROR 3
|
|
#define SO_TYPE 4
|
|
#define SO_RCVBUF 5
|
|
#define SO_REUSEADDR 6
|
|
#define SO_KEEPALIVE 7
|
|
#define SO_LINGER 8
|
|
// not supported on linux...
|
|
#define SO_SNDLOWAT 9
|
|
#define SO_NAME 10
|
|
#define SO_PEER 11
|
|
struct linger {
|
|
int l_onoff;
|
|
int l_linger;
|
|
};
|
|
// TCP options
|
|
#define TCP_NODELAY 20
|
|
int sigaction(int, const struct sigaction *, struct sigaction *);
|
|
#define SIGHUP 1
|
|
#define SIGINT 2
|
|
#define SIGQUIT 3
|
|
#define SIGILL 4
|
|
#define SIGKILL 9
|
|
#define SIGUSR1 10
|
|
#define SIGSEGV 11
|
|
#define SIGSYS 12
|
|
#define SIGPIPE 13
|
|
#define SIGALRM 14
|
|
#define SIGTERM 15
|
|
#define SIGSTOP 17
|
|
#define SIGCHLD 20
|
|
#define SIGIO 23
|
|
#define SIGWINCH 28
|
|
#define SIGUSR2 31
|
|
void (*signal(int, void (*)(int)))(int);
|
|
#define SIG_DFL ((void (*)(int))1)
|
|
#define SIG_IGN ((void (*)(int))2)
|
|
#define SIG_BLOCK 1
|
|
#define SIG_SETMASK 2
|
|
#define SIG_UNBLOCK 3
|
|
int socket(int, int, int);
|
|
#define AF_UNIX 1
|
|
#define AF_LOCAL AF_UNIX
|
|
#define AF_INET 2
|
|
|
|
#define SOCK_STREAM (1 << 0)
|
|
#define SOCK_DGRAM (1 << 1)
|
|
#define SOCK_RAW (1 << 2)
|
|
#define SOCK_SEQPACKET (1 << 3)
|
|
#define SOCK_CLOEXEC (1 << 4)
|
|
#define SOCK_NONBLOCK (1 << 5)
|
|
|
|
int stat(const char *, struct stat *);
|
|
int sync(void);
|
|
long sys_prof(long, long, long, long);
|
|
#define PROF_DISABLE (1ul << 0)
|
|
#define PROF_GOLANG (1ul << 1)
|
|
#define PROF_SAMPLE (1ul << 2)
|
|
#define PROF_COUNT (1ul << 3)
|
|
|
|
// symbolic PMU event ids
|
|
#define PROF_EV_UNHALTED_CORE_CYCLES (1ul << 0)
|
|
#define PROF_EV_LLC_MISSES (1ul << 1)
|
|
#define PROF_EV_LLC_REFS (1ul << 2)
|
|
#define PROF_EV_BRANCH_INSTR_RETIRED (1ul << 3)
|
|
#define PROF_EV_BRANCH_MISS_RETIRED (1ul << 4)
|
|
#define PROF_EV_INSTR_RETIRED (1ul << 5)
|
|
// non-architectural
|
|
// "all dTLB misses that cause a page walk"
|
|
#define PROF_EV_DTLB_LOAD_MISS_ANY (1ul << 6)
|
|
// "number of completed walks due to miss in sTLB"
|
|
#define PROF_EV_DTLB_LOAD_MISS_STLB (1ul << 7)
|
|
// "retired stores that missed in the dTLB"
|
|
#define PROF_EV_STORE_DTLB_MISS (1ul << 8)
|
|
#define PROF_EV_L2_LD_HITS (1ul << 9)
|
|
// "all iTLB misses that cause a page walk"
|
|
#define PROF_EV_ITLB_LOAD_MISS_ANY (1ul << 10)
|
|
|
|
// PMU event flags
|
|
#define PROF_EVF_OS (1ul << 0)
|
|
#define PROF_EVF_USR (1ul << 1)
|
|
#define PROF_EVF_BACKTRACE (1ul << 2)
|
|
|
|
long sys_info(long);
|
|
#define SINFO_GCCOUNT 0l
|
|
#define SINFO_GCPAUSENS 1l
|
|
#define SINFO_GCHEAPSZ 2l
|
|
#define SINFO_GCMS 4l
|
|
#define SINFO_GCTOTALLOC 5l
|
|
#define SINFO_GCMARKTIME 6l
|
|
#define SINFO_GCSWEEPTIME 7l
|
|
#define SINFO_GCWBARTIME 8l
|
|
#define SINFO_GCOBJS 9l
|
|
#define SINFO_DOGC 10l
|
|
#define SINFO_PROCLIST 11l
|
|
|
|
int truncate(const char *, off_t);
|
|
int unlink(const char *);
|
|
pid_t wait(int *);
|
|
pid_t waitpid(pid_t, int *, int);
|
|
pid_t wait3(int *, int, struct rusage *);
|
|
pid_t wait4(pid_t, int *, int, struct rusage *);
|
|
#define WAIT_ANY (-1)
|
|
#define WAIT_MYPGRP 0
|
|
|
|
#define WCONTINUED 1
|
|
#define WNOHANG 2
|
|
#define WUNTRACED 4
|
|
|
|
#define WIFCONTINUED(x) (x & (1 << 9))
|
|
#define WIFEXITED(x) (x & (1 << 10))
|
|
#define WIFSIGNALED(x) (x & (1 << 11))
|
|
#define WEXITSTATUS(x) (x & 0xff)
|
|
#define WTERMSIG(x) ((int)((uint)x >> 27) & 0x1f)
|
|
ssize_t write(int, const void*, size_t);
|
|
ssize_t writev(int, const struct iovec *, int);
|
|
|
|
/*
|
|
* thread stuff
|
|
*/
|
|
void tfork_done(long);
|
|
int tfork_thread(struct tfork_t *, long (*fn)(void *), void *);
|
|
void threxit(long);
|
|
int thrwait(int, long *);
|
|
|
|
typedef long pthread_t;
|
|
|
|
typedef struct {
|
|
size_t stacksize;
|
|
#define _PTHREAD_DEFSTKSZ 4096ull
|
|
} pthread_attr_t;
|
|
|
|
typedef struct {
|
|
uint gen;
|
|
int bcast;
|
|
} pthread_cond_t;
|
|
|
|
typedef struct {
|
|
} pthread_condattr_t;
|
|
|
|
typedef struct {
|
|
uint locks;
|
|
} pthread_mutex_t;
|
|
#define PTHREAD_MUTEX_INITIALIZER {0}
|
|
|
|
typedef struct {
|
|
} pthread_mutexattr_t;
|
|
|
|
typedef struct {
|
|
} pthread_once_t;
|
|
|
|
typedef struct {
|
|
uint target;
|
|
volatile uint current;
|
|
} pthread_barrier_t;
|
|
|
|
typedef struct {
|
|
} pthread_barrierattr_t;
|
|
|
|
int pthread_attr_destroy(pthread_attr_t *);
|
|
int pthread_attr_init(pthread_attr_t *);
|
|
int pthread_attr_getstacksize(pthread_attr_t *, size_t *);
|
|
int pthread_attr_setstacksize(pthread_attr_t *, size_t);
|
|
|
|
int pthread_barrier_init(pthread_barrier_t *, pthread_barrierattr_t *, uint);
|
|
int pthread_barrier_destroy(pthread_barrier_t *);
|
|
int pthread_barrier_wait(pthread_barrier_t *);
|
|
#define PTHREAD_BARRIER_SERIAL_THREAD 1
|
|
|
|
int pthread_cond_broadcast(pthread_cond_t *);
|
|
int pthread_cond_destroy(pthread_cond_t *);
|
|
int pthread_cond_init(pthread_cond_t *, const pthread_condattr_t *);
|
|
int pthread_cond_wait(pthread_cond_t *, pthread_mutex_t *);
|
|
int pthread_cond_signal(pthread_cond_t *);
|
|
int pthread_cond_timedwait(pthread_cond_t *, pthread_mutex_t *,
|
|
const struct timespec *);
|
|
|
|
int pthread_create(pthread_t *, pthread_attr_t *, void* (*)(void *), void *);
|
|
int pthread_join(pthread_t, void **);
|
|
int pthread_mutex_init(pthread_mutex_t *, const pthread_mutexattr_t *);
|
|
int pthread_mutex_lock(pthread_mutex_t *);
|
|
int pthread_mutex_unlock(pthread_mutex_t *);
|
|
int pthread_mutex_destroy(pthread_mutex_t *);
|
|
int pthread_once(pthread_once_t *, void (*)(void));
|
|
pthread_t pthread_self(void);
|
|
int pthread_cancel(pthread_t);
|
|
|
|
int pthread_sigmask(int, const sigset_t *, sigset_t *);
|
|
|
|
int pthread_setcancelstate(int, int *);
|
|
#define PTHREAD_CANCEL_ENABLE 1
|
|
#define PTHREAD_CANCEL_DISABLE 2
|
|
|
|
int pthread_setcanceltype(int, int *);
|
|
#define PTHREAD_CANCEL_DEFERRED 1
|
|
#define PTHREAD_CANCEL_ASYNCHRONOUS 2
|
|
|
|
/*
|
|
* posix stuff
|
|
*/
|
|
typedef struct {
|
|
struct {
|
|
int from;
|
|
int to;
|
|
} dup2s[10];
|
|
int dup2slot;
|
|
} posix_spawn_file_actions_t;
|
|
|
|
typedef struct {
|
|
} posix_spawnattr_t;
|
|
|
|
int posix_spawn(pid_t *, const char *, const posix_spawn_file_actions_t *,
|
|
const posix_spawnattr_t *, char *const argv[], char *const envp[]);
|
|
int posix_spawn_file_actions_adddup2(posix_spawn_file_actions_t *, int, int);
|
|
int posix_spawn_file_actions_destroy(posix_spawn_file_actions_t *);
|
|
int posix_spawn_file_actions_init(posix_spawn_file_actions_t *);
|
|
|
|
/*
|
|
* libc
|
|
*/
|
|
#define EXIT_FAILURE (-1)
|
|
#define EXIT_SUCCESS 0
|
|
|
|
#define offsetof(s, m) __builtin_offsetof(s, m)
|
|
|
|
#define isfinite(x) __builtin_isfinite(x)
|
|
#define isinf(x) __builtin_isinf(x)
|
|
#define isnan(x) __builtin_isnan(x)
|
|
#define HUGE_VAL __builtin_huge_val()
|
|
#define NAN __builtin_nanf("")
|
|
|
|
// these "builtins" sometimes result in a call to the library function. the
|
|
// builtin version just tries to optimize some cases.
|
|
#define ceil(x) __builtin_ceil(x)
|
|
#define floor(x) __builtin_floor(x)
|
|
#define log(x) __builtin_log(x)
|
|
#define sqrt(x) __builtin_sqrt(x)
|
|
#define trunc(x) __builtin_trunc(x)
|
|
#define pow(x, y) __builtin_pow(x, y)
|
|
|
|
// annoyingly, some GCC versions < 4.8 are bugged and do not have
|
|
// __builtin_bswap16.
|
|
#define ntohs(x) (((x & 0xff) << 8) | ((x & 0xff00) >> 8))
|
|
#define htons(x) (((x & 0xff) << 8) | ((x & 0xff00) >> 8))
|
|
#define ntohl(x) __builtin_bswap32(x)
|
|
#define htonl(x) __builtin_bswap32(x)
|
|
|
|
#define MIN(x, y) (x < y ? x : y)
|
|
#define MAX(x, y) (x > y ? x : y)
|
|
|
|
#define atof(s) strtod(s, NULL)
|
|
|
|
#define _POSIX_NAME_MAX 14
|
|
struct dirent {
|
|
ino_t d_ino;
|
|
char d_name[_POSIX_NAME_MAX];
|
|
};
|
|
|
|
typedef struct {
|
|
int fd;
|
|
uint cent;
|
|
uint nent;
|
|
struct dirent dents[];
|
|
} DIR;
|
|
|
|
extern __thread int errno;
|
|
|
|
#define BUFSIZ 4096
|
|
#define L_tmpnam 20
|
|
|
|
struct _FILE {
|
|
int fd;
|
|
int btype;
|
|
#define _IOFBF 1
|
|
#define _IOLBF 2
|
|
#define _IONBF 3
|
|
char buf[BUFSIZ];
|
|
// &buf[0] <= p <= end <= &buf[BUFSIZ]
|
|
char *p;
|
|
char *end;
|
|
int eof;
|
|
int error;
|
|
// [&buf[0], pend) is dirty
|
|
int writing;
|
|
pthread_mutex_t mut;
|
|
// if something else needs builtin linked lists, replace this with
|
|
// fancy linked list macros.
|
|
struct _FILE *lnext;
|
|
struct _FILE *lprev;
|
|
};
|
|
|
|
typedef struct _FILE FILE;
|
|
extern FILE *stdin, *stdout, *stderr;
|
|
|
|
typedef struct {
|
|
} jmp_buf;
|
|
|
|
struct lconv {
|
|
int a;
|
|
int decimal_point[10];
|
|
};
|
|
|
|
struct utsname {
|
|
#define UTSMAX 64
|
|
char sysname[UTSMAX];
|
|
char nodename[UTSMAX];
|
|
char release[UTSMAX];
|
|
char version[UTSMAX];
|
|
char machine[UTSMAX];
|
|
};
|
|
|
|
void abort(void);
|
|
unsigned int alarm(unsigned int);
|
|
int atoi(const char *);
|
|
double ceil(double);
|
|
int closedir(DIR *);
|
|
int creat(const char *, mode_t);
|
|
char *ctime(const time_t *);
|
|
char *ctime_r(const time_t *, char *);
|
|
void err(int, const char *, ...)
|
|
__attribute__((format(printf, 2, 3)))
|
|
__attribute__((__noreturn__));
|
|
void errx(int, const char *, ...)
|
|
__attribute__((format(printf, 2, 3)))
|
|
__attribute__((__noreturn__));
|
|
void exit(int)
|
|
__attribute__((noreturn));
|
|
int fclose(FILE *);
|
|
DIR *fdopendir(int);
|
|
int feof(FILE *);
|
|
int ferror(FILE *);
|
|
int fileno(FILE *);
|
|
int fflush(FILE *);
|
|
int fgetc(FILE *);
|
|
char *fgets(char *, int, FILE *);
|
|
FILE *fdopen(int, const char *);
|
|
FILE *fopen(const char *, const char *);
|
|
int fprintf(FILE *, const char *, ...)
|
|
__attribute__((format(printf, 2, 3)));
|
|
int fsync(int);
|
|
//int fputs(const char *, FILE *); /*REDIS*/
|
|
size_t fread(void *, size_t, size_t, FILE *);
|
|
off_t ftello(FILE *);
|
|
size_t fwrite(const void *, size_t, size_t, FILE *);
|
|
struct gcfrac_t {
|
|
long startms;
|
|
long gcworkms;
|
|
struct {
|
|
// write barrier ms
|
|
long wbms;
|
|
long bgsweepms;
|
|
long markms;
|
|
} details;
|
|
};
|
|
struct gcfrac_t gcfracst(void);
|
|
double gcfracend(struct gcfrac_t *, long *, long *, long *);
|
|
int getopt(int, char * const *, const char *);
|
|
extern char *optarg;
|
|
extern int optind;
|
|
|
|
int isalpha(int);
|
|
int isdigit(int);
|
|
int islower(int);
|
|
int isprint(int);
|
|
int ispunct(int);
|
|
int isspace(int);
|
|
int isupper(int);
|
|
int isxdigit(int);
|
|
|
|
//struct lconv* localeconv(void); /*REDIS*/
|
|
double log(double);
|
|
dev_t makedev(uint, uint);
|
|
int memcmp(const void *, const void *, size_t);
|
|
void *memcpy(void *, const void *, size_t);
|
|
void *memmove(void *, const void *, size_t);
|
|
void *memset(void *, int, size_t);
|
|
int mkstemp(char *);
|
|
DIR *opendir(const char *);
|
|
void openlog(const char *, int, int);
|
|
// log options
|
|
#define LOG_PID (1ull << 0)
|
|
#define LOG_CONS (1ull << 1)
|
|
#define LOG_NDELAY (1ull << 2)
|
|
#define LOG_ODELAY (1ull << 3)
|
|
#define LOG_NOWAIT (1ull << 4)
|
|
int printf(const char *, ...)
|
|
__attribute__((format(printf, 1, 2)));
|
|
double pow(double, double);
|
|
void perror(const char *);
|
|
void qsort(void *, size_t, size_t, int (*)(const void *, const void *));
|
|
int rand(void);
|
|
int rand_r(uint *);
|
|
#define RAND_MAX 0x7fffffff
|
|
long random(void);
|
|
ulong rdtsc(void);
|
|
struct dirent *readdir(DIR *);
|
|
int readdir_r(DIR *, struct dirent *, struct dirent **);
|
|
char *readline(const char *);
|
|
void rewinddir(DIR *);
|
|
//int scanf(const char *, ...) /*REDIS*/
|
|
// __attribute__((format(scanf, 1, 2))); /*REDIS*/
|
|
int setenv(const char *, const char *, int);
|
|
char *setlocale(int, const char *);
|
|
#define LC_COLLATE 1
|
|
uint sleep(uint);
|
|
int snprintf(char *, size_t, const char *,...)
|
|
__attribute__((format(printf, 3, 4)));
|
|
int sprintf(char *, const char *,...)
|
|
__attribute__((format(printf, 2, 3)));
|
|
void srand(uint);
|
|
void srandom(uint);
|
|
int sscanf(const char *, const char *, ...)
|
|
__attribute__((format(scanf, 2, 3)));
|
|
int strcasecmp(const char *, const char *);
|
|
int strncasecmp(const char *, const char *, size_t);
|
|
char *strchr(const char *, int);
|
|
char *strdup(const char *);
|
|
char *strerror(int);
|
|
#define NL_TEXTMAX 64
|
|
int strerror_r(int, char *, size_t);
|
|
char *strncpy(char *, const char *, size_t);
|
|
size_t strlen(const char *);
|
|
int strcmp(const char *, const char *);
|
|
int strcoll(const char *, const char *);
|
|
int strncmp(const char *, const char *, size_t);
|
|
long strtol(const char *, char **, int);
|
|
double strtod(const char *, char **);
|
|
long double strtold(const char *, char **);
|
|
long long strtoll(const char *, char **, int);
|
|
ulong strtoul(const char *, char **, int);
|
|
unsigned long long strtoull(const char *, char **, int);
|
|
char *strstr(const char *, const char *);
|
|
void syslog(int, const char *, ...);
|
|
// priorities
|
|
#define LOG_EMERG (1ull << 0)
|
|
#define LOG_ALERT (1ull << 1)
|
|
#define LOG_CRIT (1ull << 2)
|
|
#define LOG_ERR (1ull << 3)
|
|
#define LOG_WARNING (1ull << 4)
|
|
#define LOG_NOTICE (1ull << 5)
|
|
#define LOG_INFO (1ull << 6)
|
|
#define LOG_DEBUG (1ull << 7)
|
|
#define LOG_LOCAL0 (1ull << 8)
|
|
#define LOG_LOCAL1 (1ull << 9)
|
|
#define LOG_LOCAL2 (1ull << 10)
|
|
#define LOG_LOCAL3 (1ull << 11)
|
|
#define LOG_LOCAL4 (1ull << 12)
|
|
#define LOG_LOCAL5 (1ull << 13)
|
|
#define LOG_LOCAL6 (1ull << 14)
|
|
#define LOG_LOCAL7 (1ull << 15)
|
|
#define LOG_USER (1ull << 16)
|
|
#define LOG_ALL (0x1ffff)
|
|
time_t time(time_t*);
|
|
int tolower(int);
|
|
int toupper(int);
|
|
double trunc(double);
|
|
int uname(struct utsname *);
|
|
int ungetc(int, FILE *);
|
|
int usleep(uint);
|
|
int vfprintf(FILE *, const char *, va_list)
|
|
__attribute__((format(printf, 2, 0)));
|
|
int vprintf(const char *, va_list)
|
|
__attribute__((format(printf, 1, 0)));
|
|
int vsnprintf(char *, size_t, const char *, va_list)
|
|
__attribute__((format(printf, 3, 0)));
|
|
int vsscanf(const char *, const char *, va_list)
|
|
__attribute__((format(scanf, 2, 0)));
|
|
|
|
void *malloc(size_t);
|
|
void free(void *);
|
|
void *calloc(size_t, size_t);
|
|
void *realloc(void *, size_t);
|
|
|
|
extern char __progname[64];
|
|
extern char **environ;
|
|
|
|
/* NGINX STUFF */
|
|
char *getenv(char *);
|
|
uid_t geteuid(void);
|
|
|
|
struct passwd {
|
|
char *pw_name;
|
|
uid_t pw_uid;
|
|
gid_t pw_gid;
|
|
char *pw_dir;
|
|
char *pw_shell;
|
|
};
|
|
|
|
struct passwd *getpwnam(const char *);
|
|
|
|
struct group {
|
|
char *gr_name;
|
|
gid_t gr_gid;
|
|
char **gr_mem;
|
|
};
|
|
|
|
struct group *getgrnam(const char *);
|
|
|
|
struct hostent {
|
|
char *h_name;
|
|
char **h_aliases;
|
|
int h_addrtype;
|
|
int h_length;
|
|
char **h_addr_list;
|
|
};
|
|
|
|
struct hostent *gethostbyname(const char *);
|
|
int chown(const char *, uid_t, gid_t);
|
|
time_t mktime(struct tm *);
|
|
int getpeername(int, struct sockaddr *, socklen_t *);
|
|
int getsockname(int, struct sockaddr *, socklen_t *);
|
|
int setsockopt(int, int, int, const void *, socklen_t);
|
|
int gethostname(char *, size_t);
|
|
char *strpbrk(const char *, const char *);
|
|
|
|
struct itimerval {
|
|
struct timeval it_interval;
|
|
struct timeval it_value;
|
|
};
|
|
|
|
#define ITIMER_REAL 1
|
|
|
|
int setitimer(int, struct itimerval *, struct itimerval *);
|
|
|
|
struct tm *localtime(const time_t *);
|
|
struct tm *gmtime(const time_t *);
|
|
int utimes(const char *, const struct timeval[2]);
|
|
|
|
typedef struct {
|
|
int gl_pathc;
|
|
int gl_matchc;
|
|
char **gl_pathv;
|
|
int gl_offs;
|
|
} glob_t;
|
|
|
|
int glob(const char *, int, int (*)(const char *, int), glob_t *);
|
|
void globfree(glob_t *);
|
|
|
|
struct flock {
|
|
short l_type;
|
|
#define F_WRLCK 1
|
|
#define F_UNLCK 2
|
|
short l_whence;
|
|
off_t l_start;
|
|
off_t l_len;
|
|
pid_t l_pid;
|
|
};
|
|
|
|
int socketpair(int, int, int, int[2]);
|
|
int ioctl(int, ulong, ...);
|
|
#define FIOASYNC 3
|
|
|
|
int raise(int);
|
|
mode_t umask(mode_t);
|
|
int getpagesize(void);
|
|
int sigprocmask(int, sigset_t *, sigset_t *);
|
|
int sigsuspend(const sigset_t *);
|
|
|
|
int setpriority(int, int, int);
|
|
#define PRIO_PROCESS 1
|
|
|
|
uid_t getuid(void);
|
|
int setuid(uid_t);
|
|
int setgid(gid_t);
|
|
int initgroups(const char *, gid_t);
|
|
|
|
#define MSG_PEEK 1
|
|
|
|
char *realpath(const char *, char *);
|
|
int lstat(const char *, struct stat *);
|
|
|
|
//static inline pid_t
|
|
//getppid(void)
|
|
//{
|
|
// pid_t ret;
|
|
// asm volatile(
|
|
// "movq %%rsp, %%r10\n"
|
|
// "leaq 2(%%rip), %%r11\n"
|
|
// "sysenter\n"
|
|
// "callq flea\n"
|
|
// : "=a"(ret)
|
|
// : "0"(40)
|
|
// : "cc", "rdi", "rsi", "rdx", "rcx", "r8", "memory", "r9", "r10", "r11", "r12", "r13", "r14", "r15");
|
|
// return ret;
|
|
//}
|
|
|
|
#ifdef __cplusplus
|
|
} // extern "C"
|
|
#endif
|