diff --git a/AcessNative/ld-acess.so_src/Makefile b/AcessNative/ld-acess.so_src/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..3531f710a65e52fba2500ea3e24edda4923be90b --- /dev/null +++ b/AcessNative/ld-acess.so_src/Makefile @@ -0,0 +1,31 @@ +# +# + +ifeq ($(PLATFORM),) + PLATFORM := lin +endif + +OBJ := syscalls.$(PLATFORM).o request.$(PLATFORM).o + +ifeq ($(PLATFORM),win) + BIN := ../libacess.dll +endif +ifeq ($(PLATFORM),lin) + BIN := ../libacess.so + CFLAGS += -fPIC +endif + + +.PHONY: all clean + +all: $(BIN) + +clean: + $(RM) $(BIN) $(OBJ) + +$(BIN): $(OBJ) + $(CC) -shared -o $@ $< + +%.$(PLATFORM).o: %.c + $(CC) -c $< -o $@ $(CFLAGS) $(CPPFLAGS) + diff --git a/AcessNative/ld-acess.so_src/request.c b/AcessNative/ld-acess.so_src/request.c new file mode 100644 index 0000000000000000000000000000000000000000..5a641194da7e5239dc2316734db58ce3cae6abcd --- /dev/null +++ b/AcessNative/ld-acess.so_src/request.c @@ -0,0 +1,70 @@ +/* + */ +#include <windows.h> +#include <stdio.h> +#include <winsock.h> + +#define SERVER_PORT 0xACE + +// === GLOBALS === +#ifdef __WIN32__ +WSADATA gWinsock; +SOCKET gSocket; +#endif + +// === CODE === +int _InitSyscalls() +{ + struct sockaddr_in server; + struct sockaddr_in client; + + #ifdef __WIN32__ + /* Open windows connection */ + if (WSAStartup(0x0101, &gWinsock) != 0) + { + fprintf(stderr, "Could not open Windows connection.\n"); + exit(0); + } + #endif + + // Open UDP Connection + gSocket = socket(AF_INET, SOCK_DGRAM, 0); + if (gSocket == INVALID_SOCKET) + { + fprintf(stderr, "Could not create socket.\n"); + WSACleanup(); + exit(0); + } + + // Set server address + memset((void *)&server, '\0', sizeof(struct sockaddr_in)); + server.sin_family = AF_INET; + server.sin_port = htons(SERVER_PORT); + server.sin_addr.S_un.S_un_b.s_b1 = (unsigned char)127; + server.sin_addr.S_un.S_un_b.s_b2 = (unsigned char)0; + server.sin_addr.S_un.S_un_b.s_b3 = (unsigned char)0; + server.sin_addr.S_un.S_un_b.s_b4 = (unsigned char)1; + + // Set client address + memset((void *)&client, '\0', sizeof(struct sockaddr_in)); + client.sin_family = AF_INET; + client.sin_port = htons(0); + client.sin_addr.S_un.S_un_b.s_b1 = (unsigned char)127; + client.sin_addr.S_un.S_un_b.s_b2 = (unsigned char)0; + client.sin_addr.S_un.S_un_b.s_b3 = (unsigned char)0; + client.sin_addr.S_un.S_un_b.s_b4 = (unsigned char)1; + + // Bind + if( bind(gSocket, (struct sockaddr *)&client, sizeof(struct sockaddr_in)) == -1 ) + { + fprintf(stderr, "Cannot bind address to socket.\n"); + closesocket(gSocket); + WSACleanup(); + exit(0); + } +} + +int _Syscall(const char *ArgTypes, ...) +{ + return 0; +} diff --git a/AcessNative/ld-acess.so_src/syscalls.c b/AcessNative/ld-acess.so_src/syscalls.c new file mode 100644 index 0000000000000000000000000000000000000000..35fa6aebf14edae69caa8b18defa8e1ae75f246a --- /dev/null +++ b/AcessNative/ld-acess.so_src/syscalls.c @@ -0,0 +1,55 @@ +/* + */ +//#include <acess/sys.h> +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> + +// === IMPORTS === +/** + * \param ArgTypes + * + * Whitespace is ignored + * >i: Input Integer + * >I: Input Long Integer (64-bits) + * >s: Input String + * >d: Input Buffer (Preceded by valid size) + * <I: Output long integer + * <d: Output Buffer (Preceded by valid size) + */ +int _Syscall(const char *ArgTypes, ...) +{ + int outBufSize = 0; + va_list args; + + va_start(args, ArgTypes); + va_end(args); + +} + +int open(const char *Path, int Flags) { + return _Syscall(">s >i", Path, Flags); +} + +void close(int FD) { + _Syscall(">i", FD); +} + +size_t read(int FD, size_t Bytes, void *Dest) { + return _Syscall(">i >i <d", FD, Bytes, Bytes, Dest); +} + +size_t write(int FD, size_t Bytes, void *Src) { + return _Syscall(">i >i >d", FD, Bytes, Bytes, Src); +} + +uint64_t tell(int FD) { + uint64_t ret; + _Syscall("<I >i", &ret, FD); + return ret; +} + +int seek(int FD, uint64_t Ofs, int Dir) { + return _Syscall(">i >I >i", FD, Ofs, Dir); +} +