9os

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

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:
Minclude/rcode/9p.h | 3+--
Msrc/lib9p/p9opendir.c | 4+---
Msrc/lib9p/p9readdir.c | 19+++++++++++--------
Msrc/romfw/dlang.c | 38+++++++++++++++++++++++++-------------
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 *