diff --git a/console.c b/console.c index 9a7d725..7e357fb 100644 --- a/console.c +++ b/console.c @@ -2,6 +2,7 @@ #include "x86.h" #include "defs.h" #include "spinlock.h" +#include "dev.h" struct spinlock console_lock = { "console" }; int panicked = 0; @@ -155,3 +156,24 @@ panic(char *s) for(;;) ; } + +int +console_write (int minor, void *buf, int n) +{ + int i; + uchar *b = buf; + + cprintf ("print character to console\n"); + + for (i = 0; i < n; i++) { + cons_putc((int) b[i]); + } + + return n; +} + +void +console_init () +{ + devsw[CONSOLE].d_write = console_write; +} diff --git a/defs.h b/defs.h index 30b803d..728b2a4 100644 --- a/defs.h +++ b/defs.h @@ -109,4 +109,5 @@ void idecref(struct inode *ip); void iput(struct inode *ip); struct inode * namei(char *path); int readi(struct inode *ip, void *xdst, uint off, uint n); +int writei(struct inode *ip, void *addr, uint n); struct inode *mknod(struct inode *, char *, short, short, short); diff --git a/dev.h b/dev.h new file mode 100644 index 0000000..48c6b9a --- /dev/null +++ b/dev.h @@ -0,0 +1,10 @@ +struct devsw { + int (*d_open)(char *, int); + int (*d_read)(int, void *, int); + int (*d_write)(int, void *, int); + int (*d_close)(int); +}; + +extern struct devsw devsw[]; + +#define CONSOLE 1 diff --git a/fd.c b/fd.c index 8332454..47b0f20 100644 --- a/fd.c +++ b/fd.c @@ -6,8 +6,10 @@ #include "defs.h" #include "fd.h" #include "spinlock.h" +#include "dev.h" struct spinlock fd_table_lock; +struct devsw devsw[NDEV]; struct fd fds[NFD]; @@ -56,6 +58,8 @@ fd_write(struct fd *fd, char *addr, int n) return -1; if(fd->type == FD_PIPE){ return pipe_write(fd->pipe, addr, n); + } else if (fd->type == FD_FILE) { + return writei (fd->ip, addr, n); } else { panic("fd_write"); return -1; diff --git a/fs.c b/fs.c index cf530a9..d921221 100644 --- a/fs.c +++ b/fs.c @@ -8,6 +8,7 @@ #include "buf.h" #include "fs.h" #include "fsvar.h" +#include "dev.h" // these are inodes currently in use // an entry is free if count == 0 @@ -252,6 +253,16 @@ readi(struct inode *ip, void *xdst, uint off, uint n) return target - n; } +int +writei(struct inode *ip, void *addr, uint n) +{ + if (ip->type == T_DEV) { + return devsw[ip->major].d_write (ip->minor, addr, n); + } else { + panic ("writei: unknown type\n"); + } +} + struct inode * namei(char *path) { diff --git a/main.c b/main.c index c6e27a5..f0ca80e 100644 --- a/main.c +++ b/main.c @@ -72,6 +72,7 @@ main0(void) setupsegs(p); // init disk device + console_init(); ide_init(); mp_startthem(); diff --git a/param.h b/param.h index 9b5c5e8..c8d15b7 100644 --- a/param.h +++ b/param.h @@ -7,3 +7,4 @@ #define NREQUEST 100 // outstanding disk requests #define NBUF 10 #define NINODE 100 +#define NDEV 10 diff --git a/syscall.c b/syscall.c index ce6e22d..f0f2cc2 100644 --- a/syscall.c +++ b/syscall.c @@ -271,8 +271,13 @@ sys_open(void) iunlock(ip); fd->type = FD_FILE; - fd->readable = 1; - fd->writeable = 0; + if (arg1) { + fd->readable = 1; + fd->writeable = 1; + } else { + fd->readable = 1; + fd->writeable = 0; + } fd->ip = ip; fd->off = 0; cp->fds[ufd] = fd; diff --git a/userfs.c b/userfs.c index b11f3eb..dcdffbb 100644 --- a/userfs.c +++ b/userfs.c @@ -20,6 +20,17 @@ main(void) puts ("mknod failed\n"); else puts ("made a node\n"); + fd = open("console", 1); + if(fd >= 0){ + puts("open console ok\n"); + close(fd); + } else { + puts("open console failed!\n"); + } + if (write (fd, "hello\n", 6) != 6) { + puts ("write to console failed\n"); + } + close (fd); fd = open("echo", 0); if(fd >= 0){