提交 6fa5ffb5 创建 作者: kaashoek's avatar kaashoek

devsw

checkpoint: write(fd,"hello\n",6) where fd is a console dev almost works
上级 6c0e444f
......@@ -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;
}
......@@ -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);
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
......@@ -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;
......
......@@ -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)
{
......
......@@ -72,6 +72,7 @@ main0(void)
setupsegs(p);
// init disk device
console_init();
ide_init();
mp_startthem();
......
......@@ -7,3 +7,4 @@
#define NREQUEST 100 // outstanding disk requests
#define NBUF 10
#define NINODE 100
#define NDEV 10
......@@ -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;
......
......@@ -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){
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论