From 9936bffa45c928ead9660a0df32d08a50b2b09c2 Mon Sep 17 00:00:00 2001 From: rsc Date: Wed, 6 Sep 2006 18:40:28 +0000 Subject: fd.* -> file.* --- Makefile | 4 +- fd.c | 150 -------------------------------------------------------------- fd.h | 9 ---- file.c | 150 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ file.h | 9 ++++ pipe.c | 2 +- proc.c | 2 +- syscall.c | 2 +- sysfile.c | 2 +- sysproc.c | 2 +- 10 files changed, 166 insertions(+), 166 deletions(-) delete mode 100644 fd.c delete mode 100644 fd.h create mode 100644 file.c create mode 100644 file.h diff --git a/Makefile b/Makefile index 9d1e1d6..ae45363 100644 --- 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 deleted file mode 100644 index 9ec3038..0000000 --- a/fd.c +++ /dev/null @@ -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/fd.h b/fd.h deleted file mode 100644 index 15d6b78..0000000 --- a/fd.h +++ /dev/null @@ -1,9 +0,0 @@ -struct file { - enum { FD_CLOSED, FD_NONE, FD_PIPE, FD_FILE } type; - int ref; // reference count - char readable; - char writable; - struct pipe *pipe; - struct inode *ip; - uint off; -}; diff --git a/file.c b/file.c new file mode 100644 index 0000000..fd04383 --- /dev/null +++ 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/file.h b/file.h new file mode 100644 index 0000000..15d6b78 --- /dev/null +++ b/file.h @@ -0,0 +1,9 @@ +struct file { + enum { FD_CLOSED, FD_NONE, FD_PIPE, FD_FILE } type; + int ref; // reference count + char readable; + char writable; + struct pipe *pipe; + struct inode *ip; + uint off; +}; diff --git a/pipe.c b/pipe.c index 2864432..3b2f6b8 100644 --- 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 index 066ac77..34b353b 100644 --- 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 index f75714a..4cff057 100644 --- 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 index d123a96..d0c7afa 100644 --- 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 index f648c0e..43ee973 100644 --- 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 -- cgit v1.2.3