From ef004bfc3d766fdc00216093f1796ec1c74f7dd7 Mon Sep 17 00:00:00 2001 From: Edoardo La Greca Date: Wed, 30 Jul 2025 18:36:44 +0200 Subject: add responseError method and finish version method --- src/main/kotlin/NinePConnection.kt | 40 ++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) (limited to 'src/main/kotlin') diff --git a/src/main/kotlin/NinePConnection.kt b/src/main/kotlin/NinePConnection.kt index 7f52ad5..6f678a0 100644 --- a/src/main/kotlin/NinePConnection.kt +++ b/src/main/kotlin/NinePConnection.kt @@ -20,6 +20,15 @@ class NinePConnection(netPackTrans: NetworkPacketTransporter) : NinePTranslator */ val npt: NetworkPacketTransporter = netPackTrans + /** + * Tag generator. + */ + val tagGen = TagGenerator(TagGenerator.TagGenerationMethod.INCREMENTAL, 1u) + + /** + * Maximum size for messages negotiated between the client and the server. + */ + var maxSize: UInt = 0u val NOTAG = 0.inv().toUShort() @@ -117,19 +126,38 @@ class NinePConnection(netPackTrans: NetworkPacketTransporter) : NinePTranslator return Pair(SizedMessageField(2, tag), error) } + /** + * Send 9P request and check for Rerror response. + */ + private fun responseError(msg: NinePMessage): String? { + msg.write(this.npt) + val se = waitForTag(msg.tag) + if (se.second == NinePMessageType.RERROR) { + val error = readError() + return error.second + } + return null + } + override fun version(msize: SizedMessageField, version: String): String? { - NinePMessage(NinePMessageType.TVERSION, this.NOTAG, listOf("msize", "version"), + val msg = NinePMessage(NinePMessageType.TVERSION, this.NOTAG, listOf("msize", "version"), mapOf( "msize" to msize ), mapOf( "version" to version ) - ).write(this.npt) - val se = waitForTag(this.NOTAG) - if (se.second == NinePMessageType.RERROR) { - val error = readError() - return error.second + ) + val error = responseError(msg) + if (error != null) { + return error + } + val rmsize = readInteger(4) + val rversion = readString() + // this check should not be necessary, but you never know + this.maxSize = ( if (rmsize < msize.value) msize.value else rmsize ).toInt().toUInt() + if (rversion == "unknown") { + return "Unknown version" } return null } -- cgit v1.2.3