Support partial contexts
[akaros.git] / kern / src / devfs.c
index a227d08..7bcdb51 100644 (file)
@@ -50,7 +50,7 @@ void devfs_init(void)
 struct file *make_device(char *path, int mode, int type,
                          struct file_operations *fop)
 {
 struct file *make_device(char *path, int mode, int type,
                          struct file_operations *fop)
 {
-       struct file *f_dev = do_file_open(path, O_CREAT, mode);
+       struct file *f_dev = do_file_open(path, O_CREAT | O_RDWR, mode);
        assert(f_dev);
        /* Overwrite the f_op with our own f_ops */
        f_dev->f_dentry->d_inode->i_fop = fop;
        assert(f_dev);
        /* Overwrite the f_op with our own f_ops */
        f_dev->f_dentry->d_inode->i_fop = fop;
@@ -82,6 +82,9 @@ ssize_t dev_stdin_read(struct file *file, char *buf, size_t count,
 {
        char c;
        extern struct kb_buffer cons_buf;
 {
        char c;
        extern struct kb_buffer cons_buf;
+
+       if (!count)
+               return 0;
        kb_get_from_buf(&cons_buf, &c, 1);
        /* TODO UMEM */
        if (current)
        kb_get_from_buf(&cons_buf, &c, 1);
        /* TODO UMEM */
        if (current)
@@ -106,9 +109,10 @@ ssize_t dev_stdout_write(struct file *file, const char *buf, size_t count,
         * would try to print it (which it can't do yet).  The hack is even dirtier
         * in that we only detect it if it is the first char, and we ignore
         * everything else. */
         * would try to print it (which it can't do yet).  The hack is even dirtier
         * in that we only detect it if it is the first char, and we ignore
         * everything else. */
-       if (t_buf[0] == '\033') /* 0x1b */
-               return count;
-       cputbuf(t_buf, count);
+       if (t_buf[0] != '\033') /* 0x1b */
+               cputbuf(t_buf, count);
+       if (p)
+               user_memdup_free(p, t_buf);
        return count;
 }
 
        return count;
 }
 
@@ -147,6 +151,12 @@ struct file_operations dev_f_op_stdout = {
        kfs_check_flags,
 };
 
        kfs_check_flags,
 };
 
+ssize_t dev_null_read(struct file *file, char *buf, size_t count,
+                      off64_t *offset)
+{
+       return 0;
+}
+
 /* /dev/null: just take whatever was given and pretend it was written */
 ssize_t dev_null_write(struct file *file, const char *buf, size_t count,
                        off64_t *offset)
 /* /dev/null: just take whatever was given and pretend it was written */
 ssize_t dev_null_write(struct file *file, const char *buf, size_t count,
                        off64_t *offset)
@@ -156,7 +166,7 @@ ssize_t dev_null_write(struct file *file, const char *buf, size_t count,
 
 struct file_operations dev_f_op_null = {
        dev_c_llseek,
 
 struct file_operations dev_f_op_null = {
        dev_c_llseek,
-       0,      /* read - can't read null */
+       dev_null_read,
        dev_null_write,
        kfs_readdir,    /* this will fail gracefully */
        dev_mmap,
        dev_null_write,
        kfs_readdir,    /* this will fail gracefully */
        dev_mmap,