diff --git a/CMakeLists.txt b/CMakeLists.txt index 778cdfde..ae0afdca 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -185,6 +185,7 @@ else() check_symbol_exists(inet_pton arpa/inet.h HAVE_DECL_INET_PTON) check_symbol_exists(inet_ntop arpa/inet.h HAVE_DECL_INET_NTOP) endif() +check_symbol_exists(mkstemp stdlib.h HAVE_DECL_MKSTEMP) check_symbol_exists(sigemptyset signal.h HAVE_DECL_SIGEMPTYSET) check_symbol_exists(sigfillset signal.h HAVE_DECL_SIGFILLSET) check_symbol_exists(sigaddset signal.h HAVE_DECL_SIGADDSET) @@ -394,6 +395,11 @@ if (NOT HAVE_DECL_INET_NTOP) src/compat/inet_ntop.c ) endif() +if (NOT HAVE_DECL_MKSTEMP) + list(APPEND getdns_SOURCES + src/compat/mkstemp.c + ) +endif() if (NOT HAVE_DECL_STRLCPY) list(APPEND getdns_SOURCES src/compat/strlcpy.c diff --git a/cmake/include/cmakeconfig.h.in b/cmake/include/cmakeconfig.h.in index 04771ee3..dcecbf55 100644 --- a/cmake/include/cmakeconfig.h.in +++ b/cmake/include/cmakeconfig.h.in @@ -119,6 +119,7 @@ #cmakedefine HAVE_DECL_INET_NTOP 1 #cmakedefine HAVE_WIN_DECL_INET_PTON 1 #cmakedefine HAVE_WIN_DECL_INET_NTOP 1 +#cmakedefine HAVE_DECL_MKSTEMP 1 #cmakedefine HAVE_DECL_SIGEMPTYSET 1 #cmakedefine HAVE_DECL_SIGFILLSET 1 #cmakedefine HAVE_DECL_SIGADDSET 1 @@ -467,6 +468,10 @@ int inet_pton(int af, const char* src, void* dst); const char *inet_ntop(int af, const void *src, char *dst, size_t size); #endif +#ifndef HAVE_DECL_MKSTEMP +int mkstemp(char *template); +#endif + #ifndef HAVE_GETTIMEOFDAY int gettimeofday(struct timeval* tv, void* tz); #endif diff --git a/src/compat/mkstemp.c b/src/compat/mkstemp.c new file mode 100644 index 00000000..4d5acc8f --- /dev/null +++ b/src/compat/mkstemp.c @@ -0,0 +1,43 @@ +/** + * \file mkstemp.c + * @brief Implementation of mkstemp for Windows. + */ + +/* + * Copyright (c) 2019 Sinodun + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the names of the copyright holders nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL Verisign, Inc. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include + +int mkstemp(char *template) +{ + if (_mktemp_s(template, strlen(template) + 1) != 0) + return -1; + return open(template, _O_CREAT | _O_EXCL, _S_IWRITE); +}