diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2016-07-09 08:40:04 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2016-07-09 08:47:16 +0300 |
commit | 479a469033903a76b9c073806037dd66176f3da0 (patch) | |
tree | 2841b611288f9343868e6ded82909b096a62e121 /src | |
parent | 2efd8358711ab3ea6c0ecaab75d195837b4b3e37 (diff) | |
download | gdbm-479a469033903a76b9c073806037dd66176f3da0.tar.gz gdbm-479a469033903a76b9c073806037dd66176f3da0.tar.bz2 |
Per-database error state.
Last error code is stored in the database file structure as
well as in the global gdbm_errno. Special functions are provided
for retrieving and clearing the last error state.
* src/gdbmdefs.h (gdbm_file_info): New member: last_error
* src/gdbm.h.in (gdbm_last_errno, gdbm_set_errno)
(gdbm_clear_error): New protos.
* src/gdbmerrno.c (gdbm_last_errno, gdbm_set_errno)
(gdbm_clear_error): New functions
* NEWS: Update.
* compat/dbminit.c: Use gdbm_set_errno to set error state.
* compat/dbmopen.c: Likewise.
* src/bucket.c: Likewise.
* src/findkey.c: Likewise.
* src/gdbm_load.c: Likewise.
* src/gdbmcount.c: Likewise.
* src/gdbmdelete.c: Likewise.
* src/gdbmdump.c: Likewise.
* src/gdbmexists.c: Likewise.
* src/gdbmexp.c: Likewise.
* src/gdbmfetch.c: Likewise.
* src/gdbmimp.c: Likewise.
* src/gdbmload.c: Likewise.
* src/gdbmopen.c: Likewise.
* src/gdbmreorg.c: Likewise.
* src/gdbmseq.c: Likewise.
* src/gdbmsetopt.c: Likewise.
* src/gdbmstore.c: Likewise.
* src/gdbmsync.c: Likewise.
* src/mmap.c: Likewise.
Diffstat (limited to 'src')
-rw-r--r-- | src/bucket.c | 8 | ||||
-rw-r--r-- | src/findkey.c | 2 | ||||
-rw-r--r-- | src/gdbm.h.in | 4 | ||||
-rw-r--r-- | src/gdbm_load.c | 6 | ||||
-rw-r--r-- | src/gdbmcount.c | 5 | ||||
-rw-r--r-- | src/gdbmdefs.h | 6 | ||||
-rw-r--r-- | src/gdbmdelete.c | 4 | ||||
-rw-r--r-- | src/gdbmdump.c | 18 | ||||
-rw-r--r-- | src/gdbmerrno.c | 36 | ||||
-rw-r--r-- | src/gdbmexists.c | 4 | ||||
-rw-r--r-- | src/gdbmexp.c | 12 | ||||
-rw-r--r-- | src/gdbmfetch.c | 4 | ||||
-rw-r--r-- | src/gdbmimp.c | 12 | ||||
-rw-r--r-- | src/gdbmload.c | 14 | ||||
-rw-r--r-- | src/gdbmopen.c | 65 | ||||
-rw-r--r-- | src/gdbmreorg.c | 20 | ||||
-rw-r--r-- | src/gdbmseq.c | 10 | ||||
-rw-r--r-- | src/gdbmsetopt.c | 79 | ||||
-rw-r--r-- | src/gdbmstore.c | 12 | ||||
-rw-r--r-- | src/gdbmsync.c | 6 | ||||
-rw-r--r-- | src/mmap.c | 8 |
21 files changed, 199 insertions, 136 deletions
diff --git a/src/bucket.c b/src/bucket.c index c9a951c..ee0e157 100644 --- a/src/bucket.c +++ b/src/bucket.c | |||
@@ -1,8 +1,8 @@ | |||
1 | /* bucket.c - The routines for playing with hash buckets. */ | 1 | /* bucket.c - The routines for playing with hash buckets. */ |
2 | 2 | ||
3 | /* This file is part of GDBM, the GNU data base manager. | 3 | /* This file is part of GDBM, the GNU data base manager. |
4 | Copyright (C) 1990, 1991, 1993, 2007, 2011, 2013 Free Software Foundation, | 4 | Copyright (C) 1990, 1991, 1993, 2007, 2011, 2013, |
5 | Inc. | 5 | 2016 Free Software Foundation, Inc. |
6 | 6 | ||
7 | GDBM is free software; you can redistribute it and/or modify | 7 | GDBM is free software; you can redistribute it and/or modify |
8 | it under the terms of the GNU General Public License as published by | 8 | it under the terms of the GNU General Public License as published by |
@@ -131,13 +131,13 @@ _gdbm_read_bucket_at (GDBM_FILE dbf, off_t off, hash_bucket *bucket, | |||
131 | file_pos = __lseek (dbf, off, SEEK_SET); | 131 | file_pos = __lseek (dbf, off, SEEK_SET); |
132 | if (file_pos != off) | 132 | if (file_pos != off) |
133 | { | 133 | { |
134 | gdbm_errno = GDBM_FILE_SEEK_ERROR; | 134 | gdbm_set_errno (dbf, GDBM_FILE_SEEK_ERROR, 1); |
135 | return -1; | 135 | return -1; |
136 | } | 136 | } |
137 | rc = _gdbm_full_read (dbf, bucket, size); | 137 | rc = _gdbm_full_read (dbf, bucket, size); |
138 | if (rc) | 138 | if (rc) |
139 | { | 139 | { |
140 | gdbm_errno = rc; | 140 | gdbm_set_errno (dbf, rc, 1); |
141 | return -1; | 141 | return -1; |
142 | } | 142 | } |
143 | return 0; | 143 | return 0; |
diff --git a/src/findkey.c b/src/findkey.c index b4b3bd2..6b13fbf 100644 --- a/src/findkey.c +++ b/src/findkey.c | |||
@@ -149,7 +149,7 @@ _gdbm_findkey (GDBM_FILE dbf, datum key, char **ret_dptr, int *ret_hash_val) | |||
149 | } | 149 | } |
150 | 150 | ||
151 | /* If we get here, we never found the key. */ | 151 | /* If we get here, we never found the key. */ |
152 | gdbm_errno = GDBM_ITEM_NOT_FOUND; | 152 | gdbm_set_errno (dbf, GDBM_ITEM_NOT_FOUND, 0); |
153 | return -1; | 153 | return -1; |
154 | 154 | ||
155 | } | 155 | } |
diff --git a/src/gdbm.h.in b/src/gdbm.h.in index f8238b9..07ac4dc 100644 --- a/src/gdbm.h.in +++ b/src/gdbm.h.in | |||
@@ -177,6 +177,10 @@ typedef int gdbm_error; /* For compatibilities sake. */ | |||
177 | extern gdbm_error gdbm_errno; | 177 | extern gdbm_error gdbm_errno; |
178 | extern const char * const gdbm_errlist[]; | 178 | extern const char * const gdbm_errlist[]; |
179 | 179 | ||
180 | extern int gdbm_last_errno (GDBM_FILE dbf); | ||
181 | extern void gdbm_set_errno (GDBM_FILE dbf, gdbm_error ec, int fatal); | ||
182 | extern void gdbm_clear_error (GDBM_FILE dbf); | ||
183 | |||
180 | /* extra prototypes */ | 184 | /* extra prototypes */ |
181 | 185 | ||
182 | extern const char *gdbm_strerror (gdbm_error); | 186 | extern const char *gdbm_strerror (gdbm_error); |
diff --git a/src/gdbm_load.c b/src/gdbm_load.c index 260a601..fd404b9 100644 --- a/src/gdbm_load.c +++ b/src/gdbm_load.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* This file is part of GDBM, the GNU data base manager. | 1 | /* This file is part of GDBM, the GNU data base manager. |
2 | Copyright (C) 2011, 2013 Free Software Foundation, Inc. | 2 | Copyright (C) 2011, 2013, 2016 Free Software Foundation, Inc. |
3 | 3 | ||
4 | GDBM is free software; you can redistribute it and/or modify | 4 | GDBM is free software; you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by | 5 | it under the terms of the GNU General Public License as published by |
@@ -53,13 +53,13 @@ set_meta_info (GDBM_FILE dbf) | |||
53 | { | 53 | { |
54 | if (fchown (fd, owner_uid, owner_gid)) | 54 | if (fchown (fd, owner_uid, owner_gid)) |
55 | { | 55 | { |
56 | gdbm_errno = GDBM_ERR_FILE_OWNER; | 56 | gdbm_set_errno (dbf, GDBM_ERR_FILE_OWNER, 0); |
57 | return 1; | 57 | return 1; |
58 | } | 58 | } |
59 | } | 59 | } |
60 | if ((meta_mask & GDBM_META_MASK_MODE) && fchmod (fd, mode)) | 60 | if ((meta_mask & GDBM_META_MASK_MODE) && fchmod (fd, mode)) |
61 | { | 61 | { |
62 | gdbm_errno = GDBM_ERR_FILE_OWNER; | 62 | gdbm_set_errno (dbf, GDBM_ERR_FILE_OWNER, 0); |
63 | return 1; | 63 | return 1; |
64 | } | 64 | } |
65 | } | 65 | } |
diff --git a/src/gdbmcount.c b/src/gdbmcount.c index 8e22213..17016b2 100644 --- a/src/gdbmcount.c +++ b/src/gdbmcount.c | |||
@@ -1,7 +1,8 @@ | |||
1 | /* gdbmcount.c - get number of items in a gdbm file. */ | 1 | /* gdbmcount.c - get number of items in a gdbm file. */ |
2 | 2 | ||
3 | /* This file is part of GDBM, the GNU data base manager. | 3 | /* This file is part of GDBM, the GNU data base manager. |
4 | Copyright (C) 1993, 1994, 2007, 2011, 2013 Free Software Foundation, Inc. | 4 | Copyright (C) 1993, 1994, 2007, 2011, 2013, |
5 | 2016 Free Software Foundation, Inc. | ||
5 | 6 | ||
6 | GDBM is free software; you can redistribute it and/or modify | 7 | GDBM is free software; you can redistribute it and/or modify |
7 | it under the terms of the GNU General Public License as published by | 8 | it under the terms of the GNU General Public License as published by |
@@ -42,7 +43,7 @@ gdbm_count (GDBM_FILE dbf, gdbm_count_t *pcount) | |||
42 | sdir = malloc (dbf->header->dir_size); | 43 | sdir = malloc (dbf->header->dir_size); |
43 | if (!sdir) | 44 | if (!sdir) |
44 | { | 45 | { |
45 | gdbm_errno = GDBM_MALLOC_ERROR; | 46 | gdbm_set_errno (dbf, GDBM_MALLOC_ERROR, 0); |
46 | return -1; | 47 | return -1; |
47 | } | 48 | } |
48 | 49 | ||
diff --git a/src/gdbmdefs.h b/src/gdbmdefs.h index c62413b..e873117 100644 --- a/src/gdbmdefs.h +++ b/src/gdbmdefs.h | |||
@@ -159,6 +159,12 @@ struct gdbm_file_info { | |||
159 | 159 | ||
160 | /* Whether the database was open with GDBM_CLOEXEC flag */ | 160 | /* Whether the database was open with GDBM_CLOEXEC flag */ |
161 | unsigned cloexec :1; | 161 | unsigned cloexec :1; |
162 | |||
163 | /* Last error was fatal */ | ||
164 | unsigned fatal :1; | ||
165 | |||
166 | /* Last error number */ | ||
167 | int last_error; | ||
162 | 168 | ||
163 | /* Type of file locking in use. */ | 169 | /* Type of file locking in use. */ |
164 | enum { LOCKING_NONE = 0, LOCKING_FLOCK, LOCKING_LOCKF, | 170 | enum { LOCKING_NONE = 0, LOCKING_FLOCK, LOCKING_LOCKF, |
diff --git a/src/gdbmdelete.c b/src/gdbmdelete.c index 4396b14..7e2867d 100644 --- a/src/gdbmdelete.c +++ b/src/gdbmdelete.c | |||
@@ -39,12 +39,12 @@ gdbm_delete (GDBM_FILE dbf, datum key) | |||
39 | /* First check to make sure this guy is a writer. */ | 39 | /* First check to make sure this guy is a writer. */ |
40 | if (dbf->read_write == GDBM_READER) | 40 | if (dbf->read_write == GDBM_READER) |
41 | { | 41 | { |
42 | gdbm_errno = GDBM_READER_CANT_DELETE; | 42 | gdbm_set_errno (dbf, GDBM_READER_CANT_DELETE, 0); |
43 | return -1; | 43 | return -1; |
44 | } | 44 | } |
45 | 45 | ||
46 | /* Initialize the gdbm_errno variable. */ | 46 | /* Initialize the gdbm_errno variable. */ |
47 | gdbm_errno = GDBM_NO_ERROR; | 47 | gdbm_set_errno (dbf, GDBM_NO_ERROR, 0); |
48 | 48 | ||
49 | /* Find the item. */ | 49 | /* Find the item. */ |
50 | elem_loc = _gdbm_findkey (dbf, key, NULL, NULL); | 50 | elem_loc = _gdbm_findkey (dbf, key, NULL, NULL); |
diff --git a/src/gdbmdump.c b/src/gdbmdump.c index 1b374f3..cf1e2fc 100644 --- a/src/gdbmdump.c +++ b/src/gdbmdump.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* This file is part of GDBM, the GNU data base manager. | 1 | /* This file is part of GDBM, the GNU data base manager. |
2 | Copyright (C) 2011, 2013 Free Software Foundation, Inc. | 2 | Copyright (C) 2011, 2013, 2016 Free Software Foundation, Inc. |
3 | 3 | ||
4 | GDBM is free software; you can redistribute it and/or modify | 4 | GDBM is free software; you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by | 5 | it under the terms of the GNU General Public License as published by |
@@ -99,7 +99,7 @@ _gdbm_dump_ascii (GDBM_FILE dbf, FILE *fp) | |||
99 | { | 99 | { |
100 | free (key.dptr); | 100 | free (key.dptr); |
101 | free (data.dptr); | 101 | free (data.dptr); |
102 | gdbm_errno = rc; | 102 | gdbm_set_errno (dbf, rc, 0); |
103 | break; | 103 | break; |
104 | } | 104 | } |
105 | } | 105 | } |
@@ -139,11 +139,15 @@ gdbm_dump_to_file (GDBM_FILE dbf, FILE *fp, int format) | |||
139 | break; | 139 | break; |
140 | 140 | ||
141 | default: | 141 | default: |
142 | gdbm_set_errno (NULL, GDBM_BAD_OPEN_FLAGS, 0); | ||
142 | return EINVAL; | 143 | return EINVAL; |
143 | } | 144 | } |
144 | 145 | ||
145 | if (rc == 0 && ferror (fp)) | 146 | if (rc == 0 && ferror (fp)) |
146 | rc = gdbm_errno = GDBM_FILE_WRITE_ERROR; | 147 | { |
148 | gdbm_set_errno (NULL, GDBM_FILE_WRITE_ERROR, 0); | ||
149 | rc = -1; | ||
150 | } | ||
147 | 151 | ||
148 | return rc; | 152 | return rc; |
149 | } | 153 | } |
@@ -162,7 +166,7 @@ gdbm_dump (GDBM_FILE dbf, const char *filename, int fmt, int open_flags, | |||
162 | nfd = open (filename, O_WRONLY | O_CREAT | O_EXCL, mode); | 166 | nfd = open (filename, O_WRONLY | O_CREAT | O_EXCL, mode); |
163 | if (nfd == -1) | 167 | if (nfd == -1) |
164 | { | 168 | { |