Provide mkdtemp() for systems without it.
This commit is contained in:
@@ -41,6 +41,9 @@
|
|||||||
static unsigned int get_random(void);
|
static unsigned int get_random(void);
|
||||||
static void seed_random(void);
|
static void seed_random(void);
|
||||||
|
|
||||||
|
#define MKTEMP_FILE 1
|
||||||
|
#define MKTEMP_DIR 2
|
||||||
|
|
||||||
#define TEMPCHARS "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
|
#define TEMPCHARS "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
|
||||||
#define NUM_CHARS (sizeof(TEMPCHARS) - 1)
|
#define NUM_CHARS (sizeof(TEMPCHARS) - 1)
|
||||||
|
|
||||||
@@ -48,8 +51,26 @@ static void seed_random(void);
|
|||||||
#define INT_MAX 0x7fffffff
|
#define INT_MAX 0x7fffffff
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE_MKSTEMPS
|
||||||
int
|
int
|
||||||
mkstemps(char *path, int slen)
|
mkstemps(char *path, int slen)
|
||||||
|
{
|
||||||
|
return(mktemp_internal(path, slen, MKTEMP_FILE));
|
||||||
|
}
|
||||||
|
#endif /* HAVE_MKSTEMPS */
|
||||||
|
|
||||||
|
#ifndef HAVE_MKDTEMP
|
||||||
|
char *
|
||||||
|
mkdtemp(char *path)
|
||||||
|
{
|
||||||
|
if (mktemp_internal(path, 0, MKTEMP_DIR) == -1)
|
||||||
|
return(NULL);
|
||||||
|
return(path);
|
||||||
|
}
|
||||||
|
#endif /* HAVE_MKDTEMP */
|
||||||
|
|
||||||
|
int
|
||||||
|
mktemp_internal(char *path, int slen, int mode)
|
||||||
{
|
{
|
||||||
char *start, *cp, *ep;
|
char *start, *cp, *ep;
|
||||||
const char *tempchars = TEMPCHARS;
|
const char *tempchars = TEMPCHARS;
|
||||||
@@ -77,9 +98,19 @@ mkstemps(char *path, int slen)
|
|||||||
*cp = tempchars[r];
|
*cp = tempchars[r];
|
||||||
}
|
}
|
||||||
|
|
||||||
fd = open(path, O_CREAT|O_EXCL|O_RDWR, S_IRUSR|S_IWUSR);
|
switch (mode) {
|
||||||
if (fd != -1 || errno != EEXIST)
|
case MKTEMP_FILE:
|
||||||
return(fd);
|
fd = open(path, O_CREAT|O_EXCL|O_RDWR, S_IRUSR|S_IWUSR);
|
||||||
|
if (fd != -1 || errno != EEXIST)
|
||||||
|
return(fd);
|
||||||
|
break;
|
||||||
|
case MKTEMP_DIR:
|
||||||
|
if (mkdir(path, S_IRWXU) == 0)
|
||||||
|
return(0);
|
||||||
|
if (errno != EEXIST)
|
||||||
|
return(-1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
} while (--tries);
|
} while (--tries);
|
||||||
|
|
||||||
errno = EEXIST;
|
errno = EEXIST;
|
@@ -331,6 +331,9 @@
|
|||||||
/* Define to 1 if you have the `memrchr' function. */
|
/* Define to 1 if you have the `memrchr' function. */
|
||||||
#undef HAVE_MEMRCHR
|
#undef HAVE_MEMRCHR
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `mkdtemp' function. */
|
||||||
|
#undef HAVE_MKDTEMP
|
||||||
|
|
||||||
/* Define to 1 if you have the `mkstemps' function. */
|
/* Define to 1 if you have the `mkstemps' function. */
|
||||||
#undef HAVE_MKSTEMPS
|
#undef HAVE_MKSTEMPS
|
||||||
|
|
||||||
|
14
configure
vendored
14
configure
vendored
@@ -15684,12 +15684,14 @@ fi
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
for ac_func in mkstemps
|
for ac_func in mkstemps mkdtemp
|
||||||
do :
|
do :
|
||||||
ac_fn_c_check_func "$LINENO" "mkstemps" "ac_cv_func_mkstemps"
|
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
|
||||||
if test "x$ac_cv_func_mkstemps" = x""yes; then :
|
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
|
||||||
|
eval as_val=\$$as_ac_var
|
||||||
|
if test "x$as_val" = x""yes; then :
|
||||||
cat >>confdefs.h <<_ACEOF
|
cat >>confdefs.h <<_ACEOF
|
||||||
#define HAVE_MKSTEMPS 1
|
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
|
||||||
_ACEOF
|
_ACEOF
|
||||||
|
|
||||||
else
|
else
|
||||||
@@ -15708,8 +15710,8 @@ fi
|
|||||||
done
|
done
|
||||||
|
|
||||||
case " $LIBOBJS " in
|
case " $LIBOBJS " in
|
||||||
*" mkstemps.$ac_objext "* ) ;;
|
*" mkstemp.$ac_objext "* ) ;;
|
||||||
*) LIBOBJS="$LIBOBJS mkstemps.$ac_objext"
|
*) LIBOBJS="$LIBOBJS mkstemp.$ac_objext"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
@@ -2004,9 +2004,9 @@ AC_CHECK_FUNCS(closefrom, [], [AC_LIBOBJ(closefrom)
|
|||||||
[ #include <limits.h>
|
[ #include <limits.h>
|
||||||
#include <fcntl.h> ])
|
#include <fcntl.h> ])
|
||||||
])
|
])
|
||||||
AC_CHECK_FUNCS(mkstemps, [], [
|
AC_CHECK_FUNCS(mkstemps mkdtemp, [], [
|
||||||
AC_CHECK_FUNCS(random lrand48, [break])
|
AC_CHECK_FUNCS(random lrand48, [break])
|
||||||
AC_LIBOBJ(mkstemps)
|
AC_LIBOBJ(mkstemp)
|
||||||
])
|
])
|
||||||
AC_CHECK_FUNCS(snprintf vsnprintf asprintf vasprintf, , [NEED_SNPRINTF=1])
|
AC_CHECK_FUNCS(snprintf vsnprintf asprintf vasprintf, , [NEED_SNPRINTF=1])
|
||||||
if test X"$ac_cv_type_struct_timespec" != X"no"; then
|
if test X"$ac_cv_type_struct_timespec" != X"no"; then
|
||||||
|
@@ -316,6 +316,9 @@ size_t strlcpy(char *, const char *, size_t);
|
|||||||
#ifndef HAVE_MEMRCHR
|
#ifndef HAVE_MEMRCHR
|
||||||
void *memrchr(const void *, int, size_t);
|
void *memrchr(const void *, int, size_t);
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef HAVE_MKDTEMP
|
||||||
|
char *mkdtemp(char *);
|
||||||
|
#endif
|
||||||
#ifndef HAVE_MKSTEMPS
|
#ifndef HAVE_MKSTEMPS
|
||||||
int mkstemps(char *, int);
|
int mkstemps(char *, int);
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user