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);
}
} 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);
}
}
- 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 ) {
FDBVacuumFreeSpace(db);
header.lenfreespace = sizeof(FDBFreeSpace)*db->listcur;
+
ptr = findFreeSpace( db, header.lenfreespace );
if ( ptr ) {
if ( readLen(db, offset, &length) != FDB_OK )
return FDB_ERROR;
- addFreeSpace(db, offset, length);
+ addFreeSpace(db, offset, PTRALIGN(length));
return FDB_OK;
}
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;
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;
-
}