00001 #include "filesys/file.h"
00002
00003 #include <debug.h>
00004 #include "filesys/inode.h"
00005 #include "threads/malloc.h"
00006
00007
00008 struct file
00009 {
00010 struct inode *inode;
00011 off_t pos;
00012 bool deny_write;
00013 };
00014
00015
00016
00017
00018 struct file *
00019 file_open (struct inode *inode)
00020 {
00021 struct file *file = calloc (1, sizeof *file);
00022 if (inode != NULL && file != NULL)
00023 {
00024 file->inode = inode;
00025 file->pos = 0;
00026 file->deny_write = false;
00027 return file;
00028 }
00029 else
00030 {
00031 inode_close (inode);
00032 free (file);
00033 return NULL;
00034 }
00035 }
00036
00037
00038
00039 struct file *
00040 file_reopen (struct file *file)
00041 {
00042 return file_open (inode_reopen (file->inode));
00043 }
00044
00045
00046 void
00047 file_close (struct file *file)
00048 {
00049 if (file != NULL)
00050 {
00051 file_allow_write (file);
00052 inode_close (file->inode);
00053 free (file);
00054 }
00055 }
00056
00057
00058 struct inode *
00059 file_get_inode (struct file *file)
00060 {
00061 return file->inode;
00062 }
00063
00064
00065
00066
00067
00068
00069 off_t
00070 file_read (struct file *file, void *buffer, off_t size)
00071 {
00072 off_t bytes_read = inode_read_at (file->inode, buffer, size, file->pos);
00073 file->pos += bytes_read;
00074 return bytes_read;
00075 }
00076
00077
00078
00079
00080
00081
00082 off_t
00083 file_read_at (struct file *file, void *buffer, off_t size, off_t file_ofs)
00084 {
00085 return inode_read_at (file->inode, buffer, size, file_ofs);
00086 }
00087
00088
00089
00090
00091
00092
00093
00094
00095 off_t
00096 file_write (struct file *file, const void *buffer, off_t size)
00097 {
00098 off_t bytes_written = inode_write_at (file->inode, buffer, size, file->pos);
00099 file->pos += bytes_written;
00100 return bytes_written;
00101 }
00102
00103
00104
00105
00106
00107
00108
00109
00110 off_t
00111 file_write_at (struct file *file, const void *buffer, off_t size,
00112 off_t file_ofs)
00113 {
00114 return inode_write_at (file->inode, buffer, size, file_ofs);
00115 }
00116
00117
00118
00119 void
00120 file_deny_write (struct file *file)
00121 {
00122 ASSERT (file != NULL);
00123 if (!file->deny_write)
00124 {
00125 file->deny_write = true;
00126 inode_deny_write (file->inode);
00127 }
00128 }
00129
00130
00131
00132
00133 void
00134 file_allow_write (struct file *file)
00135 {
00136 ASSERT (file != NULL);
00137 if (file->deny_write)
00138 {
00139 file->deny_write = false;
00140 inode_allow_write (file->inode);
00141 }
00142 }
00143
00144
00145 off_t
00146 file_length (struct file *file)
00147 {
00148 ASSERT (file != NULL);
00149 return inode_length (file->inode);
00150 }
00151
00152
00153
00154 void
00155 file_seek (struct file *file, off_t new_pos)
00156 {
00157 ASSERT (file != NULL);
00158 ASSERT (new_pos >= 0);
00159 file->pos = new_pos;
00160 }
00161
00162
00163
00164 off_t
00165 file_tell (struct file *file)
00166 {
00167 ASSERT (file != NULL);
00168 return file->pos;
00169 }