diff --git a/src/sys/ubixfsv2/btree.cpp b/src/sys/ubixfsv2/btree.cpp index ee90d62..57e279b 100644 --- a/src/sys/ubixfsv2/btree.cpp +++ b/src/sys/ubixfsv2/btree.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include "btree.h" #include "inode.h" @@ -11,6 +12,7 @@ #define VERIFY(x, y, z, n) if ((x) != (y)) { cout << "verify " << z << " failed" << endl; PrintWholeTree(); } bTree::bTree(ubixfsInode * inode) : root(NULL) { + tag = 0; header.treeDepth = 1; header.treeWidth = 0; header.treeLeafCount = 0; @@ -415,7 +417,7 @@ newNode->magic1 = B_NODE_MAGIC_1; newNode->magic2 = B_NODE_MAGIC_2; newNode->parent = NULL; - + newNode->tag = ++tag; // this will start at 1 (0 is the header node) return newNode; } // bTree::allocEmptyNode @@ -609,15 +611,48 @@ return NULL; } // bTree::findLeafNode -off_t -bTree::saveNode(FILE * fd, bNode * node, void * tmpPtr, off_t parent) { - if (fd == NULL) return -1; - off_t myOffset = ftello(fd); - - for (int i = 0; i < node->used; i++) { +void +bTree::saveNode(FILE * fd, bNode * node, void * tmpPtr) { + + bNode * ptr = (bNode *)tmpPtr; + assert(tmpPtr); + assert(fd); + assert(node); + cout << "writing tag: " << node->tag << endl; + off_t myOffset = node->tag * sizeof(bNode); + + memcpy(tmpPtr, node, sizeof(bNode)); + + if (node->parent != NULL) + ptr->parent = (bNode *)(node->parent->tag * sizeof(bNode)); + else + ptr->parent = 0; + + for (unsigned int i = 0; i <= node->used; i++) { + bNode * bPtr = (bNode *)node->head[i]; + + if (bPtr != NULL) + ptr->head[i] = (void *) (bPtr->tag * sizeof(bNode)); + else + ptr->head[i] = (void *) ~0; + } // for i - + + cout << "fseeko() returned: " << fseeko(fd, myOffset, SEEK_SET) << endl; + + cout << "fwrite() returned: " << fwrite(ptr, sizeof(bNode), 1, fd) << endl; + + if (node->leaf) return; + + for (unsigned int i = 0; i <= node->used; i++) { + + if (node->head[i] != NULL) saveNode(fd, (bNode *)node->head[i], tmpPtr); + + } // for i + + return; } // bTree::saveNode + bool bTree::Save(const char * filename) { ubixfsInode * uPtr = NULL; @@ -625,15 +660,21 @@ FILE * fd = NULL; if ((fd = fopen(filename, "wb+")) == NULL) return false; - header.firstNodeOffset = 4096; +cout << "tags: " << tag; + lseek(fileno(fd), tag * sizeof(bNode), SEEK_END); + + header.firstNodeOffset = sizeof(bNode); header.firstDeleted = -1; - void * tmpPtr = malloc(4096); + void * tmpPtr = malloc(sizeof(bNode)); + assert(tmpPtr); uPtr = (ubixfsInode *)tmpPtr; - memset(tmpPtr, 0, 4096); + memset(tmpPtr, 0, sizeof(bNode)); memcpy(tmpPtr, &header, sizeof(header)); - fwrite(tmpPtr, 4096, 1, fd); + fwrite(tmpPtr, sizeof(bNode), 1, fd); + saveNode(fd, root, tmpPtr); fclose(fd); + free(tmpPtr); return true; } // bTree::Save diff --git a/src/sys/ubixfsv2/btree.h b/src/sys/ubixfsv2/btree.h index 3dfda94..c565df8 100644 --- a/src/sys/ubixfsv2/btree.h +++ b/src/sys/ubixfsv2/btree.h @@ -19,6 +19,7 @@ uInt32 magic1 __attribute__ ((packed)); uInt32 used __attribute__ ((packed)); bNode * parent __attribute__ ((packed)); + uInt64 tag __attribute__ ((packed)); char keys[B_MAX_KEYS][B_MAX_NAME_LENGTH] __attribute__ ((packed)); bool present[B_MAX_KEYS+1] __attribute__ ((packed)); void * head[(B_MAX_KEYS+1)*8/sizeof(void *)] __attribute__ ((packed)); @@ -26,13 +27,14 @@ uInt32 childCount[B_MAX_KEYS+1] __attribute__ ((packed)); uInt32 magic2 __attribute__ ((packed)); bool leaf __attribute__ ((packed)); - char reserved[143] __attribute__ ((packed)); + char reserved[135] __attribute__ ((packed)); } bNode; // bNode class bTree { protected: bNode * root; + uInt32 tag; bTreeHeader header; ubixfsInode * treeSearch(bNode *, const char *); ubixfsInode * inodeSearch(ubixfsInode *, const char *); @@ -41,7 +43,7 @@ void insertNode(bNode *, const char *, void *, void *); bNode * findLeafNode(bNode *, const char *); void Print(bNode *); - off_t saveNode(FILE *, bNode *, void *, off_t); + void saveNode(FILE *, bNode *, void *); public: bTree(ubixfsInode *); bTree(void) : root(NULL) { }; diff --git a/src/sys/ubixfsv2/btreeheader.h b/src/sys/ubixfsv2/btreeheader.h index 2aa7267..e1e4bb8 100644 --- a/src/sys/ubixfsv2/btreeheader.h +++ b/src/sys/ubixfsv2/btreeheader.h @@ -5,8 +5,8 @@ uInt32 treeDepth; uInt32 treeWidth; uInt32 treeLeafCount; - uInt32 firstNodeOffset; // used when tree is on disk - int32 firstDeleted; // used to point to an empty node + off_t firstNodeOffset; // used when tree is on disk + off_t firstDeleted; // used to point to an empty node } bTreeHeader; // bTreeHeader #endif /* !BTREEHEADER_H */ diff --git a/src/sys/ubixfsv2/main.cpp b/src/sys/ubixfsv2/main.cpp index 5209fc9..f15c50c 100644 --- a/src/sys/ubixfsv2/main.cpp +++ b/src/sys/ubixfsv2/main.cpp @@ -147,6 +147,7 @@ cout << sizeof(struct diskSuperBlock) << endl; // tree->Info(); + tree->Save("tree.dat"); free(inode); delete tree; return 0;