about summary refs log tree commit diff stats
path: root/src/LYUtils.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/LYUtils.c')
-rw-r--r--src/LYUtils.c138
1 files changed, 75 insertions, 63 deletions
diff --git a/src/LYUtils.c b/src/LYUtils.c
index d31f059f..77ad6f49 100644
--- a/src/LYUtils.c
+++ b/src/LYUtils.c
@@ -108,6 +108,11 @@ extern int BSDselect PARAMS((int nfds, fd_set * readfds, fd_set * writefds,
 #endif /* __FreeBSD__ || __bsdi__ */
 #endif /* !UTMP_FILE */
 
+#if defined(HAVE_RAND) && defined(HAVE_SRAND) && defined(RAND_MAX)
+#define USE_RAND_TEMPNAME 1
+#define MAX_TEMPNAME 10000
+#endif
+
 #define COPY_COMMAND "%s %s %s"
 
 extern BOOLEAN LYHaveCJKCharacterSet;
@@ -118,6 +123,42 @@ PRIVATE char *HomeDir = NULL;			/* HOME directory */
 PUBLIC	HTList * sug_filenames = NULL;		/* Suggested filenames	 */
 
 /*
+ * Maintain a list of all of the temp-files we create so that we can remove
+ * them during the cleanup.
+ */
+typedef struct _LYTemp {
+    struct _LYTemp *next;
+    char *name;
+    FILE *file;
+} LY_TEMP;
+
+PRIVATE LY_TEMP *ly_temp;
+
+PRIVATE LY_TEMP *FindTempfileByName ARGS1(CONST char *, name)
+{
+    LY_TEMP *p;
+
+    for (p = ly_temp; p != 0; p = p->next) {
+	if (!strcmp(p->name, name)) {
+	    break;
+	}
+    }
+    return p;
+}
+
+PRIVATE LY_TEMP *FindTempfileByFP ARGS1(FILE *, fp)
+{
+    LY_TEMP *p;
+
+    for (p = ly_temp; p != 0; p = p->next) {
+	if (p->file == fp) {
+	    break;
+	}
+    }
+    return p;
+}
+
+/*
  *  Highlight (or unhighlight) a given link.
  */
 PUBLIC void highlight ARGS3(
@@ -3732,26 +3773,21 @@ PRIVATE int fmt_tempname ARGS3(
     /*
      * Prefer a random value rather than a counter.
      */
-#if defined(HAVE_RAND) && defined(HAVE_SRAND) && defined(RAND_MAX)
+#ifdef USE_RAND_TEMPNAME
+    do {
+	int uninit;	/* ( intentionally uninitialized ;-) */
     if (counter == 0)
-	srand(time((time_t *)0));
-    counter = ( 10000.0 * rand() ) / RAND_MAX;
+	srand(time((time_t *)0) + uninit);
+    /* We don't really need all of the bits from rand().  The high-order bits
+     * are the more-random portion in any case, but limiting the width of the
+     * generated name is done partly to avoid problems on systems that may not
+     * support long filenames.
+     */
+    counter = ( (float)MAX_TEMPNAME * rand() ) / RAND_MAX + 1;
 #else
     counter++;
 #endif
 
-#if 0 && defined(_WINDOWS)	/* 1998/05/25 (Mon) 20:51:22 */
-    /*  This is nonsense - result hasn't been filled yet and will
-     *  be overwritten below.  If you mean 'prefix' then say so. - kw
-     */
-    {
-	char *p = result;
-	while (*p++) {
-	    if (*p == '/')
-		*p = '\\';
-	}
-    }
-#endif
 #ifdef FNAMES_8_3
     /*
      * The 'lynx_temp_space' string ends with a '/' or '\\', so we only have to
@@ -3787,6 +3823,10 @@ PRIVATE int fmt_tempname ARGS3(
 	sprintf(result, "%.*s", LY_MAXPATH-1, leaf);
 	code = FALSE;
     }
+#ifdef USE_RAND_TEMPNAME
+    /* If we really have 10000 files open, there's no point in returning... */
+    } while (FindTempfileByName(result) != 0);
+#endif
     CTRACE((tfp, "-> '%s'\n", result));
     return (code);
 }
@@ -6362,18 +6402,6 @@ PUBLIC BOOLEAN LYCachedTemp ARGS2(
 }
 
 /*
- * Maintain a list of all of the temp-files we create so that we can remove
- * them during the cleanup.
- */
-typedef struct _LYTemp {
-    struct _LYTemp *next;
-    char *name;
-    FILE *file;
-} LY_TEMP;
-
-static LY_TEMP *ly_temp;
-
-/*
  * Open a temp-file, ensuring that it is unique, and not readable by other
  * users.
  *
@@ -6456,11 +6484,8 @@ PUBLIC FILE *LYReopenTemp ARGS1(
     FILE *fp = 0;
 
     LYCloseTemp(name);
-    for (p = ly_temp; p != 0; p = p->next) {
-	if (!strcmp(p->name, name)) {
-	    fp = p->file = LYAppendToTxtFile (name);
-	    break;
-	}
+    if ((p = FindTempfileByName(name)) != 0) {
+	fp = p->file = LYAppendToTxtFile (name);
     }
     return fp;
 }
@@ -6499,15 +6524,11 @@ PUBLIC FILE *LYOpenTempRewrite ARGS3(
     if (*fname == '\0')		/* first time, no filename yet */
 	return (LYOpenTemp(fname, suffix, mode));
 
-    for (p = ly_temp; p != 0; p = p->next) {
-	if (!strcmp(fname, p->name)) {
-	    registered = YES;
-	    if (p->file != 0)
-		still_open = YES;
-	    CTRACE((tfp, "...used before%s\n",
-		still_open ? ", still open!" : "."));
-	    break;
-	}
+    if ((p = FindTempfileByName(fname)) != 0) {
+	registered = YES;
+	if (p->file != 0)
+	    still_open = YES;
+	CTRACE((tfp, "...used before%s\n", still_open ? ", still open!" : "."));
     }
 
     if (registered) {
@@ -6669,15 +6690,12 @@ PUBLIC void LYCloseTemp ARGS1(
     LY_TEMP *p;
 
     CTRACE((tfp, "LYCloseTemp(%s)\n", name));
-    for (p = ly_temp; p != 0; p = p->next) {
-	if (!strcmp(name, p->name)) {
-	    CTRACE((tfp, "...LYCloseTemp(%s)%s\n", name,
-		(p->file != 0) ? ", closed" : ""));
-	    if (p->file != 0) {
-		fclose(p->file);
-		p->file = 0;
-	    }
-	    break;
+    if ((p = FindTempfileByName(name)) != 0) {
+	CTRACE((tfp, "...LYCloseTemp(%s)%s\n", name,
+	    (p->file != 0) ? ", closed" : ""));
+	if (p->file != 0) {
+	    fclose(p->file);
+	    p->file = 0;
 	}
     }
 }
@@ -6691,13 +6709,10 @@ PUBLIC void LYCloseTempFP ARGS1(
     LY_TEMP *p;
 
     CTRACE((tfp, "LYCloseTempFP\n"));
-    for (p = ly_temp; p != 0; p = p->next) {
-	if (p->file == fp) {
-	    fclose(p->file);
-	    p->file = 0;
-	    CTRACE((tfp, "...LYCloseTempFP(%s)\n", p->name));
-	    break;
-	}
+    if ((p = FindTempfileByFP(fp)) != 0) {
+	fclose(p->file);
+	p->file = 0;
+	CTRACE((tfp, "...LYCloseTempFP(%s)\n", p->name));
     }
 }
 
@@ -6754,11 +6769,8 @@ PUBLIC void LYRenamedTemp ARGS2(
     LY_TEMP *p;
 
     CTRACE((tfp, "LYRenamedTemp(old=%s, new=%s)\n", oldname, newname));
-    for (p = ly_temp; p != 0; p = p->next) {
-	if (!strcmp(oldname, p->name)) {
-	    StrAllocCopy((p->name), newname);
-	    break;
-	}
+    if ((p = FindTempfileByName(oldname)) != 0) {
+	StrAllocCopy((p->name), newname);
     }
 }
 
@@ -7566,7 +7578,7 @@ PUBLIC char *LYgetXDisplay NOARGS
 PUBLIC void LYsetXDisplay ARGS1(
 	char *,	new_display)
 {
-    if (new_display != 0 && *new_display != '\0') {
+    if (new_display != 0) {
 #ifdef VMS
 	LYUpperCase(new_display);
 	Define_VMSLogical(DISPLAY, new_display);