+(* Create a temporary directory. It is *not* deleted on exit. *)
+let tmpdir () =
+ let chan = open_in "/dev/urandom" in
+ let data = String.create 16 in
+ really_input chan data 0 (String.length data);
+ close_in chan;
+ let data = Digest.to_hex (Digest.string data) in
+ let dir = Filename.temp_dir_name // sprintf "goaljobstmp%s" data in
+ mkdir dir 0o700;
+ dir
+
+(* Recursively remove directory. *)
+let rm_rf dir =
+ let cmd = sprintf "rm -rf %s" (quote dir) in
+ ignore (Sys.command cmd)
+
+let shell = ref "/bin/sh"
+
+(* Used by sh, shout etc. Create a temporary directory and a
+ * 'script.sh' inside it containing the script to run. Returns the
+ * temporary directory and command to run.
+ *)
+let create_script script =
+ let dir = tmpdir () in
+ let script_file = dir // "script.sh" in
+ let chan = open_out script_file in
+ fprintf chan "#!%s\n" !shell;
+ fprintf chan "set -e\n"; (* so that job exits on error *)
+ fprintf chan "set -x\n"; (* echo commands (must be last) *)
+ fprintf chan "\n";
+ output_string chan script;
+ close_out chan;
+ chmod script_file 0o700;
+ let cmd = sprintf "cd %s && exec %s" (quote dir) (quote script_file) in
+ dir, cmd