Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemathinc
GitHub Repository: sagemathinc/wapython
Path: blob/main/core/posix-wasm/src/posix-wasm.h
1067 views
1
#ifndef WASMPOSIX
2
#define WASMPOSIX
3
4
#include <sys/types.h>
5
6
#define GRND_NONBLOCK 0x0001
7
#define GRND_RANDOM 0x0002
8
#define GRND_INSECURE 0x0004
9
10
ssize_t getrandom(void* buf, size_t buflen, unsigned int flags);
11
int dup(int oldfd);
12
13
typedef unsigned char sigset_t;
14
int sigemptyset(sigset_t* set);
15
int sigaddset(sigset_t* set, int signo);
16
#include <unistd.h>
17
char* ttyname(int fd);
18
int ttyname_r(int fd, char* buf, size_t buflen);
19
20
#include <sys/stat.h>
21
22
int chmod(const char* path, mode_t mode);
23
int fchmod(int fd, mode_t mode);
24
int lchmod(const char* path, mode_t mode);
25
int fchmodat(int fd, const char* path, mode_t mode, int flag);
26
int chflags(const char* path, unsigned long flags);
27
int lchflags(const char* path, unsigned long flags);
28
void sync(void);
29
int chown(const char* path, uid_t owner, gid_t group);
30
int fchown(int fd, uid_t owner, gid_t group);
31
int lchown(const char* path, uid_t owner, gid_t group);
32
int fchownat(int fd, const char* path, uid_t owner, gid_t group, int flag);
33
int nice(int inc);
34
35
struct ttyent {
36
char* ty_name; /* terminal device name */
37
char* ty_getty; /* command to execute, usually getty */
38
char* ty_type; /* terminal type for termcap */
39
#define TTY_ON 0x01 /* enable logins (start ty_getty program) */
40
#define TTY_SECURE 0x02 /* allow uid of 0 to login */
41
int ty_status; /* status flags */
42
char* ty_window; /* command to start up window manager */
43
char* ty_comment; /* comment field */
44
};
45
46
struct ttyent* getttyent(void);
47
struct ttyent* getttynam(const char* name);
48
49
//#include <sys/resource.h>
50
int getpriority(int which, id_t who);
51
int setpriority(int which, id_t who, int prio);
52
53
mode_t umask(mode_t mask);
54
55
#include <sys/time.h>
56
int futimes(int fd, const struct timeval tv[2]);
57
int lutimes(const char* filename, const struct timeval tv[2]);
58
int utimes(const char* path, const struct timeval times[2]);
59
60
int execv(const char* path, char* const argv[]);
61
int fexecve(int fd, char* const argv[], char* const envp[]);
62
int execve(const char* pathname, char* const argv[], char* const envp[]);
63
int execlp(const char* file, const char* arg, ... /* (char *) NULL */);
64
int execvp(const char* file, char* const argv[]);
65
66
struct sched_param {
67
int sched_priority;
68
};
69
70
struct sigaction {
71
void (*sa_handler)(int);
72
void (*sa_sigaction)(int, void*, void*);
73
sigset_t sa_mask;
74
int sa_flags;
75
void (*sa_restorer)(void);
76
};
77
78
int sigaction(int signum, const struct sigaction* act,
79
struct sigaction* oldact);
80
81
pid_t fork(void);
82
83
pid_t fork1(void);
84
pid_t vfork(void);
85
86
ssize_t splice(int fd_in, void* off_in, int fd_out, void* off_out, size_t len,
87
unsigned int flags);
88
int login_tty(int fd);
89
int eventfd(unsigned int initval, int flags);
90
91
int sched_get_priority_max(int policy);
92
int sched_get_priority_min(int policy);
93
int sched_setscheduler(pid_t pid, int policy, const struct sched_param* param);
94
int sched_getscheduler(pid_t pid);
95
int sched_setparam(pid_t pid, const struct sched_param* param);
96
int sched_getparam(pid_t pid, struct sched_param* param);
97
int sched_rr_get_interval(pid_t pid, struct timespec* tp);
98
99
gid_t getgid(void);
100
gid_t getegid(void);
101
uid_t getuid(void);
102
uid_t geteuid(void);
103
int getgroups(int size, gid_t list[]);
104
// ncurses wants this:
105
pid_t getpgrp(void); /* POSIX.1 version */
106
// but cpython may get confused and want this (it's configurable):
107
// pid_t getpgrp(pid_t pid); /* BSD version */
108
pid_t getpgid(pid_t pid);
109
110
int setpgrp(pid_t pid, pid_t pgid);
111
int kill(pid_t pid, int sig);
112
int killpg(int pgrp, int sig);
113
pid_t getppid(void);
114
115
int plock(int opr);
116
117
int setuid(uid_t uid);
118
int seteuid(uid_t euid);
119
int setegid(gid_t egid);
120
int setreuid(uid_t ruid, uid_t euid);
121
int setregid(gid_t rgid, gid_t egid);
122
int setgid(gid_t gid);
123
124
#define WNOHANG 1
125
#define WUNTRACED 2
126
#define WSTOPPED 2
127
#define WEXITED 4
128
#define WCONTINUED 8
129
#define WNOWAIT 0x1000000
130
#define __WNOTHREAD 0x20000000
131
#define __WALL 0x40000000
132
#define __WCLONE 0x80000000
133
134
typedef struct {
135
pid_t si_pid;
136
uid_t si_uid;
137
int si_signo;
138
int si_status;
139
int si_code;
140
int si_errno;
141
void* si_addr;
142
} siginfo_t;
143
144
// From packages/zig/dist/lib/libc/musl/include/sys/wait.h and needed for
145
// Python. The #ifndef is because slightly different versions of sys/wait.h
146
// get included from zig for cowasm-cc versus normal zig, I think, maybe. TODO!
147
#include <sys/wait.h>
148
#ifndef _SYS_WAIT_H
149
typedef enum { P_ALL = 0, P_PID = 1, P_PGID = 2, P_PIDFD = 3 } idtype_t;
150
#define WEXITSTATUS(s) (((s)&0xff00) >> 8)
151
#define WTERMSIG(s) ((s)&0x7f)
152
#define WSTOPSIG(s) WEXITSTATUS(s)
153
#define WIFEXITED(s) (!WTERMSIG(s))
154
#define WIFSTOPPED(s) ((short)((((s)&0xffff) * 0x10001) >> 8) > 0x7f00)
155
#define WIFSIGNALED(s) (((s)&0xffff) - 1U < 0xffu)
156
#endif
157
158
int waitid(idtype_t idtype, id_t id, siginfo_t* infop, int options);
159
pid_t wait(int* status);
160
pid_t waitpid(pid_t pid, int* status, int options);
161
162
pid_t getpid(void);
163
164
pid_t getsid(pid_t pid);
165
pid_t setsid(void);
166
int setpgid(pid_t pid, pid_t pgid);
167
168
pid_t tcgetpgrp(int fd);
169
int tcsetpgrp(int fd, pid_t pgrp);
170
171
int fdwalk(int (*func)(void*, int), void* cd);
172
int dup2(int oldfd, int newfd);
173
int dup3(int oldfd, int newfd, int flags);
174
175
int lockf(int fd, int cmd, off_t len);
176
ssize_t preadv(int fd, const struct iovec* iov, int iovcnt, off_t offset);
177
ssize_t preadv2(int fd, const struct iovec* iov, int iovcnt, off_t offset,
178
int flags);
179
180
int pipe(int pipefd[2]);
181
int pipe2(int pipefd[2], int flags);
182
183
ssize_t pwritev2(int fd, const struct iovec* iov, int iovcnt, off_t offset,
184
int flags);
185
186
typedef long long off64_t;
187
ssize_t copy_file_range(int fd_in, off64_t* off_in, int fd_out,
188
off64_t* off_out, size_t len, unsigned int flags);
189
190
int mkstemp(char* temp);
191
int mkstemps(char* templ, int suffixlen);
192
char* mkdtemp(char* templ);
193
194
int mkfifoat(int dirfd, const char* pathname, mode_t mode);
195
int mkfifo(const char* pathname, mode_t mode);
196
int mknodat(int dirfd, const char* pathname, mode_t mode, dev_t dev);
197
int mknod(const char* pathname, mode_t mode, dev_t dev);
198
int getloadavg(double loadavg[], int nelem);
199
int setresuid(uid_t ruid, uid_t euid, uid_t suid);
200
int setresgid(gid_t rgid, gid_t egid, gid_t sgid);
201
int getresuid(uid_t* ruid, uid_t* euid, uid_t* suid);
202
int getresgid(gid_t* rgid, gid_t* egid, gid_t* sgid);
203
204
char* strcasestr(const char*, const char*);
205
206
struct itimerval {
207
struct timeval it_interval; /* Interval for periodic timer */
208
struct timeval it_value; /* Time until next expiration */
209
};
210
211
unsigned int alarm(unsigned int seconds);
212
int pause(void);
213
214
int siginterrupt(int sig, int flag);
215
int getitimer(int which, struct itimerval* curr_value);
216
int setitimer(int which, const struct itimerval* new_value,
217
struct itimerval* old_value);
218
int sigismember(const sigset_t* set, int signo);
219
220
int sigpending(sigset_t* set);
221
int sigwait(const sigset_t* set, int* sig);
222
int sigfillset(sigset_t* set);
223
int sigprocmask(int, const sigset_t* __restrict, sigset_t* __restrict);
224
int sigsuspend(const sigset_t*);
225
int sigwaitinfo(const sigset_t* set, siginfo_t* info);
226
int sigtimedwait(const sigset_t* set, siginfo_t* info,
227
const struct timespec* timeout);
228
229
int clock_settime(clockid_t clk_id, const struct timespec* tp);
230
231
typedef struct {
232
void* ss_sp; /* Base address of stack */
233
int ss_flags; /* Flags */
234
size_t ss_size; /* Number of bytes in stack */
235
} stack_t;
236
int sigaltstack(const stack_t* ss, stack_t* old_ss);
237
#define SA_NODEFER 0
238
#define SA_ONSTACK 0
239
#define SA_RESTART 0
240
#define SIGSTKSZ 0
241
#define SIG_BLOCK 0
242
#define SIG_UNBLOCK 1
243
#define SIG_SETMASK 2
244
245
#define SI_ASYNCNL (-60)
246
#define SI_TKILL (-6)
247
#define SI_SIGIO (-5)
248
#define SI_ASYNCIO (-4)
249
#define SI_MESGQ (-3)
250
#define SI_TIMER (-2)
251
#define SI_QUEUE (-1)
252
#define SI_USER 0
253
#define SI_KERNEL 128
254
255
#define RLIMIT_CORE 0
256
#define RLIM_INFINITY -1
257
#define RLIM_NLIMITS 16
258
259
typedef int rlim_t;
260
struct rlimit {
261
rlim_t rlim_cur; /* Soft limit */
262
rlim_t rlim_max; /* Hard limit (ceiling for rlim_cur) */
263
};
264
int getrlimit(int resource, struct rlimit* rlim);
265
int setrlimit(int resource, const struct rlimit* rlim);
266
267
char* realpath(const char* path, char* resolved_path);
268
269
int close_range(unsigned int first, unsigned int last, unsigned int flags);
270
271
// These are not needed by Python but are needed by PARI (which isn't
272
// even part of CoWasm!?):
273
// This #define is to ensure that only one setjmp defs get defined.
274
#ifndef _SETJMP_H
275
#define _SETJMP_H
276
typedef void* __jmp_buf;
277
typedef struct __jmp_buf_tag {
278
__jmp_buf __jb;
279
unsigned long __fl;
280
unsigned long __ss[128 / sizeof(long)];
281
} jmp_buf[1];
282
typedef jmp_buf sigjmp_buf;
283
int setjmp(jmp_buf env);
284
int sigsetjmp(sigjmp_buf env, int savesigs);
285
void longjmp(jmp_buf env, int val);
286
void siglongjmp(sigjmp_buf env, int val);
287
#endif // _SETJMP_H
288
289
#ifndef FILE
290
struct _IO_FILE {
291
char __x;
292
};
293
typedef struct _IO_FILE FILE;
294
#endif
295
296
FILE* popen(const char* command, const char* type);
297
int pclose(FILE* stream);
298
299
struct passwd* getpwnam(const char* name);
300
struct passwd* getpwuid(uid_t uid);
301
// void (*signal(int sig, void (*func)(int)))(int);
302
303
// These #defines *must* be consistent with what is in kernel! See that via
304
// "DEBUG=posix:constants python-wasm":
305
306
#define SO_ERROR 4
307
#define SO_REUSEADDR 2
308
#define SO_KEEPALIVE 9
309
#define SOMAXCONN 128
310
#define SOCK_SEQPACKET 5
311
#define __WASI_RIFLAGS_RECV_DATA_TRUNCATED 0
312
313
typedef unsigned int socklen_t;
314
int setsockopt(int sockfd, int level, int optname, const void* optval,
315
socklen_t optlen);
316
317
int bind(int sockfd, const void* addr, socklen_t addrlen);
318
int connect(int sockfd, const void* addr, socklen_t addrlen);
319
int getsockname(int sockfd, void* addr, socklen_t* addrlen);
320
int getpeername(int sockfd, void* addr, socklen_t* addrlen);
321
322
int listen(int sockfd, int backlog);
323
ssize_t recvfrom(int sockfd, void* buf, size_t len, int flags, void* src_addr,
324
socklen_t* addrlen);
325
ssize_t sendto(int sockfd, const void* buf, size_t len, int flags,
326
const void* dest_addr, socklen_t addrlen);
327
int socket(int domain, int type, int protocol);
328
int gethostname(char* name, size_t len);
329
int sethostname(const char* name, size_t len);
330
int accept(int socket, void *addr, socklen_t *address_len);
331
332
// These are needed to build parts of posixmodule in Python. They seem harmless
333
// since they are self contained and copied from
334
// packages/zig/dist/lib/libc/musl/include/stdlib.h We may need to change them
335
// if we invent some notion of fork and subprocesses for our runtime!
336
337
#define WSTOPSIG(s) WEXITSTATUS(s)
338
339
// needed by sqlite; copied from packages/zig/dist/lib/libc/musl/include/fcntl.h
340
// and packages/zig/dist/lib/libc/musl/arch/aarch64/bits/fcntl.h
341
// Main point is if/when I implement these at the WASI level, have to use them
342
// and be consistent.
343
344
#define F_RDLCK 0
345
#define F_WRLCK 1
346
#define F_UNLCK 2
347
348
#define F_DUPFD 0
349
#ifndef F_GETFD
350
#define F_GETFD 1
351
#define F_SETFD 2
352
#define F_GETFL 3
353
#define F_SETFL 4
354
#endif
355
#define F_GETLK 5
356
#define F_SETLK 6
357
#define F_SETLKW 7
358
#define F_SETOWN 8
359
#define F_GETOWN 9
360
#define F_SETSIG 10
361
#define F_GETSIG 11
362
363
void flockfile(FILE* filehandle);
364
int ftrylockfile(FILE* filehandle);
365
void funlockfile(FILE* filehandle);
366
367
char* strsignal(int sig);
368
369
int fiprintf(FILE* stream, const char* format, ...);
370
int siprintf(char* s, const char* format, ...);
371
#define __small_sprintf sprintf
372
373
int strunvis(char* dst, const char* src);
374
int strnvis(char* dst, size_t dlen, const char* src, int flag);
375
int strvis(char* dst, const char* src, int flag);
376
377
#include <termios.h>
378
speed_t cfgetispeed(const struct termios* termios_p);
379
speed_t cfgetospeed(const struct termios* termios_p);
380
int tcgetattr(int fd, struct termios* tio);
381
int tcsetattr(int fd, int act, const struct termios* tio);
382
383
int fchdir(int fd);
384
385
#define SA_SIGINFO 4
386
387
// WASI can't set time, but things will try so these should be
388
// implemented as functions that display an error. They are part of POSIX.
389
// They could work on a server though, if you're running as root! I did
390
// implement related things in posix-node, I think.
391
int settimeofday(const struct timeval*, const struct timezone*);
392
int adjtime(const struct timeval*, struct timeval*);
393
394
// implemented in zig in wasm/posix/other.zig
395
int getpagesize(void);
396
397
const char* getprogname(void);
398
399
void setprogname(const char* progname);
400
401
// The following constants are all copied from grepping the musl/wasi headers.
402
#define TIOCGWINSZ 0x5413
403
#define S_ISTXT S_ISVTX
404
#define LINE_MAX 4096
405
406
long long strtonum(const char*, long long, long long, const char**);
407
408
mode_t getmode(const void* bbox, mode_t omode);
409
void* setmode(const char* p);
410
411
int mergesort(void*, size_t, size_t, int (*)(const void*, const void*));
412
int heapsort(void*, size_t, size_t, int (*)(const void*, const void*));
413
414
int cowasm_fstat(int fildes, struct stat* buf);
415
int cowasm_lstat(const char* path, struct stat* buf);
416
int cowasm_stat(const char* path, struct stat* buf);
417
int cowasm_fstatat(int fd, const char* path, struct stat* buf, int flag);
418
419
#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
420
quad_t strtoq(const char* str, char** endptr, int base);
421
422
#define UQUAD_MAX ULLONG_MAX
423
#define QUAD_MAX LLONG_MAX
424
#define QUAD_MIN LLONG_MIN
425
426
#define REG_BASIC 0000
427
#define MAXLOGNAME 255 /* max login name length */
428
429
int rpmatch(const char* response);
430
#endif // BSD_SOURCE
431
432
// Some py-numpy cython code fails without this
433
// include to ensure that max_align_t is defined in
434
// the right place:
435
#include "__stddef_max_align_t.h"
436
437
// This is needed by openssl.
438
#include "netdb.h"
439
char* inet_ntoa(struct in_addr in);
440
441
void openlog(const char*, int, int);
442
443
#endif
444
445