diff options
-rw-r--r-- | src/bucket.c | 18 | ||||
-rw-r--r-- | src/falloc.c | 5 | ||||
-rw-r--r-- | src/findkey.c | 5 | ||||
-rw-r--r-- | src/fullio.c | 23 | ||||
-rw-r--r-- | src/gdbmdefs.h | 2 | ||||
-rw-r--r-- | src/gdbmopen.c | 48 | ||||
-rw-r--r-- | src/gdbmstore.c | 9 | ||||
-rw-r--r-- | src/mmap.c | 6 | ||||
-rw-r--r-- | src/recover.c | 20 | ||||
-rw-r--r-- | src/update.c | 13 |
10 files changed, 79 insertions, 70 deletions
diff --git a/src/bucket.c b/src/bucket.c index 912a7b4..9f423f4 100644 --- a/src/bucket.c +++ b/src/bucket.c @@ -108,14 +108,17 @@ _gdbm_get_bucket (GDBM_FILE dbf, int dir_index) } rc = GDBM_DEBUG_OVERRIDE ("_gdbm_get_bucket:read-failure", _gdbm_full_read (dbf, dbf->bucket, dbf->header->bucket_size)); if (rc) { - _gdbm_fatal (dbf, gdbm_strerror (rc)); - GDBM_SET_ERRNO (dbf, rc, TRUE); + GDBM_DEBUG (GDBM_DEBUG_ERR, + "%s: error reading bucket: %s", + dbf->name, gdbm_db_strerror (dbf)); + dbf->need_recovery = TRUE; + _gdbm_fatal (dbf, gdbm_db_strerror (dbf)); return -1; } } return 0; } @@ -147,16 +150,17 @@ _gdbm_read_bucket_at (GDBM_FILE dbf, off_t off, hash_bucket *bucket, file_pos = __lseek (dbf, off, SEEK_SET); if (file_pos != off) { GDBM_SET_ERRNO (dbf, GDBM_FILE_SEEK_ERROR, TRUE); return -1; } - rc = _gdbm_full_read (dbf, bucket, size); - if (rc) + if (_gdbm_full_read (dbf, bucket, size)) { - GDBM_SET_ERRNO (dbf, rc, TRUE); + GDBM_DEBUG (GDBM_DEBUG_ERR, + "%s: error reading bucket: %s", + dbf->name, gdbm_db_strerror (dbf)); return -1; } return 0; } /* Split the current bucket. This includes moving all items in the bucket to @@ -391,13 +395,15 @@ _gdbm_write_bucket (GDBM_FILE dbf, cache_elem *ca_entry) return -1; } rc = GDBM_DEBUG_OVERRIDE ("_gdbm_write_bucket:write-failure", _gdbm_full_write (dbf, ca_entry->ca_bucket, dbf->header->bucket_size)); if (rc) { - GDBM_SET_ERRNO (dbf, rc, TRUE); + GDBM_DEBUG (GDBM_DEBUG_STORE|GDBM_DEBUG_ERR, + "%s: error writing bucket: %s", + dbf->name, gdbm_db_strerror (dbf)); _gdbm_fatal (dbf, gdbm_strerror (rc)); return -1; } ca_entry->ca_changed = FALSE; ca_entry->ca_data.hash_val = -1; diff --git a/src/falloc.c b/src/falloc.c index c5ffdc3..516a197 100644 --- a/src/falloc.c +++ b/src/falloc.c @@ -199,13 +199,12 @@ pop_avail_block (GDBM_FILE dbf) } rc = GDBM_DEBUG_OVERRIDE ("pop_avail_block:read-failure", _gdbm_full_read (dbf, new_blk, new_el.av_size)); if (rc) { - GDBM_SET_ERRNO (dbf, rc, TRUE); _gdbm_fatal (dbf, gdbm_strerror (rc)); return -1; } /* Add the elements from the new block to the header. */ index = 0; @@ -318,13 +317,15 @@ push_avail_block (GDBM_FILE dbf) } rc = GDBM_DEBUG_OVERRIDE ("push_avail_block:write-failure", _gdbm_full_write (dbf, temp, av_size)); if (rc) { - GDBM_SET_ERRNO (dbf, rc, TRUE); + GDBM_DEBUG (GDBM_DEBUG_STORE|GDBM_DEBUG_ERR, + "%s: error writing avail data: %s", + dbf->name, gdbm_db_strerror (dbf)); _gdbm_fatal (dbf, gdbm_strerror (rc)); return -1; } free (temp); diff --git a/src/findkey.c b/src/findkey.c index 135856b..b2e0e8c 100644 --- a/src/findkey.c +++ b/src/findkey.c @@ -76,13 +76,16 @@ _gdbm_read_entry (GDBM_FILE dbf, int elem_loc) } rc = GDBM_DEBUG_OVERRIDE ("_gdbm_read_entry:read-failure", _gdbm_full_read (dbf, data_ca->dptr, key_size+data_size)); if (rc) { - GDBM_SET_ERRNO2 (dbf, rc, TRUE, GDBM_DEBUG_LOOKUP); + GDBM_DEBUG (GDBM_DEBUG_ERR|GDBM_DEBUG_LOOKUP|GDBM_DEBUG_READ, + "%s: error reading entry: %s", + dbf->name, gdbm_db_strerror (dbf)); + dbf->need_recovery = TRUE; _gdbm_fatal (dbf, gdbm_strerror (rc)); return NULL; } return data_ca->dptr; } diff --git a/src/fullio.c b/src/fullio.c index adfff2c..0b65187 100644 --- a/src/fullio.c +++ b/src/fullio.c @@ -15,56 +15,61 @@ along with GDBM. If not, see <http://www.gnu.org/licenses/>. */ #include "autoconf.h" #include "gdbmdefs.h" /* Read exactly SIZE bytes of data into BUFFER. Return value is 0 on - success, GDBM_FILE_EOF, if not enough data is available, and - GDBM_FILE_READ_ERROR, if a read error occurs. In the latter case - errno keeps actual system error code. */ + success, and -1 on error. In the latter case, gdbm_errno is set to + GDBM_FILE_EOF, if not enough data is available, and to + GDBM_FILE_READ_ERROR, if a read error occurs. */ int _gdbm_full_read (GDBM_FILE dbf, void *buffer, size_t size) { char *ptr = buffer; while (size) { ssize_t rdbytes = __read (dbf, ptr, size); if (rdbytes == -1) { if (errno == EINTR) continue; - return GDBM_FILE_READ_ERROR; + GDBM_SET_ERRNO (dbf, GDBM_FILE_READ_ERROR, FALSE); + return -1; } if (rdbytes == 0) - return GDBM_FILE_EOF; + { + GDBM_SET_ERRNO (dbf, GDBM_FILE_EOF, FALSE); + return -1; + } ptr += rdbytes; size -= rdbytes; } return 0; } /* Write exactly SIZE bytes of data from BUFFER tp DBF. Return 0 on - success, and GDBM_FILE_READ_ERROR on error. In the latter case errno - will keep actual system error code. */ + success, and -1 (setting gdbm_errno to GDBM_FILE_READ_ERROR) on error. */ int _gdbm_full_write (GDBM_FILE dbf, void *buffer, size_t size) { char *ptr = buffer; while (size) { ssize_t wrbytes = __write (dbf, ptr, size); if (wrbytes == -1) { if (errno == EINTR) continue; - return GDBM_FILE_WRITE_ERROR; + GDBM_SET_ERRNO (dbf, GDBM_FILE_WRITE_ERROR, TRUE); + return -1; } if (wrbytes == 0) { errno = ENOSPC; - return GDBM_FILE_WRITE_ERROR; + GDBM_SET_ERRNO (dbf, GDBM_FILE_WRITE_ERROR, TRUE); + return -1; } ptr += wrbytes; size -= wrbytes; } return 0; } diff --git a/src/gdbmdefs.h b/src/gdbmdefs.h index e1c143d..286f3fc 100644 --- a/src/gdbmdefs.h +++ b/src/gdbmdefs.h @@ -242,13 +242,13 @@ struct gdbm_file_info /* Return immediately if the database needs recovery */ #define GDBM_ASSERT_CONSISTENCY(dbf, onerr) \ do \ { \ if (dbf->need_recovery) \ { \ - gdbm_set_errno (dbf, GDBM_NEED_RECOVERY, TRUE); \ + GDBM_SET_ERRNO (dbf, GDBM_NEED_RECOVERY, TRUE); \ return onerr; \ } \ } \ while (0) /* Debugging hooks */ diff --git a/src/gdbmopen.c b/src/gdbmopen.c index 101d497..e444bc1 100644 --- a/src/gdbmopen.c +++ b/src/gdbmopen.c @@ -54,13 +54,12 @@ gdbm_fd_open (int fd, const char *file_name, int block_size, int flags, void (*fatal_func) (const char *)) { GDBM_FILE dbf; /* The record to return. */ struct stat file_stat; /* Space for the stat information. */ off_t file_pos; /* Used with seeks. */ int index; /* Used as a loop index. */ - int rc; /* temporary error code */ /* Initialize the gdbm_errno variable. */ gdbm_set_errno (NULL, GDBM_NO_ERROR, FALSE); /* Get the status of the file. */ if (fstat (fd, &file_stat)) @@ -267,41 +266,44 @@ gdbm_fd_open (int fd, const char *file_name, int block_size, dbf->header->avail.count = 0; dbf->header->avail.next_block = 0; dbf->header->next_block = 4*dbf->header->block_size; /* Write initial configuration to the file. */ /* Block 0 is the file header and active avail block. */ - rc = _gdbm_full_write (dbf, dbf->header, dbf->header->block_size); - if (rc) + if (_gdbm_full_write (dbf, dbf->header, dbf->header->block_size)) { + GDBM_DEBUG (GDBM_DEBUG_OPEN|GDBM_DEBUG_ERR, + "%s: error writing header: %s", + dbf->name, gdbm_db_strerror (dbf)); if (!(flags & GDBM_CLOERROR)) dbf->desc = -1; SAVE_ERRNO (gdbm_close (dbf)); - gdbm_set_errno (NULL, rc, FALSE); return NULL; } /* Block 1 is the initial bucket directory. */ - rc = _gdbm_full_write (dbf, dbf->dir, dbf->header->dir_size); - if (rc) + if (_gdbm_full_write (dbf, dbf->dir, dbf->header->dir_size)) { + GDBM_DEBUG (GDBM_DEBUG_OPEN|GDBM_DEBUG_ERR, + "%s: error writing directory: %s", + dbf->name, gdbm_db_strerror (dbf)); if (!(flags & GDBM_CLOERROR)) dbf->desc = -1; SAVE_ERRNO (gdbm_close (dbf)); - gdbm_set_errno (NULL, rc, FALSE); return NULL; } /* Block 2 is the only bucket. */ - rc = _gdbm_full_write (dbf, dbf->bucket, dbf->header->bucket_size); - if (rc) + if (_gdbm_full_write (dbf, dbf->bucket, dbf->header->bucket_size)) { + GDBM_DEBUG (GDBM_DEBUG_OPEN|GDBM_DEBUG_ERR, + "%s: error writing bucket: %s", + dbf->name, gdbm_db_strerror (dbf)); if (!(flags & GDBM_CLOERROR)) dbf->desc = -1; SAVE_ERRNO (gdbm_close (dbf)); - gdbm_set_errno (NULL, rc, FALSE); return NULL; } /* Wait for initial configuration to be written to disk. */ __fsync (dbf); @@ -312,33 +314,27 @@ gdbm_fd_open (int fd, const char *file_name, int block_size, /* This is an old database. Read in the information from the file header and initialize the hash directory. */ gdbm_file_header partial_header; /* For the first part of it. */ /* Read the partial file header. */ - rc = _gdbm_full_read (dbf, &partial_header, sizeof (gdbm_file_header)); - if (rc) + if (_gdbm_full_read (dbf, &partial_header, sizeof (gdbm_file_header))) { GDBM_DEBUG (GDBM_DEBUG_ERR|GDBM_DEBUG_OPEN, "%s: error reading partial header: %s", - dbf->name, strerror (errno)); + dbf->name, gdbm_db_strerror (dbf)); if (!(flags & GDBM_CLOERROR)) dbf->desc = -1; SAVE_ERRNO (gdbm_close (dbf)); - gdbm_set_errno (NULL, rc, FALSE); return NULL; } /* Is the magic number good? */ if (partial_header.header_magic != GDBM_MAGIC && partial_header.header_magic != GDBM_OMAGIC) { - GDBM_DEBUG (GDBM_DEBUG_ERR|GDBM_DEBUG_OPEN, - "%s: unexpected magic: %#4x", - dbf->name, partial_header.header_magic); - if (!(flags & GDBM_CLOERROR)) dbf->desc = -1; gdbm_close (dbf); switch (partial_header.header_magic) { case GDBM_OMAGIC_SWAP: @@ -367,23 +363,21 @@ gdbm_fd_open (int fd, const char *file_name, int block_size, dbf->desc = -1; SAVE_ERRNO (gdbm_close (dbf)); GDBM_SET_ERRNO2 (NULL, GDBM_MALLOC_ERROR, FALSE, GDBM_DEBUG_OPEN); return NULL; } memcpy (dbf->header, &partial_header, sizeof (gdbm_file_header)); - rc = _gdbm_full_read (dbf, &dbf->header->avail.av_table[1], - dbf->header->block_size - sizeof (gdbm_file_header)); - if (rc) + if (_gdbm_full_read (dbf, &dbf->header->avail.av_table[1], + dbf->header->block_size - sizeof (gdbm_file_header))) { GDBM_DEBUG (GDBM_DEBUG_ERR|GDBM_DEBUG_OPEN, - "%s: error reading av_table", - dbf->name); + "%s: error reading av_table: %s", + dbf->name, gdbm_db_strerror (dbf)); if (!(flags & GDBM_CLOERROR)) dbf->desc = -1; SAVE_ERRNO (gdbm_close (dbf)); - gdbm_set_errno (NULL, rc, FALSE); return NULL; } /* Allocate space for the hash table directory. */ dbf->dir = (off_t *) malloc (dbf->header->dir_size); if (dbf->dir == NULL) @@ -403,22 +397,20 @@ gdbm_fd_open (int fd, const char *file_name, int block_size, dbf->desc = -1; SAVE_ERRNO (gdbm_close (dbf)); GDBM_SET_ERRNO2 (NULL, GDBM_FILE_SEEK_ERROR, FALSE, GDBM_DEBUG_OPEN); return NULL; } - rc = _gdbm_full_read (dbf, dbf->dir, dbf->header->dir_size); - if (rc) + if (_gdbm_full_read (dbf, dbf->dir, dbf->header->dir_size)) { GDBM_DEBUG (GDBM_DEBUG_ERR|GDBM_DEBUG_OPEN, "%s: error reading dir: %s", - dbf->name, strerror (errno)); + dbf->name, gdbm_db_strerror (dbf)); if (!(flags & GDBM_CLOERROR)) dbf->desc = -1; SAVE_ERRNO (gdbm_close (dbf)); - gdbm_set_errno (NULL, rc, FALSE); return NULL; } } #if HAVE_MMAP diff --git a/src/gdbmstore.c b/src/gdbmstore.c index 4cd7ad1..404687c 100644 --- a/src/gdbmstore.c +++ b/src/gdbmstore.c @@ -162,27 +162,26 @@ gdbm_store (GDBM_FILE dbf, datum key, datum content, int flags) rc = GDBM_DEBUG_OVERRIDE ("gdbm_store:write-1-failure", _gdbm_full_write (dbf, key.dptr, key.dsize)); if (rc) { GDBM_DEBUG (GDBM_DEBUG_STORE|GDBM_DEBUG_ERR, - "%s: writing key: %s", dbf->name, strerror (errno)); - gdbm_set_errno (dbf, rc, TRUE); + "%s: error writing key: %s", + dbf->name, gdbm_db_strerror (dbf)); _gdbm_fatal (dbf, gdbm_strerror (rc)); return -1; } rc = GDBM_DEBUG_OVERRIDE ("gdbm_store:write-2-failure", _gdbm_full_write (dbf, content.dptr, content.dsize)); if (rc) { GDBM_DEBUG (GDBM_DEBUG_STORE|GDBM_DEBUG_ERR, - "%s: writing content: %s", - dbf->name, strerror (errno)); - gdbm_set_errno (dbf, rc, TRUE); + "%s: error writing content: %s", + dbf->name, gdbm_db_strerror (dbf)); _gdbm_fatal (dbf, gdbm_strerror (rc)); return -1; } /* Current bucket has changed. */ dbf->cache_entry->ca_changed = TRUE; @@ -96,13 +96,13 @@ _gdbm_internal_remap (GDBM_FILE dbf, size_t size) p = mmap (NULL, dbf->mapped_size, flags, MAP_SHARED, dbf->desc, dbf->mapped_off); if (p == MAP_FAILED) { dbf->mapped_region = NULL; - gdbm_set_errno (dbf, GDBM_MALLOC_ERROR, FALSE); + GDBM_SET_ERRNO (dbf, GDBM_MALLOC_ERROR, FALSE); return -1; } dbf->mapped_region = p; return 0; } @@ -132,13 +132,13 @@ _gdbm_mapped_remap (GDBM_FILE dbf, off_t size, int flag) { off_t file_size, pos; if (_gdbm_file_size (dbf, &file_size)) { SAVE_ERRNO (_gdbm_mapped_unmap (dbf)); - gdbm_set_errno (dbf, GDBM_FILE_STAT_ERROR, FALSE); + GDBM_SET_ERRNO (dbf, GDBM_FILE_STAT_ERROR, FALSE); return -1; } if (flag == _REMAP_END && size < file_size) size = file_size; @@ -327,13 +327,13 @@ _gdbm_mapped_lseek (GDBM_FILE dbf, off_t offset, int whence) case SEEK_END: { off_t file_size; if (_gdbm_file_size (dbf, &file_size)) { - gdbm_set_errno (dbf, GDBM_FILE_STAT_ERROR, FALSE); + GDBM_SET_ERRNO (dbf, GDBM_FILE_STAT_ERROR, FALSE); return -1; } needle = file_size - offset; break; } } diff --git a/src/recover.c b/src/recover.c index 69644f9..ecf47c5 100644 --- a/src/recover.c +++ b/src/recover.c @@ -23,23 +23,23 @@ int gdbm_copy_meta (GDBM_FILE dst, GDBM_FILE src) { struct stat st; if (fstat (src->desc, &st)) { - gdbm_set_errno (src, GDBM_FILE_STAT_ERROR, src->need_recovery); + GDBM_SET_ERRNO (src, GDBM_FILE_STAT_ERROR, src->need_recovery); return -1; } if (fchown (dst->desc, st.st_uid, st.st_gid)) { - gdbm_set_errno (dst, GDBM_ERR_FILE_OWNER, dst->need_recovery); + GDBM_SET_ERRNO (dst, GDBM_ERR_FILE_OWNER, dst->need_recovery); return -1; } if (fchmod (dst->desc, st.st_mode & 0777)) { - gdbm_set_errno (dst, GDBM_ERR_FILE_MODE, dst->need_recovery); + GDBM_SET_ERRNO (dst, GDBM_ERR_FILE_MODE, dst->need_recovery); return -1; } return 0; } static char * @@ -114,29 +114,29 @@ _gdbm_finish_transfer (GDBM_FILE dbf, GDBM_FILE new_dbf, if (flags & GDBM_RCVR_BACKUP) { char *bkname = backup_name (dbf->name); if (!bkname) { SAVE_ERRNO (gdbm_close (new_dbf)); - gdbm_set_errno (NULL, GDBM_BACKUP_FAILED, FALSE); + GDBM_SET_ERRNO (NULL, GDBM_BACKUP_FAILED, FALSE); return -1; } if (rename (dbf->name, bkname) != 0) { SAVE_ERRNO (gdbm_close (new_dbf); free (bkname)); - gdbm_set_errno (NULL, GDBM_BACKUP_FAILED, FALSE); + GDBM_SET_ERRNO (NULL, GDBM_BACKUP_FAILED, FALSE); return -1; } rcvr->backup_name = bkname; } /* Move the new file to old name. */ if (rename (new_dbf->name, dbf->name) != 0) { - gdbm_set_errno (NULL, GDBM_REORGANIZE_FAILED, FALSE); + GDBM_SET_ERRNO (NULL, GDBM_REORGANIZE_FAILED, FALSE); gdbm_close (new_dbf); return -1; } /* Fix up DBF to have the correct information for the new file. */ if (dbf->file_locking) @@ -339,13 +339,13 @@ gdbm_recover (GDBM_FILE dbf, gdbm_recovery *rcvr, int flags) int rc; gdbm_recovery rs; /* Readers can not reorganize! */ if (dbf->read_write == GDBM_READER) { - gdbm_set_errno (dbf, GDBM_READER_CANT_REORGANIZE, dbf->need_recovery); + GDBM_SET_ERRNO (dbf, GDBM_READER_CANT_REORGANIZE, dbf->need_recovery); return -1; } /* Initialize gdbm_recovery structure */ if (!rcvr) { @@ -362,21 +362,21 @@ gdbm_recover (GDBM_FILE dbf, gdbm_recovery *rcvr, int flags) if ((flags & GDBM_RCVR_FORCE) || check_db (dbf)) { len = strlen (dbf->name); new_name = malloc (len + sizeof (TMPSUF)); if (!new_name) { - gdbm_set_errno (NULL, GDBM_MALLOC_ERROR, FALSE); + GDBM_SET_ERRNO (NULL, GDBM_MALLOC_ERROR, FALSE); return -1; } strcat (strcpy (new_name, dbf->name), TMPSUF); fd = mkstemp (new_name); if (fd == -1) { - gdbm_set_errno (NULL, GDBM_FILE_OPEN_ERROR, FALSE); + GDBM_SET_ERRNO (NULL, GDBM_FILE_OPEN_ERROR, FALSE); free (new_name); return -1; } new_dbf = gdbm_fd_open (fd, new_name, dbf->header->block_size, GDBM_WRCREAT @@ -384,13 +384,13 @@ gdbm_recover (GDBM_FILE dbf, gdbm_recovery *rcvr, int flags) | GDBM_CLOERROR, dbf->fatal_err); SAVE_ERRNO (free (new_name)); if (new_dbf == NULL) { - gdbm_set_errno (NULL, GDBM_REORGANIZE_FAILED, FALSE); + GDBM_SET_ERRNO (NULL, GDBM_REORGANIZE_FAILED, FALSE); return -1; } rc = run_recovery (dbf, new_dbf, rcvr, flags); if (rc == 0) diff --git a/src/update.c b/src/update.c index 90a6524..eb9f33b 100644 --- a/src/update.c +++ b/src/update.c @@ -31,24 +31,25 @@ write_header (GDBM_FILE dbf) int rc; file_pos = GDBM_DEBUG_OVERRIDE ("write_header:lseek-failure", __lseek (dbf, 0L, SEEK_SET)); if (file_pos != 0) { - gdbm_set_errno (dbf, GDBM_FILE_SEEK_ERROR, TRUE); + GDBM_SET_ERRNO2 (dbf, GDBM_FILE_SEEK_ERROR, TRUE, GDBM_DEBUG_STORE); _gdbm_fatal (dbf, _("lseek error")); return -1; } rc = GDBM_DEBUG_OVERRIDE ("write_header:write-failure", _gdbm_full_write (dbf, dbf->header, dbf->header->block_size)); if (rc) { - gdbm_set_errno (dbf, rc, TRUE); - gdbm_set_errno (dbf, rc, TRUE); + GDBM_DEBUG (GDBM_DEBUG_STORE|GDBM_DEBUG_ERR, + "%s: error writing header: %s", + dbf->name, gdbm_db_strerror (dbf)); return -1; } /* Sync the file if fast_write is FALSE. */ if (dbf->fast_write == FALSE) __fsync (dbf); @@ -96,22 +97,24 @@ _gdbm_end_update (GDBM_FILE dbf) if (dbf->directory_changed) { file_pos = GDBM_DEBUG_OVERRIDE ("_gdbm_end_update:lseek-failure", __lseek (dbf, dbf->header->dir, SEEK_SET)); if (file_pos != dbf->header->dir) { - gdbm_set_errno (dbf, GDBM_FILE_SEEK_ERROR, TRUE); + GDBM_SET_ERRNO2 (dbf, GDBM_FILE_SEEK_ERROR, TRUE, GDBM_DEBUG_STORE); _gdbm_fatal (dbf, _("lseek error")); return -1; } rc = GDBM_DEBUG_OVERRIDE ("_gdbm_end_update:write-dir-failure", _gdbm_full_write (dbf, dbf->dir, dbf->header->dir_size)); if (rc) { - gdbm_set_errno (dbf, rc, TRUE); + GDBM_DEBUG (GDBM_DEBUG_STORE|GDBM_DEBUG_ERR, + "%s: error writing directory: %s", + dbf->name, gdbm_db_strerror (dbf)); _gdbm_fatal (dbf, gdbm_strerror (rc)); return -1; } dbf->directory_changed = FALSE; if (!dbf->header_changed && dbf->fast_write == FALSE) |