From 3681d02253d29229e265720984ce81a35206de4c Mon Sep 17 00:00:00 2001 From: kinichiro Date: Sun, 25 Feb 2018 01:59:39 +0900 Subject: Add compat bits for libtls on Windows --- include/compat/sys/types.h | 2 ++ include/compat/unistd.h | 18 ++++++++++++++++++ tls/CMakeLists.txt | 10 ++++++++++ tls/Makefile.am | 7 +++++++ tls/compat/ftruncate.c | 13 +++++++++++++ tls/compat/getuid.c | 14 ++++++++++++++ tls/compat/pread.c | 23 +++++++++++++++++++++++ tls/compat/pwrite.c | 23 +++++++++++++++++++++++ 8 files changed, 110 insertions(+) create mode 100644 tls/compat/ftruncate.c create mode 100644 tls/compat/getuid.c create mode 100644 tls/compat/pread.c create mode 100644 tls/compat/pwrite.c diff --git a/include/compat/sys/types.h b/include/compat/sys/types.h index 473d6da..2107119 100644 --- a/include/compat/sys/types.h +++ b/include/compat/sys/types.h @@ -21,6 +21,7 @@ #ifdef __MINGW32__ #include <_bsd_types.h> typedef uint32_t in_addr_t; +typedef uint32_t uid_t; #endif #ifdef _MSC_VER @@ -29,6 +30,7 @@ typedef unsigned short u_short; typedef unsigned int u_int; typedef uint32_t in_addr_t; typedef uint32_t mode_t; +typedef uint32_t uid_t; #include typedef SSIZE_T ssize_t; diff --git a/include/compat/unistd.h b/include/compat/unistd.h index d596043..e70a390 100644 --- a/include/compat/unistd.h +++ b/include/compat/unistd.h @@ -7,7 +7,16 @@ #define LIBCRYPTOCOMPAT_UNISTD_H #ifndef _MSC_VER + #include_next + +#ifdef __MINGW32__ +int ftruncate(int fd, off_t length); +uid_t getuid(void); +ssize_t pread(int d, void *buf, size_t nbytes, off_t offset); +ssize_t pwrite(int d, const void *buf, size_t nbytes, off_t offset); +#endif + #else #include @@ -22,10 +31,19 @@ #define X_OK 0 #define F_OK 0 +#define SEEK_SET 0 +#define SEEK_CUR 1 +#define SEEK_END 2 + #define access _access unsigned int sleep(unsigned int seconds); +int ftruncate(int fd, off_t length); +uid_t getuid(void); +ssize_t pread(int d, void *buf, size_t nbytes, off_t offset); +ssize_t pwrite(int d, const void *buf, size_t nbytes, off_t offset); + #endif #ifndef HAVE_GETENTROPY diff --git a/tls/CMakeLists.txt b/tls/CMakeLists.txt index bc0c8f5..0e13da5 100644 --- a/tls/CMakeLists.txt +++ b/tls/CMakeLists.txt @@ -19,6 +19,16 @@ set( tls_verify.c ) +if(CMAKE_HOST_WIN32) +set( + TLS_SRC + ${TLS_SRC} + compat/ftruncate.c + compat/getuid.c + compat/pread.c + compat/pwrite.c +) +endif() if(NOT "${OPENSSLDIR}" STREQUAL "") add_definitions(-D_PATH_SSL_CA_FILE=\"${OPENSSLDIR}/cert.pem\") diff --git a/tls/Makefile.am b/tls/Makefile.am index bfe9571..58c0344 100644 --- a/tls/Makefile.am +++ b/tls/Makefile.am @@ -30,3 +30,10 @@ libtls_la_SOURCES += tls_peer.c libtls_la_SOURCES += tls_util.c libtls_la_SOURCES += tls_verify.c noinst_HEADERS = tls_internal.h + +if HOST_WIN +libtls_la_SOURCES += compat/ftruncate.c +libtls_la_SOURCES += compat/getuid.c +libtls_la_SOURCES += compat/pread.c +libtls_la_SOURCES += compat/pwrite.c +endif diff --git a/tls/compat/ftruncate.c b/tls/compat/ftruncate.c new file mode 100644 index 0000000..e68e6d0 --- /dev/null +++ b/tls/compat/ftruncate.c @@ -0,0 +1,13 @@ +/* + * Public domain + * + * Kinichiro Inoguchi + */ + +#include + +int +ftruncate(int fd, off_t length) +{ + return _chsize(fd, length); +} diff --git a/tls/compat/getuid.c b/tls/compat/getuid.c new file mode 100644 index 0000000..632967a --- /dev/null +++ b/tls/compat/getuid.c @@ -0,0 +1,14 @@ +/* + * Public domain + * + * Kinichiro Inoguchi + */ + +#include + +uid_t +getuid(void) +{ + /* Windows fstat sets 0 as st_uid */ + return 0; +} diff --git a/tls/compat/pread.c b/tls/compat/pread.c new file mode 100644 index 0000000..f0c9a2f --- /dev/null +++ b/tls/compat/pread.c @@ -0,0 +1,23 @@ +/* + * Public domain + * + * Kinichiro Inoguchi + */ + +#include + +ssize_t +pread(int d, void *buf, size_t nbytes, off_t offset) +{ + off_t cpos, opos, rpos; + ssize_t bytes; + if((cpos = lseek(d, 0, SEEK_CUR)) == -1) + return -1; + if((opos = lseek(d, offset, SEEK_SET)) == -1) + return -1; + if((bytes = read(d, buf, nbytes)) == -1) + return -1; + if((rpos = lseek(d, cpos, SEEK_SET)) == -1) + return -1; + return bytes; +} diff --git a/tls/compat/pwrite.c b/tls/compat/pwrite.c new file mode 100644 index 0000000..a304f7a --- /dev/null +++ b/tls/compat/pwrite.c @@ -0,0 +1,23 @@ +/* + * Public domain + * + * Kinichiro Inoguchi + */ + +#include + +ssize_t +pwrite(int d, const void *buf, size_t nbytes, off_t offset) +{ + off_t cpos, opos, rpos; + ssize_t bytes; + if((cpos = lseek(d, 0, SEEK_CUR)) == -1) + return -1; + if((opos = lseek(d, offset, SEEK_SET)) == -1) + return -1; + if((bytes = write(d, buf, nbytes)) == -1) + return -1; + if((rpos = lseek(d, cpos, SEEK_SET)) == -1) + return -1; + return bytes; +} -- cgit v1.2.3-55-g6feb