summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/util/genrand.c59
-rw-r--r--lib/util/util.h10
2 files changed, 69 insertions, 0 deletions
diff --git a/lib/util/genrand.c b/lib/util/genrand.c
index 5b8456547a..1519931222 100644
--- a/lib/util/genrand.c
+++ b/lib/util/genrand.c
@@ -360,3 +360,62 @@ again:
return retstr;
}
+
+/**
+ * Define our own pow() function to avoid linking in libm
+ */
+static double s_pow(double x, double y)
+{
+ int i;
+ double ret = x;
+
+ if (y == 0)
+ return 1;
+
+ for (i = 1; i < y; i++)
+ ret *= x;
+
+ return ret;
+}
+
+
+/**
+ * Generate an array of unique text strings all of the same length.
+ * The returned string will be allocated.
+ * Returns NULL if the number of unique combinations cannot be created.
+ *
+ * Characters used are: abcdefghijklmnopqrstuvwxyz0123456789+_-#.,
+ */
+_PUBLIC_ char** generate_unique_strs(TALLOC_CTX *mem_ctx, size_t len,
+ uint32_t num)
+{
+ const char *c_list = "abcdefghijklmnopqrstuvwxyz0123456789+_-#.,";
+ const int c_size = 42;
+ int i, j, rem;
+ long long place;
+ char ** strs = NULL;
+
+ if (num == 0 || len == 0)
+ return NULL;
+
+ /* We'll never return more than UINT32_MAX strings. Since 42^6 is more
+ * than UINT32_MAX, we only have to check if we've been asked to return
+ * more than the total number of permutations for lengths less than 6.*/
+ if ((len < 6) && (num > s_pow(c_size, len)))
+ return NULL;
+
+ strs = talloc_array(mem_ctx, char *, num);
+
+ for (i = 0; i < num; i++) {
+ char *retstr = talloc_zero_size(mem_ctx, len + 1);
+ rem = i;
+ for (j = len - 1; j >= 0; j--) {
+ place = s_pow(c_size, j);
+ retstr[j] = c_list[rem / place];
+ rem = rem % place;
+ }
+ strs[i] = retstr;
+ }
+
+ return strs;
+}
diff --git a/lib/util/util.h b/lib/util/util.h
index 20050d2f0a..aa9f91ef96 100644
--- a/lib/util/util.h
+++ b/lib/util/util.h
@@ -192,6 +192,16 @@ _PUBLIC_ char *generate_random_str_list(TALLOC_CTX *mem_ctx, size_t len, const c
*/
_PUBLIC_ char *generate_random_str(TALLOC_CTX *mem_ctx, size_t len);
+/**
+ * Generate an array of unique text strings all of the same length.
+ * The returned strings will be allocated.
+ * Returns NULL if the number of unique combinations cannot be created.
+ *
+ * Characters used are: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+_-#.,
+ */
+_PUBLIC_ char** generate_unique_strs(TALLOC_CTX *mem_ctx, size_t len,
+ uint32_t num);
+
/* The following definitions come from lib/util/dprintf.c */
#if _SAMBA_BUILD_ == 4