#include "x86.h"
#include "defs.h"
#include "spinlock.h"
+#include "dev.h"
struct spinlock console_lock = { "console" };
int panicked = 0;
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;
+}
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);
--- /dev/null
+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
#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];
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;
#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
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)
{
setupsegs(p);
// init disk device
+ console_init();
ide_init();
mp_startthem();
#define NREQUEST 100 // outstanding disk requests
#define NBUF 10
#define NINODE 100
+#define NDEV 10
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;
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){