Signed-off-by: Will Miles <wmiles@sgl.com> --- configure.ac | 6 +++--- lib/libalpm/trans.c | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index da1953e..0a1ef44 100644 --- a/configure.ac +++ b/configure.ac @@ -303,9 +303,9 @@ AC_FUNC_MALLOC AC_FUNC_MKTIME AC_FUNC_STRCOLL AC_CHECK_FUNCS([asprintf dup2 getcwd getmntinfo gettimeofday memmove memset \ - mkdir realpath regcomp rmdir setenv setlocale strcasecmp \ - strchr strcspn strdup strerror strndup strnlen strrchr \ - strsep strstr strtol swprintf tcflush wcwidth uname]) + mkdir mkdtemp realpath regcomp rmdir setenv setlocale \ + strcasecmp strchr strcspn strdup strerror strndup strnlen \ + strrchr strsep strstr strtol swprintf tcflush wcwidth uname]) AC_CHECK_MEMBERS([struct stat.st_blksize],,,[[#include <sys/stat.h>]]) # For the diskspace code diff --git a/lib/libalpm/trans.c b/lib/libalpm/trans.c index 6a26e75..b3f6044 100644 --- a/lib/libalpm/trans.c +++ b/lib/libalpm/trans.c @@ -41,6 +41,41 @@ #include "alpm.h" #include "deps.h" +#ifndef HAVE_MKDTEMP +/* supply a workaround implementation of mkdtemp as the system does not */ +static char *mkdtemp(char *templateName) +{ + static const char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + const int length = strlen(templateName); + char *XXXXXX = templateName + length - 6; + + if((length < 6) || (strncmp(XXXXXX, "XXXXXX", 6) != 0)) + return 0; + + for(int i = 0; i < 256; ++i) { + int v = rand(); + + /* Fill in the random bits. */ + XXXXXX[0] = letters[v % 62]; + v /= 62; + XXXXXX[1] = letters[v % 62]; + v /= 62; + XXXXXX[2] = letters[v % 62]; + v /= 62; + XXXXXX[3] = letters[v % 62]; + v /= 62; + XXXXXX[4] = letters[v % 62]; + v /= 62; + XXXXXX[5] = letters[v % 62]; + + if(mkdir(templateName, 0700) == 0) + return templateName; + } + + return 0; +} +#endif + /** \addtogroup alpm_trans Transaction Functions * @brief Functions to manipulate libalpm transactions * @{ -- 2.3.0