diff options
author | Jacques Garrigue <garrigue at math.nagoya-u.ac.jp> | 2002-04-18 07:00:34 +0000 |
---|---|---|
committer | Jacques Garrigue <garrigue at math.nagoya-u.ac.jp> | 2002-04-18 07:00:34 +0000 |
commit | 3447e059f033e7d59b4262fe869115aae20bcb85 (patch) | |
tree | ec3442ebc0940aefd4d6ab0e67dd88c08d5f5496 /stdlib/filename.ml | |
parent | 059d9fc181595b6cf7d2d1a6472eb97fce1fe86a (diff) | |
download | ocaml-poly_meth2.tar.gz |
merging poly_meth2poly_meth2
git-svn-id: http://caml.inria.fr/svn/ocaml/branches/poly_meth2@4692 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
Diffstat (limited to 'stdlib/filename.ml')
-rw-r--r-- | stdlib/filename.ml | 41 |
1 files changed, 31 insertions, 10 deletions
diff --git a/stdlib/filename.ml b/stdlib/filename.ml index bf7ad1761a..34853f85dc 100644 --- a/stdlib/filename.ml +++ b/stdlib/filename.ml @@ -182,19 +182,40 @@ let chop_extension name = external open_desc: string -> open_flag list -> int -> int = "sys_open" external close_desc: int -> unit = "sys_close" +external random_seed: unit -> int = "sys_random_seed" + +let temp_file_counter = ref 0 + +let temp_file_name prefix suffix = + if !temp_file_counter = 0 then temp_file_counter := random_seed(); + let name = + concat temporary_directory + (Printf.sprintf "%s%06x%s" + prefix (!temp_file_counter land 0xFFFFFF) suffix) in + (* Linear congruential PRNG *) + temp_file_counter := !temp_file_counter * 69069 + 25173; + name let temp_file prefix suffix = let rec try_name counter = if counter >= 1000 then - invalid_arg "Filename.temp_file: temp dir nonexistent or full" - else begin - let name = - concat temporary_directory (prefix ^ string_of_int counter ^ suffix) in - try - close_desc(open_desc name [Open_wronly; Open_creat; Open_excl] 0o666); - name - with Sys_error _ -> - try_name (counter + 1) - end + invalid_arg "Filename.temp_file: temp dir nonexistent or full"; + let name = temp_file_name prefix suffix in + try + close_desc(open_desc name [Open_wronly; Open_creat; Open_excl] 0o600); + name + with Sys_error _ -> + try_name (counter + 1) in try_name 0 +let open_temp_file ?(mode = [Open_text]) prefix suffix = + let rec try_name counter = + if counter >= 1000 then + invalid_arg "Filename.open_temp_file: temp dir nonexistent or full"; + let name = temp_file_name prefix suffix in + try + (name, + open_out_gen (Open_wronly::Open_creat::Open_excl::mode) 0o600 name) + with Sys_error _ -> + try_name (counter + 1) + in try_name 0 |