changeset 66:b30006e3fb42

Changed how error returns are added when there is state to clean up When there is state to clean up, I set a variable (ret) equal to the "error code" and goto the part of the code that cleans up the state
author Jonathan Pevarnek <pevarnj@gmail.com>
date Thu, 21 Apr 2011 23:13:03 -0400
parents cd108c0a9030
children 9816d3510467
files src/fs.c src/testFS.c
diffstat 2 files changed, 56 insertions(+), 39 deletions(-) [+]
line wrap: on
line diff
--- a/src/fs.c	Thu Apr 21 22:28:17 2011 -0400
+++ b/src/fs.c	Thu Apr 21 23:13:03 2011 -0400
@@ -45,12 +45,13 @@
 //this lists all the files
 u32 listFiles()
 {
+	u32 ret = 0;
 	size_t i;
 	Inode *rootINode = malloc(sizeof(Inode));
 	if(!rootINode) return -1;
 	if(getBlockData(rootLoc, rootINode)) {
-		free(rootINode);
-		return -1;
+		ret = -1;
+		goto end;
 	}
 
 	u32 NFiles = rootINode->size/sizeof(Direntry);
@@ -60,14 +61,16 @@
 		if(!(i%DEPBLK)) {
 			dp = readFSBlock(rootINode->blocks[i/DEPBLK]);
 			if(!dp) {
-				free(rootINode);
-				return -1;
+				ret = -1;
+				goto end;
 			}
 		}
 		printFname(dp->fname), putline("\n", 1);
 	}
+
+end:
 	free(rootINode);
-	return 0;
+	return ret;
 }
 
 //This returns the "file ID" of a specific file
@@ -75,12 +78,13 @@
 {
 	//XXX XXX XXX TODO TODO XXX XXX XXX
 	//XXX MASSIVE CODE DUPLICATION XXX
+	u32 ret = 0;
 	size_t i;
 	Inode *rootINode = malloc(sizeof(Inode));
 	if(!rootINode) return -1;
 	if(getBlockData(rootLoc, rootINode)) {
-		free(rootINode);
-		return -1;
+		ret = -1;
+		goto end;
 	}
 
 	u32 NFiles = rootINode->size/sizeof(Direntry);
@@ -90,14 +94,16 @@
 		if(!(i%DEPBLK)) {
 			dp = readFSBlock(rootINode->blocks[i/DEPBLK]);
 			if(!dp) {
-				free(rootINode);
-				return -1;
+				ret = -1;
+				goto end;
 			}
 		}
 		if(!fnameCmp(fname, dp->fname)) return dp->inode; //XXX THIS IS THE ONLY NON DUPLICATED LINE XXX
 	}
+
+end:
 	free(rootINode);
-	return 0;
+	return ret;
 }
 
 //PRECON:  fid is a valid file id
@@ -114,20 +120,21 @@
 //         fid
 int getFileData(u32 fid, void *ptr)
 {
+	int ret = 0;
 	int i;
 	Inode *inPtr = malloc(sizeof(Inode));
 	if(!inPtr) return -1;
 	if(getBlockData(fid, inPtr)) {
-		free(inPtr);
-		return -1;
+		ret = -1;
+		goto end;
 	}
 
 	u32 size = inPtr->size;
 	for(i = 0; i < inPtr->nblocks; i++) {
 		Inode *filePtr = readFSBlock(inPtr->blocks[i]);
 		if(!filePtr) {
-			free(inPtr);
-			return -1;
+			ret = -1;
+			goto end;
 		}
 		memcpy(ptr, filePtr, Min_u32(size, FSBLKSIZE));
 		sync(inPtr->blocks[i]); //update the content of the actual file on disk
@@ -135,29 +142,32 @@
 		size -= FSBLKSIZE;
 	}
 	if(writeFSBlock(fid, inPtr)) {
-		free(inPtr);
-		return -1;
+		ret = -1;
+		goto end;
 	}
+
+end:
 	free(inPtr);
-	return 0;
+	return ret;
 }
 
 int setFileData(u32 fid, const void *ptr, size_t size)
 {
+	int ret = 0;
 	unsigned int i;
 	if(setFileSize(fid, size)) return -1; //TODO efficiency (talk to Jeff)
 	Inode *inPtr = malloc(sizeof(Inode));
 	if(!inPtr) return -1;
 	if(getBlockData(fid, inPtr)) {
-		free(inPtr);
-		return -1;
+		ret = -1;
+		goto end;
 	}
 
 	for(i = 0; i < inPtr->nblocks; i++) {
 		Inode *filePtr = readFSBlock(inPtr->blocks[i]);
 		if(!filePtr) {
-			free(inPtr);
-			return -1;
+			ret = -1;
+			goto end;
 		}
 		memcpy(filePtr, ptr, Min_u32(size, FSBLKSIZE));
 		ptr += FSBLKSIZE;
@@ -165,15 +175,17 @@
 	}
 
 	if(setTod(inPtr)) { //sadly, this needs to be updated...
-		free(inPtr);
-		return -1;
+		ret = -1;
+		goto end;
 	}
 	if(writeFSBlock(fid, inPtr)) {
-		free(inPtr);
-		return -1;
+		ret = -1;
+		goto end;
 	}
+
+end:
 	free(inPtr);
-	return 0;
+	return ret;
 }
 
 //sets the file to have a size equal to size.  The data will be preserved if
@@ -181,21 +193,22 @@
 //currently smaller
 static int setFileSize(u32 fid, size_t size)
 {
+	int ret = 0;
 	unsigned int i, j;
 	u16 neededBlocks = (size + FSBLKSIZE - 1)/FSBLKSIZE;
-	if(neededBlocks > MAXBLOCKS) return -1;
+	if(neededBlocks > MAXBLOCKS) goto final;
 	Inode *inPtr = malloc(sizeof(Inode));
-	if(!inPtr) return -1;
+	if(!inPtr) goto final;
 	if(getBlockData(fid, inPtr)) {
-		free(inPtr);
-		return -1;
+		ret = -1;
+		goto end;
 	}
 
 	if(inPtr->nblocks >= neededBlocks) { //get rid of some blocks
 		for(i = neededBlocks; i < inPtr->nblocks; i++) { //if it is equal, will skip this loop
 			if(setBlockAt(inPtr->blocks[i], 0)) {
-				free(inPtr);
-				return -1;
+				ret = -1;
+				goto end;
 			}
 		}
 	} else { //there are fewer blocks
@@ -204,23 +217,26 @@
 			for(j = inPtr->blocks[i - 1]; inPtr->blocks[i] == 0; j++)
 				if(!isBlockAt(j)) inPtr->blocks[i] = j;
 			if(setBlockAt(inPtr->blocks[i], 1)) {
-				free(inPtr);
-				return -1;
+				ret = -1;
+				goto end;
 			}
 		}
 	}
 	inPtr->nblocks = neededBlocks;
 	inPtr->size = size;
 	if(setTod(inPtr)) {
-		free(inPtr);
-		return -1;
+		ret = -1;
+		goto end;
 	}
 	if(writeFSBlock(fid, inPtr)) {
-		free(inPtr);
-		return -1;
+		ret = -1;
+		goto end;
 	}
+
+end:
 	free(inPtr);
-	return 0;
+final:
+	return ret;
 }
 
 short isBlockAt(u32 block)
--- a/src/testFS.c	Thu Apr 21 22:28:17 2011 -0400
+++ b/src/testFS.c	Thu Apr 21 23:13:03 2011 -0400
@@ -26,6 +26,7 @@
 		u32 fileSize;
 		if(getFileSize(fid, &fileSize)) continue;
 		char *text = malloc(fileSize);
+		if(!text) continue;
 		if(getFileData(fid, text)) continue;
 		dumpText(text, fileSize);
 		free(text);