Handle Rerror and return errno correctly (only for 9P2000.u for now)
This commit is contained in:
parent
e235cd7c28
commit
3a48a88c0a
|
@ -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
|
||||
|
|
|
@ -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, struct puffs_framebuf *pb, struct vatt
|
|||
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 *pu, p9pfid_t oldfid, p9pfid_t newfid)
|
|||
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 *pu, p9pfid_t fid, int waitforit)
|
|||
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, p9pfid_t fid,
|
|||
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 *pu, struct puffs_framebuf *pb,
|
|||
}
|
||||
|
||||
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 *pu, struct puffs_framebuf *pb,
|
|||
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);
|
||||
|
|
|
@ -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_framebuf *);
|
|||
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);
|
||||
|
|
|
@ -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, struct puffs_node *pn, struct vattr *vap)
|
|||
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_usermount *pu, void *opc, struct puffs_newinfo
|
|||
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_usermount *pu, void *opc,
|
|||
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 *pu, void *opc, uint8_t *buf,
|
|||
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_usermount *pu, void *opc, uint8_t *buf,
|
|||
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, struct puffs_node *pn,
|
|||
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, struct puffs_node *pn)
|
|||
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_usermount *pu, void *opc, void *src,
|
|||
GETRESPONSE(pb);
|
||||
|
||||
if (p9pbuf_get_type(pb) != P9PROTO_R_WSTAT)
|
||||
rv = EPROTO;
|
||||
rv = proto_handle_rerror(pu, pb);
|
||||
|
||||
out:
|
||||
RETURN(rv);
|
||||
|
|
|
@ -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 *pu, struct p9pnode *p9n, off_t wantoff,
|
|||
GETRESPONSE(pb);
|
||||
|
||||
if (p9pbuf_get_type(pb) != P9PROTO_R_READ) {
|
||||
rv = EPROTO;
|
||||
rv = proto_handle_rerror(pu, pb);
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue