diff --git a/contrib/win32/w32-posix-prototype/win32posix/win32posix/defs.h b/contrib/win32/w32-posix-prototype/win32posix/win32posix/defs.h new file mode 100644 index 0000000..e7ebe1e --- /dev/null +++ b/contrib/win32/w32-posix-prototype/win32posix/win32posix/defs.h @@ -0,0 +1,46 @@ +#pragma once + +#include + +#define fd_set w32_fd_set +#undef FD_ZERO +#define FD_ZERO(set) (memset( (set), 0, sizeof(w32_fd_set))) +#undef FD_SET +#define FD_SET(fd,set) ( (set)->bitmap[(fd) >> 3] |= (0x80 >> ((fd) % 8))) +#undef FD_ISSET +#define FD_ISSET(fd, set) (( (set)->bitmap[(fd) >> 3] & (0x80 >> ((fd) % 8)))?1:0) +#undef FD_CLR +#define FD_CLR(fd, set) ((set)->bitmap[(fd) >> 3] &= (~(0x80 >> ((fd) % 8)))) + +#define STDIN_FILENO 0 +#define STDOUT_FILENO 1 +#define STDERR_FILENO 2 + +//fcntl commands +#define F_GETFL 0x1 +#define F_SETFL 0x2 +#define F_GETFD 0x4 +#define F_SETFD 0x8 + +//fd status flags +#define O_NONBLOCK 0x1 + +//fd flags +#define FD_CLOEXEC 0x1 + + +//open access modes. only one of these specified +#define O_RDONLY 0x1 +#define O_WRONLY 0x2 +#define O_RDWR 0x4 +//open file creation and file status flags // can be bitwise-or'd +#define O_APPEND 0x10 //file is opened in append mode +#define O_CREAT 0x20 //If the file does not exist it will be created +#define O_TRUNC 0x40 //If the file exists and is a regular file, and the file is successfully opened O_RDWR or O_WRONLY, its length shall be truncated to 0, and the mode and owner shall be unchanged +#define O_EXCL 0x80 //If O_CREAT and O_EXCL are set, open() shall fail if the file exists +#define O_BINARY 0x100 //Gives raw data (while O_TEXT normalises line endings +// open modes +#define S_IRUSR 00400 //user has read permission +#define S_IWUSR 00200 //user has write permission +#define S_IRGRP 00040 //group has read permission +#define S_IROTH 00004 //others have read permission \ No newline at end of file diff --git a/contrib/win32/w32-posix-prototype/win32posix/win32posix/fileio.cpp b/contrib/win32/w32-posix-prototype/win32posix/win32posix/fileio.cpp new file mode 100644 index 0000000..56c3de5 --- /dev/null +++ b/contrib/win32/w32-posix-prototype/win32posix/win32posix/fileio.cpp @@ -0,0 +1,26 @@ +#include "w32fd.h" +#include "defs.h" + +int fileio_pipe(struct w32_io* pio[2]) { + return -1; +} +struct w32_io* fileio_open(const char *pathname, int flags, int mode) { + + return NULL; +} +int fileio_read(struct w32_io* pio, void *dst, unsigned int max) { + return -1; +} +int fileio_write(struct w32_io* pio, const void *buf, unsigned int max) { + return -1; +} + +int fileio_fstat(struct w32_io* pio, struct stat *buf) { + return -1; +} +int fileio_isatty(struct w32_io* pio) { + return 0; +} +FILE* fileio_fdopen(struct w32_io* pio, const char *mode) { + return NULL; +} \ No newline at end of file diff --git a/contrib/win32/w32-posix-prototype/win32posix/win32posix/socketio.c b/contrib/win32/w32-posix-prototype/win32posix/win32posix/socketio.c index 153236b..9babdb3 100644 --- a/contrib/win32/w32-posix-prototype/win32posix/win32posix/socketio.c +++ b/contrib/win32/w32-posix-prototype/win32posix/win32posix/socketio.c @@ -5,7 +5,7 @@ #include "w32fd.h" #include -#define INTERNAL_BUFFER_SIZE 100*1024 //100KB +#define INTERNAL_SEND_BUFFER_SIZE 70*1024 //70KB #define INTERNAL_RECV_BUFFER_SIZE 70*1024 //70KB @@ -248,7 +248,7 @@ int socketio_recv(struct w32_io* pio, void *buf, size_t len, int flags) { BOOL completed = FALSE; if ((buf == NULL) || (len == 0)){ - errno = EPERM; + errno = EINVAL; return -1; } @@ -371,7 +371,7 @@ int socketio_send(struct w32_io* pio, const void *buf, size_t len, int flags) { } //initialize buffers if needed - wsabuf.len = INTERNAL_BUFFER_SIZE; + wsabuf.len = INTERNAL_SEND_BUFFER_SIZE; if (pio->write_details.buf == NULL) { wsabuf.buf = malloc(wsabuf.len); diff --git a/contrib/win32/w32-posix-prototype/win32posix/win32posix/w32fd.c b/contrib/win32/w32-posix-prototype/win32posix/win32posix/w32fd.c index 0cf5a49..a27fb6b 100644 --- a/contrib/win32/w32-posix-prototype/win32posix/win32posix/w32fd.c +++ b/contrib/win32/w32-posix-prototype/win32posix/win32posix/w32fd.c @@ -127,49 +127,156 @@ int w32_accept(int fd, struct sockaddr* addr, int* addrlen) } int w32_setsockopt(int fd, int level, int optname, const char* optval, int optlen) { + if (fd_table.w32_ios[fd] == NULL) { + errno = EBADF; + return -1; + } return socketio_setsockopt(fd_table.w32_ios[fd], level, optname, optval, optlen); } int w32_getsockopt(int fd, int level, int optname, char* optval, int* optlen) { + if (fd_table.w32_ios[fd] == NULL) { + errno = EBADF; + return -1; + } return socketio_getsockopt(fd_table.w32_ios[fd], level, optname, optval, optlen); } int w32_getsockname(int fd, struct sockaddr* name, int* namelen) { + if (fd_table.w32_ios[fd] == NULL) { + errno = EBADF; + return -1; + } return socketio_getsockname(fd_table.w32_ios[fd], name, namelen); } int w32_getpeername(int fd, struct sockaddr* name, int* namelen) { + if (fd_table.w32_ios[fd] == NULL) { + errno = EBADF; + return -1; + } return socketio_getpeername(fd_table.w32_ios[fd], name, namelen); } int w32_listen(int fd, int backlog) { + if (fd_table.w32_ios[fd] == NULL) { + errno = EBADF; + return -1; + } return socketio_listen(fd_table.w32_ios[fd], backlog); } int w32_bind(int fd, const struct sockaddr *name, int namelen) { + if (fd_table.w32_ios[fd] == NULL) { + errno = EBADF; + return -1; + } return socketio_bind(fd_table.w32_ios[fd], name, namelen); } int w32_connect(int fd, const struct sockaddr* name, int namelen) { + if (fd_table.w32_ios[fd] == NULL) { + errno = EBADF; + return -1; + } return socketio_connect(fd_table.w32_ios[fd], name, namelen); } int w32_recv(int fd, void *buf, size_t len, int flags) { + if (fd_table.w32_ios[fd] == NULL) { + errno = EBADF; + return -1; + } return socketio_recv(fd_table.w32_ios[fd], buf, len, flags); } int w32_send(int fd, const void *buf, size_t len, int flags) { + if (fd_table.w32_ios[fd] == NULL) { + errno = EBADF; + return -1; + } return socketio_send(fd_table.w32_ios[fd], buf, len, flags); } int w32_shutdown(int fd, int how) { + if (fd_table.w32_ios[fd] == NULL) { + errno = EBADF; + return -1; + } return socketio_shutdown(fd_table.w32_ios[fd], how); } + + + +//file io +int w32_pipe(int *pfds){ + pfds[0] = -1; + pfds[1] = -1; + struct w32_io* pio[2]; + + fileio_pipe(pio); + return -1; +} + +int w32_open(const char *pathname, int flags, ...) { + + struct w32_io* fileio = fileio_open(pathname, flags, 0); + return -1; +} + +int w32_read(int fd, void *dst, unsigned int max) { + if (fd_table.w32_ios[fd] == NULL) { + errno = EBADF; + return -1; + } + return fileio_read(fd_table.w32_ios[fd], dst, max); +} + +int w32_write(int fd, const void *buf, unsigned int max) { + if (fd_table.w32_ios[fd] == NULL) { + errno = EBADF; + return -1; + } + return fileio_write(fd_table.w32_ios[fd], buf, max); +} + +int w32_fstat(int fd, struct stat *buf) { + if (fd_table.w32_ios[fd] == NULL) { + errno = EBADF; + return -1; + } + return fileio_fstat(fd_table.w32_ios[fd], buf); +} + +int w32_isatty(int fd) { + if (fd_table.w32_ios[fd] == NULL) { + errno = EBADF; + return -1; + } + + return fileio_isatty(fd_table.w32_ios[fd]); +} + +FILE* w32_fdopen(int fd, const char *mode) { + if (fd_table.w32_ios[fd] == NULL) { + errno = EBADF; + return NULL; + } + + return fileio_fdopen(fd_table.w32_ios[fd], mode); +} + +//Common IO int w32_close(int fd) { struct w32_io* pio = fd_table.w32_ios[fd]; + if (pio == NULL) { + errno = EBADF; + return -1; + } + fd_table_clear(pio->table_index); if ((pio->type == LISTEN_FD) || (pio->type == SOCK_FD)) { return socketio_close(pio); @@ -182,6 +289,11 @@ int w32_fcntl(int fd, int cmd, ... /* arg */) { va_list valist; va_start(valist, cmd); + if (fd_table.w32_ios[fd] == NULL) { + errno = EBADF; + return -1; + } + switch (cmd){ case F_GETFL: return fd_table.w32_ios[fd]->fd_status_flags; @@ -215,7 +327,7 @@ int w32_select(int fds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, co } if (!readfds && !writefds && !exceptfds) { - errno = EPERM; + errno = EINVAL; return -1; } @@ -225,7 +337,7 @@ int w32_select(int fds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, co if (readfds && FD_ISSET(i, readfds)) { if (fd_table.w32_ios[i] == NULL) { - errno = EPERM; + errno = EBADF; return -1; } @@ -238,7 +350,7 @@ int w32_select(int fds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, co if (writefds && FD_ISSET(i, writefds)) { if (fd_table.w32_ios[i] == NULL) { - errno = EPERM; + errno = EBADF; return -1; } @@ -325,3 +437,11 @@ int w32_select(int fds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, co } + +int w32_dup(int oldfd) { + return -1; +} + +int w32_dup2(int oldfd, int newfd) { + return -1; +} \ No newline at end of file diff --git a/contrib/win32/w32-posix-prototype/win32posix/win32posix/w32fd.h b/contrib/win32/w32-posix-prototype/win32posix/win32posix/w32fd.h index 3601c80..a8dfd43 100644 --- a/contrib/win32/w32-posix-prototype/win32posix/win32posix/w32fd.h +++ b/contrib/win32/w32-posix-prototype/win32posix/win32posix/w32fd.h @@ -1,4 +1,5 @@ #include +#include enum w32_io_type { UNKOWN_FD = 0, @@ -75,3 +76,13 @@ int socketio_send(struct w32_io* pio, const void *buf, size_t len, int flags); int socketio_shutdown(struct w32_io* pio, int how); int socketio_close(struct w32_io* pio); + +//fileio +int fileio_pipe(struct w32_io* pio[2]); +struct w32_io* fileio_open(const char *pathname, int flags, int mode); +int fileio_read(struct w32_io* pio, void *dst, unsigned int max); +int fileio_write(struct w32_io* pio, const void *buf, unsigned int max); +int fileio_fstat(struct w32_io* pio, struct stat *buf); +int fileio_isatty(struct w32_io* pio); +FILE* fileio_fdopen(struct w32_io* pio, const char *mode); + diff --git a/contrib/win32/w32-posix-prototype/win32posix/win32posix/w32posix.h b/contrib/win32/w32-posix-prototype/win32posix/win32posix/w32posix.h index 06ccca5..dfdcb8e 100644 --- a/contrib/win32/w32-posix-prototype/win32posix/win32posix/w32posix.h +++ b/contrib/win32/w32-posix-prototype/win32posix/win32posix/w32posix.h @@ -1,9 +1,9 @@ #pragma once -#include #include #include #include +#include "defs.h" //File Descriptor definitions #define MAX_FDS 128 //a 2^n number @@ -12,34 +12,6 @@ typedef struct w32_fd_set_ { unsigned char bitmap[MAX_FDS >> 3]; }w32_fd_set; -#define fd_set w32_fd_set -#undef FD_ZERO -#define FD_ZERO(set) (memset( (set), 0, sizeof(w32_fd_set))) -#undef FD_SET -#define FD_SET(fd,set) ( (set)->bitmap[(fd) >> 3] |= (0x80 >> ((fd) % 8))) -#undef FD_ISSET -#define FD_ISSET(fd, set) (( (set)->bitmap[(fd) >> 3] & (0x80 >> ((fd) % 8)))?1:0) -#undef FD_CLR -#define FD_CLR(fd, set) ((set)->bitmap[(fd) >> 3] &= (~(0x80 >> ((fd) % 8)))) - -#define STDIN_FILENO 0 -#define STDOUT_FILENO 1 -#define STDERR_FILENO 2 - -//fcntl commands -#define F_GETFL 0x1 -#define F_SETFL 0x2 -#define F_GETFD 0x4 -#define F_SETFD 0x8 - -//fd status flags -#define O_NONBLOCK 0x1 - -//fd flags -#define FD_CLOEXEC 0x1 - -#define socket w32_socket - void w32posix_initialize(); void w32posix_done(); @@ -69,10 +41,9 @@ int w32_recv(int fd, void *buf, size_t len, int flags); int w32_send(int fd, const void *buf, size_t len, int flags); int w32_shutdown(int fd, int how); -/*non-network i/o*/ +/*non-network (file) i/o*/ #define pipe w32_pipe #define open w32_open -#define creat w32_creat #define read w32_read #define write w32_write #define fstat w32_fstat @@ -80,7 +51,6 @@ int w32_shutdown(int fd, int how); #define fdopen w32_fdopen int w32_pipe(int *pfds); int w32_open(const char *pathname, int flags, ...); -int w32_creat(const char *pathname, int mode); int w32_read(int fd, void *dst, unsigned int max); int w32_write(int fd, const void *buf, unsigned int max); int w32_fstat(int fd, struct stat *buf); diff --git a/contrib/win32/w32-posix-prototype/win32posix/win32posix/win32posix.vcxproj b/contrib/win32/w32-posix-prototype/win32posix/win32posix/win32posix.vcxproj index f3184fe..4a190e1 100644 --- a/contrib/win32/w32-posix-prototype/win32posix/win32posix/win32posix.vcxproj +++ b/contrib/win32/w32-posix-prototype/win32posix/win32posix/win32posix.vcxproj @@ -74,11 +74,13 @@ + + diff --git a/contrib/win32/w32-posix-prototype/win32posix/win32posix/win32posix.vcxproj.filters b/contrib/win32/w32-posix-prototype/win32posix/win32posix/win32posix.vcxproj.filters index 2f47450..48153c3 100644 --- a/contrib/win32/w32-posix-prototype/win32posix/win32posix/win32posix.vcxproj.filters +++ b/contrib/win32/w32-posix-prototype/win32posix/win32posix/win32posix.vcxproj.filters @@ -27,6 +27,9 @@ Source Files + + Source Files + @@ -35,5 +38,8 @@ Header Files + + Header Files + \ No newline at end of file