Add new parameter. If value is nonzero consider TMPDIR environment
[kopensolaris-gnu/glibc.git] / sysdeps / posix / tempname.c
index 6dd893e..1a11375 100644 (file)
@@ -33,7 +33,7 @@ static int
 direxists (const char *dir)
 {
   struct stat buf;
-  return __stat (dir, &buf) == 0 && S_ISDIR (buf.st_mode);
+  return __xstat (_STAT_VER, dir, &buf) == 0 && S_ISDIR (buf.st_mode);
 }
 
 /* Path search algorithm, for tmpnam, tmpfile, etc.  If DIR is
@@ -43,7 +43,8 @@ direxists (const char *dir)
    doesn't exist, none of the searched dirs exists, or there's not
    enough space in TMPL. */
 int
-__path_search (char *tmpl, size_t tmpl_len, const char *dir, const char *pfx)
+__path_search (char *tmpl, size_t tmpl_len, const char *dir, const char *pfx,
+              int try_tmpdir)
 {
   const char *d;
   size_t dlen, plen;
@@ -60,14 +61,17 @@ __path_search (char *tmpl, size_t tmpl_len, const char *dir, const char *pfx)
        plen = 5;
     }
 
-  d = __secure_getenv ("TMPDIR");
-  if (d != NULL && direxists (d))
-    dir = d;
-  else if (dir != NULL && direxists (dir))
-    /* nothing */ ;
-  else if (direxists (P_tmpdir))
+  if (try_tmpdir)
+    {
+      d = __secure_getenv ("TMPDIR");
+      if (d != NULL && direxists (d))
+       dir = d;
+      else if (dir != NULL && direxists (dir))
+       /* nothing */ ;
+    }
+  if (direxists (P_tmpdir))
     dir = P_tmpdir;
-  else if (direxists ("/tmp"))
+  else if (strcmp (P_tmpdir, "/tmp") != 0 && direxists ("/tmp"))
     dir = "/tmp";
   else
     {
@@ -145,15 +149,9 @@ __gen_tempname (char *tmpl, int openit, int largefile)
 
       if (openit)
        {
-         /* XXX Do we want to fail on largefile if 64 bit fileops
-            are not implemented, or just fall back to the old stuff? */
-#ifndef __stub_open64
          fd = (largefile
                ? __open (tmpl, O_RDWR | O_CREAT | O_EXCL, 0666)
                : __open64 (tmpl, O_RDWR | O_CREAT | O_EXCL, 0666));
-#else
-         fd = __open (tmpl, O_RDWR | O_CREAT | O_EXCL, 0666);
-#endif
          if (fd >= 0)
            {
              __set_errno (save_errno);
@@ -167,7 +165,7 @@ __gen_tempname (char *tmpl, int openit, int largefile)
       else
        {
          struct stat st;
-         if (__stat (tmpl, &st) < 0)
+         if (__xstat (_STAT_VER, tmpl, &st) < 0)
            {
              if (errno == ENOENT)
                {