Module Name: src
Committed By: ozaki-r
Date: Fri Jun 7 05:34:34 UTC 2019
Modified Files:
src/usr.sbin/puffs/mount_9p: mount_9p.8 nineproto.c ninepuffs.h node.c
subr.c
Log Message:
Handle Rerror and return errno correctly (only for 9P2000.u for now)
To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/usr.sbin/puffs/mount_9p/mount_9p.8
cvs rdiff -u -r1.10 -r1.11 src/usr.sbin/puffs/mount_9p/nineproto.c
cvs rdiff -u -r1.13 -r1.14 src/usr.sbin/puffs/mount_9p/ninepuffs.h
cvs rdiff -u -r1.22 -r1.23 src/usr.sbin/puffs/mount_9p/node.c
cvs rdiff -u -r1.6 -r1.7 src/usr.sbin/puffs/mount_9p/subr.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/usr.sbin/puffs/mount_9p/mount_9p.8
diff -u src/usr.sbin/puffs/mount_9p/mount_9p.8:1.9 src/usr.sbin/puffs/mount_9p/mount_9p.8:1.10
--- src/usr.sbin/puffs/mount_9p/mount_9p.8:1.9 Fri May 17 08:56:12 2019
+++ src/usr.sbin/puffs/mount_9p/mount_9p.8 Fri Jun 7 05:34:34 2019
@@ -1,4 +1,4 @@
-.\" $NetBSD: mount_9p.8,v 1.9 2019/05/17 08:56:12 wiz Exp $
+.\" $NetBSD: mount_9p.8,v 1.10 2019/06/07 05:34:34 ozaki-r Exp $
.\"
.\" Copyright (c) 2007 Antti Kantee. All rights reserved.
.\"
@@ -23,7 +23,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd May 15, 2019
+.Dd June 7, 2019
.Dt MOUNT_9P 8
.Os
.Sh NAME
@@ -92,7 +92,7 @@ Permissions are not handled well.
.Pp
Authentication support is missing.
.Pp
-Error code handling is missing.
+Error code handling is missing for 9P2000.
.Pp
Under construction.
.Pp
Index: src/usr.sbin/puffs/mount_9p/nineproto.c
diff -u src/usr.sbin/puffs/mount_9p/nineproto.c:1.10 src/usr.sbin/puffs/mount_9p/nineproto.c:1.11
--- src/usr.sbin/puffs/mount_9p/nineproto.c:1.10 Fri May 17 08:48:04 2019
+++ src/usr.sbin/puffs/mount_9p/nineproto.c Fri Jun 7 05:34:34 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: nineproto.c,v 1.10 2019/05/17 08:48:04 ozaki-r Exp $ */
+/* $NetBSD: nineproto.c,v 1.11 2019/06/07 05:34:34 ozaki-r Exp $ */
/*
* Copyright (c) 2007 Antti Kantee. All Rights Reserved.
@@ -27,7 +27,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: nineproto.c,v 1.10 2019/05/17 08:48:04 ozaki-r Exp $");
+__RCSID("$NetBSD: nineproto.c,v 1.11 2019/06/07 05:34:34 ozaki-r Exp $");
#endif /* !lint */
#include <sys/types.h>
@@ -188,6 +188,49 @@ proto_getstat(struct puffs_usermount *pu
return 0;
}
+static int
+proto_rerror(struct puffs_usermount *pu, struct puffs_framebuf *pb,
+ uint32_t *_errno)
+{
+ struct puffs9p *p9p = puffs_getspecific(pu);
+ uint16_t size;
+ int rv;
+ char *name;
+
+ /* Skip size[4] Rerror tag[2] */
+ rv = puffs_framebuf_seekset(pb,
+ sizeof(uint32_t) + sizeof(uint8_t) + sizeof(uint16_t));
+ if (rv == -1)
+ return EPROTO;
+
+ rv = p9pbuf_get_str(pb, &name, &size);
+ if (rv != 0)
+ return rv;
+ if (p9p->protover == P9PROTO_VERSION_U) {
+ rv = p9pbuf_get_4(pb, _errno);
+ } else {
+ /* TODO Convert error string to errno */
+ rv = EPROTO;
+ }
+
+ return rv;
+}
+
+int
+proto_handle_rerror(struct puffs_usermount *pu, struct puffs_framebuf *pb)
+{
+ int rv;
+ uint32_t _errno;
+
+ if (p9pbuf_get_type(pb) != P9PROTO_R_ERROR)
+ return EPROTO;
+
+ rv = proto_rerror(pu, pb, &_errno);
+ if (rv == 0)
+ rv = _errno;
+ return rv;
+}
+
int
proto_cc_dupfid(struct puffs_usermount *pu, p9pfid_t oldfid, p9pfid_t newfid)
{
@@ -206,7 +249,7 @@ proto_cc_dupfid(struct puffs_usermount *
p9pbuf_put_2(pb, 0);
GETRESPONSE(pb);
- rv = proto_expect_walk_nqids(pb, &qids);
+ rv = proto_expect_walk_nqids(pu, pb, &qids);
if (rv == 0 && qids != 0)
rv = EPROTO;
@@ -232,7 +275,7 @@ proto_cc_clunkfid(struct puffs_usermount
if (waitforit) {
if (puffs_framev_enqueue_cc(pcc, p9p->servsock, pb, 0) == 0) {
if (p9pbuf_get_type(pb) != P9PROTO_R_CLUNK)
- rv = EPROTO;
+ rv = proto_handle_rerror(pu, pb);
} else {
rv = errno;
}
@@ -269,7 +312,7 @@ proto_cc_open(struct puffs_usermount *pu
p9pbuf_put_1(pb, mode);
GETRESPONSE(pb);
if (p9pbuf_get_type(pb) != P9PROTO_R_OPEN)
- rv = EPROTO;
+ rv = proto_handle_rerror(pu, pb);
out:
puffs_framebuf_destroy(pb);
@@ -349,20 +392,22 @@ proto_make_stat(struct puffs_usermount *
}
int
-proto_expect_walk_nqids(struct puffs_framebuf *pb, uint16_t *nqids)
+proto_expect_walk_nqids(struct puffs_usermount *pu, struct puffs_framebuf *pb,
+ uint16_t *nqids)
{
if (p9pbuf_get_type(pb) != P9PROTO_R_WALK)
- return EPROTO;
+ return proto_handle_rerror(pu, pb);
return p9pbuf_get_2(pb, nqids);
}
int
-proto_expect_qid(struct puffs_framebuf *pb, uint8_t op, struct qid9p *qid)
+proto_expect_qid(struct puffs_usermount *pu, struct puffs_framebuf *pb,
+ uint8_t op, struct qid9p *qid)
{
if (p9pbuf_get_type(pb) != op)
- return EPROTO;
+ return proto_handle_rerror(pu, pb);
return proto_getqid(pb, qid);
}
@@ -374,7 +419,7 @@ proto_expect_stat(struct puffs_usermount
int rv;
if (p9pbuf_get_type(pb) != P9PROTO_R_STAT)
- return EPROTO;
+ return proto_handle_rerror(pu, pb);
if ((rv = p9pbuf_get_2(pb, &dummy)))
return rv;
return proto_getstat(pu, pb, va, NULL, NULL);
Index: src/usr.sbin/puffs/mount_9p/ninepuffs.h
diff -u src/usr.sbin/puffs/mount_9p/ninepuffs.h:1.13 src/usr.sbin/puffs/mount_9p/ninepuffs.h:1.14
--- src/usr.sbin/puffs/mount_9p/ninepuffs.h:1.13 Fri May 17 08:48:04 2019
+++ src/usr.sbin/puffs/mount_9p/ninepuffs.h Fri Jun 7 05:34:34 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: ninepuffs.h,v 1.13 2019/05/17 08:48:04 ozaki-r Exp $ */
+/* $NetBSD: ninepuffs.h,v 1.14 2019/06/07 05:34:34 ozaki-r Exp $ */
/*
* Copyright (c) 2007 Antti Kantee. All Rights Reserved.
@@ -151,10 +151,13 @@ uint16_t p9pbuf_get_tag(struct puffs_fra
int proto_getqid(struct puffs_framebuf *, struct qid9p *);
int proto_getstat(struct puffs_usermount *, struct puffs_framebuf *, struct vattr *,
char **, uint16_t *);
-int proto_expect_walk_nqids(struct puffs_framebuf *, uint16_t *);
+int proto_expect_walk_nqids(struct puffs_usermount *,
+ struct puffs_framebuf *, uint16_t *);
int proto_expect_stat(struct puffs_usermount *, struct puffs_framebuf *,
struct vattr *);
-int proto_expect_qid(struct puffs_framebuf *, uint8_t, struct qid9p *);
+int proto_expect_qid(struct puffs_usermount *, struct puffs_framebuf *,
+ uint8_t, struct qid9p *);
+int proto_handle_rerror(struct puffs_usermount *, struct puffs_framebuf *);
int proto_cc_dupfid(struct puffs_usermount *, p9pfid_t, p9pfid_t);
int proto_cc_clunkfid(struct puffs_usermount *, p9pfid_t, int);
Index: src/usr.sbin/puffs/mount_9p/node.c
diff -u src/usr.sbin/puffs/mount_9p/node.c:1.22 src/usr.sbin/puffs/mount_9p/node.c:1.23
--- src/usr.sbin/puffs/mount_9p/node.c:1.22 Fri May 17 08:48:04 2019
+++ src/usr.sbin/puffs/mount_9p/node.c Fri Jun 7 05:34:34 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: node.c,v 1.22 2019/05/17 08:48:04 ozaki-r Exp $ */
+/* $NetBSD: node.c,v 1.23 2019/06/07 05:34:34 ozaki-r Exp $ */
/*
* Copyright (c) 2007 Antti Kantee. All Rights Reserved.
@@ -27,7 +27,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: node.c,v 1.22 2019/05/17 08:48:04 ozaki-r Exp $");
+__RCSID("$NetBSD: node.c,v 1.23 2019/06/07 05:34:34 ozaki-r Exp $");
#endif /* !lint */
#include <assert.h>
@@ -62,6 +62,10 @@ do_getattr(struct puffs_usermount *pu, s
p9pbuf_put_4(pb, p9n->fid_base);
GETRESPONSE(pb);
+ if (p9pbuf_get_type(pb) != P9PROTO_R_STAT) {
+ rv = proto_handle_rerror(pu, pb);
+ goto out;
+ }
rv = proto_expect_stat(pu, pb, vap);
out:
@@ -101,7 +105,7 @@ puffs9p_node_lookup(struct puffs_usermou
p9pbuf_put_str(pb, pcn->pcn_name);
GETRESPONSE(pb);
- rv = proto_expect_walk_nqids(pb, &nqid);
+ rv = proto_expect_walk_nqids(pu, pb, &nqid);
if (rv) {
rv = ENOENT;
goto out;
@@ -234,8 +238,9 @@ puffs9p_node_setattr(struct puffs_usermo
proto_make_stat(pu, pb, va, NULL, pn->pn_va.va_type);
GETRESPONSE(pb);
- if (p9pbuf_get_type(pb) != P9PROTO_R_WSTAT)
- rv = EPROTO;
+ if (p9pbuf_get_type(pb) != P9PROTO_R_WSTAT) {
+ rv = proto_handle_rerror(pu, pb);
+ }
out:
RETURN(rv);
@@ -330,7 +335,7 @@ puffs9p_node_read(struct puffs_usermount
GETRESPONSE(pb);
if (p9pbuf_get_type(pb) != P9PROTO_R_READ) {
- rv = EPROTO;
+ rv = proto_handle_rerror(pu, pb);
break;
}
@@ -378,7 +383,7 @@ puffs9p_node_write(struct puffs_usermoun
GETRESPONSE(pb);
if (p9pbuf_get_type(pb) != P9PROTO_R_WRITE) {
- rv = EPROTO;
+ rv = proto_handle_rerror(pu, pb);
break;
}
@@ -430,7 +435,7 @@ nodecreate(struct puffs_usermount *pu, s
p9pbuf_put_str(pb, ""); /* extension[s] */
GETRESPONSE(pb);
- rv = proto_expect_qid(pb, P9PROTO_R_CREATE, &nqid);
+ rv = proto_expect_qid(pu, pb, P9PROTO_R_CREATE, &nqid);
if (rv)
goto out;
@@ -512,7 +517,7 @@ noderemove(struct puffs_usermount *pu, s
GETRESPONSE(pb);
if (p9pbuf_get_type(pb) != P9PROTO_R_REMOVE) {
- rv = EPROTO;
+ rv = proto_handle_rerror(pu, pb);
} else {
proto_cc_clunkfid(pu, p9n->fid_base, 0);
p9n->fid_base = P9P_INVALFID;
@@ -585,7 +590,7 @@ puffs9p_node_rename(struct puffs_usermou
GETRESPONSE(pb);
if (p9pbuf_get_type(pb) != P9PROTO_R_WSTAT)
- rv = EPROTO;
+ rv = proto_handle_rerror(pu, pb);
out:
RETURN(rv);
Index: src/usr.sbin/puffs/mount_9p/subr.c
diff -u src/usr.sbin/puffs/mount_9p/subr.c:1.6 src/usr.sbin/puffs/mount_9p/subr.c:1.7
--- src/usr.sbin/puffs/mount_9p/subr.c:1.6 Fri Nov 30 19:02:39 2007
+++ src/usr.sbin/puffs/mount_9p/subr.c Fri Jun 7 05:34:34 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: subr.c,v 1.6 2007/11/30 19:02:39 pooka Exp $ */
+/* $NetBSD: subr.c,v 1.7 2019/06/07 05:34:34 ozaki-r Exp $ */
/*
* Copyright (c) 2007 Antti Kantee. All Rights Reserved.
@@ -27,7 +27,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: subr.c,v 1.6 2007/11/30 19:02:39 pooka Exp $");
+__RCSID("$NetBSD: subr.c,v 1.7 2019/06/07 05:34:34 ozaki-r Exp $");
#endif /* !lint */
#include <sys/types.h>
@@ -139,7 +139,7 @@ getdfwithoffset(struct puffs_usermount *
GETRESPONSE(pb);
if (p9pbuf_get_type(pb) != P9PROTO_R_READ) {
- rv = EPROTO;
+ rv = proto_handle_rerror(pu, pb);
goto out;
}