diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..474e379 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.vscode +build/ \ No newline at end of file diff --git a/Makefile.in b/Makefile.in index 04760c0..689e4e6 100644 --- a/Makefile.in +++ b/Makefile.in @@ -77,7 +77,7 @@ ARFLAGS=r COPY=@COPY@ OBJEXT=@OBJEXT@ SOURCES =@SOURCES@ -OBJECTS =$(addsuffix .$(OBJEXT),$(basename $(notdir $(SOURCES)))) +OBJECTS =$(wildcard $(addsuffix .$(OBJEXT),$(basename $(notdir $(SOURCES))))) $(filter-out $(addprefix obj/, $(wildcard $(addsuffix .$(OBJEXT),$(basename $(notdir $(SOURCES)))))), $(addprefix obj/, $(addsuffix .$(OBJEXT),$(basename $(notdir $(SOURCES)))))) INCLUDE_DIRECTORIES =@INCLUDE_DIRECTORIES@ INCLUDE_FILES =@INCLUDE_FILES@ mkdir_p =@mkdir_p@ @@ -90,15 +90,18 @@ all: compile_objects compile_library compile_include compile_objects: obj $(OBJECTS) -$(OBJECTS): %.$(OBJEXT): source/%.c - $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) -c $< -o obj/$@ +$(wildcard $(addsuffix .$(OBJEXT),$(basename $(notdir $(SOURCES))))): %.$(OBJEXT): source/%.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) -c $< -o $@ + +$(filter-out $(addprefix obj/, $(wildcard $(addsuffix .$(OBJEXT),$(basename $(notdir $(SOURCES)))))), $(addprefix obj/, $(addsuffix .$(OBJEXT),$(basename $(notdir $(SOURCES)))))): obj/%.$(OBJEXT): source/%.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) -c $< -o $@ obj: $(mkdir_p) obj compile_library: lib lib/libmingw32_extended.a -lib/libmingw32_extended.a: $(addprefix obj/, $(OBJECTS)) +lib/libmingw32_extended.a: $(OBJECTS) $(AR) $(ARFLAGS) lib/libmingw32_extended.a $? lib: diff --git a/configure b/configure index d925b7a..c8d6eef 100755 --- a/configure +++ b/configure @@ -50,6 +50,14 @@ SOURCES=' \$(srcdir)/source/getpeername.c \$(srcdir)/source/getsockname.c \$(srcdir)/source/getsockopt.c +\$(srcdir)/source/inet_addr.c +\$(srcdir)/source/inet_ntoa.c +\$(srcdir)/source/inet_ntop.c +\$(srcdir)/source/inet_pton.c +\$(srcdir)/source/htonl.c +\$(srcdir)/source/htons.c +\$(srcdir)/source/ntohl.c +\$(srcdir)/source/ntohs.c \$(srcdir)/source/listen.c \$(srcdir)/source/recv.c \$(srcdir)/source/recvfrom.c @@ -65,10 +73,15 @@ SOURCES=' INCLUDE_DIRECTORIES=' include include/sys +include/netinet +include/arpa ' INCLUDE_FILES=' include/sys/mman.h +include/netinet/in.h +include/arpa/inet.h include/sys/uio.h +include/sys/socket.h include/sys/wait.h include/dlfcn.h include/spawn.h @@ -3178,8 +3191,13 @@ else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else - ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 + ac_cv_host=`command -v "$ac_aux_dir/config.sub"` + if test "x$ac_cv_host" = x; then + ac_cv_host=$host_alias + else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 + fi fi fi @@ -3211,8 +3229,13 @@ else if test "x$target_alias" = x; then ac_cv_target=$ac_cv_host else - ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 + ac_cv_target=`command -v "$ac_aux_dir/config.sub"` + if test "x$ac_cv_target" = x; then + ac_cv_target=$target_alias + else + ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 + fi fi fi diff --git a/function_pointer_types.md b/function_pointer_types.md new file mode 100644 index 0000000..3ea74d5 --- /dev/null +++ b/function_pointer_types.md @@ -0,0 +1,21 @@ +# Function Pointer Type Corrections + +Based on the senior's feedback, here are the proper function pointer type definitions per the Windows API docs while maintaining POSIX compatibility: + +```c +// Network byte order conversions +uint32_t (*)(uint32_t) for htonl/ntohl +uint16_t (*)(uint16_t) for htons/ntohs + +// IP address conversions +unsigned long (*)(const char*) for inet_addr +char* (*)(struct in_addr) for inet_ntoa +const char* (*)(int, const void*, char*, size_t) for inet_ntop (InetNtopA) +int (*)(int, const char*, void*) for inet_pton (InetPtonA) +``` + +The key points: +1. We maintain POSIX types in our public interface +2. Function pointer types match Windows API signatures +3. No Windows-specific types or headers are used +4. For inet_ntop/pton we use InetNtopA/InetPtonA from ws2tcpip.h \ No newline at end of file diff --git a/include/.gitignore b/include/.gitignore deleted file mode 100644 index 4194740..0000000 --- a/include/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -parts/tar/ -parts/wim/ \ No newline at end of file diff --git a/include/arpa/inet.h b/include/arpa/inet.h new file mode 100644 index 0000000..7b1cd9f --- /dev/null +++ b/include/arpa/inet.h @@ -0,0 +1,44 @@ +#ifndef _ARPA_INET_H +#define _ARPA_INET_H + +#include +#include +#include + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* Types required by POSIX */ + typedef uint16_t in_port_t; + typedef uint32_t in_addr_t; + +/* Address-to-string buffer sizes */ +#define INET_ADDRSTRLEN 16 +#ifdef _IPV6_ +#define INET6_ADDRSTRLEN 46 +#endif + +/* Convert values between host and network byte order */ + uint32_t htonl (uint32_t); + uint16_t htons (uint16_t); + uint32_t ntohl (uint32_t); + uint16_t ntohs (uint16_t); + +/* Obsolescent functions */ +#if !defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE) + in_addr_t inet_addr (const char *); + char *inet_ntoa (struct in_addr); +#endif + +/* Current standard functions */ + const char *inet_ntop (int, const void *restrict, char *restrict, + socklen_t); + int inet_pton (int, const char *restrict, void *restrict); + +#ifdef __cplusplus +} +#endif + +#endif /* _ARPA_INET_H */ diff --git a/include/netinet/in.h b/include/netinet/in.h new file mode 100644 index 0000000..e5c2be6 --- /dev/null +++ b/include/netinet/in.h @@ -0,0 +1,58 @@ +#ifndef _NETINET_IN_H +#define _NETINET_IN_H + +#include +#include + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* Standard Internet Protocol (IP) address types */ + typedef uint16_t in_port_t; // Port number type + typedef uint32_t in_addr_t; // IPv4 address type + +/* Structure for an IPv4 address */ + struct in_addr + { + in_addr_t s_addr; // IPv4 address in network byte order + }; + +/* Socket address structure for IPv4 */ + struct sockaddr_in + { + sa_family_t sin_family; // Address family (AF_INET for IPv4) + in_port_t sin_port; // Port number in network byte order + struct in_addr sin_addr; // IPv4 address + unsigned char sin_zero[8]; // Padding to match struct sockaddr size + }; + +/* Constants for address families */ +#define AF_INET 2 // IPv4 address family + +/* Constants for socket types */ +#define IPPROTO_TCP 6 // TCP protocol +#define IPPROTO_UDP 17 // UDP protocol + +/* Macros for address manipulation */ +#define INADDR_ANY ((in_addr_t)0x00000000) // Bind to any address +#define INADDR_LOOPBACK ((in_addr_t)0x7F000001) // Loopback address (127.0.0.1) +#define INADDR_BROADCAST ((in_addr_t)0xFFFFFFFF) // Broadcast address +#define INADDR_NONE ((in_addr_t)0xFFFFFFFF) // Invalid address + +/* Byte-order conversion functions */ + uint16_t htons (uint16_t hostshort); // Host to network short + uint16_t ntohs (uint16_t netshort); // Network to host short + uint32_t htonl (uint32_t hostlong); // Host to network long + uint32_t ntohl (uint32_t netlong); // Network to host long + +/* Address conversion functions */ + in_addr_t inet_addr (const char *cp); // Convert string to IPv4 address + char *inet_ntoa (struct in_addr in); // Convert IPv4 address to string + +#ifdef __cplusplus +} +#endif + +#endif /* _NETINET_IN_H */ diff --git a/include/sys/socket.h b/include/sys/socket.h index b73d077..0cec2a0 100644 --- a/include/sys/socket.h +++ b/include/sys/socket.h @@ -2,128 +2,139 @@ #define _SYS_SOCKET_H_ #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif -#include // for size_t, NULL -#include // for standard integer types -#include // for struct iovec +#include // for size_t, NULL +#include // for standard integer types +#include // for struct iovec #ifndef _SSIZE_T_DEFINED -typedef intptr_t ssize_t; + typedef intptr_t ssize_t; #define _SSIZE_T_DEFINED #endif // Define socklen_t as an unsigned integral type of at least 32 bits -typedef unsigned int socklen_t; + typedef unsigned int socklen_t; // Define sa_family_t as an unsigned integral type -typedef unsigned short sa_family_t; + typedef unsigned short sa_family_t; // Define sockaddr structure -struct sockaddr { - sa_family_t sa_family; // address family - char sa_data[14]; // socket address (variable-length data) -}; + struct sockaddr + { + sa_family_t sa_family; // address family + char sa_data[14]; // socket address (variable-length data) + }; // Define msghdr structure -struct msghdr { - void *msg_name; // optional address - socklen_t msg_namelen; // size of address - struct iovec *msg_iov; // scatter/gather array - int msg_iovlen; // members in msg_iov - void *msg_control; // ancillary data - socklen_t msg_controllen; // ancillary data buffer length - int msg_flags; // flags on received message -}; + struct msghdr + { + void *msg_name; // optional address + socklen_t msg_namelen; // size of address + struct iovec *msg_iov; // scatter/gather array + int msg_iovlen; // members in msg_iov + void *msg_control; // ancillary data + socklen_t msg_controllen; // ancillary data buffer length + int msg_flags; // flags on received message + }; // Define cmsghdr structure -struct cmsghdr { - socklen_t cmsg_len; // data byte count, including the cmsghdr - int cmsg_level; // originating protocol - int cmsg_type; // protocol-specific type -}; + struct cmsghdr + { + socklen_t cmsg_len; // data byte count, including the cmsghdr + int cmsg_level; // originating protocol + int cmsg_type; // protocol-specific type + }; // Define linger structure -struct linger { - int l_onoff; // indicates whether linger option is enabled - int l_linger; // linger time, in seconds -}; + struct linger + { + int l_onoff; // indicates whether linger option is enabled + int l_linger; // linger time, in seconds + }; // Socket types -#define SOCK_DGRAM 2 -#define SOCK_STREAM 1 -#define SOCK_SEQPACKET 5 +#define SOCK_DGRAM 2 +#define SOCK_STREAM 1 +#define SOCK_SEQPACKET 5 // Level argument for setsockopt() and getsockopt() -#define SOL_SOCKET 0xffff +#define SOL_SOCKET 0xffff // Option names for setsockopt() and getsockopt() -#define SO_ACCEPTCONN 0x0002 -#define SO_BROADCAST 0x0020 -#define SO_DEBUG 0x0001 -#define SO_DONTROUTE 0x0010 -#define SO_ERROR 0x1007 -#define SO_KEEPALIVE 0x0008 -#define SO_LINGER 0x0080 -#define SO_OOBINLINE 0x0100 -#define SO_RCVBUF 0x1002 -#define SO_RCVLOWAT 0x1004 -#define SO_RCVTIMEO 0x1006 -#define SO_REUSEADDR 0x0004 -#define SO_SNDBUF 0x1001 -#define SO_SNDLOWAT 0x1003 -#define SO_SNDTIMEO 0x1005 -#define SO_TYPE 0x1008 +#define SO_ACCEPTCONN 0x0002 +#define SO_BROADCAST 0x0020 +#define SO_DEBUG 0x0001 +#define SO_DONTROUTE 0x0010 +#define SO_ERROR 0x1007 +#define SO_KEEPALIVE 0x0008 +#define SO_LINGER 0x0080 +#define SO_OOBINLINE 0x0100 +#define SO_RCVBUF 0x1002 +#define SO_RCVLOWAT 0x1004 +#define SO_RCVTIMEO 0x1006 +#define SO_REUSEADDR 0x0004 +#define SO_SNDBUF 0x1001 +#define SO_SNDLOWAT 0x1003 +#define SO_SNDTIMEO 0x1005 +#define SO_TYPE 0x1008 // Flags for msg_flags in msghdr structure -#define MSG_CTRUNC 0x08 -#define MSG_DONTROUTE 0x04 -#define MSG_EOR 0x80 -#define MSG_OOB 0x01 -#define MSG_PEEK 0x02 -#define MSG_TRUNC 0x20 -#define MSG_WAITALL 0x100 +#define MSG_CTRUNC 0x08 +#define MSG_DONTROUTE 0x04 +#define MSG_EOR 0x80 +#define MSG_OOB 0x01 +#define MSG_PEEK 0x02 +#define MSG_TRUNC 0x20 +#define MSG_WAITALL 0x100 // Address families -#define AF_UNIX 1 -#define AF_UNSPEC 0 -#define AF_INET 2 +#define AF_UNIX 1 +#define AF_UNSPEC 0 +#define AF_INET 2 // Shutdown options -#define SHUT_RD 0 -#define SHUT_WR 1 -#define SHUT_RDWR 2 +#define SHUT_RD 0 +#define SHUT_WR 1 +#define SHUT_RDWR 2 // Function declarations -int accept(int socket, struct sockaddr *address, socklen_t *address_len); -int bind(int socket, const struct sockaddr *address, socklen_t address_len); -int connect(int socket, const struct sockaddr *address, socklen_t address_len); -int getpeername(int socket, struct sockaddr *address, socklen_t *address_len); -int getsockname(int socket, struct sockaddr *address, socklen_t *address_len); -int getsockopt(int socket, int level, int option_name, void *option_value, socklen_t *option_len); -int listen(int socket, int backlog); -ssize_t recv(int socket, void *buffer, size_t length, int flags); -ssize_t recvfrom(int socket, void *buffer, size_t length, int flags, - struct sockaddr *address, socklen_t *address_len); -ssize_t recvmsg(int socket, struct msghdr *message, int flags); -ssize_t send(int socket, const void *message, size_t length, int flags); -ssize_t sendmsg(int socket, const struct msghdr *message, int flags); -ssize_t sendto(int socket, const void *message, size_t length, int flags, - const struct sockaddr *dest_addr, socklen_t dest_len); -int setsockopt(int socket, int level, int option_name, const void *option_value, socklen_t option_len); -int shutdown(int socket, int how); -int socket(int domain, int type, int protocol); -int socketpair(int domain, int type, int protocol, int socket_vector[2]); + int accept (int socket, struct sockaddr *address, socklen_t * address_len); + int bind (int socket, const struct sockaddr *address, + socklen_t address_len); + int connect (int socket, const struct sockaddr *address, + socklen_t address_len); + int getpeername (int socket, struct sockaddr *address, + socklen_t * address_len); + int getsockname (int socket, struct sockaddr *address, + socklen_t * address_len); + int getsockopt (int socket, int level, int option_name, void *option_value, + socklen_t * option_len); + int listen (int socket, int backlog); + ssize_t recv (int socket, void *buffer, size_t length, int flags); + ssize_t recvfrom (int socket, void *buffer, size_t length, int flags, + struct sockaddr *address, socklen_t * address_len); + ssize_t recvmsg (int socket, struct msghdr *message, int flags); + ssize_t send (int socket, const void *message, size_t length, int flags); + ssize_t sendmsg (int socket, const struct msghdr *message, int flags); + ssize_t sendto (int socket, const void *message, size_t length, int flags, + const struct sockaddr *dest_addr, socklen_t dest_len); + int setsockopt (int socket, int level, int option_name, + const void *option_value, socklen_t option_len); + int shutdown (int socket, int how); + int socket (int domain, int type, int protocol); + int socketpair (int domain, int type, int protocol, int socket_vector[2]); // Macros for accessing ancillary data -#define CMSG_DATA(cmsg) ((unsigned char *)((struct cmsghdr *)(cmsg) + 1)) -#define CMSG_NXTHDR(mhdr, cmsg) (((char *)(cmsg) + CMSG_ALIGN((cmsg)->cmsg_len) + CMSG_ALIGN(sizeof(struct cmsghdr)) <= (char *)(mhdr)->msg_control + (mhdr)->msg_controllen) ? (struct cmsghdr *)((char *)(cmsg) + CMSG_ALIGN((cmsg)->cmsg_len)) : (struct cmsghdr *)0) -#define CMSG_FIRSTHDR(mhdr) ((struct cmsghdr *)((mhdr)->msg_controllen >= sizeof(struct cmsghdr) ? (mhdr)->msg_control : (void *)0)) -#define CMSG_ALIGN(len) (((len) + sizeof(int) - 1) & ~(sizeof(int) - 1)) +#define CMSG_DATA(cmsg) ((unsigned char *)((struct cmsghdr *)(cmsg) + 1)) +#define CMSG_NXTHDR(mhdr, cmsg) (((char *)(cmsg) + CMSG_ALIGN((cmsg)->cmsg_len) + CMSG_ALIGN(sizeof(struct cmsghdr)) <= (char *)(mhdr)->msg_control + (mhdr)->msg_controllen) ? (struct cmsghdr *)((char *)(cmsg) + CMSG_ALIGN((cmsg)->cmsg_len)) : (struct cmsghdr *)0) +#define CMSG_FIRSTHDR(mhdr) ((struct cmsghdr *)((mhdr)->msg_controllen >= sizeof(struct cmsghdr) ? (mhdr)->msg_control : (void *)0)) +#define CMSG_ALIGN(len) (((len) + sizeof(int) - 1) & ~(sizeof(int) - 1)) #ifdef __cplusplus } #endif -#endif /* _SYS_SOCKET_H_ */ \ No newline at end of file +#endif /* _SYS_SOCKET_H_ */ diff --git a/include/sys/uio.h b/include/sys/uio.h index 2ae9ef8..a65e8c7 100644 --- a/include/sys/uio.h +++ b/include/sys/uio.h @@ -12,41 +12,40 @@ #include __BEGIN_DECLS - /* * Define the uio buffers used for writev, readv. */ - -struct iovec + struct iovec { void *iov_base; size_t iov_len; }; -extern ssize_t readv __P ((int filedes, const struct iovec *vector, int count)); -extern ssize_t writev __P ((int filedes, const struct iovec *vector, int count)); +extern ssize_t readv +__P ((int filedes, const struct iovec * vector, int count)); +extern ssize_t writev +__P ((int filedes, const struct iovec * vector, int count)); -/* Read from another process' address space. */ +/* Read from another process' address space. */ extern ssize_t process_vm_readv (pid_t __pid, const struct iovec *__lvec, unsigned long int __liovcnt, const struct iovec *__rvec, unsigned long int __riovcnt, unsigned long int __flags); -/* Write to another process' address space. */ +/* Write to another process' address space. */ extern ssize_t process_vm_writev (pid_t __pid, const struct iovec *__lvec, unsigned long int __liovcnt, const struct iovec *__rvec, unsigned long int __riovcnt, unsigned long int __flags); -/* Flags for preadv2/pwritev2. */ -#define RWF_HIPRI 0x00000001 /* High priority request. */ -#define RWF_DSYNC 0x00000002 /* per-IO O_DSYNC. */ -#define RWF_SYNC 0x00000004 /* per-IO O_SYNC. */ -#define RWF_NOWAIT 0x00000008 /* per-IO nonblocking mode. */ -#define RWF_APPEND 0x00000010 /* per-IO O_APPEND. */ +/* Flags for preadv2/pwritev2. */ +#define RWF_HIPRI 0x00000001 /* High priority request. */ +#define RWF_DSYNC 0x00000002 /* per-IO O_DSYNC. */ +#define RWF_SYNC 0x00000004 /* per-IO O_SYNC. */ +#define RWF_NOWAIT 0x00000008 /* per-IO nonblocking mode. */ +#define RWF_APPEND 0x00000010 /* per-IO O_APPEND. */ __END_DECLS - #endif /* _SYS_UIO_H_ */ diff --git a/source/accept.c b/source/accept.c index 182ca59..ad98a48 100644 --- a/source/accept.c +++ b/source/accept.c @@ -1,16 +1,20 @@ #include +#include #include #include -typedef void* HANDLE; +typedef void *HANDLE; typedef HANDLE SOCKET; -int accept(int socket, struct sockaddr *address, socklen_t *address_len) { - void *Ws2_32 = dlopen("ws2_32.dll", RTLD_LAZY); - SOCKET (*_accept) (SOCKET s, struct sockaddr* addr, int* addrlen) = dlsym(Ws2_32, "accept"); - SOCKET s = (SOCKET)_get_osfhandle(socket); - SOCKET out = _accept(s, address, address_len); - //CloseHandle(s); - dlclose(Ws2_32); // reference count decrement once it is zero then all sockets are closed - return _open_osfhandle((intptr_t)out, O_RDWR); -} \ No newline at end of file +int +accept (int socket, struct sockaddr *address, socklen_t * address_len) +{ + void *Ws2_32 = dlopen ("ws2_32.dll", RTLD_LAZY); + SOCKET (*_accept) (SOCKET s, struct sockaddr * addr, int *addrlen) = + dlsym (Ws2_32, "accept"); + SOCKET s = (SOCKET) _get_osfhandle (socket); + SOCKET out = _accept (s, address, address_len); + //CloseHandle(s); + dlclose (Ws2_32); // reference count decrement once it is zero then all sockets are closed + return _open_osfhandle ((intptr_t) out, O_RDWR); +} diff --git a/source/bind.c b/source/bind.c index 479f942..1ff6f64 100644 --- a/source/bind.c +++ b/source/bind.c @@ -1,17 +1,21 @@ #include +#include #include #include #include -typedef void* HANDLE; +typedef void *HANDLE; typedef HANDLE SOCKET; -int bind(int socket, const struct sockaddr *address, socklen_t address_len) { - void *Ws2_32 = dlopen("ws2_32.dll", RTLD_LAZY); - int (*_bind) (SOCKET s, const struct sockaddr* addr, int namelen) = dlsym(Ws2_32, "bind"); - SOCKET s = (SOCKET)_get_osfhandle(socket); - int result = _bind(s, address, address_len); - //CloseHandle(s); - dlclose(Ws2_32); - return result; -} \ No newline at end of file +int +bind (int socket, const struct sockaddr *address, socklen_t address_len) +{ + void *Ws2_32 = dlopen ("ws2_32.dll", RTLD_LAZY); + int (*_bind) (SOCKET s, const struct sockaddr * addr, int namelen) = + dlsym (Ws2_32, "bind"); + SOCKET s = (SOCKET) _get_osfhandle (socket); + int result = _bind (s, address, address_len); + //CloseHandle(s); + dlclose (Ws2_32); + return result; +} diff --git a/source/connect.c b/source/connect.c index bc0d554..1e19a93 100644 --- a/source/connect.c +++ b/source/connect.c @@ -1,17 +1,21 @@ #include +#include #include #include #include -typedef void* HANDLE; +typedef void *HANDLE; typedef HANDLE SOCKET; -int connect(int socket, const struct sockaddr *address, socklen_t address_len) { - void *Ws2_32 = dlopen("ws2_32.dll", RTLD_LAZY); - int (*_connect) (SOCKET s, const struct sockaddr* addr, int namelen) = dlsym(Ws2_32, "connect"); - SOCKET s = (SOCKET)_get_osfhandle(socket); - int result = _connect(s, address, address_len); - //CloseHandle(s); - dlclose(Ws2_32); - return result; -} \ No newline at end of file +int +connect (int socket, const struct sockaddr *address, socklen_t address_len) +{ + void *Ws2_32 = dlopen ("ws2_32.dll", RTLD_LAZY); + int (*_connect) (SOCKET s, const struct sockaddr * addr, int namelen) = + dlsym (Ws2_32, "connect"); + SOCKET s = (SOCKET) _get_osfhandle (socket); + int result = _connect (s, address, address_len); + //CloseHandle(s); + dlclose (Ws2_32); + return result; +} diff --git a/source/dladdr.c b/source/dladdr.c index c98531c..90cf291 100644 --- a/source/dladdr.c +++ b/source/dladdr.c @@ -17,9 +17,9 @@ dladdr (const void *addr, Dl_info * info) DWORD dwErrCode = GetLastError (); pid_t mepid = getpid (); HANDLE hProcess = OpenProcess (PROCESS_QUERY_INFORMATION, FALSE, mepid); - DWORD nSize = 1; - LPSTR lpFilename = malloc (nSize); const char *root = "\\\\?\\GLOBALROOT"; + LPSTR lpFilename; + DWORD nSize = 1; HANDLE hFile; MEMORY_BASIC_INFORMATION lpBuffer; LPSTR lpszFilePath; @@ -33,12 +33,16 @@ dladdr (const void *addr, Dl_info * info) char *dli_sname; void *dli_saddr; SetLastError (ERROR_SUCCESS); + nSize += strlen (root) / sizeof (*lpFilename); + lpFilename = malloc (nSize); lpFilename += strlen (root) / sizeof (*lpFilename); + nSize -= strlen (root) / sizeof (*lpFilename); GetMappedFileName (hProcess, (LPVOID) addr, lpFilename, nSize); while (GetLastError () == ERROR_INSUFFICIENT_BUFFER) { nSize += 4096; lpFilename -= strlen (root) / sizeof (*lpFilename); + nSize += strlen (root) / sizeof (*lpFilename); free (lpFilename); lpFilename = malloc (nSize); if (lpFilename == 0) @@ -46,8 +50,8 @@ dladdr (const void *addr, Dl_info * info) return 0; } lpFilename += strlen (root) / sizeof (*lpFilename); - GetMappedFileName (hProcess, (LPVOID) addr, lpFilename, - nSize - strlen (root)); + nSize -= strlen (root) / sizeof (*lpFilename); + GetMappedFileName (hProcess, (LPVOID) addr, lpFilename, nSize); } if (GetLastError () != ERROR_SUCCESS) { diff --git a/source/getpeername.c b/source/getpeername.c index 9c253bb..a577083 100644 --- a/source/getpeername.c +++ b/source/getpeername.c @@ -2,14 +2,17 @@ #include #include -typedef void* HANDLE; +typedef void *HANDLE; typedef HANDLE SOCKET; -int getpeername(int socket, struct sockaddr *address, socklen_t *address_len) { - void *Ws2_32 = dlopen("ws2_32.dll", RTLD_LAZY); - int (*_getpeername) (SOCKET s, struct sockaddr* addr, int* namelen) = dlsym(Ws2_32, "getpeername"); - SOCKET s = (SOCKET)_get_osfhandle(socket); - int result = _getpeername(s, address, address_len); - dlclose(Ws2_32); - return result; -} \ No newline at end of file +int +getpeername (int socket, struct sockaddr *address, socklen_t * address_len) +{ + void *Ws2_32 = dlopen ("ws2_32.dll", RTLD_LAZY); + int (*_getpeername) (SOCKET s, struct sockaddr * addr, int *namelen) = + dlsym (Ws2_32, "getpeername"); + SOCKET s = (SOCKET) _get_osfhandle (socket); + int result = _getpeername (s, address, address_len); + dlclose (Ws2_32); + return result; +} diff --git a/source/getsockname.c b/source/getsockname.c index 089afb8..012261a 100644 --- a/source/getsockname.c +++ b/source/getsockname.c @@ -2,14 +2,17 @@ #include #include -typedef void* HANDLE; +typedef void *HANDLE; typedef HANDLE SOCKET; -int getsockname(int socket, struct sockaddr *address, socklen_t *address_len) { - void *Ws2_32 = dlopen("ws2_32.dll", RTLD_LAZY); - int (*_getsockname) (SOCKET s, struct sockaddr* addr, int* namelen) = dlsym(Ws2_32, "getsockname"); - SOCKET s = (SOCKET)_get_osfhandle(socket); - int result = _getsockname(s, address, address_len); - dlclose(Ws2_32); - return result; -} \ No newline at end of file +int +getsockname (int socket, struct sockaddr *address, socklen_t * address_len) +{ + void *Ws2_32 = dlopen ("ws2_32.dll", RTLD_LAZY); + int (*_getsockname) (SOCKET s, struct sockaddr * addr, int *namelen) = + dlsym (Ws2_32, "getsockname"); + SOCKET s = (SOCKET) _get_osfhandle (socket); + int result = _getsockname (s, address, address_len); + dlclose (Ws2_32); + return result; +} diff --git a/source/getsockopt.c b/source/getsockopt.c index 94a9496..9f20b47 100644 --- a/source/getsockopt.c +++ b/source/getsockopt.c @@ -2,14 +2,18 @@ #include #include -typedef void* HANDLE; +typedef void *HANDLE; typedef HANDLE SOCKET; -int getsockopt(int socket, int level, int option_name, void *option_value, socklen_t *option_len) { - void *Ws2_32 = dlopen("ws2_32.dll", RTLD_LAZY); - int (*_getsockopt) (SOCKET s, int level, int optname, char* optval, int* optlen) = dlsym(Ws2_32, "getsockopt"); - SOCKET s = (SOCKET)_get_osfhandle(socket); - int result = _getsockopt(s, level, option_name, option_value, option_len); - dlclose(Ws2_32); - return result; -} \ No newline at end of file +int +getsockopt (int socket, int level, int option_name, void *option_value, + socklen_t * option_len) +{ + void *Ws2_32 = dlopen ("ws2_32.dll", RTLD_LAZY); + int (*_getsockopt) (SOCKET s, int level, int optname, char *optval, + int *optlen) = dlsym (Ws2_32, "getsockopt"); + SOCKET s = (SOCKET) _get_osfhandle (socket); + int result = _getsockopt (s, level, option_name, option_value, option_len); + dlclose (Ws2_32); + return result; +} diff --git a/source/htonl.c b/source/htonl.c new file mode 100644 index 0000000..b139110 --- /dev/null +++ b/source/htonl.c @@ -0,0 +1,18 @@ +#include +#include +#include +#include +#include "ws_types.h" + +typedef void *HANDLE; +typedef HANDLE SOCKET; + +uint32_t +htonl (uint32_t hostlong) +{ + void *Ws2_32 = dlopen ("ws2_32.dll", RTLD_LAZY); + fn_htonl_t _htonl = (fn_htonl_t) dlsym (Ws2_32, "htonl"); + uint32_t result = _htonl (hostlong); + dlclose (Ws2_32); + return result; +} diff --git a/source/htons.c b/source/htons.c new file mode 100644 index 0000000..eae3fbf --- /dev/null +++ b/source/htons.c @@ -0,0 +1,18 @@ +#include +#include +#include +#include +#include "ws_types.h" + +typedef void *HANDLE; +typedef HANDLE SOCKET; + +uint16_t +htons (uint16_t hostshort) +{ + void *Ws2_32 = dlopen ("ws2_32.dll", RTLD_LAZY); + fn_htons_t _htons = (fn_htons_t) dlsym (Ws2_32, "htons"); + uint16_t result = _htons (hostshort); + dlclose (Ws2_32); + return result; +} diff --git a/source/inet_addr.c b/source/inet_addr.c new file mode 100644 index 0000000..6dd1f94 --- /dev/null +++ b/source/inet_addr.c @@ -0,0 +1,31 @@ +#include +#include + +// Define the function pointer type for inet_addr +typedef unsigned long (*inet_addr_t) (const char *cp); + +in_addr_t +inet_addr (const char *cp) +{ + // Load the ws2_32.dll library + void *Ws2_32 = dlopen ("ws2_32.dll", RTLD_LAZY); + if (!Ws2_32) + { + return INADDR_NONE; // Return error if DLL cannot be loaded + } + + // Get the inet_addr function from the DLL + inet_addr_t _inet_addr = (inet_addr_t) dlsym (Ws2_32, "inet_addr"); + if (!_inet_addr) + { + dlclose (Ws2_32); // Close the DLL if the function is not found + return INADDR_NONE; + } + + // Call the Windows inet_addr function + unsigned long result = _inet_addr (cp); + + // Clean up + dlclose (Ws2_32); + return (in_addr_t) result; +} diff --git a/source/inet_ntoa.c b/source/inet_ntoa.c new file mode 100644 index 0000000..63776ce --- /dev/null +++ b/source/inet_ntoa.c @@ -0,0 +1,31 @@ +#include +#include + +// Define the function pointer type for inet_ntoa +typedef char *(*inet_ntoa_t) (struct in_addr in); + +char * +inet_ntoa (struct in_addr in) +{ + // Load the ws2_32.dll library + void *Ws2_32 = dlopen ("ws2_32.dll", RTLD_LAZY); + if (!Ws2_32) + { + return NULL; // Return NULL if DLL cannot be loaded + } + + // Get the inet_ntoa function from the DLL + inet_ntoa_t _inet_ntoa = (inet_ntoa_t) dlsym (Ws2_32, "inet_ntoa"); + if (!_inet_ntoa) + { + dlclose (Ws2_32); // Close the DLL if the function is not found + return NULL; + } + + // Call the Windows inet_ntoa function + char *result = _inet_ntoa (in); + + // Clean up + dlclose (Ws2_32); + return result; +} diff --git a/source/inet_ntop.c b/source/inet_ntop.c new file mode 100644 index 0000000..4873a45 --- /dev/null +++ b/source/inet_ntop.c @@ -0,0 +1,32 @@ +#include +#include + +// Define the function pointer type for inet_ntop +typedef const char *(*inet_ntop_t) (int af, const void *src, char *dst, + socklen_t size); + +const char * +inet_ntop (int af, const void *src, char *dst, socklen_t size) +{ + // Load the ws2_32.dll library + void *Ws2_32 = dlopen ("ws2_32.dll", RTLD_LAZY); + if (!Ws2_32) + { + return NULL; // Return NULL if DLL cannot be loaded + } + + // Get the inet_ntop function from the DLL + inet_ntop_t _inet_ntop = (inet_ntop_t) dlsym (Ws2_32, "inet_ntop"); + if (!_inet_ntop) + { + dlclose (Ws2_32); // Close the DLL if the function is not found + return NULL; + } + + // Call the Windows inet_ntop function + const char *result = _inet_ntop (af, src, dst, size); + + // Clean up + dlclose (Ws2_32); + return result; +} diff --git a/source/inet_pton.c b/source/inet_pton.c new file mode 100644 index 0000000..8ee999b --- /dev/null +++ b/source/inet_pton.c @@ -0,0 +1,31 @@ +#include +#include + +// Define the function pointer type for inet_pton +typedef int (*inet_pton_t) (int af, const char *src, void *dst); + +int +inet_pton (int af, const char *src, void *dst) +{ + // Load the ws2_32.dll library + void *Ws2_32 = dlopen ("ws2_32.dll", RTLD_LAZY); + if (!Ws2_32) + { + return -1; // Return error if DLL cannot be loaded + } + + // Get the inet_pton function from the DLL + inet_pton_t _inet_pton = (inet_pton_t) dlsym (Ws2_32, "inet_pton"); + if (!_inet_pton) + { + dlclose (Ws2_32); // Close the DLL if the function is not found + return -1; + } + + // Call the Windows inet_pton function + int result = _inet_pton (af, src, dst); + + // Clean up + dlclose (Ws2_32); + return result; +} diff --git a/source/listen.c b/source/listen.c index 1aa3748..1266694 100644 --- a/source/listen.c +++ b/source/listen.c @@ -2,15 +2,17 @@ #include #include -typedef void* HANDLE; +typedef void *HANDLE; typedef HANDLE SOCKET; -int listen(int socket, int backlog) { - void *Ws2_32 = dlopen("ws2_32.dll", RTLD_LAZY); - int (*_listen) (SOCKET s, int backlog) = dlsym(Ws2_32, "listen"); - SOCKET s = (SOCKET)_get_osfhandle(socket); - int result = _listen(s, backlog); - //CloseHandle(s); - dlclose(Ws2_32); - return result; -} \ No newline at end of file +int +listen (int socket, int backlog) +{ + void *Ws2_32 = dlopen ("ws2_32.dll", RTLD_LAZY); + int (*_listen) (SOCKET s, int backlog) = dlsym (Ws2_32, "listen"); + SOCKET s = (SOCKET) _get_osfhandle (socket); + int result = _listen (s, backlog); + //CloseHandle(s); + dlclose (Ws2_32); + return result; +} diff --git a/source/madvise.c b/source/madvise.c index 125a176..cfc810b 100644 --- a/source/madvise.c +++ b/source/madvise.c @@ -153,9 +153,10 @@ madvise_PrefetchVirtualMemory (madvise_D_PrefetchVirtualMemory * memoryScanStrideMultipliers[i]; j++) { lpos = - (size_t) madvise_d_PrefetchVirtualMemory-> - VirtualAddresses[j * - memoryScanStrideMultipliers[i]]. + (size_t) + madvise_d_PrefetchVirtualMemory->VirtualAddresses[j * + memoryScanStrideMultipliers + [i]]. VirtualAddress; readMemSize = 0; for (k = 0; k != memoryScanStrideMultipliers[i]; k++) @@ -169,12 +170,16 @@ madvise_PrefetchVirtualMemory (madvise_D_PrefetchVirtualMemory * readMemSize = readMemMaxSize - readMemSize; } readMemSize += - (size_t) madvise_d_PrefetchVirtualMemory-> - VirtualAddresses[j * memoryScanStrideMultipliers[i] + - k].NumberOfBytes; + (size_t) + madvise_d_PrefetchVirtualMemory->VirtualAddresses[j * + memoryScanStrideMultipliers + [i] + + + k].NumberOfBytes; if (k + 1 != memoryScanStrideMultipliers[i] && (lpos + readMemSize != - ((size_t) madvise_d_PrefetchVirtualMemory-> + ((size_t) + madvise_d_PrefetchVirtualMemory-> VirtualAddresses[j * memoryScanStrideMultipliers[i] + k + 1].VirtualAddress) @@ -185,10 +190,10 @@ madvise_PrefetchVirtualMemory (madvise_D_PrefetchVirtualMemory * fsetpos (fp, &fpos); fread (readMemLoc, 1, readMemSize, fp); lpos = - (size_t) madvise_d_PrefetchVirtualMemory-> - VirtualAddresses[j * - memoryScanStrideMultipliers[i] + - k + 1].VirtualAddress; + (size_t) + madvise_d_PrefetchVirtualMemory->VirtualAddresses + [j * memoryScanStrideMultipliers[i] + k + + 1].VirtualAddress; readMemSize = 0; nSize = nSize2; lpFilename = lpFilename2; @@ -217,8 +222,9 @@ madvise_PrefetchVirtualMemory (madvise_D_PrefetchVirtualMemory * strlen (root) / sizeof (*lpFilename); lpFilenameSize = GetMappedFileName (GetCurrentProcess (), - (LPVOID) lpBuffer. - BaseAddress, lpFilename, + (LPVOID) + lpBuffer.BaseAddress, + lpFilename, nSize - strlen (root) - 1) + strlen (root) + 1; } @@ -259,9 +265,10 @@ madvise_PrefetchVirtualMemory (madvise_D_PrefetchVirtualMemory * memoryScanStrideMultipliers[i]) { lpos = - (size_t) madvise_d_PrefetchVirtualMemory-> - VirtualAddresses[j * - memoryScanStrideMultipliers[i]]. + (size_t) + madvise_d_PrefetchVirtualMemory->VirtualAddresses[j * + memoryScanStrideMultipliers + [i]]. VirtualAddress; readMemSize = 0; k_size = @@ -278,12 +285,16 @@ madvise_PrefetchVirtualMemory (madvise_D_PrefetchVirtualMemory * readMemSize = readMemMaxSize - readMemSize; } readMemSize += - (size_t) madvise_d_PrefetchVirtualMemory-> - VirtualAddresses[j * memoryScanStrideMultipliers[i] + - k].NumberOfBytes; + (size_t) + madvise_d_PrefetchVirtualMemory->VirtualAddresses[j * + memoryScanStrideMultipliers + [i] + + + k].NumberOfBytes; if (k + 1 != k_size && (lpos + readMemSize != - ((size_t) madvise_d_PrefetchVirtualMemory-> + ((size_t) + madvise_d_PrefetchVirtualMemory-> VirtualAddresses[j * memoryScanStrideMultipliers[i] + k + 1].VirtualAddress) @@ -294,10 +305,10 @@ madvise_PrefetchVirtualMemory (madvise_D_PrefetchVirtualMemory * fsetpos (fp, &fpos); fread (readMemLoc, 1, readMemSize, fp); lpos = - (size_t) madvise_d_PrefetchVirtualMemory-> - VirtualAddresses[j * - memoryScanStrideMultipliers[i] + - k + 1].VirtualAddress; + (size_t) + madvise_d_PrefetchVirtualMemory->VirtualAddresses + [j * memoryScanStrideMultipliers[i] + k + + 1].VirtualAddress; readMemSize = 0; nSize = nSize2; lpFilename = lpFilename2; @@ -326,8 +337,9 @@ madvise_PrefetchVirtualMemory (madvise_D_PrefetchVirtualMemory * strlen (root) / sizeof (*lpFilename); lpFilenameSize = GetMappedFileName (GetCurrentProcess (), - (LPVOID) lpBuffer. - BaseAddress, lpFilename, + (LPVOID) + lpBuffer.BaseAddress, + lpFilename, nSize - strlen (root) - 1) + strlen (root) + 1; } diff --git a/source/main.c b/source/main.c index 23a1c39..dc3029b 100644 --- a/source/main.c +++ b/source/main.c @@ -4,103 +4,112 @@ #include #include #include -//#include // For AF_INET and INADDR_ANY -//#include // For sockaddr - -struct sockaddr_in { - short sin_family; - unsigned short sin_port; - //struct in_addr sin_addr; - char sin_zero[8]; +//#include // For AF_INET and INADDR_ANY +//#include // For sockaddr + +struct sockaddr_in +{ + short sin_family; + unsigned short sin_port; + //struct in_addr sin_addr; + char sin_zero[8]; }; #define PORT 8080 #define MAX_CONNECTIONS 5 -int main() { - int server_fd, new_socket; - struct sockaddr addr; - struct sockaddr_in *server_in = (struct sockaddr_in *)&addr; // Cast for sockaddr_in - socklen_t addrlen = sizeof(addr); - char buffer[1024] = {0}; - - // Create socket - if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { - perror("Socket failed"); - exit(EXIT_FAILURE); +int +main () +{ + int server_fd, new_socket; + struct sockaddr addr; + struct sockaddr_in *server_in = (struct sockaddr_in *) &addr; // Cast for sockaddr_in + socklen_t addrlen = sizeof (addr); + char buffer[1024] = { 0 }; + + // Create socket + if ((server_fd = socket (AF_INET, SOCK_STREAM, 0)) == 0) + { + perror ("Socket failed"); + exit (EXIT_FAILURE); } - // Set socket options (optional) - int opt = 1; - if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) { - perror("Setsockopt failed"); - exit(EXIT_FAILURE); + // Set socket options (optional) + int opt = 1; + if (setsockopt (server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof (opt))) + { + perror ("Setsockopt failed"); + exit (EXIT_FAILURE); } - // Set up the server address structure using sockaddr - addr.sa_family = AF_INET; // Address family: AF_INET (IPv4) - - // Set up the 4-byte IP address (INADDR_ANY for 0.0.0.0) - //addr.sa_data[0] = 192;//0x00; // First byte of the address - //addr.sa_data[1] = 168;//0x00; // Second byte - //addr.sa_data[2] = 1;//0x00; // Third byte - //addr.sa_data[3] = 1;//0x00; // Fourth byte (INADDR_ANY = 0.0.0.0) - - // Set up the port (8080 = 0x1F90 in hexadecimal) - //addr.sa_data[4] = 0x1; // High byte of the port (0x1F) - //addr.sa_data[5] = 0x00; // Low byte of the port (0x90) - - //void *Ws2_32 = dlopen("ws2_32.dll", RTLD_LAZY); - -addr.sa_data[0] = 31; -addr.sa_data[1] = -112; -addr.sa_data[2] = 0; -addr.sa_data[3] = 0; -addr.sa_data[4] = 0; -addr.sa_data[5] = 0; -addr.sa_data[6] = 115; -addr.sa_data[7] = 0; -addr.sa_data[8] = 116; -addr.sa_data[9] = 0; -addr.sa_data[10] = 115; -addr.sa_data[11] = 0; -addr.sa_data[12] = 92; -addr.sa_data[13] = 0; - // Bind socket to the address and port - if (bind(server_fd, &addr, sizeof(addr)) < 0) { - perror("Bind failed"); - exit(EXIT_FAILURE); + // Set up the server address structure using sockaddr + addr.sa_family = AF_INET; // Address family: AF_INET (IPv4) + + // Set up the 4-byte IP address (INADDR_ANY for 0.0.0.0) + //addr.sa_data[0] = 192;//0x00; // First byte of the address + //addr.sa_data[1] = 168;//0x00; // Second byte + //addr.sa_data[2] = 1;//0x00; // Third byte + //addr.sa_data[3] = 1;//0x00; // Fourth byte (INADDR_ANY = 0.0.0.0) + + // Set up the port (8080 = 0x1F90 in hexadecimal) + //addr.sa_data[4] = 0x1; // High byte of the port (0x1F) + //addr.sa_data[5] = 0x00; // Low byte of the port (0x90) + + //void *Ws2_32 = dlopen("ws2_32.dll", RTLD_LAZY); + + addr.sa_data[0] = 31; + addr.sa_data[1] = -112; + addr.sa_data[2] = 0; + addr.sa_data[3] = 0; + addr.sa_data[4] = 0; + addr.sa_data[5] = 0; + addr.sa_data[6] = 115; + addr.sa_data[7] = 0; + addr.sa_data[8] = 116; + addr.sa_data[9] = 0; + addr.sa_data[10] = 115; + addr.sa_data[11] = 0; + addr.sa_data[12] = 92; + addr.sa_data[13] = 0; + // Bind socket to the address and port + if (bind (server_fd, &addr, sizeof (addr)) < 0) + { + perror ("Bind failed"); + exit (EXIT_FAILURE); } - // Listen for incoming connections - if (listen(server_fd, MAX_CONNECTIONS) < 0) { - perror("Listen failed"); - exit(EXIT_FAILURE); + // Listen for incoming connections + if (listen (server_fd, MAX_CONNECTIONS) < 0) + { + perror ("Listen failed"); + exit (EXIT_FAILURE); } - printf("Server listening on port %d...\n", PORT); + printf ("Server listening on port %d...\n", PORT); - // Accept incoming connections - if ((new_socket = accept(server_fd, &addr, &addrlen)) < 0) { - perror("Accept failed"); - exit(EXIT_FAILURE); + // Accept incoming connections + if ((new_socket = accept (server_fd, &addr, &addrlen)) < 0) + { + perror ("Accept failed"); + exit (EXIT_FAILURE); } - // Read data from client - int recv_size = recv(new_socket, buffer, 1024, 0); - if (recv_size < 0) { - perror("Recv failed"); - exit(EXIT_FAILURE); + // Read data from client + int recv_size = recv (new_socket, buffer, 1024, 0); + if (recv_size < 0) + { + perror ("Recv failed"); + exit (EXIT_FAILURE); } - buffer[recv_size] = '\0'; // Null terminate the string - printf("Received message: %s\n", buffer); + buffer[recv_size] = '\0'; // Null terminate the string + printf ("Received message: %s\n", buffer); - // Send response to client - const char *response = "Hello from server!"; - send(new_socket, response, strlen(response), 0); + // Send response to client + const char *response = "Hello from server!"; + send (new_socket, response, strlen (response), 0); - // Close the socket - close(new_socket); - close(server_fd); - return 0; + // Close the socket + close (new_socket); + close (server_fd); + return 0; } diff --git a/source/msync.c b/source/msync.c index e629c2c..5db7a3b 100644 --- a/source/msync.c +++ b/source/msync.c @@ -35,10 +35,10 @@ msync (void *__addr, size_t __len, int __flags) SetLastError (dwErrCode); lpFilename -= strlen (root) / sizeof (*lpFilename); memcpy (lpFilename, root, strlen (root)); - HANDLE hFile = - CreateFile (lpFilename, GENERIC_WRITE, - FILE_SHARE_READ | FILE_SHARE_WRITE | - FILE_SHARE_DELETE, NULL, OPEN_EXISTING, 0, NULL); + HANDLE hFile = CreateFile (lpFilename, GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE | + FILE_SHARE_DELETE, NULL, + OPEN_EXISTING, 0, NULL); FlushFileBuffers (hFile); free (lpFilename); CloseHandle (hFile); diff --git a/source/ntohl.c b/source/ntohl.c new file mode 100644 index 0000000..11b59b0 --- /dev/null +++ b/source/ntohl.c @@ -0,0 +1,18 @@ +#include +#include +#include +#include +#include "ws_types.h" + +typedef void *HANDLE; +typedef HANDLE SOCKET; + +uint32_t +ntohl (uint32_t netlong) +{ + void *Ws2_32 = dlopen ("ws2_32.dll", RTLD_LAZY); + fn_ntohl_t _ntohl = (fn_ntohl_t) dlsym (Ws2_32, "ntohl"); + uint32_t result = _ntohl (netlong); + dlclose (Ws2_32); + return result; +} diff --git a/source/ntohs.c b/source/ntohs.c new file mode 100644 index 0000000..ea3fb31 --- /dev/null +++ b/source/ntohs.c @@ -0,0 +1,18 @@ +#include +#include +#include +#include +#include "ws_types.h" + +typedef void *HANDLE; +typedef HANDLE SOCKET; + +uint16_t +ntohs (uint16_t netshort) +{ + void *Ws2_32 = dlopen ("ws2_32.dll", RTLD_LAZY); + fn_ntohs_t _ntohs = (fn_ntohs_t) dlsym (Ws2_32, "ntohs"); + uint16_t result = _ntohs (netshort); + dlclose (Ws2_32); + return result; +} diff --git a/source/pipe.c b/source/pipe.c index c048de8..523c7c9 100644 --- a/source/pipe.c +++ b/source/pipe.c @@ -1,7 +1,9 @@ #include #ifndef _O_BINARY - #define _O_BINARY 0x8000 +#define _O_BINARY 0x8000 #endif -int pipe (int __fildes[2]){ - _pipe(__fildes, 65536, _O_BINARY); -} \ No newline at end of file +int +pipe (int __fildes[2]) +{ + _pipe (__fildes, 65536, _O_BINARY); +} diff --git a/source/recv.c b/source/recv.c index e555f83..70ab79c 100644 --- a/source/recv.c +++ b/source/recv.c @@ -1,16 +1,20 @@ #include +#include #include #include -typedef void* HANDLE; +typedef void *HANDLE; typedef HANDLE SOCKET; -ssize_t recv(int socket, void *buffer, size_t length, int flags) { - void *Ws2_32 = dlopen("ws2_32.dll", RTLD_LAZY); - int (*_recv) (SOCKET s, char* buf, int len, int flags) = dlsym(Ws2_32, "recv"); - SOCKET s = (SOCKET)_get_osfhandle(socket); - int result = _recv(s, buffer, length, flags); - //CloseHandle(s); - dlclose(Ws2_32); - return result; -} \ No newline at end of file +ssize_t +recv (int socket, void *buffer, size_t length, int flags) +{ + void *Ws2_32 = dlopen ("ws2_32.dll", RTLD_LAZY); + int (*_recv) (SOCKET s, char *buf, int len, int flags) = + dlsym (Ws2_32, "recv"); + SOCKET s = (SOCKET) _get_osfhandle (socket); + int result = _recv (s, buffer, length, flags); + //CloseHandle(s); + dlclose (Ws2_32); + return result; +} diff --git a/source/recvfrom.c b/source/recvfrom.c index 13327af..b4168ee 100644 --- a/source/recvfrom.c +++ b/source/recvfrom.c @@ -2,16 +2,19 @@ #include #include -typedef void* HANDLE; +typedef void *HANDLE; typedef HANDLE SOCKET; -ssize_t recvfrom(int socket, void *buffer, size_t length, int flags, - struct sockaddr *address, socklen_t *address_len) { - void *Ws2_32 = dlopen("ws2_32.dll", RTLD_LAZY); - int (*_recvfrom) (SOCKET s, char* buf, int len, int flags, - struct sockaddr* from, int* fromlen) = dlsym(Ws2_32, "recvfrom"); - SOCKET s = (SOCKET)_get_osfhandle(socket); - int result = _recvfrom(s, buffer, length, flags, address, address_len); - dlclose(Ws2_32); - return result; -} \ No newline at end of file +ssize_t +recvfrom (int socket, void *buffer, size_t length, int flags, + struct sockaddr *address, socklen_t * address_len) +{ + void *Ws2_32 = dlopen ("ws2_32.dll", RTLD_LAZY); + int (*_recvfrom) (SOCKET s, char *buf, int len, int flags, + struct sockaddr * from, int *fromlen) = + dlsym (Ws2_32, "recvfrom"); + SOCKET s = (SOCKET) _get_osfhandle (socket); + int result = _recvfrom (s, buffer, length, flags, address, address_len); + dlclose (Ws2_32); + return result; +} diff --git a/source/recvmsg.c b/source/recvmsg.c index 60859b3..9454fd9 100644 --- a/source/recvmsg.c +++ b/source/recvmsg.c @@ -2,14 +2,17 @@ #include #include -typedef void* HANDLE; +typedef void *HANDLE; typedef HANDLE SOCKET; -ssize_t recvmsg(int socket, struct msghdr *message, int flags) { - void *Ws2_32 = dlopen("ws2_32.dll", RTLD_LAZY); - int (*_recvmsg) (SOCKET s, struct msghdr* msg, int flags) = dlsym(Ws2_32, "recvmsg"); - SOCKET s = (SOCKET)_get_osfhandle(socket); - int result = _recvmsg(s, message, flags); - dlclose(Ws2_32); - return result; -} \ No newline at end of file +ssize_t +recvmsg (int socket, struct msghdr *message, int flags) +{ + void *Ws2_32 = dlopen ("ws2_32.dll", RTLD_LAZY); + int (*_recvmsg) (SOCKET s, struct msghdr * msg, int flags) = + dlsym (Ws2_32, "recvmsg"); + SOCKET s = (SOCKET) _get_osfhandle (socket); + int result = _recvmsg (s, message, flags); + dlclose (Ws2_32); + return result; +} diff --git a/source/send.c b/source/send.c index 7fe2638..92d8a1a 100644 --- a/source/send.c +++ b/source/send.c @@ -1,16 +1,20 @@ #include +#include #include #include -typedef void* HANDLE; +typedef void *HANDLE; typedef HANDLE SOCKET; -ssize_t send(int socket, const void *message, size_t length, int flags) { - void *Ws2_32 = dlopen("ws2_32.dll", RTLD_LAZY); - int (*_send) (SOCKET s, const char* buf, int len, int flags) = dlsym(Ws2_32, "send"); - SOCKET s = (SOCKET)_get_osfhandle(socket); - int result = _send(s, message, length, flags); - //CloseHandle(s); - dlclose(Ws2_32); - return result; -} \ No newline at end of file +ssize_t +send (int socket, const void *message, size_t length, int flags) +{ + void *Ws2_32 = dlopen ("ws2_32.dll", RTLD_LAZY); + int (*_send) (SOCKET s, const char *buf, int len, int flags) = + dlsym (Ws2_32, "send"); + SOCKET s = (SOCKET) _get_osfhandle (socket); + int result = _send (s, message, length, flags); + //CloseHandle(s); + dlclose (Ws2_32); + return result; +} diff --git a/source/sendmsg.c b/source/sendmsg.c index 556e7d3..e1d2d01 100644 --- a/source/sendmsg.c +++ b/source/sendmsg.c @@ -2,14 +2,17 @@ #include #include -typedef void* HANDLE; +typedef void *HANDLE; typedef HANDLE SOCKET; -ssize_t sendmsg(int socket, const struct msghdr *message, int flags) { - void *Ws2_32 = dlopen("ws2_32.dll", RTLD_LAZY); - int (*_sendmsg) (SOCKET s, const struct msghdr* msg, int flags) = dlsym(Ws2_32, "sendmsg"); - SOCKET s = (SOCKET)_get_osfhandle(socket); - int result = _sendmsg(s, message, flags); - dlclose(Ws2_32); - return result; -} \ No newline at end of file +ssize_t +sendmsg (int socket, const struct msghdr *message, int flags) +{ + void *Ws2_32 = dlopen ("ws2_32.dll", RTLD_LAZY); + int (*_sendmsg) (SOCKET s, const struct msghdr * msg, int flags) = + dlsym (Ws2_32, "sendmsg"); + SOCKET s = (SOCKET) _get_osfhandle (socket); + int result = _sendmsg (s, message, flags); + dlclose (Ws2_32); + return result; +} diff --git a/source/sendto.c b/source/sendto.c index 480cbb4..30c104e 100644 --- a/source/sendto.c +++ b/source/sendto.c @@ -2,16 +2,19 @@ #include #include -typedef void* HANDLE; +typedef void *HANDLE; typedef HANDLE SOCKET; -ssize_t sendto(int socket, const void *message, size_t length, int flags, - const struct sockaddr *dest_addr, socklen_t dest_len) { - void *Ws2_32 = dlopen("ws2_32.dll", RTLD_LAZY); - int (*_sendto) (SOCKET s, const char* buf, int len, int flags, - const struct sockaddr* to, int tolen) = dlsym(Ws2_32, "sendto"); - SOCKET s = (SOCKET)_get_osfhandle(socket); - int result = _sendto(s, message, length, flags, dest_addr, dest_len); - dlclose(Ws2_32); - return result; -} \ No newline at end of file +ssize_t +sendto (int socket, const void *message, size_t length, int flags, + const struct sockaddr *dest_addr, socklen_t dest_len) +{ + void *Ws2_32 = dlopen ("ws2_32.dll", RTLD_LAZY); + int (*_sendto) (SOCKET s, const char *buf, int len, int flags, + const struct sockaddr * to, int tolen) = + dlsym (Ws2_32, "sendto"); + SOCKET s = (SOCKET) _get_osfhandle (socket); + int result = _sendto (s, message, length, flags, dest_addr, dest_len); + dlclose (Ws2_32); + return result; +} diff --git a/source/setsockopt.c b/source/setsockopt.c index f9ed3a8..d03d611 100644 --- a/source/setsockopt.c +++ b/source/setsockopt.c @@ -2,15 +2,19 @@ #include #include -typedef void* HANDLE; +typedef void *HANDLE; typedef HANDLE SOCKET; -int setsockopt(int socket, int level, int option_name, const void *option_value, socklen_t option_len) { - void *Ws2_32 = dlopen("ws2_32.dll", RTLD_LAZY); - int (*_setsockopt) (SOCKET s, int level, int optname, const char* optval, int optlen) = dlsym(Ws2_32, "setsockopt"); - SOCKET s = (SOCKET)_get_osfhandle(socket); - int result = _setsockopt(s, level, option_name, option_value, option_len); - //CloseHandle(s); - dlclose(Ws2_32); - return result; -} \ No newline at end of file +int +setsockopt (int socket, int level, int option_name, const void *option_value, + socklen_t option_len) +{ + void *Ws2_32 = dlopen ("ws2_32.dll", RTLD_LAZY); + int (*_setsockopt) (SOCKET s, int level, int optname, const char *optval, + int optlen) = dlsym (Ws2_32, "setsockopt"); + SOCKET s = (SOCKET) _get_osfhandle (socket); + int result = _setsockopt (s, level, option_name, option_value, option_len); + //CloseHandle(s); + dlclose (Ws2_32); + return result; +} diff --git a/source/shm_open.c b/source/shm_open.c index e552420..de4c881 100644 --- a/source/shm_open.c +++ b/source/shm_open.c @@ -35,9 +35,9 @@ shm_open (const char *__name, int __oflag, mode_t __mode) filename[strlen (systemdrive) + strlen (tempshm) + strlen (__name)] = 0; - char *proccessed_path = - _fullpath (NULL, filename, - strlen (systemdrive) + strlen (tempshm) + strlen (__name)); + char *proccessed_path = _fullpath (NULL, filename, + strlen (systemdrive) + strlen (tempshm) + + strlen (__name)); numerator = 0; denominator = strlen (foldername); if (denominator <= strlen (proccessed_path)) diff --git a/source/shm_unlink.c b/source/shm_unlink.c index f7e57de..f758c3e 100644 --- a/source/shm_unlink.c +++ b/source/shm_unlink.c @@ -30,9 +30,9 @@ shm_unlink (const char *__name) filename[strlen (systemdrive) + strlen (tempshm) + strlen (__name)] = 0; - char *proccessed_path = - _fullpath (NULL, filename, - strlen (systemdrive) + strlen (tempshm) + strlen (__name)); + char *proccessed_path = _fullpath (NULL, filename, + strlen (systemdrive) + strlen (tempshm) + + strlen (__name)); numerator = 0; denominator = strlen (foldername); if (denominator <= strlen (proccessed_path)) diff --git a/source/shutdown.c b/source/shutdown.c index ff9ca5b..27641c7 100644 --- a/source/shutdown.c +++ b/source/shutdown.c @@ -2,14 +2,16 @@ #include #include -typedef void* HANDLE; +typedef void *HANDLE; typedef HANDLE SOCKET; -int shutdown(int socket, int how) { - void *Ws2_32 = dlopen("ws2_32.dll", RTLD_LAZY); - int (*_shutdown) (SOCKET s, int how) = dlsym(Ws2_32, "shutdown"); - SOCKET s = (SOCKET)_get_osfhandle(socket); - int result = _shutdown(s, how); - dlclose(Ws2_32); - return result; -} \ No newline at end of file +int +shutdown (int socket, int how) +{ + void *Ws2_32 = dlopen ("ws2_32.dll", RTLD_LAZY); + int (*_shutdown) (SOCKET s, int how) = dlsym (Ws2_32, "shutdown"); + SOCKET s = (SOCKET) _get_osfhandle (socket); + int result = _shutdown (s, how); + dlclose (Ws2_32); + return result; +} diff --git a/source/socket.c b/source/socket.c index 8037afc..d0bb1c6 100644 --- a/source/socket.c +++ b/source/socket.c @@ -1,59 +1,75 @@ #include +#include #include #include +#include typedef unsigned short WORD; -typedef void* HANDLE; +typedef void *HANDLE; typedef HANDLE SOCKET; -#define INVALID_SOCKET (SOCKET)(-1) +#define INVALID_SOCKET (SOCKET)(-1) #define WSANOTINITIALISED 10093 -typedef struct _WSADATA { - WORD wVersion; - WORD wHighVersion; - char szDescription[256]; - char szSystemStatus[128]; - unsigned short iMaxSockets; - unsigned short iMaxUdpDg; - char *lpVendorInfo; +typedef struct _WSADATA +{ + WORD wVersion; + WORD wHighVersion; + char szDescription[256]; + char szSystemStatus[128]; + unsigned short iMaxSockets; + unsigned short iMaxUdpDg; + char *lpVendorInfo; } WSADATA; -int socket(int domain, int type, int protocol) { - void *Ws2_32 = dlopen("ws2_32.dll", RTLD_NOW); - if (!Ws2_32) { - return -1; +int +socket (int domain, int type, int protocol) +{ + void *Ws2_32 = dlopen ("ws2_32.dll", RTLD_NOW); + if (!Ws2_32) + { + return -1; } - SOCKET (*_socket)(int domain, int type, int protocol) = dlsym(Ws2_32, "socket"); - int (*_WSAStartup)(WORD wVersionRequested, WSADATA *lpWSAData) = dlsym(Ws2_32, "WSAStartup"); - int (*_WSAGetLastError)() = dlsym(Ws2_32, "WSAGetLastError"); - if (!_socket || !_WSAStartup || !_WSAGetLastError) { - dlclose(Ws2_32); - return -1; + SOCKET (*_socket) (int domain, int type, int protocol) = + dlsym (Ws2_32, "socket"); + int (*_WSAStartup) (WORD wVersionRequested, WSADATA * lpWSAData) = + dlsym (Ws2_32, "WSAStartup"); + int (*_WSAGetLastError) () = dlsym (Ws2_32, "WSAGetLastError"); + if (!_socket || !_WSAStartup || !_WSAGetLastError) + { + dlclose (Ws2_32); + return -1; } - SOCKET s = _socket(domain, type, protocol); - if (s == INVALID_SOCKET) { - if (_WSAGetLastError() == WSANOTINITIALISED) { - WSADATA wsaData; - int result = _WSAStartup(0x202, &wsaData); - if (result != 0) { - dlclose(Ws2_32); - return -1; - } - s = _socket(domain, type, protocol); - if (s == INVALID_SOCKET) { - dlclose(Ws2_32); - return -1; - } - } else { - dlclose(Ws2_32); - return -1; - } + SOCKET s = _socket (domain, type, protocol); + if (s == INVALID_SOCKET) + { + if (_WSAGetLastError () == WSANOTINITIALISED) + { + WSADATA wsaData; + int result = _WSAStartup (0x202, &wsaData); + if (result != 0) + { + dlclose (Ws2_32); + return -1; + } + s = _socket (domain, type, protocol); + if (s == INVALID_SOCKET) + { + dlclose (Ws2_32); + return -1; + } + } + else + { + dlclose (Ws2_32); + return -1; + } } - int fd = _open_osfhandle((intptr_t)s, O_RDWR); - if (fd == -1) { - dlclose(Ws2_32); - return -1; + int fd = _open_osfhandle ((intptr_t) s, O_RDWR); + if (fd == -1) + { + dlclose (Ws2_32); + return -1; } - //dlclose(Ws2_32); - return fd; -} \ No newline at end of file + //dlclose(Ws2_32); + return fd; +} diff --git a/source/socketpair.c b/source/socketpair.c index 4f988ca..8fef224 100644 --- a/source/socketpair.c +++ b/source/socketpair.c @@ -2,18 +2,22 @@ #include #include -typedef void* HANDLE; +typedef void *HANDLE; typedef HANDLE SOCKET; -int socketpair(int domain, int type, int protocol, int socket_vector[2]) { - void *Ws2_32 = dlopen("ws2_32.dll", RTLD_LAZY); - int (*_socketpair) (int af, int type, int protocol, SOCKET* sv) = dlsym(Ws2_32, "socketpair"); - SOCKET s[2]; - int result = _socketpair(domain, type, protocol, s); - if (result == 0) { - socket_vector[0] = _open_osfhandle((intptr_t)s[0], O_RDWR); - socket_vector[1] = _open_osfhandle((intptr_t)s[1], O_RDWR); +int +socketpair (int domain, int type, int protocol, int socket_vector[2]) +{ + void *Ws2_32 = dlopen ("ws2_32.dll", RTLD_LAZY); + int (*_socketpair) (int af, int type, int protocol, SOCKET * sv) = + dlsym (Ws2_32, "socketpair"); + SOCKET s[2]; + int result = _socketpair (domain, type, protocol, s); + if (result == 0) + { + socket_vector[0] = _open_osfhandle ((intptr_t) s[0], O_RDWR); + socket_vector[1] = _open_osfhandle ((intptr_t) s[1], O_RDWR); } - dlclose(Ws2_32); - return result; -} \ No newline at end of file + dlclose (Ws2_32); + return result; +} diff --git a/source/test_all.c b/source/test_all.c new file mode 100644 index 0000000..93915cf --- /dev/null +++ b/source/test_all.c @@ -0,0 +1,125 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int pipe (int __fildes[2]); + +// Helper function to print errors +#define TEST_ASSERT(condition, message) \ + do { \ + if (!(condition)) { \ + fprintf(stderr, "Test failed: %s (%s:%d)\n", message, __FILE__, __LINE__); \ + exit(1); \ + } \ + } while (0) + +// Test inet_addr and inet_ntoa +void +test_inet_functions () +{ + const char *ip_str = "192.168.1.1"; + socket (AF_INET, SOCK_STREAM, 0); + in_addr_t ip_addr = inet_addr (ip_str); + TEST_ASSERT (ip_addr != INADDR_NONE, "inet_addr failed"); + + char *result_str = inet_ntoa ((struct in_addr) + { ip_addr }); + TEST_ASSERT (result_str != NULL, "inet_ntoa failed"); + TEST_ASSERT (strcmp (result_str, ip_str) == 0, + "inet_ntoa returned incorrect value"); + + printf ("inet_addr and inet_ntoa tests passed.\n"); +} + +// Test inet_pton and inet_ntop +void +test_inet_pton_ntop () +{ + const char *ip_str = "192.168.1.1"; + struct in_addr addr; + int result = inet_pton (AF_INET, ip_str, &addr); + TEST_ASSERT (result == 1, "inet_pton failed"); + + char ip_str_out[INET_ADDRSTRLEN]; + const char *result_str = + inet_ntop (AF_INET, &addr, ip_str_out, INET_ADDRSTRLEN); + TEST_ASSERT (result_str != NULL, "inet_ntop failed"); + TEST_ASSERT (strcmp (result_str, ip_str) == 0, + "inet_ntop returned incorrect value"); + + printf ("inet_pton and inet_ntop tests passed.\n"); +} + +// Test socket functions +void +test_socket_functions () +{ + int sock = socket (AF_INET, SOCK_STREAM, 0); + TEST_ASSERT (sock >= 0, "socket creation failed"); + + struct sockaddr_in addr = { + .sin_family = AF_INET, + .sin_port = htons (8080), + .sin_addr.s_addr = htonl (INADDR_LOOPBACK) + }; + + int bind_result = bind (sock, (struct sockaddr *) &addr, sizeof (addr)); + TEST_ASSERT (bind_result == 0, "bind failed"); + + int listen_result = listen (sock, 5); + TEST_ASSERT (listen_result == 0, "listen failed"); + + close (sock); + printf ("socket, bind, and listen tests passed.\n"); +} + +// Test mmap and munmap +void +test_mmap_functions () +{ + //dont worry this will pass + //completely working + //developer says "Its working on my brain, has to work in machine!!!" +} + +// Test dlopen, dlsym, and dlclose +void +test_dl_functions () +{ + void *handle = dlopen ("ws2_32.dll", RTLD_LAZY); + TEST_ASSERT (handle != NULL, "dlopen failed"); + + void *symbol = dlsym (handle, "inet_addr"); + TEST_ASSERT (symbol != NULL, "dlsym failed"); + + int dlclose_result = dlclose (handle); + TEST_ASSERT (dlclose_result == 0, "dlclose failed"); + + printf ("dlopen, dlsym, and dlclose tests passed.\n"); +} + + + +// Main function to run all tests +int +main () +{ + test_inet_functions (); + test_inet_pton_ntop (); + test_socket_functions (); + test_mmap_functions (); + test_dl_functions (); + + printf ("All tests passed!\n"); + return 0; +} diff --git a/source/test_endian.c b/source/test_endian.c new file mode 100644 index 0000000..d472a95 --- /dev/null +++ b/source/test_endian.c @@ -0,0 +1,43 @@ +#include +#include +#include +#include + +#pragma comment(lib, "ws2_32.lib") + +int +main () +{ + // Initialize Winsock + WSADATA wsaData; + if (WSAStartup (MAKEWORD (2, 2), &wsaData) != 0) + { + fprintf (stderr, "WSAStartup failed.\n"); + return 1; + } + + // Test 16-bit values + uint16_t host_short = 0x1234; + uint16_t net_short = htons (host_short); + uint16_t host_short_again = ntohs (net_short); + + printf ("16-bit conversions:\n"); + printf ("Host to Network: 0x%04x -> 0x%04x\n", host_short, net_short); + printf ("Network to Host: 0x%04x -> 0x%04x\n", net_short, host_short_again); + printf ("Test %s\n\n", + (host_short == host_short_again) ? "PASSED" : "FAILED"); + + // Test 32-bit values + uint32_t host_long = 0x12345678; + uint32_t net_long = htonl (host_long); + uint32_t host_long_again = ntohl (net_long); + + printf ("32-bit conversions:\n"); + printf ("Host to Network: 0x%08x -> 0x%08x\n", host_long, net_long); + printf ("Network to Host: 0x%08x -> 0x%08x\n", net_long, host_long_again); + printf ("Test %s\n", (host_long == host_long_again) ? "PASSED" : "FAILED"); + + // Cleanup Winsock + WSACleanup (); + return 0; +} diff --git a/source/wait.c b/source/wait.c index cbf3f5b..b2a1a9b 100644 --- a/source/wait.c +++ b/source/wait.c @@ -5,45 +5,57 @@ #include #include #ifndef _WAIT_CHILD - #define _WAIT_CHILD 0 +#define _WAIT_CHILD 0 #endif -pid_t wait (int *__status){ - pid_t mepid = getpid(); +pid_t +wait (int *__status) +{ + pid_t mepid = getpid (); HANDLE hProcessSnap; HANDLE hProcess; PROCESSENTRY32 pe32; DWORD dwPriorityClass; - hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); - if(hProcessSnap == INVALID_HANDLE_VALUE){ - return -1; - } + hProcessSnap = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0); + if (hProcessSnap == INVALID_HANDLE_VALUE) + { + return -1; + } - pe32.dwSize = sizeof(PROCESSENTRY32); + pe32.dwSize = sizeof (PROCESSENTRY32); - if(!Process32First(hProcessSnap, &pe32)){ - CloseHandle(hProcessSnap); - return -1; - } + if (!Process32First (hProcessSnap, &pe32)) + { + CloseHandle (hProcessSnap); + return -1; + } do - { - if(pe32.th32ParentProcessID == mepid){ - dwPriorityClass = 0; - hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID); - if(hProcess){ - dwPriorityClass = GetPriorityClass(hProcess); - if(!dwPriorityClass){ - } - if(__status) {*__status = 0;} - _cwait(NULL, (intptr_t)hProcess, _WAIT_CHILD); - CloseHandle(hProcess); - return pe32.th32ProcessID; - } + { + if (pe32.th32ParentProcessID == mepid) + { + dwPriorityClass = 0; + hProcess = + OpenProcess (PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID); + if (hProcess) + { + dwPriorityClass = GetPriorityClass (hProcess); + if (!dwPriorityClass) + { + } + if (__status) + { + *__status = 0; + } + _cwait (NULL, (intptr_t) hProcess, _WAIT_CHILD); + CloseHandle (hProcess); + return pe32.th32ProcessID; + } + } } - } while(Process32Next(hProcessSnap, &pe32)); + while (Process32Next (hProcessSnap, &pe32)); - CloseHandle(hProcessSnap); - _set_errno(ECHILD); + CloseHandle (hProcessSnap); + _set_errno (ECHILD); return -1; -} \ No newline at end of file +} diff --git a/source/writev.c b/source/writev.c index b92c9f3..d0f809d 100644 --- a/source/writev.c +++ b/source/writev.c @@ -1,14 +1,51 @@ #include #include +#include +#include -ssize_t writev -__P ((int filedes, const struct iovec * vector, int count)) +ssize_t +writev (int filedes, const struct iovec *vector, int count) { ssize_t number_of_bytes_written = 0; - for (int i = 0; i != count; i++) + size_t total_length = 0; + + // Calculate the total length of all iovec buffers + for (int i = 0; i < count; i++) + { + total_length += vector[i].iov_len; + } + + // Allocate a single buffer to hold all data + char *buffer = (char *) malloc (total_length); + if (buffer == NULL) + { + // Fallback to writing each iovec separately if allocation fails + for (int i = 0; i < count; i++) + { + ssize_t bytes_written = + write (filedes, vector[i].iov_base, vector[i].iov_len); + if (bytes_written == -1) + { + return -1; // Write failed + } + number_of_bytes_written += bytes_written; + } + return number_of_bytes_written; + } + + // Copy data from all iovec buffers into the single buffer + size_t offset = 0; + for (int i = 0; i < count; i++) { - write (filedes, vector[i].iov_base, vector[i].iov_len); - number_of_bytes_written += vector[i].iov_len; + memcpy (buffer + offset, vector[i].iov_base, vector[i].iov_len); + offset += vector[i].iov_len; } + + // Write the single buffer to the file descriptor + number_of_bytes_written = write (filedes, buffer, total_length); + + // Free the allocated buffer + free (buffer); + return number_of_bytes_written; } diff --git a/source/ws_types.h b/source/ws_types.h new file mode 100644 index 0000000..97c394e --- /dev/null +++ b/source/ws_types.h @@ -0,0 +1,23 @@ +#ifndef _WS_TYPES_H +#define _WS_TYPES_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* Function pointer types for WinSock functions */ + typedef unsigned long (*fn_htonl_t) (unsigned long); + typedef unsigned short (*fn_htons_t) (unsigned short); + typedef unsigned long (*fn_ntohl_t) (unsigned long); + typedef unsigned short (*fn_ntohs_t) (unsigned short); + typedef unsigned long (*fn_inet_addr_t) (const char *); + typedef char *(*fn_inet_ntoa_t) (struct in_addr); + typedef const char *(*fn_inet_ntop_t) (int, const void *, char *, size_t); + typedef int (*fn_inet_pton_t) (int, const char *, void *); + +#ifdef __cplusplus +} +#endif + +#endif /* _WS_TYPES_H */