summaryrefslogtreecommitdiffstats
path: root/Utilities/cmlibarchive/libarchive/archive_util.c
diff options
context:
space:
mode:
Diffstat (limited to 'Utilities/cmlibarchive/libarchive/archive_util.c')
-rw-r--r--Utilities/cmlibarchive/libarchive/archive_util.c143
1 files changed, 76 insertions, 67 deletions
diff --git a/Utilities/cmlibarchive/libarchive/archive_util.c b/Utilities/cmlibarchive/libarchive/archive_util.c
index d136498..5f31edf 100644
--- a/Utilities/cmlibarchive/libarchive/archive_util.c
+++ b/Utilities/cmlibarchive/libarchive/archive_util.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2009-2012 Michihiro NAKAJIMA
+ * Copyright (c) 2009-2012,2014 Michihiro NAKAJIMA
* Copyright (c) 2003-2007 Tim Kientzle
* All rights reserved.
*
@@ -54,9 +54,13 @@ __FBSDID("$FreeBSD: head/lib/libarchive/archive_util.c 201098 2009-12-28 02:58:1
#ifdef HAVE_BZLIB_H
#include <cm_bzlib.h>
#endif
+#ifdef HAVE_LZ4_H
+#include <lz4.h>
+#endif
#include "archive.h"
#include "archive_private.h"
+#include "archive_random_private.h"
#include "archive_string.h"
#ifndef O_CLOEXEC
@@ -113,7 +117,11 @@ archive_version_details(void)
archive_strncat(&str, p, sep - p);
}
#endif
- }
+#if defined(HAVE_LZ4_H) && defined(HAVE_LIBLZ4)
+ archive_string_sprintf(&str, " liblz4/%d.%d.%d",
+ LZ4_VERSION_MAJOR, LZ4_VERSION_MINOR, LZ4_VERSION_RELEASE);
+#endif
+ }
return str.s;
}
@@ -465,7 +473,6 @@ __archive_mktemp(const char *tmpdir)
struct stat st;
int fd;
char *tp, *ep;
- unsigned seed;
fd = -1;
archive_string_init(&temp_name);
@@ -489,21 +496,15 @@ __archive_mktemp(const char *tmpdir)
archive_strcat(&temp_name, "XXXXXXXXXX");
ep = temp_name.s + archive_strlen(&temp_name);
- fd = open("/dev/random", O_RDONLY | O_CLOEXEC);
- __archive_ensure_cloexec_flag(fd);
- if (fd < 0)
- seed = time(NULL);
- else {
- if (read(fd, &seed, sizeof(seed)) < 0)
- seed = time(NULL);
- close(fd);
- }
do {
char *p;
p = tp;
- while (p < ep)
- *p++ = num[((unsigned)rand_r(&seed)) % sizeof(num)];
+ archive_random(p, ep - p);
+ while (p < ep) {
+ int d = *((unsigned char *)p) % sizeof(num);
+ *p++ = num[d];
+ }
fd = open(temp_name.s, O_CREAT | O_EXCL | O_RDWR | O_CLOEXEC,
0600);
} while (fd < 0 && errno == EEXIST);
@@ -551,62 +552,70 @@ __archive_ensure_cloexec_flag(int fd)
static int
archive_utility_string_sort_helper(char **strings, unsigned int n)
{
- unsigned int i, lesser_count, greater_count;
- char **lesser, **greater, **tmp, *pivot;
- int retval1, retval2;
-
- /* A list of 0 or 1 elements is already sorted */
- if (n <= 1)
- return (ARCHIVE_OK);
-
- lesser_count = greater_count = 0;
- lesser = greater = NULL;
- pivot = strings[0];
- for (i = 1; i < n; i++)
- {
- if (strcmp(strings[i], pivot) < 0)
- {
- lesser_count++;
- tmp = (char **)realloc(lesser, lesser_count * sizeof(char *));
- if (!tmp)
- return (ARCHIVE_FATAL);
- lesser = tmp;
- lesser[lesser_count - 1] = strings[i];
- }
- else
- {
- greater_count++;
- tmp = (char **)realloc(greater, greater_count * sizeof(char *));
- if (!tmp)
- return (ARCHIVE_FATAL);
- greater = tmp;
- greater[greater_count - 1] = strings[i];
- }
- }
-
- /* quicksort(lesser) */
- retval1 = archive_utility_string_sort_helper(lesser, lesser_count);
- for (i = 0; i < lesser_count; i++)
- strings[i] = lesser[i];
- free(lesser);
-
- /* pivot */
- strings[lesser_count] = pivot;
-
- /* quicksort(greater) */
- retval2 = archive_utility_string_sort_helper(greater, greater_count);
- for (i = 0; i < greater_count; i++)
- strings[lesser_count + 1 + i] = greater[i];
- free(greater);
-
- return (retval1 < retval2) ? retval1 : retval2;
+ unsigned int i, lesser_count, greater_count;
+ char **lesser, **greater, **tmp, *pivot;
+ int retval1, retval2;
+
+ /* A list of 0 or 1 elements is already sorted */
+ if (n <= 1)
+ return (ARCHIVE_OK);
+
+ lesser_count = greater_count = 0;
+ lesser = greater = NULL;
+ pivot = strings[0];
+ for (i = 1; i < n; i++)
+ {
+ if (strcmp(strings[i], pivot) < 0)
+ {
+ lesser_count++;
+ tmp = (char **)realloc(lesser,
+ lesser_count * sizeof(char *));
+ if (!tmp) {
+ free(greater);
+ free(lesser);
+ return (ARCHIVE_FATAL);
+ }
+ lesser = tmp;
+ lesser[lesser_count - 1] = strings[i];
+ }
+ else
+ {
+ greater_count++;
+ tmp = (char **)realloc(greater,
+ greater_count * sizeof(char *));
+ if (!tmp) {
+ free(greater);
+ free(lesser);
+ return (ARCHIVE_FATAL);
+ }
+ greater = tmp;
+ greater[greater_count - 1] = strings[i];
+ }
+ }
+
+ /* quicksort(lesser) */
+ retval1 = archive_utility_string_sort_helper(lesser, lesser_count);
+ for (i = 0; i < lesser_count; i++)
+ strings[i] = lesser[i];
+ free(lesser);
+
+ /* pivot */
+ strings[lesser_count] = pivot;
+
+ /* quicksort(greater) */
+ retval2 = archive_utility_string_sort_helper(greater, greater_count);
+ for (i = 0; i < greater_count; i++)
+ strings[lesser_count + 1 + i] = greater[i];
+ free(greater);
+
+ return (retval1 < retval2) ? retval1 : retval2;
}
int
archive_utility_string_sort(char **strings)
{
- unsigned int size = 0;
- while (strings[size] != NULL)
- size++;
- return archive_utility_string_sort_helper(strings, size);
+ unsigned int size = 0;
+ while (strings[size] != NULL)
+ size++;
+ return archive_utility_string_sort_helper(strings, size);
}