summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--console.c22
-rw-r--r--defs.h1
-rw-r--r--dev.h10
-rw-r--r--fd.c4
-rw-r--r--fs.c11
-rw-r--r--main.c1
-rw-r--r--param.h1
-rw-r--r--syscall.c9
-rw-r--r--userfs.c11
9 files changed, 68 insertions, 2 deletions
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){