Mercurial > sos > sos
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);