summaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorEdoardo La Greca2025-07-30 18:36:44 +0200
committerEdoardo La Greca2025-07-30 18:36:44 +0200
commitef004bfc3d766fdc00216093f1796ec1c74f7dd7 (patch)
tree1f1990d88bbfd42d424a69713fd662346146d948 /src/main
parent3d00fa24e4a9ac58f1c2d275571bf86e5cbc8fdc (diff)
add responseError method and finish version method
Diffstat (limited to 'src/main')
-rw-r--r--src/main/kotlin/NinePConnection.kt40
1 files changed, 34 insertions, 6 deletions
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
}