Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/usr.sbin/puffs/mount_9p Handle Rerror and return errno corre...
details: https://anonhg.NetBSD.org/src/rev/3c8940a244d5
branches: trunk
changeset: 841901:3c8940a244d5
user: ozaki-r <ozaki-r%NetBSD.org@localhost>
date: Fri Jun 07 05:34:34 2019 +0000
description:
Handle Rerror and return errno correctly (only for 9P2000.u for now)
diffstat:
usr.sbin/puffs/mount_9p/mount_9p.8 | 6 +-
usr.sbin/puffs/mount_9p/nineproto.c | 65 +++++++++++++++++++++++++++++++-----
usr.sbin/puffs/mount_9p/ninepuffs.h | 9 +++-
usr.sbin/puffs/mount_9p/node.c | 25 ++++++++-----
usr.sbin/puffs/mount_9p/subr.c | 6 +-
5 files changed, 82 insertions(+), 29 deletions(-)
diffs (truncated from 305 to 300 lines):
diff -r edf26b0f208b -r 3c8940a244d5 usr.sbin/puffs/mount_9p/mount_9p.8
--- a/usr.sbin/puffs/mount_9p/mount_9p.8 Fri Jun 07 05:22:28 2019 +0000
+++ b/usr.sbin/puffs/mount_9p/mount_9p.8 Fri Jun 07 05:34:34 2019 +0000
@@ -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 @@
.Pp
Authentication support is missing.
.Pp
-Error code handling is missing.
+Error code handling is missing for 9P2000.
.Pp
Under construction.
.Pp
diff -r edf26b0f208b -r 3c8940a244d5 usr.sbin/puffs/mount_9p/nineproto.c
--- a/usr.sbin/puffs/mount_9p/nineproto.c Fri Jun 07 05:22:28 2019 +0000
+++ b/usr.sbin/puffs/mount_9p/nineproto.c Fri Jun 07 05:34:34 2019 +0000
@@ -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 @@
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 @@
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 @@
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 @@
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 @@
}
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 @@
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);
diff -r edf26b0f208b -r 3c8940a244d5 usr.sbin/puffs/mount_9p/ninepuffs.h
--- a/usr.sbin/puffs/mount_9p/ninepuffs.h Fri Jun 07 05:22:28 2019 +0000
+++ b/usr.sbin/puffs/mount_9p/ninepuffs.h Fri Jun 07 05:34:34 2019 +0000
@@ -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 @@
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);
diff -r edf26b0f208b -r 3c8940a244d5 usr.sbin/puffs/mount_9p/node.c
--- a/usr.sbin/puffs/mount_9p/node.c Fri Jun 07 05:22:28 2019 +0000
+++ b/usr.sbin/puffs/mount_9p/node.c Fri Jun 07 05:34:34 2019 +0000
@@ -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 @@
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 @@
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 @@
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 @@
GETRESPONSE(pb);
if (p9pbuf_get_type(pb) != P9PROTO_R_READ) {
- rv = EPROTO;
+ rv = proto_handle_rerror(pu, pb);
break;
}
@@ -378,7 +383,7 @@
GETRESPONSE(pb);
if (p9pbuf_get_type(pb) != P9PROTO_R_WRITE) {
- rv = EPROTO;
+ rv = proto_handle_rerror(pu, pb);
break;
}
@@ -430,7 +435,7 @@
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 @@
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 @@
GETRESPONSE(pb);
if (p9pbuf_get_type(pb) != P9PROTO_R_WSTAT)
- rv = EPROTO;
+ rv = proto_handle_rerror(pu, pb);
out:
RETURN(rv);
diff -r edf26b0f208b -r 3c8940a244d5 usr.sbin/puffs/mount_9p/subr.c
--- a/usr.sbin/puffs/mount_9p/subr.c Fri Jun 07 05:22:28 2019 +0000
+++ b/usr.sbin/puffs/mount_9p/subr.c Fri Jun 07 05:34:34 2019 +0000
@@ -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 @@
GETRESPONSE(pb);
if (p9pbuf_get_type(pb) != P9PROTO_R_READ) {
Home |
Main Index |
Thread Index |
Old Index