diff options
author | Tom Tromey <tromey@cygnus.com> | 2000-02-11 17:32:52 +0000 |
---|---|---|
committer | Tom Tromey <tromey@gcc.gnu.org> | 2000-02-11 17:32:52 +0000 |
commit | 304ccb107580ec81f3d44fbf0ecf5b0a66c291f0 (patch) | |
tree | 12601bfce83cfa5636689e3f8af63f4c45a4c273 /libjava/java/io/File.java | |
parent | a1cee8a3f3ce4487e9671739b4db2d1c5ec6e56c (diff) | |
download | gcc-304ccb107580ec81f3d44fbf0ecf5b0a66c291f0.zip gcc-304ccb107580ec81f3d44fbf0ecf5b0a66c291f0.tar.gz gcc-304ccb107580ec81f3d44fbf0ecf5b0a66c291f0.tar.bz2 |
natFileDescriptorPosix.cc (open): Recognize EXCL flag.
* java/io/natFileDescriptorPosix.cc (open): Recognize EXCL flag.
* java/io/FileDescriptor.java (EXCL): New static field.
* java/io/File.java (tmpdir): New static field.
(createTempFile): New method.
(nextValue): New method.
* java/lang/natSystem.cc (init_properties): Set java.io.tmpdir
property.
From-SVN: r31922
Diffstat (limited to 'libjava/java/io/File.java')
-rw-r--r-- | libjava/java/io/File.java | 69 |
1 files changed, 68 insertions, 1 deletions
diff --git a/libjava/java/io/File.java b/libjava/java/io/File.java index 454c15b..229125e 100644 --- a/libjava/java/io/File.java +++ b/libjava/java/io/File.java @@ -1,6 +1,6 @@ // File.java - File name -/* Copyright (C) 1998, 1999 Red Hat, Inc. +/* Copyright (C) 1998, 1999, 2000 Red Hat, Inc. This file is part of libgcj. @@ -215,6 +215,68 @@ public class File implements Serializable return mkdirs (new File (path)); } + private static String nextValue () + { + return Long.toString(counter++, Character.MAX_RADIX); + } + + public static File createTempFile (String prefix, String suffix, + File directory) + throws IOException + { + FileDescriptor desc = new FileDescriptor (); + + SecurityManager s = System.getSecurityManager(); + if (s != null) + s.checkWrite (desc); + + if (prefix.length () < 3) + throw new IllegalArgumentException (); + if (suffix == null) + suffix = ".tmp"; + + // FIXME: filename length varies by architecture and filesystem. + int max_length = 255; + + // Truncation rules. + // `6' is the number of characters we generate. + if (prefix.length () + 6 + suffix.length () > max_length) + { + int suf_len = 0; + if (suffix.charAt(0) == '.') + suf_len = 4; + suffix = suffix.substring(0, suf_len); + if (prefix.length () + 6 + suf_len > max_length) + 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 (""); + // How many times should we try? We choose 100. + for (int i = 0; i < 100; ++i) + { + // This is ugly. + String l = prefix + (nextValue () + "ZZZZZZ").substring(0,6) + suffix; + try + { + desc.open (l, FileDescriptor.WRITE | FileDescriptor.EXCL); + ret.setPath(l); + return ret; + } + catch (IOException _) + { + } + } + + throw new IOException ("couldn't make temp file"); + } + + public static File createTempFile (String prefix, String suffix) + throws IOException + { + return createTempFile (prefix, suffix, null); + } + private final native boolean performRenameTo (File dest); public boolean renameTo (File dest) { @@ -234,10 +296,15 @@ public class File implements Serializable public static final String separator = System.getProperty("file.separator"); public static final char separatorChar = separator.charAt(0); + private static final String tmpdir = System.getProperty("java.io.tmpdir"); // The path. private String path; + // We keep a counter for use by createTempFile. We choose the first + // value randomly to try to avoid clashes with other VMs. + private static long counter = Double.doubleToLongBits (Math.random ()); + // mkdirs() uses this to avoid repeated allocations. private final void setPath (String n) { |