diff --git a/configure.ac b/configure.ac index 885482c5..93d40748 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 08ec715c..9dec89b4 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 6e3cb9f0..101a8025 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);