From 157c95b9889b523a3de7772e85ef9f3f69182c88 Mon Sep 17 00:00:00 2001 From: Nicolas Williams Date: Thu, 1 Jan 2015 03:14:55 -0600 Subject: [PATCH] Add mkstemp() for mingw build --- configure.ac | 1 + util.c | 27 ++++++++++++++++++++++++++- util.h | 4 ++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 885482c..93d4074 100644 --- a/configure.ac +++ b/configure.ac @@ -86,6 +86,7 @@ if test "x$valgrind_cmd" = "x" ; then AC_MSG_WARN([valgrind is required to test jq.]) fi AC_CHECK_FUNCS(memmem) +AC_CHECK_FUNCS(mkstemp) dnl Don't attempt to build docs if there's no Ruby lying around diff --git a/util.c b/util.c index 08ec715..9dec89b 100644 --- a/util.c +++ b/util.c @@ -1,9 +1,13 @@ +#include +#include +#include +#include + #ifdef HAVE_MEMMEM #define _GNU_SOURCE #include #endif -#include #ifndef WIN32 #include #endif @@ -15,6 +19,27 @@ #include "util.h" #include "jv.h" +#ifndef HAVE_MKSTEMP +int mkstemp(char *template) { + size_t len = strlen(template); + int tries=5; + int fd; + + // mktemp() truncates template when it fails + char *s = alloca(len + 1); + assert(s != NULL); + strcpy(s, template); + + do { + // Restore template + strcpy(template, s); + (void) mktemp(template); + fd = open(template, O_CREAT | O_EXCL | O_RDWR, 0600); + } while (fd == -1 && tries-- > 0); + return fd; +} +#endif + jv expand_path(jv path) { assert(jv_get_kind(path) == JV_KIND_STRING); const char *pstr = jv_string_value(path); diff --git a/util.h b/util.h index 6e3cb9f..101a802 100644 --- a/util.h +++ b/util.h @@ -3,6 +3,10 @@ #include "jv.h" +#ifndef HAVE_MKSTEMP +int mkstemp(char *template); +#endif + jv expand_path(jv); jv get_home(void); jv jq_realpath(jv); -- 2.40.0