W3C home > Mailing lists > Public > www-lib@w3.org > April to June 1999

[5.2.8] include file trouble and messing with TMPDIR

From: Luc Van Eycken <Luc.VanEycken@esat.kuleuven.ac.be>
Date: Thu, 3 Jun 1999 10:55:54 +0200
Message-Id: <199906030855.AA11795@ampere.esat.kuleuven.ac.be>
To: www-lib@w3.org
Since it's used for xdvi from the TeX-suite, I decided to install the
libwww library system-wide so it can also be used for other applications.
With version 5.2.8, this gave me the following problems:

 1) System-wide implies that it's available for at least 5 architectures
    (HPUX, Solaris, Digital Unix, SGI, and Linux). However, the wwwconf.h
    include file is architecture-dependent, so I have to install all the
    include files in an architecture-dependent directory, which is possible
    thanks to libwww-config. But first of all, this is a waste of disk
    space, since all the other include files are the same. Furthermore
    "libwww-config --cflags" does not include the directory where
    xmlparse.h is installed (which wasn't a problem when all was installed
    in default include directory), so the libwww-config program must be
    modified to include this directory as well.

 2) HTLibInit sets the environment variable TMPDIR to "" (which is not the
    same as unsetting it, as the comment claims) so the function tempnam
    (in HTGetTmpFileName) does not get confused. However this assumes that
    HTGetTmpFileName is the only user of TMPDIR, which is not at all
    evident since this is part of a library which can be linked to any other
    kind of program. In fact I ran into this problem using xdvi, which
    calls a script mktexpk containing "TEMPDIR=${TMPDIR-/tmp}/mt$$.tmp". If
    TMPDIR is set to "", this results in an unusable TEMPDIR = /mt$$.tmp.
    In my opinion, the correct way to do it, is to change TMPDIR only
    locally in HTGetTmpFileName and I hope that someone can make the
    appropriate changes. Below you find the patches I tried as a
    suggestion, please feel free to use any part of it you like.

Best regards,

Luc Van Eycken

-------------------------8<-------------------------8<-------------------------
*** w3c-libwww-5.2.8/Library/src/HTLib.c.orig	Wed Mar 31 21:48:21 1999
--- w3c-libwww-5.2.8/Library/src/HTLib.c	Wed Jun  2 15:04:47 1999
***************
*** 156,166 ****
      tzset();
  #endif
  
-     /* If we are using tempnam() then unset any TMPDIR env var */
- #ifdef HAVE_TEMPNAM
-     putenv("TMPDIR=");
- #endif
- 
      /* Create a default user profile and initialize it */
      UserProfile = HTUserProfile_new(HT_DEFAULT_USER, NULL);
      HTUserProfile_localize(UserProfile);
--- 156,161 ----
*** w3c-libwww-5.2.8/Library/src/HTInet.c.orig	Tue Feb 23 00:29:44 1999
--- w3c-libwww-5.2.8/Library/src/HTInet.c	Wed Jun  2 15:10:42 1999
***************
*** 592,610 ****
  */
  PUBLIC char * HTGetTmpFileName (const char * abs_dir)
  {
  #ifdef HAVE_TEMPNAM
  #ifdef __CYGWIN__
!     return tempnam(abs_dir, "");
  #else
!     return tempnam(abs_dir, NULL);
  #endif /* __CYGWIN__ */
  #else
      /*
      **  This is only approx. as we don't know if this file exists or not.
      **  Hopefully, tempnam() exists on enough platforms so that this is not
      **  a problem.
      */
-     char * result = NULL;
      char * offset = NULL;
      if (!(result = (char *) HT_MALLOC((abs_dir ? strlen(abs_dir) : 0) +
  				      HT_MAX_TMPNAM + 2)))
--- 592,626 ----
  */
  PUBLIC char * HTGetTmpFileName (const char * abs_dir)
  {
+     char * result = NULL;
  #ifdef HAVE_TEMPNAM
+     static char * envtmpdir = NULL;
+     size_t len = 0;
+     if (abs_dir && *abs_dir) {
+ 	char * tmpdir = getenv("TMPDIR");
+ 	if (tmpdir)
+ 	    len = strlen(tmpdir);
+ 	if (len) {
+ 	    if (!(envtmpdir = (char *) HT_REALLOC(envtmpdir, len + 8)))
+ 		HT_OUTOFMEM("HTGetTmpFileName");
+ 	    strcpy(envtmpdir, "TMPDIR=");
+ 	    strcpy(envtmpdir + 7, tmpdir);
+ 	    putenv("TMPDIR=");
+ 	}
+     }
  #ifdef __CYGWIN__
!     result = tempnam(abs_dir, "");
  #else
!     result = tempnam(abs_dir, NULL);
  #endif /* __CYGWIN__ */
+     if (len)
+ 	putenv(envtmpdir);
  #else
      /*
      **  This is only approx. as we don't know if this file exists or not.
      **  Hopefully, tempnam() exists on enough platforms so that this is not
      **  a problem.
      */
      char * offset = NULL;
      if (!(result = (char *) HT_MALLOC((abs_dir ? strlen(abs_dir) : 0) +
  				      HT_MAX_TMPNAM + 2)))
***************
*** 639,646 ****
  #endif
  	offset = result;
      }
-     return result;
  #endif /* HAVE_TEMPNAM */
  }
  
  /*
--- 655,662 ----
  #endif
  	offset = result;
      }
  #endif /* HAVE_TEMPNAM */
+     return result;
  }
  
  /*
Received on Thursday, 3 June 1999 04:55:58 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Monday, 23 April 2007 18:18:29 GMT