Mercurial > sos > sos
changeset 80:2fb2138d8c83
Added the ability to delete a file
author | Jonathan Pevarnek <pevarnj@gmail.com> |
---|---|
date | Wed, 27 Apr 2011 20:52:56 -0400 |
parents | 5a60bc8e2cd0 |
children | cc10ad44c2c2 |
files | include/fs.h src/fs.c src/testFS.c |
diffstat | 3 files changed, 48 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/include/fs.h Wed Apr 27 11:21:19 2011 -0400 +++ b/include/fs.h Wed Apr 27 20:52:56 2011 -0400 @@ -54,6 +54,7 @@ ErrCode getFInfo(u32 n, void* de); ErrCode lookupFile(char *fname, u32 *fid); ErrCode makeFile(char *fname, u32 *fid); +ErrCode deleteFile(u32 fid); ErrCode fileAppend(u32 fid, void *data, u32 length); ErrCode getFileSize(u32 fid, u32 *size); ErrCode getFileData(u32 fid, void *ptr);
--- a/src/fs.c Wed Apr 27 11:21:19 2011 -0400 +++ b/src/fs.c Wed Apr 27 20:52:56 2011 -0400 @@ -102,6 +102,34 @@ return 0; } +ErrCode deleteFile(u32 fid) +{ + ErrCode err; + if(isError(err = setFileSize(fid, 0))) return err; + Direntry de; + u32 fileNo; + for(fileNo = 0; 1; fileNo++) { + if(isError(err = getFInfo(fileNo, &de))) return err; + else if(err == mkError(MODFS, OUTOFRANGE, WARN)) return mkError(MODFS, NOTFILE, ERROR); + if(de.inode == fid) break; + } + Inode *root = readFSBlock(rootLoc); + if(!root) return ERR_FSBLKREADFAIL; + u32 rootSize = root->size; + u32 numDE = rootSize/sizeof(Direntry); + Direntry *td = readFSBlock(root->blocks[fileNo/DEPBLK]); + if(!td) return ERR_FSBLKREADFAIL; + td += fileNo%DEPBLK; + Direntry *end = readFSBlock(numDE/DEPBLK); //this will fail if there is only + //space for one item in cache and + //the 2 DEs are in different blks + if(!end) return ERR_FSBLKREADFAIL; + end += numDE%DEPBLK; + *td = *end; + if(isError(err = setFileSize(rootLoc, rootSize - sizeof(Direntry)))) return err; + return 0; +} + ErrCode fileAppend(u32 fid, void *data, u32 length) { ErrCode err;
--- a/src/testFS.c Wed Apr 27 11:21:19 2011 -0400 +++ b/src/testFS.c Wed Apr 27 20:52:56 2011 -0400 @@ -31,7 +31,7 @@ if(isError(init_fs(0x100, __memsize))) goto END; while(1) { - sPrint("Please select a mode:\n0: show file text\n1: make new file\n2: write to file\n"); + sPrint("Please select a mode:\n0: show file text\n1: make new file\n2: write to file\n3: Delete File\n"); sGet(buffer, 30); int mode = atoi(buffer); switch(mode) { @@ -91,6 +91,24 @@ } } break; + case 3: + { + if(isError(listFiles())) sPrint("WARNING: ERROR IN READING FILE NAMES\n"); + char fname[28]; + sPrint("Please enter the file to delete: "); + getFname(fname); + u32 fid; + ErrCode err = lookupFile(fname, &fid); + if(isError(err)) { + if(errCode(err) == NOTFILE) sPrint("ERROR: Invalid file name\n"); + continue; + } + if(isError(deleteFile(fid))) { + sPrint("ERROR\n"); + continue; + } + } + break; } }