type file_status = {action : file_action,
domain : string,
+ dir : string,
file : string}
val registerFileHandler : (file_status -> unit) -> unit
(* Register code to run before or after making all changes. *)
val handleChanges : file_status list -> unit
+
+ val shell : string list -> bool
+ val shellF : string list * (string -> string) -> unit
+
+ val concatTo : (string -> bool) -> string -> unit
+ (* Search through the result configuration hierarchy for all files matching
+ * the predicate, concatenating their contents in arbitrary order to the
+ * given file. *)
+
+ val enumerateTo : (string -> bool) -> string -> string -> unit
+ (* Search through the result configuration hierarchy for all files matching
+ * the predicate, writing a list of their domains to the file named by the
+ * third argument, delimiting the entries with the second argument. *)
+
+ val hostname : unit -> string
+ (* Get hostname of this machine *)
+
+ val readList : string -> string list
+ val writeList : string * string list -> unit
+ (* Reading and writing lists of strings stored on separate lines in files *)
+
+ val lineInFile : string -> string -> bool
+ (* Is there a line in the file (first arg) that matches that given? *)
+
+ val inGroup : {user : string, group : string} -> bool
+ (* Check membership in a UNIX group. *)
+
+ val mkDirAll : string -> unit
+ (* [mkDirAll p] creates directory "p", creating all parent directories, as
+ * necessary. *)
+
+ val remove : ''a list * ''a -> ''a list
+ val removeDups : ''a list -> ''a list
end