Properly extract errno from p9 rpc; fix incorrect mkdir error
authorRonald G. Minnich <rminnich@google.com>
Thu, 30 Jan 2014 18:08:04 +0000 (10:08 -0800)
committerRonald G. Minnich <rminnich@google.com>
Thu, 30 Jan 2014 18:08:04 +0000 (10:08 -0800)
commit0f0b2ab7e0433b7d1fc523cf50cac8e289102e97
treeaeab4b4ca123bf715435f73be4c48c200bcc8e40
parentef4b45a52571e49b163fa0bed1d88bf6c8f1b29b
Properly extract errno from p9 rpc; fix incorrect mkdir error

mkdir /mnt/tmp/xxx would fail with the wrong errno (EEXIST)
because we could not properly get errno from the Plan 9 RPC.

I've fixed my version of go9p (github.com/rminnich/go9p) to
return Rerror strings in the form 'XXXX error message'
(space after XXXX is important) where XXXX is the hex-encoded
errno (this is how I did it for the original Linux 9p in 1998).
This format has the advantage of being all text; later implementations
(e.g. 9p2000.[ul]) break the rule and embed binary data in the string
and were a backward step IMHO.

I've fixed Akaros 9p parsing to look for a string at least 5 bytes long,
with the first 4 bytes being hex digits, and if that is the case to
set_errno using those digits.

I added get_errno to allow code to save the current errno value.

Finally, in the namec create case, I save errno as well as errstr
and restore them on the errpath.

mkdir /mnt/tmp/xxx now returns the correct errno/error message.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
kern/drivers/dev/mnt.c
kern/include/syscall.h
kern/src/ns/chan.c
kern/src/syscall.c