/** * 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 } }