devsw
checkpoint: write(fd,"hello\n",6) where fd is a console dev almost works
This commit is contained in:
parent
6c0e444fcd
commit
6fa5ffb56f
9 changed files with 68 additions and 2 deletions
22
console.c
22
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;
|
||||
}
|
||||
|
|
1
defs.h
1
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);
|
||||
|
|
10
dev.h
Normal file
10
dev.h
Normal 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
4
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;
|
||||
|
|
11
fs.c
11
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)
|
||||
{
|
||||
|
|
1
main.c
1
main.c
|
@ -72,6 +72,7 @@ main0(void)
|
|||
setupsegs(p);
|
||||
|
||||
// init disk device
|
||||
console_init();
|
||||
ide_init();
|
||||
|
||||
mp_startthem();
|
||||
|
|
1
param.h
1
param.h
|
@ -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;
|
||||
|
|
11
userfs.c
11
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){
|
||||
|
|
Loading…
Reference in a new issue