diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gdbmdefs.h | 10 | ||||
-rw-r--r-- | src/gdbmopen.c | 26 | ||||
-rw-r--r-- | src/mmap.c | 6 |
3 files changed, 23 insertions, 19 deletions
diff --git a/src/gdbmdefs.h b/src/gdbmdefs.h index 28995de..b5922e3 100644 --- a/src/gdbmdefs.h +++ b/src/gdbmdefs.h @@ -204,5 +204,15 @@ struct gdbm_file_info { begins */ }; +/* Execute CODE without clobbering errno */ +#define SAVE_ERRNO(code) \ + do \ + { \ + int __ec = errno; \ + code; \ + errno = __ec; \ + } \ + while (0) \ + /* Now define all the routines in use. */ #include "proto.h" diff --git a/src/gdbmopen.c b/src/gdbmopen.c index 2029499..a8a488f 100644 --- a/src/gdbmopen.c +++ b/src/gdbmopen.c @@ -145,8 +145,8 @@ gdbm_open (const char *file, int block_size, int flags, int mode, } if (dbf->desc < 0) { - free (dbf->name); - free (dbf); + SAVE_ERRNO (free (dbf->name); + free (dbf)); gdbm_errno = GDBM_FILE_OPEN_ERROR; return NULL; } @@ -154,12 +154,10 @@ gdbm_open (const char *file, int block_size, int flags, int mode, /* Get the status of the file. */ if (fstat (dbf->desc, &file_stat)) { - int ec = errno; - close (dbf->desc); - free (dbf->name); - free (dbf); + SAVE_ERRNO (close (dbf->desc); + free (dbf->name); + free (dbf)); gdbm_errno = GDBM_FILE_STAT_ERROR; - errno = ec; return NULL; } @@ -286,7 +284,7 @@ gdbm_open (const char *file, int block_size, int flags, int mode, num_bytes = __write (dbf, dbf->header, dbf->header->block_size); if (num_bytes != dbf->header->block_size) { - gdbm_close (dbf); + SAVE_ERRNO (gdbm_close (dbf)); gdbm_errno = GDBM_FILE_WRITE_ERROR; return NULL; } @@ -295,7 +293,7 @@ gdbm_open (const char *file, int block_size, int flags, int mode, num_bytes = __write (dbf, dbf->dir, dbf->header->dir_size); if (num_bytes != dbf->header->dir_size) { - gdbm_close (dbf); + SAVE_ERRNO (gdbm_close (dbf)); gdbm_errno = GDBM_FILE_WRITE_ERROR; return NULL; } @@ -304,7 +302,7 @@ gdbm_open (const char *file, int block_size, int flags, int mode, num_bytes = __write (dbf, dbf->bucket, dbf->header->bucket_size); if (num_bytes != dbf->header->bucket_size) { - gdbm_close (dbf); + SAVE_ERRNO (gdbm_close (dbf)); gdbm_errno = GDBM_FILE_WRITE_ERROR; return NULL; } @@ -325,7 +323,7 @@ gdbm_open (const char *file, int block_size, int flags, int mode, num_bytes = __read (dbf, &partial_header, sizeof (gdbm_file_header)); if (num_bytes != sizeof (gdbm_file_header)) { - gdbm_close (dbf); + SAVE_ERRNO (gdbm_close (dbf)); gdbm_errno = GDBM_FILE_READ_ERROR; return NULL; } @@ -365,7 +363,7 @@ gdbm_open (const char *file, int block_size, int flags, int mode, dbf->header->block_size-sizeof (gdbm_file_header)); if (num_bytes != dbf->header->block_size-sizeof (gdbm_file_header)) { - gdbm_close (dbf); + SAVE_ERRNO (gdbm_close (dbf)); gdbm_errno = GDBM_FILE_READ_ERROR; return NULL; } @@ -383,7 +381,7 @@ gdbm_open (const char *file, int block_size, int flags, int mode, file_pos = __lseek (dbf, dbf->header->dir, L_SET); if (file_pos != dbf->header->dir) { - gdbm_close (dbf); + SAVE_ERRNO (gdbm_close (dbf)); gdbm_errno = GDBM_FILE_SEEK_ERROR; return NULL; } @@ -391,7 +389,7 @@ gdbm_open (const char *file, int block_size, int flags, int mode, num_bytes = __read (dbf, dbf->dir, dbf->header->dir_size); if (num_bytes != dbf->header->dir_size) { - gdbm_close (dbf); + SAVE_ERRNO (gdbm_close (dbf)); gdbm_errno = GDBM_FILE_READ_ERROR; return NULL; } @@ -134,10 +134,8 @@ _gdbm_mapped_remap (GDBM_FILE dbf, off_t size, int flag) if (_gdbm_file_size (dbf, &file_size)) { - int ec = errno; + SAVE_ERRNO (_gdbm_mapped_unmap (dbf)); gdbm_errno = GDBM_FILE_STAT_ERROR; - _gdbm_mapped_unmap (dbf); - errno = ec; return -1; } @@ -332,9 +330,7 @@ _gdbm_mapped_lseek (GDBM_FILE dbf, off_t offset, int whence) off_t file_size; if (_gdbm_file_size (dbf, &file_size)) { - int ec = errno; gdbm_errno = GDBM_FILE_STAT_ERROR; - errno = ec; return -1; } needle = file_size - offset; |