summaryrefslogtreecommitdiff
path: root/lib/sh/tmpfile.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sh/tmpfile.c')
-rw-r--r--lib/sh/tmpfile.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/lib/sh/tmpfile.c b/lib/sh/tmpfile.c
index d42d1807..7c2fbf22 100644
--- a/lib/sh/tmpfile.c
+++ b/lib/sh/tmpfile.c
@@ -114,6 +114,23 @@ get_tmpdir (flags)
return tdir;
}
+static void
+sh_seedrand ()
+{
+#if HAVE_RANDOM
+ int d;
+ static int seeded = 0;
+ if (seeded == 0)
+ {
+ struct timeval tv;
+
+ gettimeofday (&tv, NULL);
+ srandom (tv.tv_sec ^ tv.tv_usec ^ (getpid () << 16) ^ (unsigned int)&d);
+ seeded = 1;
+ }
+#endif
+}
+
char *
sh_mktmpname (nameroot, flags)
char *nameroot;
@@ -122,6 +139,7 @@ sh_mktmpname (nameroot, flags)
char *filename, *tdir, *lroot;
struct stat sb;
int r, tdlen;
+ static int seeded = 0;
filename = (char *)xmalloc (PATH_MAX + 1);
tdir = get_tmpdir (flags);
@@ -137,6 +155,7 @@ sh_mktmpname (nameroot, flags)
filename = NULL;
}
#else /* !USE_MKTEMP */
+ sh_seedrand ();
while (1)
{
filenum = (filenum << 1) ^
@@ -167,7 +186,7 @@ sh_mktmpfd (nameroot, flags, namep)
{
char *filename, *tdir, *lroot;
int fd, tdlen;
-
+
filename = (char *)xmalloc (PATH_MAX + 1);
tdir = get_tmpdir (flags);
tdlen = strlen (tdir);
@@ -186,6 +205,7 @@ sh_mktmpfd (nameroot, flags, namep)
*namep = filename;
return fd;
#else /* !USE_MKSTEMP */
+ sh_seedrand ();
do
{
filenum = (filenum << 1) ^