diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2018-08-31 11:26:31 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2018-08-31 11:26:31 +0300 |
commit | 2ff4ae9c745d4b9e6ee36468c81554027f66c35b (patch) | |
tree | 4a6012ba90fc9c4fc9da8bade6fb943efc38d1a0 /src/gdbmopen.c | |
parent | 778cc81d55aecd6344d577919cec73e4e6980e2e (diff) | |
download | gdbm-2ff4ae9c745d4b9e6ee36468c81554027f66c35b.tar.gz gdbm-2ff4ae9c745d4b9e6ee36468c81554027f66c35b.tar.bz2 |
Various bugfixes.
* compat/dbmopen.c (ndbm_open_dir_file0): Ignore ENOENT.
* src/falloc.c (push_avail_block): Free temporary storage no matter
what return status.
* src/gdbm.h.in (GDBM_FILE_TRUNCATE_ERROR): New error code.
* src/gdbmdump.c (_gdbm_dump_ascii): Initialize rc.
* src/gdbmerrno.c: Handle new error.code
* src/gdbmload.c (gdbm_load_bdb_dump): Initialize rc
* src/gdbmopen.c (_gdbm_ftruncate): New function.
(gdbm_fd_open): Use _gdbm_ftruncate. Check its return.
* src/gdbmseq.c (gdbm_firstkey): Initialize dsize
* src/gdbmtool.c (command_generator): Check if cmd is NULL.
(shouldn't happen, but anyways).
* src/mmap.c (_gdbm_mapped_lseek): Check for vailidity of the 'whence'
parameter.
* src/systems.h (TRUNCATE): Remove macro.
* src/util.c (vgetyn): Remove unnecessary assignment.
Diffstat (limited to 'src/gdbmopen.c')
-rw-r--r-- | src/gdbmopen.c | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/src/gdbmopen.c b/src/gdbmopen.c index 908887c..7ec57e7 100644 --- a/src/gdbmopen.c +++ b/src/gdbmopen.c @@ -199,6 +199,21 @@ validate_header (gdbm_file_header const *hdr, struct stat const *st) return 0; } +/* Do we have ftruncate? */ +static inline int +_gdbm_ftruncate (GDBM_FILE dbf) +{ +#if HAVE_FTRUNCATE + return ftruncate (dbf->desc, 0); +#else + int fd; + fd = open (dbf->name, O_RDWR|O_TRUNC, mode); + if (fd == -1) + return -1; + return close (fd); +#endif +} + GDBM_FILE gdbm_fd_open (int fd, const char *file_name, int block_size, int flags, void (*fatal_func) (const char *)) @@ -320,14 +335,22 @@ gdbm_fd_open (int fd, const char *file_name, int block_size, now time to truncate the file. */ if ((flags & GDBM_OPENMASK) == GDBM_NEWDB && file_stat.st_size != 0) { - TRUNCATE (dbf); - if (fstat (dbf->desc, &file_stat)) + if (_gdbm_ftruncate (dbf)) + { + GDBM_SET_ERRNO2 (dbf, GDBM_FILE_TRUNCATE_ERROR, FALSE, + GDBM_DEBUG_OPEN); + } + else if (fstat (dbf->desc, &file_stat)) + { + GDBM_SET_ERRNO2 (dbf, GDBM_FILE_STAT_ERROR, FALSE, GDBM_DEBUG_OPEN); + } + + if (gdbm_last_errno (dbf)) { if (flags & GDBM_CLOERROR) close (dbf->desc); free (dbf->name); free (dbf); - GDBM_SET_ERRNO2 (NULL, GDBM_FILE_STAT_ERROR, FALSE, GDBM_DEBUG_OPEN); return NULL; } } |