diff --git a/arch/aarch64.c b/arch/aarch64.c index 37bee65..ba8436b 100644 --- a/arch/aarch64.c +++ b/arch/aarch64.c @@ -147,7 +147,7 @@ int socket(int domain, int type, int protocol) { return (int32_t)rtn; } -int setsockopt(int sockfd, int level, int optname, const void* optval, uint64_t optlen) { +int setsockopt(int sockfd, int level, int optname, const void* optval, socklen_t optlen) { long int rtn; asm volatile ( // Assembly Instructions @@ -162,14 +162,14 @@ int setsockopt(int sockfd, int level, int optname, const void* optval, uint64_t // Output operands : "=r" (rtn) // Input operand - : "r" ((int64_t)sockfd), "r"((int64_t)level), "r"((int64_t)optname), "r"(optval), "r"(optlen) + : "r" ((int64_t)sockfd), "r"((int64_t)level), "r"((int64_t)optname), "r"(optval), "r"((uint64_t)optlen) // Clobbered registers : "x0", "x1", "x2", "x3", "x4", "x8" ); return (int32_t)rtn; } -int bind(int sockfd, const void* sockaddr, uint64_t addrlen) { +int bind(int sockfd, const void* sockaddr, socklen_t addrlen) { long int rtn; asm volatile ( // Assembly Instructions @@ -182,7 +182,7 @@ int bind(int sockfd, const void* sockaddr, uint64_t addrlen) { // Output operands : "=r" (rtn) // Input operand - : "r" ((int64_t)sockfd), "r"(sockaddr), "r"(addrlen) + : "r" ((int64_t)sockfd), "r"(sockaddr), "r"((uint64_t)addrlen) // Clobbered registers : "x0", "x1", "x2", "x8" ); @@ -208,7 +208,7 @@ int listen(int fd, int backlog) { return (int32_t)rtn; } -int accept(int sockfd, void* addr, uint64_t* addrlen) { +int accept(int sockfd, void* addr, socklen_t* addrlen) { long int rtn; asm volatile ( // Assembly Instructions @@ -228,7 +228,7 @@ int accept(int sockfd, void* addr, uint64_t* addrlen) { return (int32_t)rtn; } -int connect(int sockfd, void* addr, uint64_t addrlen) { +int connect(int sockfd, void* addr, socklen_t addrlen) { long int rtn; asm volatile ( // Assembly Instructions @@ -241,15 +241,15 @@ int connect(int sockfd, void* addr, uint64_t addrlen) { // Output operands : "=r" (rtn) // Input operand - : "r" ((int64_t)sockfd), "r"(addr), "r"(addrlen) + : "r" ((int64_t)sockfd), "r"(addr), "r"((uint64_t)addrlen) // Clobbered registers : "x0", "x1", "x2", "x8" ); return (int32_t)rtn; } -int64_t sendto(int sockfd, const void* buf, uint64_t size, int flags, const void* sockaddr, uint64_t addrlen) { - long int rtn; +ssize_t sendto(int sockfd, const void* buf, size_t size, int flags, const void* sockaddr, socklen_t addrlen) { + ssize_t rtn; asm volatile ( // Assembly Instructions "mov x8, #206\n" // Syscall number for 'sendto' is 206 in AArch64 @@ -264,15 +264,15 @@ int64_t sendto(int sockfd, const void* buf, uint64_t size, int flags, const void // Output operands : "=r" (rtn) // Input operand - : "r" ((int64_t)sockfd), "r"(buf), "r"(size), "r"((int64_t)flags), "r"(sockaddr), "r"(addrlen) + : "r" ((int64_t)sockfd), "r"(buf), "r"(size), "r"((int64_t)flags), "r"(sockaddr), "r"((uint64_t)addrlen) // Clobbered registers : "x0", "x1", "x2", "x3", "x4", "x5", "x8" ); return rtn; } -int64_t recvfrom(int sockfd, const void* buf, uint64_t size, int flags, const void* sockaddr, uint64_t addrlen) { - long int rtn; +ssize_t recvfrom(int sockfd, const void* buf, size_t size, int flags, const void* sockaddr, socklen_t addrlen) { + ssize_t rtn; asm volatile ( // Assembly Instructions "mov x8, #207\n" // Syscall number for 'recvfrom' is 207 in AArch64 @@ -287,7 +287,7 @@ int64_t recvfrom(int sockfd, const void* buf, uint64_t size, int flags, const vo // Output operands : "=r" (rtn) // Input operand - : "r" ((int64_t)sockfd), "r"(buf), "r"(size), "r"((int64_t)flags), "r"(sockaddr), "r"(addrlen) + : "r" ((int64_t)sockfd), "r"(buf), "r"(size), "r"((int64_t)flags), "r"(sockaddr), "r"((uint64_t)addrlen) // Clobbered registers : "x0", "x1", "x2", "x3", "x4", "x5", "x8", "memory" ); diff --git a/arch/x86_64.c b/arch/x86_64.c index 7925f17..28378c8 100644 --- a/arch/x86_64.c +++ b/arch/x86_64.c @@ -101,21 +101,21 @@ int socket(int domain, int type, int protocol) { } #define SYS_SETSOCKOPT 54 -int setsockopt(int fd, int level, int optname, const void* optval, uint64_t optlen) { +int setsockopt(int fd, int level, int optname, const void* optval, socklen_t optlen) { int rtn; asm volatile( "mov %5, %%r10\n" "mov %6, %%r8\n" "syscall\n" : "=a"(rtn) - : "a"(SYS_SETSOCKOPT), "D"(fd), "S"(level), "d"(optname), "r"(optval), "r"(optlen) + : "a"(SYS_SETSOCKOPT), "D"(fd), "S"(level), "d"(optname), "r"(optval), "r"((uint64_t)optlen) : "rcx", "r11" ); return rtn; } #define SYS_BIND 49 -int bind(int fd, const void* sockaddr, uint64_t addrlen) { +int bind(int fd, const void* sockaddr, socklen_t addrlen) { int rtn; asm volatile( "syscall\n" @@ -139,7 +139,7 @@ int listen(int fd, int backlog) { } #define SYS_ACCEPT 43 -int accept(int fd, void* addr, uint64_t* addrlen) { +int accept(int fd, void* addr, socklen_t* addrlen) { int rtn; asm volatile( "syscall\n" @@ -151,7 +151,7 @@ int accept(int fd, void* addr, uint64_t* addrlen) { } #define SYS_CONNECT 42 -int connect(int fd, void* addr, uint64_t addrlen) { +int connect(int fd, void* addr, socklen_t addrlen) { int rtn; asm volatile( "syscall\n" @@ -163,30 +163,30 @@ int connect(int fd, void* addr, uint64_t addrlen) { } #define SYS_SENDTO 44 -int64_t sendto(int fd, const void* buf, uint64_t size, int flags, const void* sockaddr, uint64_t addrlen) { - int64_t nsent; +ssize_t sendto(int fd, const void* buf, size_t size, int flags, const void* sockaddr, socklen_t addrlen) { + ssize_t nsent; asm volatile( "mov %5, %%r10\n" "mov %6, %%r8\n" "mov %7, %%r9\n" "syscall\n" : "=a"(nsent) - : "a"(SYS_SENDTO), "D"(fd), "S"(buf), "d"(size), "r"((int64_t)flags), "r"(sockaddr), "r"(addrlen) + : "a"(SYS_SENDTO), "D"(fd), "S"(buf), "d"(size), "r"((int64_t)flags), "r"(sockaddr), "r"((uint64_t)addrlen) : "rcx", "r11" ); return nsent; } #define SYS_RECVFROM 45 -int64_t recvfrom(int fd, const void* buf, uint64_t size, int flags, const void* sockaddr, uint64_t addrlen) { - int64_t nrecv; +ssize_t recvfrom(int fd, const void* buf, size_t size, int flags, const void* sockaddr, socklen_t addrlen) { + ssize_t nrecv; asm volatile( "mov %5, %%r10\n" "mov %6, %%r8\n" "mov %7, %%r9\n" "syscall\n" : "=a"(nrecv) - : "a"(SYS_RECVFROM), "D"(fd), "S"(buf), "d"(size), "r"((int64_t)flags), "r"(sockaddr), "r"(addrlen) + : "a"(SYS_RECVFROM), "D"(fd), "S"(buf), "d"(size), "r"((int64_t)flags), "r"(sockaddr), "r"((int64_t)addrlen) : "rcx", "r11", "memory" ); return nrecv; diff --git a/int.h b/int.h index 550e198..caf7cf6 100644 --- a/int.h +++ b/int.h @@ -23,15 +23,17 @@ typedef uint64_t uintptr_t; #elif __WORDSIZE == 32 typedef int32_t intptr_t; typedef uint32_t uintptr_t; +#else +#error Unsupported or unknown wordsize #endif +typedef intptr_t ssize_t; +typedef uintptr_t size_t; + +typedef uint32_t socklen_t; +typedef uint32_t pid_t; + // Compile time tests in supported compilers -#ifdef __SIZEOF_CHAR__ -#if __SIZEOF_CHAR__ != 1 -#error __SIZEOF_CHAR__ is not 1 -#endif -#endif - #ifdef __SIZEOF_SHORT__ #if __SIZEOF_SHORT__ != 2 #error __SIZEOF_SHORT__ is not 2 @@ -56,7 +58,10 @@ typedef uint32_t uintptr_t; #endif #endif -// TODO: -// size_t, ssize_t, socklen_t -// #ifdef __SIZEOF_SIZE_T__ +#ifdef __SIZEOF_SIZE_T__ +#if __SIZEOF_SIZE_T__ != (__WORDSIZE / 8) +#error __SIZEOF_SIZE_T__ is not (__WORDSIZE / 8) +#endif +#endif + #endif // !MINIMALINT_H diff --git a/socktest.c b/socktest.c index 5e46dd7..5425a7e 100644 --- a/socktest.c +++ b/socktest.c @@ -5,7 +5,6 @@ int main() { char recvBuff[4096]; int socket_fd, connection_fd; - int c; struct sockaddr_in server, client; server.sin_family = AF_INET; server.sin_addr.s_addr = INADDR_ANY; @@ -17,7 +16,7 @@ int main() { if (socket_fd < 0) { write(STDERR, "Socket error\n", 13); close(socket_fd); - return(1); + return 1; } // Set socket options @@ -25,14 +24,14 @@ int main() { if(0 > setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { write(STDERR, "Socket error\n", 13); close(socket_fd); - return(2); + return 2; } // Bind the socket if( bind(socket_fd, (struct sockaddr *)&server, sizeof(server)) < 0) { write(STDERR, "Socket error\n", 13); close(socket_fd); - return(3); + return 3; } // Listen for incoming connections @@ -42,14 +41,14 @@ int main() { write(STDOUT, "Waiting for incoming connections...\n", 36); // Get the new connection - c = sizeof(struct sockaddr_in); - connection_fd = accept(socket_fd, (void *)&client, (uint64_t*)&c); + socklen_t c = sizeof(struct sockaddr_in); + connection_fd = accept(socket_fd, (void *)&client, &c); write(STDOUT, "Got new connection\n", 19); if(connection_fd < 0) { write(STDERR, "Connection error\n", 17); close(connection_fd); close(socket_fd); - return(5); + return 5; } @@ -63,18 +62,18 @@ int main() { write(STDERR, "Connection error\n", 17); close(connection_fd); close(socket_fd); - return(6); + return 6; } // Recieve stuff write(STDOUT, "Recieving data...\n", 18); for(;;) { - int64_t incoming = recv(connection_fd, recvBuff, 4096, 0); + ssize_t incoming = recv(connection_fd, recvBuff, 4096, 0); if( incoming < 0) { write(STDERR, "Connection error\n", 17); close(connection_fd); close(socket_fd); - return(7); + return 7; }if(incoming == 0) break; // Print the recieved data diff --git a/sys.h b/sys.h index b12881f..ee9a711 100644 --- a/sys.h +++ b/sys.h @@ -39,14 +39,14 @@ int fsync(unsigned int fd); // Socket syscalls int socket(int domain, int type, int protocol); -int setsockopt(int sockfd, int level, int optname, const void* optval, uint64_t optlen); -int bind(int sockfd, const void* sockaddr, uint64_t addrlen); +int setsockopt(int sockfd, int level, int optname, const void* optval, socklen_t optlen); +int bind(int sockfd, const void* sockaddr, socklen_t addrlen); int listen(int fd, int backlog); -int accept(int sockfd, void* addr, uint64_t* addrlen); -int connect(int sockfd, void* addr, uint64_t addrlen); -int64_t sendto(int sockfd, const void* buf, uint64_t size, int flags, const void* sockaddr, uint64_t addrlen); +int accept(int sockfd, void* addr, socklen_t* addrlen); +int connect(int sockfd, void* addr, socklen_t addrlen); +int64_t sendto(int sockfd, const void* buf, size_t size, int flags, const void* sockaddr, socklen_t addrlen); #define send(sockfd, buf, size, flags) sendto(sockfd, buf, size, flags, 0, 0) -int64_t recvfrom(int sockfd, const void* buf, uint64_t size, int flags, const void* sockaddr, uint64_t addrlen); +int64_t recvfrom(int sockfd, const void* buf, size_t size, int flags, const void* sockaddr, socklen_t addrlen); #define recv(sockfd, buf, size, flags) recvfrom(sockfd, buf, size, flags, 0, 0) // Socket Domain constants typedef unsigned short sa_family_t; @@ -84,22 +84,22 @@ SOCK_PACKET = 10, #define SO_BROADCAST 6 #define SO_SNDBUF 7 #define SO_RCVBUF 8 - #define SO_SNDBUFFORCE 32 - #define SO_RCVBUFFORCE 33 #define SO_KEEPALIVE 9 #define SO_OOBINLINE 10 - #define SO_NO_CHECK 11 - #define SO_PRIORITY 12 #define SO_LINGER 13 - #define SO_BSDCOMPAT 14 #define SO_REUSEPORT 15 - #define SO_PASSCRED 16 - #define SO_PEERCRED 17 #define SO_RCVLOWAT 18 #define SO_SNDLOWAT 19 #define SO_RCVTIMEO 20 #define SO_SNDTIMEO 21 #endif +#define SO_STYLE SO_TYPE /* Synonym */ +/* linux-specific, might as well be the same as on i386 */ +#define SO_NO_CHECK 11 +#define SO_PRIORITY 12 +#define SO_BSDCOMPAT 14 +#define SO_PASSCRED 17 +#define SO_PEERCRED 18 uint32_t fork();