// SPDX-License-Identifier: MIT #include #include #define AF_INET 2 #define SOCK_STREAM 2 #define SYSCALL_CLOBBER_LIST \ "at", "v1", \ "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7", "t8", "t9", \ "memory" static inline long syscall(long n, long arg0, long arg1, long arg2, long arg3) { register long v0 asm("v0") = n; register long a0 asm("a0") = arg0; register long a1 asm("a1") = arg1; register long a2 asm("a2") = arg2; register long a3 asm("a3") = arg3; asm volatile ( "addu $v0, $zero, %[n]\n" "syscall\n" : "=&r" (v0), "+r" (a0), "+r" (a1), "+r" (a2), "+r" (a3) : [n] "ir" (n) : SYSCALL_CLOBBER_LIST ); return a3 ? -v0 : v0; } static inline int socket(int domain, int type, int protocol) { return syscall(__NR_socket, domain, type, protocol, 0); } static inline int bind(int sockfd, const struct sockaddr_in *addr, int addrlen) { return syscall(__NR_bind, sockfd, (long)addr, addrlen, 0); } static inline int listen(int sockfd, int backlog) { return syscall(__NR_listen, sockfd, backlog, 0, 0); } static inline int accept(int sockfd, const struct sockaddr_in *addr, int *addrlen) { return syscall(__NR_accept, sockfd, (long)addr, (long)addrlen, 0); } static inline int dup2(int oldfd, int newfd) { return syscall(__NR_dup2, oldfd, newfd, 0, 0); } static inline int execve(const char *path, char* argv[], char* envp[]) { return syscall(__NR_execve, (long)path, (long)argv, (long)envp, 0); }