summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authornicm <>2016-09-04 16:56:02 +0000
committernicm <>2016-09-04 16:56:02 +0000
commitc97db0cdd2e66e4e777a54ed7a6836d81a30d8e2 (patch)
tree1d157a43748660f622e2a5cb7be066097f3cea4b /src
parentb713c4422dc21e06cdd9c33f6bdb0583dbb23903 (diff)
downloadopenbsd-c97db0cdd2e66e4e777a54ed7a6836d81a30d8e2.tar.gz
openbsd-c97db0cdd2e66e4e777a54ed7a6836d81a30d8e2.tar.bz2
openbsd-c97db0cdd2e66e4e777a54ed7a6836d81a30d8e2.zip
Set errno more consistently, and fix a warning, ok tedu
Diffstat (limited to 'src')
-rw-r--r--src/lib/libc/stdlib/icdb.c50
1 files changed, 29 insertions, 21 deletions
diff --git a/src/lib/libc/stdlib/icdb.c b/src/lib/libc/stdlib/icdb.c
index e135bf025e..2ddd9db48c 100644
--- a/src/lib/libc/stdlib/icdb.c
+++ b/src/lib/libc/stdlib/icdb.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: icdb.c,v 1.7 2016/09/04 14:51:39 nicm Exp $ */ 1/* $OpenBSD: icdb.c,v 1.8 2016/09/04 16:56:02 nicm Exp $ */
2/* 2/*
3 * Copyright (c) 2015 Ted Unangst <tedu@openbsd.org> 3 * Copyright (c) 2015 Ted Unangst <tedu@openbsd.org>
4 * 4 *
@@ -14,14 +14,16 @@
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */ 16 */
17
18#include <errno.h>
17#include <fcntl.h> 19#include <fcntl.h>
20#include <icdb.h>
21#include <stddef.h>
18#include <stdint.h> 22#include <stdint.h>
19#include <stdio.h> 23#include <stdio.h>
20#include <stddef.h>
21#include <stdlib.h> 24#include <stdlib.h>
22#include <string.h> 25#include <string.h>
23#include <unistd.h> 26#include <unistd.h>
24#include <icdb.h>
25 27
26#include <sys/mman.h> 28#include <sys/mman.h>
27#include <sys/stat.h> 29#include <sys/stat.h>
@@ -120,10 +122,10 @@ icdb_new(uint32_t version, uint32_t nentries, uint32_t entrysize,
120 struct icdbinfo *info; 122 struct icdbinfo *info;
121 int i; 123 int i;
122 124
123 if (entrysize == 0 || entrysize > 1048576) 125 if (entrysize == 0 || entrysize > 1048576 || nkeys > 8) {
124 return NULL; 126 errno = EINVAL;
125 if (nkeys > 8)
126 return NULL; 127 return NULL;
128 }
127 129
128 if (!(db = calloc(1, sizeof(*db)))) 130 if (!(db = calloc(1, sizeof(*db))))
129 return NULL; 131 return NULL;
@@ -156,7 +158,7 @@ icdb_open(const char *name, int flags, uint32_t version)
156 struct stat sb; 158 struct stat sb;
157 uint8_t *ptr = MAP_FAILED; 159 uint8_t *ptr = MAP_FAILED;
158 uint32_t baseoff, indexsize, idxmask, idxlen; 160 uint32_t baseoff, indexsize, idxmask, idxlen;
159 int fd, i; 161 int fd, i, saved_errno;
160 162
161 if ((fd = open(name, flags | O_CLOEXEC)) == -1) 163 if ((fd = open(name, flags | O_CLOEXEC)) == -1)
162 return NULL; 164 return NULL;
@@ -169,10 +171,10 @@ icdb_open(const char *name, int flags, uint32_t version)
169 if (ptr == MAP_FAILED) 171 if (ptr == MAP_FAILED)
170 goto fail; 172 goto fail;
171 info = (struct icdbinfo *)ptr; 173 info = (struct icdbinfo *)ptr;
172 if (info->magic != magic) 174 if (info->magic != magic || info->version != version) {
173 goto fail; 175 errno = ENOENT;
174 if (info->version != version)
175 goto fail; 176 goto fail;
177 }
176 178
177 if (!(db = calloc(1, sizeof(*db)))) 179 if (!(db = calloc(1, sizeof(*db))))
178 goto fail; 180 goto fail;
@@ -191,11 +193,13 @@ icdb_open(const char *name, int flags, uint32_t version)
191 return db; 193 return db;
192 194
193fail: 195fail:
196 saved_errno = errno;
194 if (ptr != MAP_FAILED) 197 if (ptr != MAP_FAILED)
195 munmap(ptr, sb.st_size); 198 munmap(ptr, sb.st_size);
196 if (fd != -1) 199 if (fd != -1)
197 close(fd); 200 close(fd);
198 free(db); 201 free(db);
202 errno = saved_errno;
199 return NULL; 203 return NULL;
200} 204}
201DEF_WEAK(icdb_open); 205DEF_WEAK(icdb_open);
@@ -211,14 +215,15 @@ icdb_get(struct icdb *db, void *entry, uint32_t idx)
211DEF_WEAK(icdb_get); 215DEF_WEAK(icdb_get);
212 216
213int 217int
214icdb_lookup(struct icdb *db, int keynum, const void *key, void *entry, uint32_t *idxp) 218icdb_lookup(struct icdb *db, int keynum, const void *key, void *entry,
219 uint32_t *idxp)
215{ 220{
216 struct icdbinfo *info = db->info; 221 struct icdbinfo *info = db->info;
217 uint32_t offset; 222 uint32_t offset;
218 uint64_t hash; 223 uint64_t hash;
219 uint32_t indexsize, idxmask, idxlen; 224 uint32_t indexsize, idxmask, idxlen;
220 uint32_t *idxdata; 225 uint32_t *idxdata;
221 226
222 indexsize = info->indexsize; 227 indexsize = info->indexsize;
223 idxmask = indexsize - 1; 228 idxmask = indexsize - 1;
224 idxlen = indexsize * sizeof(uint32_t); 229 idxlen = indexsize * sizeof(uint32_t);
@@ -227,8 +232,10 @@ icdb_lookup(struct icdb *db, int keynum, const void *key, void *entry, uint32_t
227 232
228 hash = SipHash24(&info->siphashkey, key, info->keysize[keynum]); 233 hash = SipHash24(&info->siphashkey, key, info->keysize[keynum]);
229 while ((offset = idxdata[hash & idxmask]) != -1) { 234 while ((offset = idxdata[hash & idxmask]) != -1) {
230 if (icdb_get(db, entry, offset) != 0) 235 if (icdb_get(db, entry, offset) != 0) {
236 errno = ENOENT;
231 return -1; 237 return -1;
238 }
232 if (memcmp((uint8_t *)entry + info->keyoffset[keynum], key, 239 if (memcmp((uint8_t *)entry + info->keyoffset[keynum], key,
233 info->keysize[keynum]) == 0) { 240 info->keysize[keynum]) == 0) {
234 if (idxp) 241 if (idxp)
@@ -262,16 +269,17 @@ icdb_update(struct icdb *db, const void *entry, int offset)
262 uint32_t entrysize = info->entrysize; 269 uint32_t entrysize = info->entrysize;
263 uint32_t baseoff; 270 uint32_t baseoff;
264 uint32_t indexsize, idxmask, idxlen; 271 uint32_t indexsize, idxmask, idxlen;
265 272
266 indexsize = info->indexsize; 273 indexsize = info->indexsize;
267 idxmask = indexsize - 1; 274 idxmask = indexsize - 1;
268 idxlen = indexsize * sizeof(uint32_t); 275 idxlen = indexsize * sizeof(uint32_t);
269 baseoff = sizeof(*info) + idxlen * info->nkeys; 276 baseoff = sizeof(*info) + idxlen * info->nkeys;
270 277
271 memcpy((uint8_t *)db->entries + offset * entrysize, 278 memcpy((uint8_t *)db->entries + offset * entrysize, entry, entrysize);
272 entry, entrysize); 279 if (db->fd != -1) {
273 if (db->fd != -1) 280 msync((uint8_t *)db->entries + offset * entrysize, entrysize,
274 msync(db->entries + offset * entrysize, entrysize, MS_SYNC); 281 MS_SYNC);
282 }
275 return 0; 283 return 0;
276} 284}
277DEF_WEAK(icdb_update); 285DEF_WEAK(icdb_update);
@@ -304,7 +312,7 @@ icdb_rehash(struct icdb *db)
304 uint32_t entrysize = info->entrysize; 312 uint32_t entrysize = info->entrysize;
305 uint32_t indexsize, idxmask, idxlen; 313 uint32_t indexsize, idxmask, idxlen;
306 int i, j; 314 int i, j;
307 315
308 indexsize = info->indexsize = roundup(info->nentries); 316 indexsize = info->indexsize = roundup(info->nentries);
309 idxmask = indexsize - 1; 317 idxmask = indexsize - 1;
310 idxlen = sizeof(uint32_t) * indexsize; 318 idxlen = sizeof(uint32_t) * indexsize;
@@ -341,10 +349,10 @@ icdb_save(struct icdb *db, int fd)
341 uint32_t entrysize = info->entrysize; 349 uint32_t entrysize = info->entrysize;
342 uint32_t indexsize, idxlen; 350 uint32_t indexsize, idxlen;
343 int i; 351 int i;
344 352
345 if (icdb_rehash(db) != 0) 353 if (icdb_rehash(db) != 0)
346 return -1; 354 return -1;
347 355
348 indexsize = info->indexsize; 356 indexsize = info->indexsize;
349 idxlen = sizeof(uint32_t) * indexsize; 357 idxlen = sizeof(uint32_t) * indexsize;
350 358