/** * This class holds information about a single QID. */ class QID { /** * Does the QID represent a directory? */ val isDirectory get() = getIsDirectory() /** * Does the QID represent an append-only file? */ val isAppendOnly get() = getIsAppendOnly() /** * Does the QID represent an exclusive-use file? */ val isExclusive get() = getIsExclusive() /** * Does the QID represent a temporary file? */ val isTemporary get() = getIsTemporary() /** * The QID type. */ val type: UByte /** * The QID file version. */ val version: UInt /** * The QID path. */ val path: ULong /** * Constructor for a QID with separate fields. See the `stat(5)` manual page for more information about [type], * [version], and [path]. * * @param type The QID type. * @param version The QID file version. * @param path The QID path. */ constructor(type: UByte, version: UInt, path: ULong) { this.type = type this.version = version this.path = path } /** * Constructor for raw QID data. Only the first 13 elements are read. * * @param raw The raw QID data. * @throws IllegalArgumentException if [raw] does not have at least 13 elements. */ constructor(raw: List) { require(raw.size >= 13) this.type = raw.first() val rawVersion = raw.slice(1..4) val rawPath = raw.slice(5..12) this.version = InMessage.convInteger(rawVersion, 0, rawVersion.size).toInt().toUInt() this.path = InMessage.convInteger(rawPath, 0, rawPath.size).toLong().toULong() } private fun getIsDirectory(): Boolean { return this.type.and(0x80.toUByte()) != 0u.toUByte() } private fun getIsAppendOnly(): Boolean { return this.type.and(0x40.toUByte()) != 0u.toUByte() } private fun getIsExclusive(): Boolean { return this.type.and(0x20.toUByte()) != 0u.toUByte() } private fun getIsTemporary(): Boolean { return this.type.and(0x04.toUByte()) != 0u.toUByte() } }