67 typedef struct MKMAP_DB {
75 static void mkmap_db_after_close(
MKMAP *mp)
77 MKMAP_DB *mkmap = (MKMAP_DB *) mp;
79 if (mkmap->lock_fd >= 0 && close(mkmap->lock_fd) < 0)
80 msg_warn(
"close %s: %m", mkmap->lock_file);
86 static void mkmap_db_after_open(
MKMAP *mp)
88 MKMAP_DB *mkmap = (MKMAP_DB *) mp;
90 if (mkmap->lock_fd < 0) {
91 if ((mkmap->lock_fd = open(mkmap->lock_file, O_RDWR, 0644)) < 0)
92 msg_fatal(
"open lockfile %s: %m", mkmap->lock_file);
94 msg_fatal(
"lock %s: %m", mkmap->lock_file);
100 static MKMAP *mkmap_db_before_open(
const char *path,
101 DICT *(*db_open) (
const char *,
int,
int))
103 MKMAP_DB *mkmap = (MKMAP_DB *)
mymalloc(
sizeof(*mkmap));
129 mkmap->lock_file =
concatenate(path,
".db", (
char *) 0);
130 mkmap->mkmap.open = db_open;
131 mkmap->mkmap.after_open = mkmap_db_after_open;
132 mkmap->mkmap.after_close = mkmap_db_after_close;
141 if ((mkmap->lock_fd = open(mkmap->lock_file, O_RDWR, 0644)) < 0) {
143 msg_fatal(
"open %s: %m", mkmap->lock_file);
158 msg_fatal(
"lock %s: %m", mkmap->lock_file);
159 if (
fstat(mkmap->lock_fd, &st) < 0)
160 msg_fatal(
"fstat %s: %m", mkmap->lock_file);
161 if (st.st_size == 0) {
162 if (st.st_nlink > 0) {
163 if (unlink(mkmap->lock_file) < 0)
164 msg_fatal(
"cannot remove zero-length database file %s: %m",
166 msg_warn(
"removing zero-length database file: %s",
169 close(mkmap->lock_fd);
174 return (&mkmap->mkmap);
#define MYFLOCK_OP_EXCLUSIVE
MKMAP * mkmap_btree_open(const char *)
void msg_warn(const char *fmt,...)
int myflock(int fd, int lock_style, int operation)
NORETURN msg_fatal(const char *fmt,...)
char * concatenate(const char *arg0,...)
DICT * dict_btree_open(const char *, int, int)
MKMAP * mkmap_hash_open(const char *)
DICT * dict_hash_open(const char *, int, int)
void * mymalloc(ssize_t len)