commit 162747b94f638768178d38af33f1f609305dd581
parent e7a48f46c5b29472a2db41889bb4642f49045bf1
Author: Roberto Vargas <roberto.vargas@arm.com>
Date: Thu, 28 Feb 2019 10:19:16 +0000
[dev] Add devwrite()
Only a few devs are going to support write, so it makes
sense to have a general function to disable writes. This
patch also makes the order of the parameters in bind()
more orthogonal with the driver prototype.
Change-Id: I675a7aa35408b5a4c9b01f1ed95c8706c696c46b
Diffstat:
4 files changed, 20 insertions(+), 18 deletions(-)
diff --git a/drivers/dev.c b/drivers/dev.c
@@ -334,6 +334,13 @@ write(int fd, void *buf, int n)
}
int
+devwrite(Chan *c, void *buf, int n)
+{
+ errno = EINVAL;
+ return -1;
+}
+
+int
seek(int fd, long long off, int whence)
{
Chan *c;
@@ -362,10 +369,16 @@ seek(int fd, long long off, int whence)
}
int
+devbind(Chan *new, Chan *where)
+{
+ errno = EINVAL;
+ return -1;
+}
+
+int
bind(char *new, char *where)
{
Chan *cw, *cn;
- int (*fn)(Chan *, Chan *);
if ((cw = namec(where, O_READ)) == NULL)
goto err0;
@@ -378,15 +391,8 @@ bind(char *new, char *where)
if ((cn = namec(new, O_BIND)) == NULL)
goto err1;
- fn = devtab[cw->type]->bind;
- if (!fn) {
- errno = EINVAL;
- goto err2;
- }
-
- if ((*fn)(cw, cn) < 0)
+ if (devtab[cw->type]->bind(cn, cw) < 0)
goto err2;
-
chanclose(cw);
return 0;
diff --git a/drivers/dev.h b/drivers/dev.h
@@ -11,7 +11,6 @@ typedef struct chan Chan;
typedef struct dirtab Dirtab;
typedef int Devgen(Chan *, const Dirtab *, int, int, Dir *);
typedef struct attr Attr;
-typedef struct uart Uart;
struct dirtab {
char name[NAMELEN];
@@ -48,6 +47,8 @@ extern Chan *devclone(Chan *c, Chan *nc);
extern Chan *devattach(int id, int dev);
extern Chan *devclone(Chan *c, Chan *nc);
extern void devlink(void);
+extern int devbind(Chan *new, Chan *where);
+extern int devwrite(Chan *c, void *buf, int n);
extern void chanclose(Chan *c);
extern int devgen(Chan *c,
const Dirtab *tab, int ntab,
diff --git a/drivers/devroot.c b/drivers/devroot.c
@@ -65,7 +65,7 @@ rootwalk(Chan *c, const char *name)
}
static int
-rootbind(Chan *cw, Chan *cn)
+rootbind(Chan *cn, Chan *cw)
{
Qid qid;
Chan *mnt;
@@ -95,12 +95,6 @@ rootread(Chan *c, void *buf, int n)
return dirread(c, buf, n, NULL, 0, rootgen);
}
-static int
-rootwrite(Chan *c, void *buf, int n)
-{
- return -1;
-}
-
const Dev rootdevtab = {
.id = '/',
.name = "root",
@@ -108,6 +102,6 @@ const Dev rootdevtab = {
.attach = rootattach,
.walk = rootwalk,
.read = rootread,
- .write = rootwrite,
+ .write = devwrite,
.bind = rootbind,
};
diff --git a/drivers/devuart.c b/drivers/devuart.c
@@ -289,4 +289,5 @@ const Dev uartdevtab = {
.clone = devclone,
.read = uartread,
.write = uartwrite,
+ .bind = devbind,
};