From 20ad4f0f93da79e2ec0a9699dff58b9922556438 Mon Sep 17 00:00:00 2001
From: Andre Noll <maan@systemlinux.org>
Date: Sun, 14 Jun 2009 12:30:41 +0200
Subject: [PATCH] Move para_tmpname() to file_write.c and make it static.

Also use para_random() instead of rand().
---
 file_write.c | 30 ++++++++++++++++++++++++------
 string.c     | 21 ---------------------
 string.h     |  1 -
 3 files changed, 24 insertions(+), 28 deletions(-)

diff --git a/file_write.c b/file_write.c
index 92777d7d..1c534ae1 100644
--- a/file_write.c
+++ b/file_write.c
@@ -8,6 +8,7 @@
 
 #include <sys/types.h>
 #include <dirent.h>
+#include <sys/time.h>
 
 #include "para.h"
 #include "list.h"
@@ -27,20 +28,37 @@ struct private_file_write_data {
 	int check_fd;
 };
 
+/*
+ * Get a random filename.
+ *
+ * This is by no means a secure way to create temporary files in a hostile
+ * directory like \p /tmp. However, we use it only for creating temp files in
+ * ~/.paraslash, for which it is OK. Result must be freed by the caller.
+ */
+__must_check __malloc static char *random_filename(void)
+{
+	char *result, *home = para_homedir();
+	struct timeval tv;
+
+	gettimeofday(&tv, NULL);
+	srandom(tv.tv_usec);
+	result = make_message("%s/.paraslash/%08lu", home,
+		para_random(99999999));
+	free(home);
+	return result;
+}
+
 static int file_write_open(struct writer_node *wn)
 {
 	struct private_file_write_data *pfwd = para_calloc(
 		sizeof(struct private_file_write_data));
 	struct file_write_args_info *conf = wn->conf;
 	char *filename;
+
 	if (conf->filename_given)
 		filename = conf->filename_arg;
-	else {
-		char *tmp = para_tmpname(), *home = para_homedir();
-		filename = make_message("%s/.paraslash/%s", home, tmp);
-		free(home);
-		free(tmp);
-	}
+	else
+		filename = random_filename();
 	wn->private_data = pfwd;
 	pfwd->fd = open(filename, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
 	if (!conf->filename_given)
diff --git a/string.c b/string.c
index f51f3574..d0bb60c5 100644
--- a/string.c
+++ b/string.c
@@ -231,27 +231,6 @@ void chop(char *buf)
 		buf[n - 1] = '\0';
 }
 
-/**
- * Get a random filename.
- *
- * This is by no means a secure way to create temporary files in a hostile
- * directory like \p /tmp. However, it is OK to use for temp files, fifos,
- * sockets that are created in ~/.paraslash. Result must be freed by the
- * caller.
- *
- * \return A pointer to a random filename.
- */
-__must_check __malloc char *para_tmpname(void)
-{
-	struct timeval now;
-	unsigned int seed;
-
-	gettimeofday(&now, NULL);
-	seed = now.tv_usec;
-	srand(seed);
-	return make_message("%08i", rand());
-}
-
 /**
  * Get the logname of the current user.
  *
diff --git a/string.h b/string.h
index 272f107d..a9dfae90 100644
--- a/string.h
+++ b/string.h
@@ -35,7 +35,6 @@ __must_check __malloc char *para_strcat(char *a, const char *b);
 __must_check __malloc char *para_dirname(const char *name);
 __must_check const char *para_basename(const char *name);
 void chop(char *buf);
-__must_check __malloc char *para_tmpname(void);
 __must_check __malloc char *para_logname(void);
 __must_check __malloc char *para_homedir(void);
 unsigned split_args(char *args, char *** const argv_ptr, const char *delim);
-- 
2.39.5