summaryrefslogtreecommitdiff
path: root/lib9p/9P2000.txt
diff options
context:
space:
mode:
Diffstat (limited to 'lib9p/9P2000.txt')
-rw-r--r--lib9p/9P2000.txt82
1 files changed, 82 insertions, 0 deletions
diff --git a/lib9p/9P2000.txt b/lib9p/9P2000.txt
new file mode 100644
index 0000000..5f93cdf
--- /dev/null
+++ b/lib9p/9P2000.txt
@@ -0,0 +1,82 @@
+# 9P2000.txt - Definitions of 9P2000 messages
+#
+# Copyright (C) 2024 Luke T. Shumaker <lukeshu@lukeshu.com>
+# SPDX-Licence-Identifier: AGPL-3.0-or-later
+
+# The format of each message (excluding the "size[4] msg_type[1]
+# tag[2]" header) is written here as a sequence of
+# "member_name[member_type]" struct members.
+#
+# The primitive member types types are the following single-character
+# mnemonics:
+#
+# - 1 = u8
+# - 2 = u16le
+# - 4 = u32le
+# - 8 = u16le
+
+# "9P2000" base protocol
+# https://ericvh.github.io/9p-rfc/rfc9p2000.html
+# https://github.com/ericvh/9p-rfc/blob/master/9p2000.xml
+#
+# But due to incompleteness of the draft RFC, the Plan 9 manual
+# section-5 and the Plan 9 headers (particularly fcall.h) are a better
+# references.
+version "9P2000"
+
+# data (u32le `n`, then `n` bytes of data)
+d = "len[4] len*(dat[1])"
+
+# string (u16le `n`, then `n` bytes of UTF-8)
+s = "len[2] len*(utf8[1])"
+
+# qid (TODO)
+qid = "type[1] vers[4] path[8]"
+
+# stat (TODO)
+stat = "stat_size[2]"
+ "kern_type[2]"
+ "kern_dev[4]"
+ "file_qid[qid]"
+ "file_mode[4]"
+ "file_atime[4]"
+ "file_mtime[4]"
+ "file_size[8]"
+ "file_name[s]"
+ "file_owner_uid[s]"
+ "file_owner_gid[s]"
+ "file_last_modified_uid[s]"
+
+# In the 9P protocol, each message has a type, and message types come
+# in pairs (except "Rerror"); "T" and "R"; "T" messages are
+# client->server requests, and "R" messages are server->client
+# responses (I do not know what the Plan 9 designers intended "T" and
+# "R" to stand for). The type of a message is represented by a u8 ID.
+100/Tversion = "max_msg_size[4] version[s]"
+101/Rversion = "max_msg_size[4] version[s]"
+102/Tauth = "afid[4] uname[s] aname[s]"
+103/Rauth = "aqid[qid]"
+104/Tattach = "fid[4] afid[4] uname[s] aname[s]"
+105/Rattach = "qid[qid]"
+#106/Terror = "illegal"
+107/Rerror = "ename[s]"
+108/Tflush = "oldtag[2]"
+109/Rflush = ""
+110/Twalk = "fid[4] newfid[4] nwname[2] nwname*(wname[s])"
+111/Rwalk = "nwqid[2] nwqid*(wqid[qid])"
+112/Topen = "fid[4] mode[1]"
+113/Ropen = "qid[qid] iounit[4]"
+114/Tcreate = "fid[4] name[s] perm[4] mode[1]"
+115/Rcreate = "qid[qid] iounit[4]"
+116/Tread = "fid[4] offset[8] count[4]"
+117/Rread = "data[d]" # for directories data is the sequence "cnt*(entries[stat])"
+118/Twrite = "fid[4] offset[8] data[d]"
+119/Rwrite = "count[4]"
+120/Tclunk = "fid[4]"
+121/Rclunk = ""
+122/Tremove = "fid[4]"
+123/Rremove = ""
+124/Tstat = "fid[4]"
+125/Rstat = "stat[stat]"
+126/Twstat = "fid[4] stat[stat]"
+127/Rwstat = ""