summaryrefslogtreecommitdiff
path: root/src/main/kotlin/FilePermissions.kt
blob: 04561feca9554c13c50a5676427f80f37363e380 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
 * The permissions of a newly created file.
 *
 * @param userPerms The permissions for the file's owning user.
 * @param groupPerms The permissions for the file's owning group.
 * @param elsePerms The permissions for everyone else.
 * @param isDirectory Is the file a directory? If not, it's a regular file.
 */
class FilePermissions(val userPerms: Permissions, val groupPerms: Permissions, val elsePerms: Permissions, val isDirectory: Boolean) {
    enum class Permissions(val bits: UByte) {
        READ(0x4u),
        WRITE(0x2u),
        EXECUTE(0x1u),
        READ_WRITE(READ.bits.or(WRITE.bits)),
        READ_EXECUTE(READ.bits.or(EXECUTE.bits)),
        WRITE_EXECUTE(WRITE.bits.or(EXECUTE.bits)),
        READ_WRITE_EXECUTE(READ.bits.or(WRITE.bits.or(EXECUTE.bits)))
    }

    /**
     * Turn the permissions described by the [FilePermissions] fields into a permission integer (4 bytes).
     */
    fun toPermissionInt(): UInt {
        val permFileds = listOf(userPerms, groupPerms, elsePerms)
        val perms: UInt = 0u
        for (i in 0..permFileds.size) {
            perms.or(permFileds[i].bits.toUInt().shl(8 * (permFileds.size - 1 - i)))
        }
        if (isDirectory) {
            perms.or(0x80000000u)
        }
        return perms
    }
}