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;
 		}
 

Reply via email to