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;
 		}
 	}