README.md
Rendering markdown...
// SPDX-License-Identifier: MIT
#include <linux/in.h>
#include <linux/unistd.h>
#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);
}