xv6

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit 9936bffa45c928ead9660a0df32d08a50b2b09c2
parent 39593d2f1aab1355d61b75c041b31a88d2043a04
Author: rsc <rsc>
Date:   Wed,  6 Sep 2006 18:40:28 +0000

fd.* -> file.*

Diffstat:
MMakefile | 4++--
Dfd.c | 150-------------------------------------------------------------------------------
Afile.c | 150+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rfd.h -> file.h | 0
Mpipe.c | 2+-
Mproc.c | 2+-
Msyscall.c | 2+-
Msysfile.c | 2+-
Msysproc.c | 2+-
9 files changed, 157 insertions(+), 157 deletions(-)

diff --git a/Makefile b/Makefile @@ -1,6 +1,6 @@ OBJS = \ console.o\ - fd.o\ + file.o\ ide.o\ kalloc.o\ lapic.o\ @@ -66,7 +66,7 @@ PRINT = \ bootasm.S bootother.S main.c init.c spinlock.c\ proc.h proc.c setjmp.S kalloc.c\ syscall.h trapasm.S traps.h trap.c vectors.pl syscall.c\ - buf.h dev.h fcntl.h stat.h fd.h fs.h fsvar.h fd.c fs.c bio.c ide.c\ + buf.h dev.h fcntl.h stat.h file.h fs.h fsvar.h fd.c fs.c bio.c ide.c\ pipe.c\ mp.h ioapic.h mp.c lapic.c ioapic.c picirq.c\ console.c\ diff --git a/fd.c b/fd.c @@ -1,150 +0,0 @@ -#include "types.h" -#include "stat.h" -#include "param.h" -#include "x86.h" -#include "mmu.h" -#include "proc.h" -#include "defs.h" -#include "fd.h" -#include "spinlock.h" -#include "dev.h" -#include "fs.h" -#include "fsvar.h" - -struct spinlock fd_table_lock; -struct devsw devsw[NDEV]; - -struct file file[NFILE]; - -void -fd_init(void) -{ - initlock(&fd_table_lock, "fd_table"); -} - -// Allocate a file descriptor number for curproc. -int -fd_ualloc(void) -{ - int fd; - struct proc *p = curproc[cpu()]; - for(fd = 0; fd < NOFILE; fd++) - if(p->ofile[fd] == 0) - return fd; - return -1; -} - -// Allocate a file descriptor structure -struct file* -fd_alloc(void) -{ - int i; - - acquire(&fd_table_lock); - for(i = 0; i < NFILE; i++){ - if(file[i].type == FD_CLOSED){ - file[i].type = FD_NONE; - file[i].ref = 1; - release(&fd_table_lock); - return file + i; - } - } - release(&fd_table_lock); - return 0; -} - -// Write to file descriptor; -// addr is a kernel address, pointing into some process's p->mem. -int -fd_write(struct file *fd, char *addr, int n) -{ - if(fd->writable == 0) - return -1; - if(fd->type == FD_PIPE){ - return pipe_write(fd->pipe, addr, n); - } else if(fd->type == FD_FILE) { - ilock(fd->ip); - int r = writei(fd->ip, addr, fd->off, n); - if(r > 0) { - fd->off += r; - } - iunlock(fd->ip); - return r; - } else { - panic("fd_write"); - return -1; - } -} - -// Read from file descriptor. -int -fd_read(struct file *fd, char *addr, int n) -{ - if(fd->readable == 0) - return -1; - if(fd->type == FD_PIPE){ - return pipe_read(fd->pipe, addr, n); - } else if(fd->type == FD_FILE){ - ilock(fd->ip); - int cc = readi(fd->ip, addr, fd->off, n); - if(cc > 0) - fd->off += cc; - iunlock(fd->ip); - return cc; - } else { - panic("fd_read"); - return -1; - } -} - -// Close file descriptor. -void -fd_close(struct file *fd) -{ - acquire(&fd_table_lock); - - if(fd->ref < 1 || fd->type == FD_CLOSED) - panic("fd_close"); - - if(--fd->ref == 0){ - struct file dummy = *fd; - - fd->ref = 0; - fd->type = FD_CLOSED; - release(&fd_table_lock); - - if(dummy.type == FD_PIPE){ - pipe_close(dummy.pipe, dummy.writable); - } else if(dummy.type == FD_FILE){ - idecref(dummy.ip); - } else { - panic("fd_close"); - } - } else { - release(&fd_table_lock); - } -} - -// Get metadata about file descriptor. -int -fd_stat(struct file *fd, struct stat *st) -{ - if(fd->type == FD_FILE){ - ilock(fd->ip); - stati(fd->ip, st); - iunlock(fd->ip); - return 0; - } else - return -1; -} - -// Increment file descriptor reference count. -void -fd_incref(struct file *fd) -{ - acquire(&fd_table_lock); - if(fd->ref < 1 || fd->type == FD_CLOSED) - panic("fd_incref"); - fd->ref++; - release(&fd_table_lock); -} diff --git a/file.c b/file.c @@ -0,0 +1,150 @@ +#include "types.h" +#include "stat.h" +#include "param.h" +#include "x86.h" +#include "mmu.h" +#include "proc.h" +#include "defs.h" +#include "file.h" +#include "spinlock.h" +#include "dev.h" +#include "fs.h" +#include "fsvar.h" + +struct spinlock fd_table_lock; +struct devsw devsw[NDEV]; + +struct file file[NFILE]; + +void +fd_init(void) +{ + initlock(&fd_table_lock, "fd_table"); +} + +// Allocate a file descriptor number for curproc. +int +fd_ualloc(void) +{ + int fd; + struct proc *p = curproc[cpu()]; + for(fd = 0; fd < NOFILE; fd++) + if(p->ofile[fd] == 0) + return fd; + return -1; +} + +// Allocate a file descriptor structure +struct file* +fd_alloc(void) +{ + int i; + + acquire(&fd_table_lock); + for(i = 0; i < NFILE; i++){ + if(file[i].type == FD_CLOSED){ + file[i].type = FD_NONE; + file[i].ref = 1; + release(&fd_table_lock); + return file + i; + } + } + release(&fd_table_lock); + return 0; +} + +// Write to file descriptor; +// addr is a kernel address, pointing into some process's p->mem. +int +fd_write(struct file *fd, char *addr, int n) +{ + if(fd->writable == 0) + return -1; + if(fd->type == FD_PIPE){ + return pipe_write(fd->pipe, addr, n); + } else if(fd->type == FD_FILE) { + ilock(fd->ip); + int r = writei(fd->ip, addr, fd->off, n); + if(r > 0) { + fd->off += r; + } + iunlock(fd->ip); + return r; + } else { + panic("fd_write"); + return -1; + } +} + +// Read from file descriptor. +int +fd_read(struct file *fd, char *addr, int n) +{ + if(fd->readable == 0) + return -1; + if(fd->type == FD_PIPE){ + return pipe_read(fd->pipe, addr, n); + } else if(fd->type == FD_FILE){ + ilock(fd->ip); + int cc = readi(fd->ip, addr, fd->off, n); + if(cc > 0) + fd->off += cc; + iunlock(fd->ip); + return cc; + } else { + panic("fd_read"); + return -1; + } +} + +// Close file descriptor. +void +fd_close(struct file *fd) +{ + acquire(&fd_table_lock); + + if(fd->ref < 1 || fd->type == FD_CLOSED) + panic("fd_close"); + + if(--fd->ref == 0){ + struct file dummy = *fd; + + fd->ref = 0; + fd->type = FD_CLOSED; + release(&fd_table_lock); + + if(dummy.type == FD_PIPE){ + pipe_close(dummy.pipe, dummy.writable); + } else if(dummy.type == FD_FILE){ + idecref(dummy.ip); + } else { + panic("fd_close"); + } + } else { + release(&fd_table_lock); + } +} + +// Get metadata about file descriptor. +int +fd_stat(struct file *fd, struct stat *st) +{ + if(fd->type == FD_FILE){ + ilock(fd->ip); + stati(fd->ip, st); + iunlock(fd->ip); + return 0; + } else + return -1; +} + +// Increment file descriptor reference count. +void +fd_incref(struct file *fd) +{ + acquire(&fd_table_lock); + if(fd->ref < 1 || fd->type == FD_CLOSED) + panic("fd_incref"); + fd->ref++; + release(&fd_table_lock); +} diff --git a/fd.h b/file.h diff --git a/pipe.c b/pipe.c @@ -4,7 +4,7 @@ #include "mmu.h" #include "proc.h" #include "defs.h" -#include "fd.h" +#include "file.h" #include "spinlock.h" #define PIPESIZE 512 diff --git a/proc.c b/proc.c @@ -2,7 +2,7 @@ #include "mmu.h" #include "x86.h" #include "param.h" -#include "fd.h" +#include "file.h" #include "proc.h" #include "defs.h" #include "spinlock.h" diff --git a/syscall.c b/syscall.c @@ -12,7 +12,7 @@ #include "fs.h" #include "fsvar.h" #include "elf.h" -#include "fd.h" +#include "file.h" #include "fcntl.h" // User code makes a system call with INT T_SYSCALL. diff --git a/sysfile.c b/sysfile.c @@ -12,7 +12,7 @@ #include "fs.h" #include "fsvar.h" #include "elf.h" -#include "fd.h" +#include "file.h" #include "fcntl.h" int diff --git a/sysproc.c b/sysproc.c @@ -12,7 +12,7 @@ #include "fs.h" #include "fsvar.h" #include "elf.h" -#include "fd.h" +#include "file.h" #include "fcntl.h" int