# Module FileUtilMode

    module FileUtilMode: sig .. end

    type who = [ `All | `Group | `Other | `User ]

    type wholist = [ `All | `Group | `List of who list | `Other | `User ]

    type permcopy = [ `Group | `Other | `User ]

    type perm = [ `Exec | `ExecX | `Read | `Sticky | `StickyO | `Write ]

    type permlist = [ `Exec
           | `ExecX
           | `List of perm list
           | `Read
           | `Sticky
           | `StickyO
           | `Write ]

    type actionarg = [ `Exec
           | `ExecX
           | `Group
           | `List of perm list
           | `Other
           | `Read
           | `Sticky
           | `StickyO
           | `User
           | `Write ]

    type action = [ `Add of actionarg
           | `Remove of actionarg
           | `Set of actionarg ]

    type actionlist = [ `Add of actionarg
           | `List of action list
           | `Remove of actionarg
           | `Set of actionarg ]

    type clause = [ `All of actionlist
           | `Group of actionlist
           | `None of actionlist
           | `Other of actionlist
           | `User of actionlist ]

    type t = clause list

    val all_masks : ([> `Group | `Other | `User ] *
            [> `Exec | `Read | `Sticky | `StickyO | `Write ] * int)
           list

    val mask : who -> perm -> int

    val of_int : int ->
           [> `Group of
                [> `Set of
                     [> `List of [> `Exec | `Read | `Sticky | `StickyO | `Write ] list ]
                ]
            | `Other of
                [> `Set of
                     [> `List of [> `Exec | `Read | `Sticky | `StickyO | `Write ] list ]
                ]
            | `User of
                [> `Set of
                     [> `List of [> `Exec | `Read | `Sticky | `StickyO | `Write ] list ]
                ] ]
           list

    val to_string : [< `All of
                [< `Add of actionarg
                 | `List of
                     [< `Add of
                          [< `Exec
                           | `ExecX
                           | `Group
                           | `List of perm list
                           | `Other
                           | `Read
                           | `Sticky
                           | `StickyO
                           | `User
                           | `Write ]
                          as 'b
                      | `Remove of 'b
                      | `Set of 'b ]
                     list
                 | `Remove of actionarg
                 | `Set of actionarg ]
                as 'a
            | `Group of 'a
            | `None of 'a
            | `Other of 'a
            | `User of 'a ]
           list -> string

    val apply : is_dir:bool -> umask:int -> int -> t -> int