projects
/
tedtools.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
c26ecb5
)
Add linux compatibility - 2
author
teodor
<teodor>
Tue, 5 Oct 2004 08:25:25 +0000
(08:25 +0000)
committer
teodor
<teodor>
Tue, 5 Oct 2004 08:25:25 +0000
(08:25 +0000)
flatdb.c
patch
|
blob
|
history
diff --git
a/flatdb.c
b/flatdb.c
index
79a1ec6
..
05dbe34
100644
(file)
--- a/
flatdb.c
+++ b/
flatdb.c
@@
-34,6
+34,7
@@
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
+#include <sys/file.h>
#include "tlog.h"
#include "tmalloc.h"
#include "tlog.h"
#include "tmalloc.h"
@@
-114,9
+115,19
@@
FDBOpen(FDB *db, char *file, int readonly) {
if ( readonly ) {
db->readonly=1;
if ( readonly ) {
db->readonly=1;
- db->fd = open(file, O_RDONLY | O_SHLOCK);
+ db->fd = open(file, O_RDONLY);
+ if ( flock( db->fd, LOCK_SH ) < 0 ) {
+ tlog(TL_CRIT,"FDBOpen: flock failed: %s",strerror(errno));
+ close(db->fd);
+ return FDB_ERROR;
+ }
} else {
} else {
- db->fd = open(file, O_CREAT | O_RDWR | O_EXLOCK, 0666);
+ db->fd = open(file, O_CREAT | O_RDWR, 0666);
+ if ( flock( db->fd, LOCK_EX ) < 0 ) {
+ tlog(TL_CRIT,"FDBOpen: flock failed: %s",strerror(errno));
+ close(db->fd);
+ return FDB_ERROR;
+ }
}
if ( db->fd < 0 ) {
}
if ( db->fd < 0 ) {
@@
-128,16
+139,19
@@
FDBOpen(FDB *db, char *file, int readonly) {
rc = read(db->fd, &header, sizeof(FDBHeader));
if ( rc<0 ) {
rc = read(db->fd, &header, sizeof(FDBHeader));
if ( rc<0 ) {
+ flock( db->fd, LOCK_UN );
close(db->fd);
tlog(TL_CRIT,"FDBOpen: read failed: %s", strerror(errno));
return FDB_ERROR;
} else if ( rc==0 ) {
memset(&header, 0, sizeof(FDBHeader));
} else if ( rc != sizeof(FDBHeader) ) {
close(db->fd);
tlog(TL_CRIT,"FDBOpen: read failed: %s", strerror(errno));
return FDB_ERROR;
} else if ( rc==0 ) {
memset(&header, 0, sizeof(FDBHeader));
} else if ( rc != sizeof(FDBHeader) ) {
+ flock( db->fd, LOCK_UN );
close(db->fd);
tlog(TL_CRIT,"FDBOpen: header fault: %d bytes only", rc);
return FDB_ERROR;
} else if ( header.isopened ) {
close(db->fd);
tlog(TL_CRIT,"FDBOpen: header fault: %d bytes only", rc);
return FDB_ERROR;
} else if ( header.isopened ) {
+ flock( db->fd, LOCK_UN );
close(db->fd);
tlog(TL_CRIT,"FDBOpen: file wasn't closed correctly");
return FDB_ERROR;
close(db->fd);
tlog(TL_CRIT,"FDBOpen: file wasn't closed correctly");
return FDB_ERROR;
@@
-151,6
+165,7
@@
FDBOpen(FDB *db, char *file, int readonly) {
if ( lseek(db->fd, header.freespace, SEEK_SET)!=header.freespace ||
read( db->fd, db->space, header.lenfreespace ) != header.lenfreespace ) {
if ( lseek(db->fd, header.freespace, SEEK_SET)!=header.freespace ||
read( db->fd, db->space, header.lenfreespace ) != header.lenfreespace ) {
+ flock( db->fd, LOCK_UN );
close(db->fd);
tlog(TL_CRIT,"FDBOpen: free space read failed: %s", strerror(errno));
return FDB_ERROR;
close(db->fd);
tlog(TL_CRIT,"FDBOpen: free space read failed: %s", strerror(errno));
return FDB_ERROR;
@@
-168,6
+183,7
@@
FDBOpen(FDB *db, char *file, int readonly) {
if ( lseek(db->fd, 0, SEEK_SET)!=0 ||
write(db->fd, &header, sizeof(FDBHeader)) != sizeof(FDBHeader) ||
fsync(db->fd) ) {
if ( lseek(db->fd, 0, SEEK_SET)!=0 ||
write(db->fd, &header, sizeof(FDBHeader)) != sizeof(FDBHeader) ||
fsync(db->fd) ) {
+ flock( db->fd, LOCK_UN );
close(db->fd);
if ( db->space ) tfree( db->space );
tlog(TL_CRIT,"FDBOpen: can't modify header: %s", strerror(errno));
close(db->fd);
if ( db->space ) tfree( db->space );
tlog(TL_CRIT,"FDBOpen: can't modify header: %s", strerror(errno));
@@
-217,6
+233,7
@@
FDBClose(FDB *db) {
tlog(TL_CRIT|TL_EXIT,"FDBClose: header write failed: %s", strerror(errno));
}
tlog(TL_CRIT|TL_EXIT,"FDBClose: header write failed: %s", strerror(errno));
}
+ flock( db->fd, LOCK_UN );
close(db->fd);
if ( db->space )
close(db->fd);
if ( db->space )