commit 1c8fd7585b7625481e9fd45a17861c4d820d9608
parent 75e333c72ec94c920d3e2b816c5898afef5c999e
Author: Roberto Vargas <roberto.vargas@arm.com>
Date: Thu, 21 Feb 2019 21:33:52 +0000
[dlang] Improve dlang() i/o commands
Better error handling and change p9readdir to the same
prototype than readdir.
Change-Id: I0b5b2eb13edbdd6702d5f7cf3c3641965f2c9da2
Diffstat:
4 files changed, 38 insertions(+), 26 deletions(-)
diff --git a/include/rcode/9p.h b/include/rcode/9p.h
@@ -26,14 +26,13 @@ struct dirent {
typedef struct {
int fd;
unsigned char buf[DIRLEN];
- struct dirent ent;
} DIR;
extern int dirtop9(Dir *dp, unsigned char *buf, int n);
extern int p9todir(Dir *dp, unsigned char *buf, int n);
extern DIR *p9opendir(DIR *dir, const char *name);
-extern struct dirent *p9readdir(DIR *dir);
+extern int p9readdir(DIR *dir, struct dirent *ent);
extern int p9closedir(DIR *dir);
#endif
diff --git a/src/lib9p/p9opendir.c b/src/lib9p/p9opendir.c
@@ -8,10 +8,8 @@ p9opendir(DIR *dir, const char *name)
{
int fd;
- if ((fd = open(name, O_READ)) < 0) {
- errno = ENOENT;
+ if ((fd = open(name, O_READ)) < 0)
return NULL;
- }
dir->fd = fd;
/* TODO: check that it is actually a directory */
diff --git a/src/lib9p/p9readdir.c b/src/lib9p/p9readdir.c
@@ -1,21 +1,24 @@
+#include <errno.h>
#include <string.h>
#include <rcode/9p.h>
#include <rcode/rcode.h>
-struct dirent *
-p9readdir(DIR *dir)
+int
+p9readdir(DIR *dir, struct dirent *ent)
{
int n;
Dir dentry;
- if ((n = read(dir->fd, dir->buf, sizeof(dir->buf))) < 0)
- return NULL;
+ if ((n = read(dir->fd, dir->buf, sizeof(dir->buf))) <= 0)
+ return n;
- if (p9todir(&dentry, dir->buf, n) < 0)
- return NULL;
+ if (p9todir(&dentry, dir->buf, n) < 0) {
+ errno = EINVAL;
+ return -1;
+ }
- strcpy(dir->ent.d_name, dentry.name);
+ strcpy(ent->d_name, dentry.name);
- return &dir->ent;
+ return 1;
}
diff --git a/src/romfw/dlang.c b/src/romfw/dlang.c
@@ -216,33 +216,42 @@ do_cat(const struct cmd *cmd, struct args *args)
char buf[100];
if ((fd = open(args->argv[1], O_READ)) < 0)
- return -1;
+ goto err;
while ((n = read(fd, buf, sizeof(buf))) > 0)
kprint(PREFIX "%s", buf);
if (close(fd) < 0 || n < 0)
- return -1;
+ goto err;
+
+ return 0;
+err:
+ kerror(PREFIX "cat");
return 0;
}
static int
do_ls(const struct cmd *cmd, struct args *args)
{
+ int n;
DIR dir;
- struct dirent *d;
+ struct dirent d;
if (!p9opendir(&dir, args->argv[1]))
- return -1;
+ goto err;
- while ((d = p9readdir(&dir)) != NULL)
- kprint(PREFIX "%s\n", d->d_name);
+ while ((n = p9readdir(&dir, &d)) > 0)
+ kprint(PREFIX "%s\n", d.d_name);
- if (p9closedir(&dir))
- return -1;
+ if (p9closedir(&dir) < 0 || n < 0)
+ goto err;
return 0;
+
+err:
+ kerror(PREFIX "ls");
+ return 0;
}
static int
@@ -251,16 +260,19 @@ do_echo(const struct cmd *cmd, struct args *args)
int fd, n;
char *s;
- if ((fd = open(args->argv[1], O_WRITE)) < 0)
- return -1;
+ if ((fd = open(args->argv[2], O_WRITE)) < 0)
+ goto err;
- s = args->argv[2];
- write(fd, s, strlen(s));
+ s = args->argv[1];
+ n = write(fd, s, strlen(s));
if (close(fd) < 0 || n < 0)
- return -1;
+ goto err;
return 0;
+err:
+ kerror(PREFIX "echo");
+ return 0;
}
static char *