add correct header
[tedtools.git] / flatdb.c
index 05dbe34..10b3848 100644 (file)
--- a/flatdb.c
+++ b/flatdb.c
@@ -116,6 +116,10 @@ FDBOpen(FDB *db, char *file, int readonly) {
        if ( readonly ) {
                db->readonly=1;
                db->fd = open(file, O_RDONLY);
+               if ( db->fd < 0 ) {
+                       tlog(TL_CRIT,"FDBOpen: open failed: %s",strerror(errno));
+                       return FDB_ERROR;
+               }
                if ( flock( db->fd, LOCK_SH ) < 0 ) {
                        tlog(TL_CRIT,"FDBOpen: flock failed: %s",strerror(errno));
                        close(db->fd);
@@ -123,6 +127,10 @@ FDBOpen(FDB *db, char *file, int readonly) {
                } 
        } else {
                db->fd = open(file, O_CREAT | O_RDWR, 0666);
+               if ( db->fd < 0 ) {
+                       tlog(TL_CRIT,"FDBOpen: open failed: %s",strerror(errno));
+                       return FDB_ERROR;
+               }
                if ( flock( db->fd, LOCK_EX ) < 0 ) {
                        tlog(TL_CRIT,"FDBOpen: flock failed: %s",strerror(errno));
                        close(db->fd);
@@ -130,12 +138,6 @@ FDBOpen(FDB *db, char *file, int readonly) {
                } 
        }
 
-       if ( db->fd < 0 ) {
-               memset(db, 0, sizeof(FDB));
-               tlog(TL_CRIT,"FDBOpen: open failed: %s", strerror(errno));
-               return FDB_ERROR;
-       }
-
        rc = read(db->fd, &header, sizeof(FDBHeader));
 
        if ( rc<0 ) {
@@ -208,6 +210,7 @@ FDBClose(FDB *db) {
                        FDBVacuumFreeSpace(db);
 
                        header.lenfreespace = sizeof(FDBFreeSpace)*db->listcur;
+
                        ptr = findFreeSpace( db, header.lenfreespace );
                
                        if ( ptr ) {
@@ -263,7 +266,7 @@ FDBDelete(FDB *db, off_t offset, size_t length) {
                if ( readLen(db, offset, &length) != FDB_OK )
                        return FDB_ERROR;
 
-       addFreeSpace(db, offset, length);
+       addFreeSpace(db, offset, PTRALIGN(length));
 
        return FDB_OK;
 }
@@ -309,11 +312,14 @@ FDBGet(FDB *db, off_t offset, size_t length, FDBRecord **record) {
 int 
 FDBPut(FDB *db, FDBRecord *record, off_t *offset ) {
        FDBFreeSpace *ptr;
+       size_t  aligned;
 
        if ( db->readonly )
                return FDB_ERROR;
 
-       ptr = findFreeSpace( db, record->length ); 
+       aligned = PTRALIGN(record->length);
+
+       ptr = findFreeSpace( db, aligned ); 
        if ( ptr ) {
                *offset = ptr->offset;
                ptr->length -= record->length;
@@ -332,9 +338,13 @@ FDBPut(FDB *db, FDBRecord *record, off_t *offset ) {
 
        if ( write(db->fd, record, record->length) != record->length ) 
                tlog(TL_CRIT|TL_EXIT,"FDBPut: write failed: %s", strerror(errno));
+       if ( record->length != aligned ) {
+               char    buf[] = {0, 0, 0, 0, 0, 0, 0, 0};
+               if ( write(db->fd, buf, aligned - record->length) != (aligned - record->length) ) 
+                       tlog(TL_CRIT|TL_EXIT,"FDBPut: write failed: %s", strerror(errno));
+       }
 
        return FDB_OK;
-
 }