re GNATS java.io/203 (File.createTempFile doesn't close descriptor)
authorAnthony Green <green@redhat.com>
Mon, 4 Sep 2000 20:57:18 +0000 (20:57 +0000)
committerAnthony Green <green@gcc.gnu.org>
Mon, 4 Sep 2000 20:57:18 +0000 (20:57 +0000)
        Fix for PR java.io/203:
        * java/io/File.java (createTempFile): Obey directory argument.
        Use java.io.tmpdir if needed.  Don't leave FileDescripators open.
        * java/lang/natSystem.cc (init_properties): Use TMPDIR environment
        variable to set java.io.tmpdir on non-WIN32 systems.

From-SVN: r36143

libjava/ChangeLog
libjava/java/io/File.java
libjava/java/lang/natSystem.cc

index 6fd10ccfe5bf0795e63f9ff1f081c7debf06beb0..d4b4b94b8adb278938d7c8d7209fd5fefa1efdca 100644 (file)
@@ -1,3 +1,11 @@
+2000-09-04  Anthony Green  <green@redhat.com>
+
+        Fix for PR java.io/203:
+        * java/io/File.java (createTempFile): Obey directory argument.
+       Use java.io.tmpdir if needed.  Don't leave FileDescripators open.
+        * java/lang/natSystem.cc (init_properties): Use TMPDIR environment
+       variable to set java.io.tmpdir on non-WIN32 systems.
+
 2000-09-04  Anthony Green  <green@redhat.com>
 
        * java/io/File.java (deleteOnExit): New method.
index 9043660be382bcb359185c39818a4eb2a4343cfc..01d8d53fee90248c603a53c4bc23aa77fbaec34d 100644 (file)
@@ -233,14 +233,26 @@ public class File implements Serializable
                                     File directory)
     throws IOException
   {
-    FileDescriptor desc = new FileDescriptor ();
-
-    SecurityManager s = System.getSecurityManager();
-    if (s != null)
-      s.checkWrite (desc);
+    // Grab the system temp directory if necessary
+    if (directory == null)
+      {
+       String dirname = tmpdir;
+       if (dirname == null)
+         throw 
+           new IOException("Cannot determine system temporary directory"); 
+       
+       directory = new File(dirname);
+       if (!directory.exists())
+         throw new IOException("System temporary directory " 
+                               + directory.getName() + " does not exist.");
+       if (!directory.isDirectory())
+         throw new IOException("System temporary directory " 
+                               + directory.getName() 
+                               + " is not really a directory.");
+      }
 
     if (prefix.length () < 3)
-      throw new IllegalArgumentException ();
+      throw new IllegalArgumentException ("Prefix too short: " + prefix);
     if (suffix == null)
       suffix = ".tmp";
 
@@ -259,8 +271,8 @@ public class File implements Serializable
          prefix = prefix.substring(0, max_length - 6 - suf_len);
       }
 
-    // We don't care about the name because we set it later.
-    File ret = new File ("");
+    File f;
+
     // How many times should we try?  We choose 100.
     for (int i = 0; i < 100; ++i)
       {
@@ -269,18 +281,33 @@ public class File implements Serializable
        String l = prefix + t.substring(t.length() - 6) + suffix;
        try
          {
-           desc = new FileDescriptor 
-             (l, FileDescriptor.WRITE | FileDescriptor.EXCL);
-           desc.close ();
-           ret.setPath(l);
-           return ret;
+           f = new File(directory, l);
+           if (f.exists())
+             continue;
+           else
+             {
+               String af = f.getAbsolutePath ();
+               
+               // Check to see if we're allowed to write to it.
+               SecurityManager s = System.getSecurityManager();
+               if (s != null)
+                 s.checkWrite (af);
+               
+               // Now create the file.
+               FileDescriptor fd = 
+                 new FileDescriptor (af, 
+                                     FileDescriptor.WRITE
+                                     | FileDescriptor.EXCL);
+               fd.close ();
+               return f;
+             }
          }
        catch (IOException _)
          {
          }
       }
 
-    throw new IOException ("couldn't make temp file");
+    throw new IOException ("cannot create temporary file");
   }
 
   public static File createTempFile (String prefix, String suffix)
index 2672895c6a4e9b48bef9c662f54c0bae4ffca132..39deab2ad04f7a2b41424da151438e94e74f1eb3 100644 (file)
@@ -244,8 +244,10 @@ java::lang::System::init_properties (void)
   SET ("file.separator", "/");
   SET ("path.separator", ":");
   SET ("line.separator", "\n");
-  // FIXME: look at getenv("TMPDIR");
-  SET ("java.io.tmpdir", "/tmp");
+  char *tmpdir = ::getenv("TMPDIR");
+  if (! tmpdir)
+    tmpdir = "/tmp";
+  SET ("java.io.tmpdir", tmpdir);
 #endif
 
 #ifdef HAVE_UNAME