aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libjava/ChangeLog8
-rw-r--r--libjava/java/io/File.java55
-rw-r--r--libjava/java/lang/natSystem.cc6
3 files changed, 53 insertions, 16 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 6fd10cc..d4b4b94 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,5 +1,13 @@
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.
* gnu/gcj/runtime/FileDeleter.java: New class.
* java/lang/natRuntime.cc (exit): Call
diff --git a/libjava/java/io/File.java b/libjava/java/io/File.java
index 9043660..01d8d53 100644
--- a/libjava/java/io/File.java
+++ b/libjava/java/io/File.java
@@ -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)
diff --git a/libjava/java/lang/natSystem.cc b/libjava/java/lang/natSystem.cc
index 2672895..39deab2 100644
--- a/libjava/java/lang/natSystem.cc
+++ b/libjava/java/lang/natSystem.cc
@@ -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