diff options
Diffstat (limited to 'src/main/kotlin/Connection.kt')
-rw-r--r-- | src/main/kotlin/Connection.kt | 59 |
1 files changed, 57 insertions, 2 deletions
diff --git a/src/main/kotlin/Connection.kt b/src/main/kotlin/Connection.kt index 5db6b51..8908364 100644 --- a/src/main/kotlin/Connection.kt +++ b/src/main/kotlin/Connection.kt @@ -284,8 +284,63 @@ class Connection(transLay: TransportLayer) : ProtocolTranslator { val imsg = checkedInMessage(omsg.tag) } - override fun stat(path: String) { - TODO("Not yet implemented") + override fun stat(fid: UInt): Stat { + val omsg = OutMessage(NinePMessageType.TSTAT, this.tagGen.generate(), listOf("fid"), + mapOf( + "fid" to Pair(BigInteger(fid.toString()), 4u) + ), + emptyMap(), + emptyMap(), + this.maxSize + ) + omsg.write(this.tl) + val imsg = checkedInMessage(omsg.tag) + imsg.applyField(InMessage.Field("nstat", InMessage.Field.Type.INTEGER, 2u)) + val nstat = imsg.fieldsInt["nstat"]!!.toInt().toUInt() + imsg.applyField(InMessage.Field("stat", InMessage.Field.Type.RAW, nstat)) + val rawStat = imsg.fieldsRaw["stat"]!!.toList() + + var offset = 0 + val qid = QID(rawStat.slice(0..<13)) + offset += 13 + val mode = FilePermissions(rawStat.slice(offset+0..<offset+4)) + offset += 4 + + val intFielSizes = listOf(4, 4, 8) + val intFields: MutableList<BigInteger> = mutableListOf() + for (size in intFielSizes) { + intFields.add(InMessage.convInteger(rawStat, offset, size)) + offset += size + } + val atime = intFields[0].toInt().toUInt() + val mtime = intFields[1].toInt().toUInt() + val length = intFields[2].toLong().toULong() + + val strAmount = 4 + val strFields: MutableList<String> = mutableListOf() + for (i in 0..strAmount) { + val str = InMessage.convString(rawStat, offset) + strFields.add(str) + offset += str.length + } + val name = strFields[0] + val uid = strFields[1] + val gid = strFields[2] + val muid = strFields[3] + + val stat = Stat( + fid, + qid, + mode, + atime, + mtime, + length, + name, + uid, + gid, + muid + ) + return stat } override fun wstat(path: String) { |