checkpoint: write(fd,"hello\n",6) where fd is a console dev almost works
This commit is contained in:
kaashoek 2006-08-09 16:04:04 +00:00
parent 6c0e444fcd
commit 6fa5ffb56f
9 changed files with 68 additions and 2 deletions

View file

@ -2,6 +2,7 @@
#include "x86.h" #include "x86.h"
#include "defs.h" #include "defs.h"
#include "spinlock.h" #include "spinlock.h"
#include "dev.h"
struct spinlock console_lock = { "console" }; struct spinlock console_lock = { "console" };
int panicked = 0; int panicked = 0;
@ -155,3 +156,24 @@ panic(char *s)
for(;;) 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;
}

1
defs.h
View file

@ -109,4 +109,5 @@ void idecref(struct inode *ip);
void iput(struct inode *ip); void iput(struct inode *ip);
struct inode * namei(char *path); struct inode * namei(char *path);
int readi(struct inode *ip, void *xdst, uint off, uint n); 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 inode *mknod(struct inode *, char *, short, short, short);

10
dev.h Normal file
View file

@ -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

4
fd.c
View file

@ -6,8 +6,10 @@
#include "defs.h" #include "defs.h"
#include "fd.h" #include "fd.h"
#include "spinlock.h" #include "spinlock.h"
#include "dev.h"
struct spinlock fd_table_lock; struct spinlock fd_table_lock;
struct devsw devsw[NDEV];
struct fd fds[NFD]; struct fd fds[NFD];
@ -56,6 +58,8 @@ fd_write(struct fd *fd, char *addr, int n)
return -1; return -1;
if(fd->type == FD_PIPE){ if(fd->type == FD_PIPE){
return pipe_write(fd->pipe, addr, n); return pipe_write(fd->pipe, addr, n);
} else if (fd->type == FD_FILE) {
return writei (fd->ip, addr, n);
} else { } else {
panic("fd_write"); panic("fd_write");
return -1; return -1;

11
fs.c
View file

@ -8,6 +8,7 @@
#include "buf.h" #include "buf.h"
#include "fs.h" #include "fs.h"
#include "fsvar.h" #include "fsvar.h"
#include "dev.h"
// these are inodes currently in use // these are inodes currently in use
// an entry is free if count == 0 // an entry is free if count == 0
@ -252,6 +253,16 @@ readi(struct inode *ip, void *xdst, uint off, uint n)
return target - 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 * struct inode *
namei(char *path) namei(char *path)
{ {

1
main.c
View file

@ -72,6 +72,7 @@ main0(void)
setupsegs(p); setupsegs(p);
// init disk device // init disk device
console_init();
ide_init(); ide_init();
mp_startthem(); mp_startthem();

View file

@ -7,3 +7,4 @@
#define NREQUEST 100 // outstanding disk requests #define NREQUEST 100 // outstanding disk requests
#define NBUF 10 #define NBUF 10
#define NINODE 100 #define NINODE 100
#define NDEV 10

View file

@ -271,8 +271,13 @@ sys_open(void)
iunlock(ip); iunlock(ip);
fd->type = FD_FILE; fd->type = FD_FILE;
if (arg1) {
fd->readable = 1;
fd->writeable = 1;
} else {
fd->readable = 1; fd->readable = 1;
fd->writeable = 0; fd->writeable = 0;
}
fd->ip = ip; fd->ip = ip;
fd->off = 0; fd->off = 0;
cp->fds[ufd] = fd; cp->fds[ufd] = fd;

View file

@ -20,6 +20,17 @@ main(void)
puts ("mknod failed\n"); puts ("mknod failed\n");
else else
puts ("made a node\n"); 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); fd = open("echo", 0);
if(fd >= 0){ if(fd >= 0){