Index: .cvsignore =================================================================== RCS file: /home/mwa/Admin/cvsroot/home/mwa/src/pks/.cvsignore,v retrieving revision 1.4 retrieving revision 1.6 diff -c -5 -r1.4 -r1.6 *** .cvsignore 1998/07/10 21:50:14 1.4 --- .cvsignore 1999/04/23 19:39:45 1.6 *************** *** 10,14 **** --- 10,16 ---- wwwtest Makefile config.cache config.log config.status + mkpksdconf + pksd.conf Index: .purify =================================================================== RCS file: /home/mwa/Admin/cvsroot/home/mwa/src/pks/.purify,v retrieving revision 1.1.1.1 retrieving revision 1.1 diff -c -5 -r1.1.1.1 -r1.1 *** .purify 1998/04/26 04:18:44 1.1.1.1 --- .purify 1998/02/17 23:06:33 1.1 *************** *** 6,11 **** suppress umr accept; listener suppress umr __bind; __accept; accept; listener suppress umr bind; pks_socket_init suppress umr listen; pks_socket_init suppress umr accept; pks_socket_listener - suppress umr _libc_write; __db_write; __memp_pgwrite; __memp_bhwrite; __memp_ralloc; memp_fget --- 6,10 ---- Index: Makefile.in =================================================================== RCS file: /home/mwa/Admin/cvsroot/home/mwa/src/pks/Makefile.in,v retrieving revision 1.3 retrieving revision 1.4 diff -c -5 -r1.3 -r1.4 *** Makefile.in 1998/10/08 16:08:33 1.3 --- Makefile.in 1999/04/23 18:48:02 1.4 *************** *** 1,7 **** # ! # $Id: Makefile.in,v 1.3 1998/10/08 16:08:33 mwa Exp $ # # Copyright (c) 1996, Marc Horowitz. All rights reserved. # See the LICENSE file in the release for redistribution information. all:: --- 1,7 ---- # ! # $Id: Makefile.in,v 1.4 1999/04/23 18:48:02 mwa Exp $ # # Copyright (c) 1996, Marc Horowitz. All rights reserved. # See the LICENSE file in the release for redistribution information. all:: *************** *** 56,66 **** MKDEP = makedepend PURIFY = purify INCLUDES = -I$(DBDIR) DBG = -DDEBUG ! DEFINES = $(DBG) @DEFS@ CFLAGS = @gcc_cflags@ -g -O $(INCLUDES) $(DEFINES) LIBDB = $(DBDIR)/libdb.a CLEAN = rm -f --- 56,66 ---- MKDEP = makedepend PURIFY = purify INCLUDES = -I$(DBDIR) DBG = -DDEBUG ! DEFINES = $(DBG) -DMULTI_DB @DEFS@ CFLAGS = @gcc_cflags@ -g -O $(INCLUDES) $(DEFINES) LIBDB = $(DBDIR)/libdb.a CLEAN = rm -f *************** *** 68,78 **** PKSOBJS = pks_www.o pks_socket.o WWWOBJS = www.o MAILOBJS = mail_req.o mail_send.o INCROBJS = pks_incr.o DBOBJS = kd_add.o kd_delete.o kd_disable.o kd_generic.o kd_get.o kd_index.o \ ! kd_search.o kd_since.o kd_types.o PGPOBJS = pgputil.o md5c.o armor.o pgpcrc.o shs.o MPOBJS = kd_signal.o multiplex.o mp_signal.o MISCOBJS = parse.o llist.o globals.o UTILOBJS = util.o logging.o --- 68,78 ---- PKSOBJS = pks_www.o pks_socket.o WWWOBJS = www.o MAILOBJS = mail_req.o mail_send.o INCROBJS = pks_incr.o DBOBJS = kd_add.o kd_delete.o kd_disable.o kd_generic.o kd_get.o kd_index.o \ ! kd_search.o kd_since.o kd_types.o kd_generic_multi.o multidbutil.o kd_search_multi.o PGPOBJS = pgputil.o md5c.o armor.o pgpcrc.o shs.o MPOBJS = kd_signal.o multiplex.o mp_signal.o MISCOBJS = parse.o llist.o globals.o UTILOBJS = util.o logging.o Index: kd_add.c =================================================================== RCS file: /home/mwa/Admin/cvsroot/home/mwa/src/pks/kd_add.c,v retrieving revision 1.8 retrieving revision 1.11 diff -c -5 -r1.8 -r1.11 *** kd_add.c 1998/12/10 16:37:54 1.8 --- kd_add.c 1999/04/23 19:39:47 1.11 *************** *** 1,6 **** ! const char rcsid_kd_add_c[] = "$Id: kd_add.c,v 1.8 1998/12/10 16:37:54 mwa Exp $"; /* * Copyright (c) 1996, Marc Horowitz. All rights reserved. * See the LICENSE file in the release for redistribution information. */ --- 1,6 ---- ! const char rcsid_kd_add_c[] = "$Id: kd_add.c,v 1.11 1999/04/23 19:39:47 mwa Exp $"; /* * Copyright (c) 1996, Marc Horowitz. All rights reserved. * See the LICENSE file in the release for redistribution information. */ *************** *** 12,30 **** --- 12,33 ---- #include #include #include #include #include + #include #include "armor.h" #include "pgputil.h" #include "database.h" #include "globals.h" #include "llist.h" #include "kd_types.h" #include "kd_internal.h" #include "kd_search.h" + #include "memory_config.h" + #include "multidbutil.h" /* for all of these, the first element will come from the database, the second from the request */ typedef struct _merge_state { *************** *** 786,866 **** unsigned char entry[12]; int writing; int pks_errno; } aetd_state; int add_entry_to_db(DB *db, DBT *key, aetd_state *s) { int ret; int needfree = 0; DBT data, newdata; memset(&data, 0, sizeof(data)); memset(&newdata, 0, sizeof(newdata)); ret = (*(db->get))(db, NULL, key, &data, 0); if (ret == DB_NOTFOUND) { /* word not in file, create DBT for insert */ ! ! newdata.data = (void *) s->entry; ! newdata.size = sizeof(s->entry); } else if (ret) { s->writing = 0; s->pks_errno = ret; fail(); ! } else { ! int i, o; ! ! if (data.size%12) ! fail(); ! ! /* allocate data to store */ ! newdata.size = data.size+12; ! if ((newdata.data = (void *) malloc(newdata.size)) == NULL) fail(); ! needfree = 1; ! ! /* scan for insertion point. This is O(n), but so is the ! copy which follows it */ ! ! for (i=0; ientry, 12); ! if (o < 0) ! break; ! ! if (o == 0) { ! /* no duplicates */ ! free(newdata.data); ! return(1); ! } ! } ! ! /* copy data to newdata, inserting entry */ ! memcpy(newdata.data, data.data, i); ! memcpy((void *) (((unsigned char *) newdata.data)+i), ! (void *) s->entry, 12); ! memcpy((void *) (((unsigned char *) newdata.data)+i+12), ! (void *) (((unsigned char *) data.data)+i), ! data.size - i); } ! if ((ret = (*(db->put))(db, NULL, key, &newdata, 0))) { ! s->writing = 1; ! s->pks_errno = ret; ! if (needfree) ! free(newdata.data); ! fail(); } - if (needfree) - free(newdata.data); - return(1); } int add_word_to_worddb(void *e, void *c) { words_elem *we = (words_elem *) e; aetd_state *s = (aetd_state *) c; --- 789,906 ---- unsigned char entry[12]; int writing; int pks_errno; } aetd_state; + int add_entry_to_db(DB *db, DBT *key, aetd_state *s) { int ret; int needfree = 0; DBT data, newdata; + unsigned char tmpbuf[12]; + int i; + DBT *pdata=NULL; + unsigned char *p; memset(&data, 0, sizeof(data)); memset(&newdata, 0, sizeof(newdata)); ret = (*(db->get))(db, NULL, key, &data, 0); if (ret == DB_NOTFOUND) { /* word not in file, create DBT for insert */ ! newdata.data = (void *) malloc( MIN_KEY_PAGE_SIZE ); ! if ( newdata.data == NULL ) { ! fail(); ! return(1); ! } ! bzero((void *)newdata.data,MIN_KEY_PAGE_SIZE); ! memcpy((void *)newdata.data, (void *) s->entry, 12); ! newdata.size = MIN_KEY_PAGE_SIZE; ! needfree=1; ! pdata = &newdata; } else if (ret) { s->writing = 0; s->pks_errno = ret; fail(); ! return (1); ! } ! if (data.size%12) { ! /* ! * unknown error, db is broken?? ! */ ! fail(); ! return(1); ! } ! ! /* liner searching! boo~~~~*/ ! for (i=0; ientry + 8 ), 4)) { ! /* ! * Duplicate, keyid already recorded. ! */ ! return(1); ! } ! if ( !zerocmp(tmpbuf,4) ) { ! /* ! * find empty room! ! */ ! break; ! } ! } ! ! if ( data.size != 0 ) { ! if ( data.size <= i) { ! int allocsize; ! if ( data.size <= MAX_KEYID_ENTRY_SIZE ) { ! allocsize = data.size * 2; ! } ! else { ! allocsize = data.size + (1024*12); ! } ! /* ! * Page has no empty room and make new page. ! */ ! newdata.data = (void *) malloc( allocsize ); ! if ( newdata.data == NULL ) { fail(); ! return(1); ! } ! bzero((void *)newdata.data, allocsize); ! newdata.size = allocsize; ! memcpy(newdata.data,data.data,data.size); ! pdata = &newdata; ! needfree=1; ! } ! else { ! memcpy((void *) (((unsigned char *) data.data)+i), ! (void *) s->entry,12); ! pdata = &data; ! } ! } ! ! if ((ret = (*(db->put))(db, NULL, key, pdata, 0))) { ! s->writing = 1; ! s->pks_errno = ret; ! if (needfree) { ! free(newdata.data); ! } ! fail(); } ! if (needfree) { ! free(newdata.data); } return(1); } + int add_word_to_worddb(void *e, void *c) { words_elem *we = (words_elem *) e; aetd_state *s = (aetd_state *) c; Index: kd_delete.c =================================================================== RCS file: /home/mwa/Admin/cvsroot/home/mwa/src/pks/kd_delete.c,v retrieving revision 1.3 retrieving revision 1.4 diff -c -5 -r1.3 -r1.4 *** kd_delete.c 1998/07/10 22:01:12 1.3 --- kd_delete.c 1999/04/23 18:48:04 1.4 *************** *** 1,6 **** ! const char rcsid_kd_delete_c[] = "$Id: kd_delete.c,v 1.3 1998/07/10 22:01:12 mwa Exp $"; /* * Copyright (c) 1996, Marc Horowitz. All rights reserved. * See the LICENSE file in the release for redistribution information. */ --- 1,6 ---- ! const char rcsid_kd_delete_c[] = "$Id: kd_delete.c,v 1.4 1999/04/23 18:48:04 mwa Exp $"; /* * Copyright (c) 1996, Marc Horowitz. All rights reserved. * See the LICENSE file in the release for redistribution information. */ *************** *** 16,25 **** --- 16,26 ---- #include "llist.h" #include "kd_types.h" #include "kd_internal.h" #include "kd_search.h" #include "pgputil.h" + #include "multidbutil.h" typedef struct _dwfw_state { unsigned char entry[12]; error *err; } dwfw_state; *************** *** 31,42 **** { words_elem *we = (words_elem *) e; dwfw_state *s = (dwfw_state *) c; unsigned char word[256]; DBT key, data; - unsigned char *here; int i, ret; memset(&key, 0, sizeof(key)); memset(&data, 0, sizeof(data)); --- 32,44 ---- { words_elem *we = (words_elem *) e; dwfw_state *s = (dwfw_state *) c; unsigned char word[256]; + unsigned char tmpbuf[12]; + unsigned char *dist, *src, *tail; DBT key, data; int i, ret; memset(&key, 0, sizeof(key)); memset(&data, 0, sizeof(data)); *************** *** 59,110 **** sprintf(s->err->buf, "error reading worddb entry for delete (errno = %d)", ret); fail(); } ! for (here = (unsigned char *) data.data; ! here = my_memmem((void *) here, s->entry, ! data.size - (here - ((unsigned char *) data.data)), ! sizeof(s->entry)), ! here && (here-((unsigned char *) data.data))%12; ! here++ ! ) ! /* SUPPRESS 570 */ ! ; ! ! if (!here) { ! char buf[1024]; ! ! sprintf(buf, ! "consistency error: word \"%.*s\" in key id %02X%02X%02X%02X\n" ! "does not refer back to key", (int) key.size, (char *) key.data, ! s->entry[8], s->entry[9], s->entry[10], s->entry[11]); ! log_error("delete_word_from_worddb", buf); ! ! return(1); } ! ! if (data.size == 12) { if ((*(worddb->del))(worddb, NULL, &key, 0)) { s->err->fatal = 1; s->err->str = "failed deleting worddb entry from database"; fail(); } ! } else { ! here += 12; ! ! if (here < (((unsigned char *) data.data) + data.size)) ! memmove((void *) (here-12), (void *) here, ! data.size - (here - ((unsigned char *) data.data))); ! ! data.size -= 12; ! if ((*(worddb->put))(worddb, NULL, &key, &data, 0)) { ! s->err->fatal = 1; ! s->err->str = "failed replacing worddb entry in database"; ! fail(); ! } } return(1); } --- 61,114 ---- sprintf(s->err->buf, "error reading worddb entry for delete (errno = %d)", ret); fail(); } ! if (data.size % 12) { ! /* ! * unknown error, db is broken?? ! */ ! s->err->fatal = 1; ! sprintf(s->err->buf, ! "consistency error reading worddb for delete: %.*s not found ", ! (int) we->len, we->ptr); ! fail(); ! return(1); } ! for( i = 0 ; i < data.size ; i+=12 ) { ! memcpy(tmpbuf, ((unsigned char *)data.data + i),12); ! if ( !zerocmp(tmpbuf,12) ) { ! break; ! } ! } ! ! if ( i == 1 ) { ! /* ! * one word has one keyid. ! */ if ((*(worddb->del))(worddb, NULL, &key, 0)) { s->err->fatal = 1; s->err->str = "failed deleting worddb entry from database"; fail(); } ! return (1); ! } ! dist = (unsigned char *) data.data; ! src = (unsigned char *) data.data; ! tail =(unsigned char *)data.data + data.size; ! while ( src <= tail ) { ! if ( memcmp((void *) src, s->entry, 12) ) { ! memcpy((void *)dist,(void *)src,12); ! dist +=12; ! } ! src +=12; ! } ! if ((*(worddb->put))(worddb, NULL, &key, &data, 0)) { ! s->err->fatal = 1; ! s->err->str = "failed replacing worddb entry in database"; ! fail(); } return(1); } Index: kd_generic.c =================================================================== RCS file: /home/mwa/Admin/cvsroot/home/mwa/src/pks/kd_generic.c,v retrieving revision 1.6 retrieving revision 1.8 diff -c -5 -r1.6 -r1.8 *** kd_generic.c 1998/07/10 22:01:15 1.6 --- kd_generic.c 1999/04/23 18:49:26 1.8 *************** *** 1,6 **** ! const char rcsid_kd_generic_c[] = "$Id: kd_generic.c,v 1.6 1998/07/10 22:01:15 mwa Exp $"; /* * Copyright (c) 1996, Marc Horowitz. All rights reserved. * See the LICENSE file in the release for redistribution information. */ --- 1,6 ---- ! const char rcsid_kd_generic_c[] = "$Id: kd_generic.c,v 1.8 1999/04/23 18:49:26 mwa Exp $"; /* * Copyright (c) 1996, Marc Horowitz. All rights reserved. * See the LICENSE file in the release for redistribution information. */ *************** *** 21,30 **** --- 21,34 ---- #include "globals.h" #include "llist.h" #include "kd_types.h" #include "kd_internal.h" + #ifdef MULTI_DB + #include "kd_generic_multi.h" + #endif + /* this file contains functions which are common to two different database operations, and functions which perform operations on the database itself. */ DB *keydb = NULL, *worddb = NULL, *timedb = NULL; *************** *** 55,65 **** if (end-start > 1) { if ((tmp = (words_elem *) malloc(sizeof(words_elem))) == NULL) fail(); tmp->ptr = start; tmp->len = end-start; ! if (!(ret = llist_add_sorted(wl, tmp, words_elem_order))) { free(tmp); fail(); } if (ret == -1) free(tmp); --- 59,69 ---- if (end-start > 1) { if ((tmp = (words_elem *) malloc(sizeof(words_elem))) == NULL) fail(); tmp->ptr = start; tmp->len = end-start; ! if (!(ret = llist_add(wl, tmp))) { free(tmp); fail(); } if (ret == -1) free(tmp); *************** *** 124,133 **** --- 128,143 ---- return 1; } int kd_db_store_keyblock(llist *keys, error *err) { + #ifdef MULTI_DB + /* + * + */ + return(multi_kd_db_store_keyblock(keys,err)); + #else DBT key, newdata; xbuffer newxb; keys_elem *ke = (keys_elem *) (*((void **) keys->xb.buf)); memset(&key, 0, sizeof(key)); *************** *** 159,168 **** --- 169,180 ---- } xbuffer_free(&newxb); return(1); + + #endif } /* log utility functions */ void kd_log_start(char *fct, unsigned char *userid, long len, int flags) *************** *** 189,198 **** --- 201,213 ---- /* create/open/close/sync */ int kd_open_1(char *dbdir, int create, error *err) { + #ifdef MULTI_DB + return(multi_kd_open_1(dbdir, create, err)); + #else int flags, db_err, fd; /* XXX I don't like this, but I also don't have a better answer */ static DB_ENV dbenv; DB_INFO keyinfo, wordinfo, timeinfo; *************** *** 279,288 **** --- 294,304 ---- sprintf(err->buf, "failed making timedb close-on-exec: %d", errno); fail(); } return(1); + #endif } /* this not only copies files, but leaves holes if there's no data */ static const char zeros[1024]; *************** *** 350,369 **** close(fdst); return(-1); } } close(fsrc); close(fdst); return(total); } int kd_backup_1() { char buf[1024]; ! if ((mkdir("backup", 0755) < 0) && (errno != EEXIST)) { kd_sync(); sprintf(buf, "failed creating backup/ dir: errno = %d", errno); log_error("kd_backup_1", buf); return(0); --- 366,399 ---- close(fdst); return(-1); } } + if (last_seek) { + /* Need to write into the last location, at least on Solaris */ + if (lseek(fdst, -1, SEEK_CUR) < 0 + || write(fdst, zeros, 1) != 1) { + log_error("copy_file", strerror(errno)); + close(fsrc); + close(fdst); + return(-1); + } + } + close(fsrc); close(fdst); return(total); } int kd_backup_1() { + #ifdef MULTI_DB + return(multi_kd_backup_1()); + #else char buf[1024]; ! if ((mkdir("backup", 0755) < 0) && (errno != EEXIST)) { kd_sync(); sprintf(buf, "failed creating backup/ dir: errno = %d", errno); log_error("kd_backup_1", buf); return(0); *************** *** 414,440 **** --- 444,479 ---- log_error("kd_backup_1", buf); return(0); } return(1); + #endif } void kd_sync_1() { + #ifdef MULTI_DB + multi_kd_sync_1(); + #else (*(timedb->sync))(timedb, 0); (*(worddb->sync))(worddb, 0); (*(keydb->sync))(keydb, 0); + #endif } void kd_close_1() { + #ifdef MULTI_DB + multi_kd_close_1(); + #else if (timedb) (*(timedb->close))(timedb, 0); if (worddb) (*(worddb->close))(worddb, 0); if (keydb) (*(keydb->close))(keydb, 0); + #endif } int kd_create(char *dbdir, char **ret) { error err; Index: kd_internal.h =================================================================== RCS file: /home/mwa/Admin/cvsroot/home/mwa/src/pks/kd_internal.h,v retrieving revision 1.4 retrieving revision 1.5 diff -c -5 -r1.4 -r1.5 *** kd_internal.h 1998/11/27 08:00:05 1.4 --- kd_internal.h 1999/04/23 19:39:51 1.5 *************** *** 1,10 **** #ifndef _KD_INTERNAL_H_ #define _KD_INTERNAL_H_ /* ! * $Id: kd_internal.h,v 1.4 1998/11/27 08:00:05 mwa Exp $ * * Copyright (c) 1996, Marc Horowitz. All rights reserved. * See the LICENSE file in the release for redistribution information. */ --- 1,10 ---- #ifndef _KD_INTERNAL_H_ #define _KD_INTERNAL_H_ /* ! * $Id: kd_internal.h,v 1.5 1999/04/23 19:39:51 mwa Exp $ * * Copyright (c) 1996, Marc Horowitz. All rights reserved. * See the LICENSE file in the release for redistribution information. */ *************** *** 37,43 **** --- 37,45 ---- /* from kd_add.c */ int kd_sigs_elem_merge(llist *lout, void *e1, void *e2, void *c); int kd_userids_elem_merge(llist *lout, void *e1, void *e2, void *c); int kd_keys_elem_merge(llist *lout, void *e1, void *e2, void *c); + + int copy_file(const char *src, const char *dst); #endif Index: kd_search.c =================================================================== RCS file: /home/mwa/Admin/cvsroot/home/mwa/src/pks/kd_search.c,v retrieving revision 1.6 retrieving revision 1.9 diff -c -5 -r1.6 -r1.9 *** kd_search.c 1999/03/11 20:32:36 1.6 --- kd_search.c 1999/04/23 19:39:53 1.9 *************** *** 1,6 **** ! const char rcsid_kd_search_c[] = "$Id: kd_search.c,v 1.6 1999/03/11 20:32:36 mwa Exp $"; /* * Copyright (c) 1996, Marc Horowitz. All rights reserved. * See the LICENSE file in the release for redistribution information. */ --- 1,6 ---- ! const char rcsid_kd_search_c[] = "$Id: kd_search.c,v 1.9 1999/04/23 19:39:53 mwa Exp $"; /* * Copyright (c) 1996, Marc Horowitz. All rights reserved. * See the LICENSE file in the release for redistribution information. */ *************** *** 21,30 **** --- 21,35 ---- #include "llist.h" #include "kd_types.h" #include "kd_internal.h" #include "kd_search.h" + #ifdef MULTI_DB + #include "multidbutil.h" + extern DB *keydb_array[]; + #endif + typedef struct _mke_state { /* what do do with the key when done */ llist_iter iter; void *c; /* this is set when a secret key packet is seen. */ *************** *** 626,635 **** --- 631,643 ---- memset(&data, 0, sizeof(data)); key.data = keyid+(8-KEYDB_KEYID_BYTES); key.size = KEYDB_KEYID_BYTES; + #ifdef MULTI_DB + keydb=keydb_array[which_db(key.data)]; + #endif ret = (*(keydb->get))(keydb, NULL, &key, &data, 0); if ((ret == DB_NOTFOUND) || ((ret == 0) && (data.size == 0))) { return(1); *************** *** 827,836 **** --- 835,849 ---- /* already 1 element selected */ if ( llist_count(&(s->wdes)) == 1 ) { return (1); } + /* already 1 element selected */ + if ( llist_count(&(s->wdes)) == 1 ) { + return (1); + } + memset(&key, 0, sizeof(key)); memset(&data, 0, sizeof(data)); for (i=0; ilen; i++) word[i] = tolower((we->ptr)[i]); *************** *** 841,850 **** --- 854,866 ---- ret = (*(worddb->get))(worddb, NULL, &key, &data, 0); /* sort for merging */ qsort(data.data, (size_t) (data.size/12), 12, sort_twelvebytes); + /* sort for merging */ + qsort(data.data, (size_t) (data.size/12), 12, sort_twelvebytes); + if (ret && ret != DB_NOTFOUND) { s->err->fatal = 1; s->err->str = "database read error getting userid word"; fail(); } *************** *** 862,871 **** --- 878,894 ---- s->err->str = "allocating memory for wde failed"; fail(); } memcpy((void *) wde, ((unsigned char *)data.data)+i, 12); + if ( !zerocmp((void*)wde,12) ) { + /* + * NULL means end of data. + */ + free(wde); + break; + } /* they should already be sorted coming in */ if (!llist_add(&db_wdes, (void *) wde)) { llist_iterate(&(db_wdes), malloc_elem_free, NULL); *************** *** 963,972 **** --- 986,999 ---- memset(&key, 0, sizeof(key)); key.data = wde+4 + (8-KEYDB_KEYID_BYTES); key.size = KEYDB_KEYID_BYTES; + #ifdef MULTI_DB + keydb=keydb_array[which_db(key.data)]; + #endif + if ((*(keydb->del))(keydb, NULL, &key, 0)) { s->err->fatal = 1; s->err->str = "failed deleting keydb entry from database"; fail(); } *************** *** 1018,1027 **** --- 1045,1059 ---- return(1); } int do_all_keys(int flags, llist_iter func, void *c, error *err) { + #ifdef MULTI_DB + extern int multi_do_all_keys(int flags, llist_iter func, void *c, error *err); + return(multi_do_all_keys(flags,func,c,err)); + #else + akte_state aktes; int ret, i; DBC *cursor; DBT key, data; ow_state ows; *************** *** 1034,1044 **** aktes.err = err; ftfs.func = func; ftfs.state = c; ! if ((ret = (*(keydb->cursor))(keydb, NULL, &cursor))) { err->fatal = 1; sprintf(err->buf, "error creating keydb cursor: error = %d", ret); fail(); } --- 1066,1076 ---- aktes.err = err; ftfs.func = func; ftfs.state = c; ! if ((ret = (*(keydb->cursor))(keydb, NULL, &cursor,0))) { err->fatal = 1; sprintf(err->buf, "error creating keydb cursor: error = %d", ret); fail(); } *************** *** 1118,1127 **** --- 1150,1160 ---- } xbuffer_free(&(aktes.entries)); return(1); + #endif } /* 1) generate a list of words from the userid 2) for each word, look up the keyid's associated with it Index: kd_since.c =================================================================== RCS file: /home/mwa/Admin/cvsroot/home/mwa/src/pks/kd_since.c,v retrieving revision 1.3 retrieving revision 1.5 diff -c -5 -r1.3 -r1.5 *** kd_since.c 1998/07/10 22:01:26 1.3 --- kd_since.c 1999/04/23 19:39:54 1.5 *************** *** 1,6 **** ! const char rcsid_kd_since_c[] = "$Id: kd_since.c,v 1.3 1998/07/10 22:01:26 mwa Exp $"; /* * Copyright (c) 1996, Marc Horowitz. All rights reserved. * See the LICENSE file in the release for redistribution information. */ --- 1,6 ---- ! const char rcsid_kd_since_c[] = "$Id: kd_since.c,v 1.5 1999/04/23 19:39:54 mwa Exp $"; /* * Copyright (c) 1996, Marc Horowitz. All rights reserved. * See the LICENSE file in the release for redistribution information. */ *************** *** 35,44 **** --- 35,45 ---- DBC *cursor; DBT key, data; ow_state ows; unsigned char *tmp; unsigned long ul_last; + static const char twelve0[12]; memset(&key, 0, sizeof(key)); memset(&data, 0, sizeof(data)); xbuffer_alloc(&entries); *************** *** 49,59 **** firstkey[3] = since; key.data = firstkey; key.size = sizeof(firstkey); ! if ((ret = (*(timedb->cursor))(timedb, NULL, &cursor))) { err->fatal = 1; sprintf(err->buf, "error creating timedb cursor: error = %d", ret); fail(); } --- 50,60 ---- firstkey[3] = since; key.data = firstkey; key.size = sizeof(firstkey); ! if ((ret = (*(timedb->cursor))(timedb, NULL, &cursor,0))) { err->fatal = 1; sprintf(err->buf, "error creating timedb cursor: error = %d", ret); fail(); } *************** *** 105,119 **** ows.return_disabled = 0; ows.c = (void *) &keys; ows.err = err; ows.append = kd_keys_elem_marshall; ! for (i=0; idata = keys.buf; --- 106,128 ---- ows.return_disabled = 0; ows.c = (void *) &keys; ows.err = err; ows.append = kd_keys_elem_marshall; ! for (i=0; idata = keys.buf; Index: logging.c =================================================================== RCS file: /home/mwa/Admin/cvsroot/home/mwa/src/pks/logging.c,v retrieving revision 1.3 retrieving revision 1.4 diff -c -5 -r1.3 -r1.4 *** logging.c 1998/07/10 22:01:38 1.3 --- logging.c 1999/04/23 18:48:11 1.4 *************** *** 1,56 **** ! const char rcsid_logging_c[] = "$Id: logging.c,v 1.3 1998/07/10 22:01:38 mwa Exp $"; /* * Copyright (c) 1996, Marc Horowitz. All rights reserved. * See the LICENSE file in the release for redistribution information. */ #include #include #include "globals.h" #include "database.h" #ifndef DEBUG #define debug 0 #endif int log_terminal; void log_debug(char *fct, char *msg) { if (debug || log_terminal) ! fprintf(stderr, "%s: %s\n", fct, msg); else ! syslog(LOG_DEBUG, "pksd: %s: %s", fct, msg); } void log_info(char *fct, char *msg) { if (debug || log_terminal) ! fprintf(stderr, "%s: %s\n", fct, msg); else syslog(LOG_INFO, "pksd: %s: %s", fct, msg); } void log_error(char *fct, char *msg) { if (debug || log_terminal) ! fprintf(stderr, "%s: %s\n", fct, msg); else syslog(LOG_ERR, "pksd: %s: %s", fct, msg); } void log_fatal(char *fct, char *msg) { /* try to keep the database intact */ kd_close(); if (debug || log_terminal) ! fprintf(stderr, "FATAL ERROR in %s: %s\n", fct, msg); else syslog(LOG_CRIT, "pksd: %s: %s", fct, msg); exit(1); } --- 1,74 ---- ! const char rcsid_logging_c[] = "$Id: logging.c,v 1.4 1999/04/23 18:48:11 mwa Exp $"; /* * Copyright (c) 1996, Marc Horowitz. All rights reserved. * See the LICENSE file in the release for redistribution information. */ #include #include + #include #include "globals.h" #include "database.h" #ifndef DEBUG #define debug 0 #endif + + /* + * To show current time + */ + char *current_time() + { + time_t t; + char *time_str; + t = time(NULL); + time_str = ctime(&t); + time_str[strlen(time_str) -1 ]='\0'; + return time_str; + + } + + + int log_terminal; void log_debug(char *fct, char *msg) { if (debug || log_terminal) ! fprintf(stderr, "[%s] %s: %s\n", current_time(),fct, msg); else ! syslog(LOG_DEBUG, "pksd: %s: %s",fct, msg); } void log_info(char *fct, char *msg) { if (debug || log_terminal) ! fprintf(stderr, "[%s] %s: %s\n", current_time(),fct, msg); else syslog(LOG_INFO, "pksd: %s: %s", fct, msg); } void log_error(char *fct, char *msg) { if (debug || log_terminal) ! fprintf(stderr, "[%s] %s: %s\n", current_time(),fct, msg); else syslog(LOG_ERR, "pksd: %s: %s", fct, msg); } void log_fatal(char *fct, char *msg) { /* try to keep the database intact */ kd_close(); if (debug || log_terminal) ! fprintf(stderr, "[%s] %s: %s\n", current_time(),fct, msg); else syslog(LOG_CRIT, "pksd: %s: %s", fct, msg); exit(1); } Index: pgputil.c =================================================================== RCS file: /home/mwa/Admin/cvsroot/home/mwa/src/pks/pgputil.c,v retrieving revision 1.3 retrieving revision 1.4 diff -c -5 -r1.3 -r1.4 *** pgputil.c 1998/07/10 22:02:06 1.3 --- pgputil.c 1999/04/23 18:48:16 1.4 *************** *** 1,6 **** ! const char rcsid_pgputil_c[] = "$Id: pgputil.c,v 1.3 1998/07/10 22:02:06 mwa Exp $"; /* * Copyright (c) 1996, Marc Horowitz. All rights reserved. * See the LICENSE file in the release for redistribution information. */ --- 1,6 ---- ! const char rcsid_pgputil_c[] = "$Id: pgputil.c,v 1.4 1999/04/23 18:48:16 mwa Exp $"; /* * Copyright (c) 1996, Marc Horowitz. All rights reserved. * See the LICENSE file in the release for redistribution information. */ *************** *** 188,197 **** --- 188,198 ---- int decode_pubkey(ddesc *data, long len, mpidesc *modulus, mpidesc *exponent, mpidesc *keyid, int *keytype, time_t *create_time) { long version, valid_days, pkctype; unsigned char *pktend = data->data+data->offset+len; + mpidesc publicbits, grouporder, groupgenerator; if (!decode_num(data, 1, &version)) return(0); if ((version != 2) && (version != 3) && (version !=4)) *************** *** 210,235 **** /* This is pretty sloppy. It will set the type to DSA first time through then to ElGamal the last time through (for each packet). Either DSA or ElGamal should be considered the same. */ *keytype = pkctype; ! if (pkctype == 1) { /* RSA */ if (!decode_mpi(data, modulus)) return(0); if (!decode_mpi(data, exponent)) return(0); keyid->nbits = 64; keyid->number.size = 8; keyid->number.offset = 0; keyid->number.data = &(modulus->number.data[modulus->number.size - 8]); ! } else if (pkctype == 17) { /* DSA */ ! mpidesc publicbits; ! mpidesc grouporder; ! mpidesc groupgenerator; ! if (!decode_mpi(data, modulus)) return(0); if (!decode_mpi(data, &grouporder)) return(0); --- 211,236 ---- /* This is pretty sloppy. It will set the type to DSA first time through then to ElGamal the last time through (for each packet). Either DSA or ElGamal should be considered the same. */ *keytype = pkctype; ! switch (pkctype) { ! case 1: /*RSA*/ ! case 2: ! case 3: if (!decode_mpi(data, modulus)) return(0); if (!decode_mpi(data, exponent)) return(0); keyid->nbits = 64; keyid->number.size = 8; keyid->number.offset = 0; keyid->number.data = &(modulus->number.data[modulus->number.size - 8]); ! break; ! case 17: /*DSA*/ if (!decode_mpi(data, modulus)) return(0); if (!decode_mpi(data, &grouporder)) return(0); *************** *** 239,263 **** if (!decode_mpi(data, &publicbits)) return(0); generate_DSA_keyid(data, keyid); ! } else if (pkctype == 16) { /* ElGamal */ ! mpidesc publicbits; ! mpidesc groupgenerator; ! if (!decode_mpi(data, modulus)) return(0); if (!decode_mpi(data, &groupgenerator)) return(0); if (!decode_mpi(data, &publicbits)) return(0); ! /* generate_DSA_keyid(data, keyid); */ ! } else { return(0); } return(pktend == (data->data + data->offset)); } --- 240,264 ---- if (!decode_mpi(data, &publicbits)) return(0); generate_DSA_keyid(data, keyid); ! break; ! case 16: /*ElGamal*/ ! case 20: if (!decode_mpi(data, modulus)) return(0); if (!decode_mpi(data, &groupgenerator)) return(0); if (!decode_mpi(data, &publicbits)) return(0); ! generate_DSA_keyid(data, keyid); ! break; ! default: return(0); } return(pktend == (data->data + data->offset)); } Index: pks_config.c =================================================================== RCS file: /home/mwa/Admin/cvsroot/home/mwa/src/pks/pks_config.c,v retrieving revision 1.3 retrieving revision 1.5 diff -c -5 -r1.3 -r1.5 *** pks_config.c 1998/07/10 22:02:11 1.3 --- pks_config.c 1999/04/23 19:39:58 1.5 *************** *** 1,6 **** ! const char rcsid_pks_c[] = "$Id: pks_config.c,v 1.3 1998/07/10 22:02:11 mwa Exp $"; /* * Copyright (c) 1996, Marc Horowitz. All rights reserved. * See the LICENSE file in the release for redistribution information. */ --- 1,6 ---- ! const char rcsid_pks_c[] = "$Id: pks_config.c,v 1.5 1999/04/23 19:39:58 mwa Exp $"; /* * Copyright (c) 1996, Marc Horowitz. All rights reserved. * See the LICENSE file in the release for redistribution information. */ *************** *** 14,27 **** --- 14,29 ---- #include "parse.h" #include "pks_config.h" #include "globals.h" #include "util.h" + #include "kd_generic_multi.h" const pks_config default_config = { "/var/spool/pks/etc/db", 0, + DB_ARRAY_SIZE, "/var/spool/pks/pksd_socket", "", "root", "/var/spool/pks/etc/mail_intro", "/var/spool/pks/etc/mail_help", *************** *** 31,40 **** --- 33,49 ---- this in C++ */ { { 0, 0, NULL } }, -1, }; + + /* by hironobu */ + const char number_of_db_files_str[] = "number_of_db_files"; + long number_of_db_files_len = sizeof(number_of_db_files_str)-1; + /* end */ + + const char db_dir_str[] = "db_dir"; long db_dir_len = sizeof(db_dir_str)-1; const char www_port_str[] = "www_port"; long www_port_len = sizeof(www_port_str)-1; *************** *** 151,160 **** --- 160,170 ---- else if (str_conf(deflang_str, deflang_len, pc->default_lang)) else if (str_conf(this_site_str, this_site_len, pc->this_site)) else if (num_conf(max_last_str, max_last_len, pc->max_last)) else if (llist_conf(syncsite_str, syncsite_len, &(pc->syncsites))) else if (num_conf(debug_str, debug_len, debug)) + else if (num_conf(number_of_db_files_str, number_of_db_files_len, pc->number_of_db_files)) /* by hironobu */ } fclose(conf); return(1); Index: pks_config.h =================================================================== RCS file: /home/mwa/Admin/cvsroot/home/mwa/src/pks/pks_config.h,v retrieving revision 1.3 retrieving revision 1.4 diff -c -5 -r1.3 -r1.4 *** pks_config.h 1998/07/10 22:02:13 1.3 --- pks_config.h 1999/04/23 18:48:19 1.4 *************** *** 1,10 **** #ifndef _PKS_CONFIG_H_ #define _PKS_CONFIG_H_ /* ! * $Id: pks_config.h,v 1.3 1998/07/10 22:02:13 mwa Exp $ * * Copyright (c) 1996, Marc Horowitz. All rights reserved. * See the LICENSE file in the release for redistribution information. */ --- 1,10 ---- #ifndef _PKS_CONFIG_H_ #define _PKS_CONFIG_H_ /* ! * $Id: pks_config.h,v 1.4 1999/04/23 18:48:19 mwa Exp $ * * Copyright (c) 1996, Marc Horowitz. All rights reserved. * See the LICENSE file in the release for redistribution information. */ *************** *** 14,23 **** --- 14,26 ---- /* database stuff */ char db_dir[1024]; /* web server stuff */ int www_port; + + /* number of splited db files (by hironobu) */ + int number_of_db_files; /* mail server stuff */ char socket_name[1024]; char mail_delivery_client[1024]; Index: pkscheck.c =================================================================== RCS file: /home/mwa/Admin/cvsroot/home/mwa/src/pks/pkscheck.c,v retrieving revision 1.3 retrieving revision 1.4 diff -c -5 -r1.3 -r1.4 *** pkscheck.c 1998/07/10 22:02:24 1.3 --- pkscheck.c 1999/04/23 18:48:20 1.4 *************** *** 1,6 **** ! const char rcsid_dbcheck_c[] = "$Id: pkscheck.c,v 1.3 1998/07/10 22:02:24 mwa Exp $"; /* * Copyright (c) 1996, Marc Horowitz. All rights reserved. * See the LICENSE file in the release for redistribution information. */ --- 1,6 ---- ! const char rcsid_dbcheck_c[] = "$Id: pkscheck.c,v 1.4 1999/04/23 18:48:20 mwa Exp $"; /* * Copyright (c) 1996, Marc Horowitz. All rights reserved. * See the LICENSE file in the release for redistribution information. */ *************** *** 40,56 **** fprintf(stderr, "database open failed: %s\n", str); free(str); exit(1); } ! if ((ret = (*(worddb->cursor))(worddb, NULL, &cursor))) { sprintf(buf, "error creating worddb cursor: error = %d", ret); log_error("main", buf); } for (ret = (*(cursor->c_get))(cursor, &ikey, &idata, DB_FIRST); ! ret == 0; ret = (*(cursor->c_get))(cursor, &ikey, &idata, DB_NEXT)) { if (idata.size%12) { sprintf(buf, "worddb corrupt in entry = \"%.*s\", size = %d\n", (int) ikey.size, (char *) ikey.data, (int) idata.size); --- 40,56 ---- fprintf(stderr, "database open failed: %s\n", str); free(str); exit(1); } ! if ((ret = (*(worddb->cursor))(worddb, NULL, &cursor,0))) { sprintf(buf, "error creating worddb cursor: error = %d", ret); log_error("main", buf); } for (ret = (*(cursor->c_get))(cursor, &ikey, &idata, DB_FIRST); ! ret != 0; ret = (*(cursor->c_get))(cursor, &ikey, &idata, DB_NEXT)) { if (idata.size%12) { sprintf(buf, "worddb corrupt in entry = \"%.*s\", size = %d\n", (int) ikey.size, (char *) ikey.data, (int) idata.size); *************** *** 58,68 **** } for (i=0; iget))(keydb, NULL, &kkey, &kdata, 0)) { sprintf(buf, "keyid %02X%02X%02X%02X in worddb but not keydb\n", ((unsigned char *) kkey.data)[0], ((unsigned char *) kkey.data)[1], ((unsigned char *) kkey.data)[2], --- 58,74 ---- } for (i=0; iget))(keydb, NULL, &kkey, &kdata, 0)) { sprintf(buf, "keyid %02X%02X%02X%02X in worddb but not keydb\n", ((unsigned char *) kkey.data)[0], ((unsigned char *) kkey.data)[1], ((unsigned char *) kkey.data)[2], *************** *** 72,82 **** } } (*(cursor->c_close))(cursor); ! if ((ret = (*(timedb->cursor))(timedb, NULL, &cursor))) { sprintf(buf, "error creating timedb cursor: error = %d", ret); log_error("main", buf); } for (ret = (*(cursor->c_get))(cursor, &ikey, &idata, DB_FIRST); --- 78,88 ---- } } (*(cursor->c_close))(cursor); ! if ((ret = (*(timedb->cursor))(timedb, NULL, &cursor,0))) { sprintf(buf, "error creating timedb cursor: error = %d", ret); log_error("main", buf); } for (ret = (*(cursor->c_get))(cursor, &ikey, &idata, DB_FIRST); *************** *** 90,100 **** } for (i=0; iget))(keydb, NULL, &kkey, &kdata, 0)) { sprintf(buf, "keyid %02X%02X%02X%02X in timedb but not keydb\n", ((unsigned char *) kkey.data)[0], ((unsigned char *) kkey.data)[1], ((unsigned char *) kkey.data)[2], --- 96,112 ---- } for (i=0; iget))(keydb, NULL, &kkey, &kdata, 0)) { sprintf(buf, "keyid %02X%02X%02X%02X in timedb but not keydb\n", ((unsigned char *) kkey.data)[0], ((unsigned char *) kkey.data)[1], ((unsigned char *) kkey.data)[2], Index: pksd.c =================================================================== RCS file: /home/mwa/Admin/cvsroot/home/mwa/src/pks/pksd.c,v retrieving revision 1.3 retrieving revision 1.4 diff -c -5 -r1.3 -r1.4 *** pksd.c 1998/07/10 22:02:31 1.3 --- pksd.c 1999/04/23 18:48:21 1.4 *************** *** 1,6 **** ! const char rcsid_pksd_c[] = "$Id: pksd.c,v 1.3 1998/07/10 22:02:31 mwa Exp $"; /* * Copyright (c) 1996, Marc Horowitz. All rights reserved. * See the LICENSE file in the release for redistribution information. */ --- 1,6 ---- ! const char rcsid_pksd_c[] = "$Id: pksd.c,v 1.4 1999/04/23 18:48:21 mwa Exp $"; /* * Copyright (c) 1996, Marc Horowitz. All rights reserved. * See the LICENSE file in the release for redistribution information. */ *************** *** 78,87 **** --- 78,89 ---- mrc.pic = &pic; mrc.max_last = pc.max_last; psc.socket = pc.socket_name; psc.mrc = &mrc; + + /*handledb_init_array(pc.number_of_db_files); by hironobu */ if (!pc.www_port && (pc.mail_delivery_client[0] == '\0')) { fprintf(stderr, "The configuration file did not specify any servers\n" "to run. Did you forget to configure the server?\n" "See the INSTALL file for help.\n"); Index: pksdump.c =================================================================== RCS file: /home/mwa/Admin/cvsroot/home/mwa/src/pks/pksdump.c,v retrieving revision 1.1.1.2 retrieving revision 1.3 diff -c -5 -r1.1.1.2 -r1.3 *** pksdump.c 1998/05/01 06:24:48 1.1.1.2 --- pksdump.c 1999/04/23 19:40:00 1.3 *************** *** 1,12 **** #include #include #include #include - - #include - #include #include #include "database.h" #include "globals.h" #include "kd_internal.h" --- 1,9 ---- *************** *** 30,40 **** if ((ret = (*(worddb->cursor))(worddb, NULL, &cursor))) { sprintf(buf, "error creating worddb cursor: error = %d", ret); log_error("main", buf); return; } ! for (ret = (*(cursor->c_get))(cursor, &key, &data, DB_FIRST); ret == 0; ret = (*(cursor->c_get))(cursor, &key, &data, DB_NEXT)) { if (data.size%12) { printf("worddb corrupt in entry = \"%.*s\", size = %d\n", --- 27,38 ---- if ((ret = (*(worddb->cursor))(worddb, NULL, &cursor))) { sprintf(buf, "error creating worddb cursor: error = %d", ret); log_error("main", buf); return; } ! bzero(&key,sizeof(key)); ! bzero(&data,sizeof(data)); for (ret = (*(cursor->c_get))(cursor, &key, &data, DB_FIRST); ret == 0; ret = (*(cursor->c_get))(cursor, &key, &data, DB_NEXT)) { if (data.size%12) { printf("worddb corrupt in entry = \"%.*s\", size = %d\n", *************** *** 50,59 **** --- 48,59 ---- printf(" %12ld %02X%02X%02X%02X %02X%02X%02X%02X\n", (long) (tmp[0]<<24)|(tmp[1]<<16)|(tmp[2]<<8)|(tmp[3]), tmp[4], tmp[5], tmp[6], tmp[7], tmp[8], tmp[9], tmp[10], tmp[11]); } + bzero(&key,sizeof(key)); + bzero(&data,sizeof(data)); } (*(cursor->c_close))(cursor); } Index: util.c =================================================================== RCS file: /home/mwa/Admin/cvsroot/home/mwa/src/pks/util.c,v retrieving revision 1.4 retrieving revision 1.5 diff -c -5 -r1.4 -r1.5 *** util.c 1998/07/10 22:02:39 1.4 --- util.c 1999/04/23 19:40:01 1.5 *************** *** 1,6 **** ! const char rcsid_util_c[] = "$Id: util.c,v 1.4 1998/07/10 22:02:39 mwa Exp $"; /* * Copyright (c) 1996, Marc Horowitz. All rights reserved. * See the LICENSE file in the release for redistribution information. */ --- 1,6 ---- ! const char rcsid_util_c[] = "$Id: util.c,v 1.5 1999/04/23 19:40:01 mwa Exp $"; /* * Copyright (c) 1996, Marc Horowitz. All rights reserved. * See the LICENSE file in the release for redistribution information. */ *************** *** 92,108 **** if (fstat(fd, &fst)) return(0); xfc->len = fst.st_size; ! xfc->buf = mmap(0, xfc->len, PROT_READ, MAP_SHARED, fd, 0); if (xfc->buf != ((void *) -1)) { xfc->mmapped = 1; #if defined(HAVE_MADVISE) && defined(MADV_SEQUENTIAL) ! madvise(xfc->buf, xfc->len, MADV_SEQUENTIAL); /* ignore the error. some systems don't support all the kinds of advice, and there's nothing to do, anyway. */ #endif return(1); --- 92,108 ---- if (fstat(fd, &fst)) return(0); xfc->len = fst.st_size; ! xfc->buf = (void *)mmap(0, xfc->len, PROT_READ, MAP_SHARED, fd, 0); if (xfc->buf != ((void *) -1)) { xfc->mmapped = 1; #if defined(HAVE_MADVISE) && defined(MADV_SEQUENTIAL) ! madvise((void *)xfc->buf, xfc->len, MADV_SEQUENTIAL); /* ignore the error. some systems don't support all the kinds of advice, and there's nothing to do, anyway. */ #endif return(1); *************** *** 141,151 **** void xfilecontents_free(xfilecontents *xfc) { #ifdef HAVE_MMAP if (xfc->mmapped) ! munmap(xfc->buf, xfc->len); #endif xbuffer_free(&(xfc->xb)); } char *my_strdup(const char *s) --- 141,151 ---- void xfilecontents_free(xfilecontents *xfc) { #ifdef HAVE_MMAP if (xfc->mmapped) ! munmap((void *)xfc->buf, xfc->len); #endif xbuffer_free(&(xfc->xb)); } char *my_strdup(const char *s) diff -r -c5 ../a/kd_generic_multi.c ./kd_generic_multi.c *** ../a/kd_generic_multi.c Fri Apr 23 19:24:13 1999 --- ./kd_generic_multi.c Fri Apr 23 20:48:07 1999 *************** *** 0 **** --- 1,271 ---- + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + + #include "database.h" + #include "globals.h" + #include "llist.h" + #include "kd_types.h" + #include "kd_internal.h" + #include "memory_config.h" + + + /* + #ifdef MULTI_DB + #endif + */ + + #include "multidbutil.h" + #include "kd_generic_multi.h" + + + + DB *keydb_array[DB_ARRAY_SIZE]={NULL,NULL,NULL}; + + int multi_kd_db_store_keyblock(llist *keys, error *err) + { + int db_index; + DBT key, newdata; + xbuffer newxb; + keys_elem *ke = (keys_elem *) (*((void **) keys->xb.buf)); + + memset(&key, 0, sizeof(key)); + memset(&newdata, 0, sizeof(newdata)); + + /* ke points to first key, which is enough to derive the keyid + for the database key */ + + xbuffer_alloc(&newxb); + + if (!llist_iterate(keys, kd_keys_elem_marshall, (void *) &newxb)) { + xbuffer_free(&newxb); + err->fatal = 1; + err->str = "internal error while marshalling keyblock"; + fail(); + } + + key.data = &(ke->keyidbits.buf[4]); + key.size = KEYDB_KEYID_BYTES; + + newdata.data = (void *) newxb.buf; + newdata.size = (size_t) newxb.len; + + /* + * + */ + + db_index = which_db(key.data); + if ((*(keydb_array[db_index]->put))(keydb_array[db_index], NULL, &key, &newdata, 0) < 0) { + xbuffer_free(&newxb); + err->fatal = 1; + sprintf(err->buf, "error %s keydb%3.3d, errno = %d", "writing to", db_index,errno); + fail(); + } + + xbuffer_free(&newxb); + + return(1); + } + + static DB_ENV dummy_dbenv; + int multi_kd_open_1(char *dbdir, int create, error *err) + { + int flags, db_err, fd; + static DB_ENV dbenv; + DB_INFO keyinfo, wordinfo, timeinfo; + int i; + char filename[1024]; + + if (chdir(dbdir) < 0) { + err->fatal = 1; + sprintf(err->buf, "(pksd_db_open)Error changing to db directory (errno = %d)",errno); + fail(); + } + + /* this might get a lg_info, lk_info, and/or tx_info later */ + memset(&dbenv, 0, sizeof(dbenv)); + flags = create?(DB_CREATE|DB_TRUNCATE):0; + + /* + * open keydb databass files + */ + memset(&keyinfo, 0, sizeof(keyinfo)); + keyinfo.db_cachesize = 65536; + keyinfo.db_pagesize = 4096; + for ( i = 0; i < DB_ARRAY_SIZE ; i++) { + sprintf(filename,"keydb%3.3d",i); + if ((db_err = db_open(filename, DB_HASH, flags, 0644, &dbenv, + &keyinfo,&keydb_array[i]))) { + err->fatal = 1; + sprintf(err->buf, "Error opening %s (errno = %d => %s )", filename, db_err,strerror(db_err)); + fail(); + } + + + if ((db_err = ((*(keydb_array[i]->fd))(keydb_array[i], &fd)))) { + err->fatal = 1; + sprintf(err->buf, "failed getting %s fd: %d", filename, db_err); + fail(); + } + if (fcntl(fd, F_SETFD, 1) < 0) { + err->fatal = 1; + sprintf(err->buf, "failed making %s close-on-exec: %d", filename,errno); + fail(); + } + } + + /* + * open worddb + */ + memset(&wordinfo, 0, sizeof(wordinfo)); + wordinfo.db_pagesize = 512; + wordinfo.db_cachesize = WORDDB_CASH_SIZE; + if ((db_err = db_open("worddb", DB_HASH, flags, 0644, &dbenv, &wordinfo, + &worddb))) { + multi_kd_close_1(); + err->fatal = 1; + sprintf(err->buf, "Error opening worddb (errno = %d)", db_err); + fail(); + } + + if ((db_err = ((*(worddb->fd))(worddb, &fd)))) { + err->fatal = 1; + sprintf(err->buf, "failed getting worddb fd: %d", db_err); + fail(); + } + + if (fcntl(fd, F_SETFD, 1) < 0) { + err->fatal = 1; + sprintf(err->buf, "failed making worddb close-on-exec: %d", errno); + fail(); + } + + /* + * open timedb + */ + memset(&timeinfo, 0, sizeof(timeinfo)); + if ((db_err = db_open("timedb", DB_BTREE, flags, 0644, &dbenv, &timeinfo, + &timedb))) { + multi_kd_close_1(); + err->fatal = 1; + sprintf(err->buf, "Error opening timedb (errno = %d)", db_err); + fail(); + } + + if ((db_err = ((*(timedb->fd))(timedb, &fd)))) { + err->fatal = 1; + sprintf(err->buf, "failed getting timedb fd: %d", db_err); + fail(); + } + + if (fcntl(fd, F_SETFD, 1) < 0) { + err->fatal = 1; + sprintf(err->buf, "failed making timedb close-on-exec: %d", errno); + fail(); + } + + return(1); + + + } + + void multi_kd_sync_1() + { + int i; + (*(timedb->sync))(timedb, 0); + (*(worddb->sync))(worddb, 0); + for(i=0; i < DB_ARRAY_SIZE ; i++) { + if (keydb_array[i]) + (*(keydb_array[i]->sync))(keydb_array[i],0); + } + } + + void multi_kd_close_1() + { + int i; + if (timedb) + (*(timedb->close))(timedb, 0); + if (worddb) + (*(worddb->close))(worddb, 0); + for(i=0; i < DB_ARRAY_SIZE ; i++) { + if (keydb_array[i]) + (*(keydb_array[i]->close))(keydb_array[i],0); + } + } + + int multi_kd_backup_1() + { + char buf[1024]; + char dist_fname[1024]; + char src_fname[1024]; + int i; + + kd_sync(); + + if ((mkdir("backup", 0755) < 0) && (errno != EEXIST)) { + kd_sync(); + sprintf(buf, "failed creating backup/ dir: errno = %d", errno); + log_error("multi_kd_backup_1", buf); + return(0); + } + + for (i=0; i < DB_ARRAY_SIZE ; i++) { + sprintf(dist_fname,"backup/keydb%3.3d",i); + if ((unlink(dist_fname) < 0) && (errno != ENOENT)) { + kd_sync(); + sprintf(buf, "failed removing old %s: errno = %d",dist_fname,errno); + log_error("multi_kd_backup_1", buf); + return(0); + } + } + + if ((unlink("backup/worddb") < 0) && (errno != ENOENT)) { + kd_sync(); + sprintf(buf, "failed removing old backup/worddb: errno = %d", errno); + log_error("multi_backup_1", buf); + return(0); + } + + if ((unlink("backup/timedb") < 0) && (errno != ENOENT)) { + kd_sync(); + sprintf(buf, "failed removing old backup/timedb: errno = %d", errno); + log_error("multi_kd_backup_1", buf); + return(0); + } + + kd_sync(); + for (i=0; i < DB_ARRAY_SIZE ; i++) { + sprintf(src_fname,"keydb%3.3d",i); + sprintf(dist_fname,"backup/keydb%3.3d",i); + if (copy_file((const char *)src_fname, (const char *)dist_fname) < 0) { + kd_sync(); + sprintf(buf, "failed copying keydb to %s: errno = %d", dist_fname,errno); + log_error("multi_kd_backup_1", buf); + return(0); + } + } + + if (copy_file("worddb", "backup/worddb") < 0) { + kd_sync(); + sprintf(buf, "failed copying worddb to backup/worddb: errno = %d", + errno); + log_error("multi_kd_backup_1", buf); + return(0); + } + + if (copy_file("timedb", "backup/timedb") < 0) { + kd_sync(); + sprintf(buf, "failed copying timedb to backup/timedb: errno = %d", + errno); + log_error("multi_kd_backup_1", buf); + return(0); + } + return(1); + } diff -r -c5 ../a/kd_generic_multi.h ./kd_generic_multi.h *** ../a/kd_generic_multi.h Fri Apr 23 19:24:13 1999 --- ./kd_generic_multi.h Fri Apr 23 20:48:07 1999 *************** *** 0 **** --- 1,30 ---- + + /* + #ifdef MULTI_DB + #endif + */ + + + #include "llist.h" + #include "kd_internal.h" + #ifndef _KD_GENERIC_MULTI_H + #define _KD_GENERIC_MULTI_H + + /* + * number of keydb files + * prime number would be good for DB_ARRAY_SIZE. + */ + #define DB_ARRAY_SIZE 3 + + int multi_kd_db_store_keyblock (llist *key, + error *err); + int multi_kd_open_1(char *dbdir, + int create, + error *err); + void multi_kd_sync_1(); + void multi_kd_close_1(); + int multi_kd_backup_1(); + + #endif + + diff -r -c5 ../a/kd_search_multi.c ./kd_search_multi.c *** ../a/kd_search_multi.c Fri Apr 23 19:24:13 1999 --- ./kd_search_multi.c Fri Apr 23 20:48:09 1999 *************** *** 0 **** --- 1,159 ---- + + + #include + #include + #include + #include + #include + #include + #include + #include + + #include "pgputil.h" + #include "database.h" + #include "globals.h" + #include "llist.h" + #include "kd_types.h" + #include "kd_internal.h" + #include "kd_search.h" + + #ifdef MULTI_DB + #include "kd_generic_multi.h" + #include "multidbutil.h" + #endif + + /* + * This duplicated typedef is very bad manner (see kd_search.c) + */ + typedef struct _akte_state { + xbuffer entries; + error *err; + } akte_state; + typedef struct _ftf_state { + llist_iter func; + void *state; + } ftf_state; + + extern int func_then_free(void *e, void *c); + extern int add_key_to_keylist(void *e, void *c); + extern int add_key_to_entrylist(void *e, void *c); + extern DB *keydb_array[]; + + /* + * Bad manner, duplicated function (see kd_search.c) + */ + static int sort_twelvebytes(const void *a, const void *b) + { + /* the result should be most recent first, so reverse args to memcmp */ + return(memcmp(b, a, 12)); + } + + + int multi_do_all_keys(int flags, llist_iter func, void *c, error *err) + { + int db_index; + akte_state aktes; + int ret, i; + DBC *cursor; + DBT key, data; + ow_state ows; + ftf_state ftfs; + + memset(&key, 0, sizeof(key)); + memset(&data, 0, sizeof(data)); + + xbuffer_alloc(&(aktes.entries)); + aktes.err = err; + + ftfs.func = func; + ftfs.state = c; + + for ( db_index = 0; db_index < DB_ARRAY_SIZE; db_index++) { + keydb=keydb_array[db_index]; + if ((ret = (*(keydb->cursor))(keydb, NULL, &cursor,0))) { + err->fatal = 1; + sprintf(err->buf, "error creating keydb cursor: error = %d", ret); + fail(); + } + + for (ret = (*(cursor->c_get))(cursor, &key, &data, DB_FIRST); + ret == 0; + ret = (*(cursor->c_get))(cursor, &key, &data, DB_NEXT)) { + if (flags & KD_SEARCH_STDOUT) { + /* just iterate the database calling the iterator function. + don't bother collecting id's or sorting */ + if (kd_keyblock_iterate((unsigned char *) data.data, + (long) data.size, + func_then_free, &ftfs, err)) + continue; + } else { + if (kd_keyblock_iterate((unsigned char *) data.data, + (long) data.size, + add_key_to_entrylist, &aktes, err)) + continue; + } + + /* if the loop gets here, there was an error in the iteration. */ + + if ((flags & KD_SEARCH_IGNORE_ERRORS) && (err->fatal == 0)) { + char buf[1024]; + + sprintf(buf, "ignoring error in kd_keyblock_iterate, " + "keydb%3.3d keyid %02X%02X%02X%02X: %s", + db_index, + ((unsigned char *) key.data)[0], + ((unsigned char *) key.data)[1], + ((unsigned char *) key.data)[2], + ((unsigned char *) key.data)[3], + err->str); + + log_error("multi_do_all_keys", buf); + } else { + xbuffer_free(&(aktes.entries)); + (*(cursor->c_close))(cursor); + + /* a "non-fatal" error here indicates a user err, which + indicates db corruption, which is fatal */ + err->fatal = 1; + fail(); + } + } + + (*(cursor->c_close))(cursor); + + if (ret != DB_NOTFOUND) { + err->fatal = 1; + sprintf(err->buf, "error iterating keydb%3.3d: error = %d", db_index,ret); + fail(); + } + } + + if (!(flags & KD_SEARCH_STDOUT)) { + if (aktes.entries.len == 0) { + /* the database is empty */ + + err->fatal = 0; + err->str = "The database is empty"; + return(0); + } + + qsort(aktes.entries.buf, (size_t) (aktes.entries.len/12), 12, + sort_twelvebytes); + + ows.userid = NULL; + ows.userid_len = 0; + ows.filter = NULL; + ows.return_disabled = (flags & KD_SEARCH_RETURN_DISABLED)?1:0; + ows.c = c; + ows.err = err; + ows.append = func; + + for (i=0; i + #include + #include "multidbutil.h" + #include "kd_generic_multi.h" + + /* + #ifdef MULTI_DB + #endif + */ + + /* + * 'which_ db' function ==> hash('keyid') mod 'db_array_size' + * but real hash function isn't required because keyid would be + * random number. + */ + int which_db(void *byte) + { + unsigned int i; + BIT_TO_UINT(byte,i); + + #ifdef MULTI_DEBUG + fprintf(stderr,"which_db: keyid %8.8X\n",i); + #endif + return i % DB_ARRAY_SIZE; + } + + #define MAX_ZERO_AREA 1024 + static unsigned char nullbuf[MAX_ZERO_AREA]; + static int clear_flag=0; + int zerocmp(unsigned char *buf,int n) + { + int ret; + if ( clear_flag == 0 ) { + /* init nullbuf */ + bzero(nullbuf,MAX_ZERO_AREA); + clear_flag=1; + } + if ( n > MAX_ZERO_AREA ) { + return -1; + } + ret = memcmp(buf,nullbuf,n); + return ( ret==0? (0):(1) ); + } diff -r -c5 ../a/multidbutil.h ./multidbutil.h *** ../a/multidbutil.h Fri Apr 23 19:24:14 1999 --- ./multidbutil.h Fri Apr 23 20:48:15 1999 *************** *** 0 **** --- 1,22 ---- + + /* + #ifdef MULTI_DB + #endif + */ + + #ifndef _MULTIDBUTIL_H + #define _MULTIDBUTIL_H + + /* #define MULTI_DEBUG 1 */ + + #define BIT_TO_UINT(bitpattern,i) {\ + unsigned char b[4];\ + memcpy(b,bitpattern,4);\ + i = ((b[0] & 0xff)<<24) | ((b[1] & 0xff)<<16) | ((b[2] & 0xff)<<8) | (b[3] & 0xff);\ + } + + extern int which_db(void *byte); + + extern int zerocmp(unsigned char *buf,int n); + + #endif diff -r -c5 ../a/readme_1 ./readme_1 *** ../a/readme_1 Fri Apr 23 19:24:14 1999 --- ./readme_1 Fri Apr 23 20:48:24 1999 *************** *** 0 **** --- 1,143 ---- + $Date: 1999/04/23 18:48:24 $ + + Subject: Memorandum for patched pks-0.9.3db2test. + Author: Hironobu SUZUKI + Date: 1999/Jan/24 + + + How to use this + =============== + + pks-0.9.3db2test.tar.gz and db-2.6.4.tar.gz are required. db-2.6.4 is + available from http://www.sleepycat.com. + + + + HOW TO COMPILE + =============== + + Example (under Linux) + + $ tar zxvf pks-0.9.3db2test.tar.gz + $ cd pks-0.9.3db2test + $ rm -fr db2-sleepycat + $ tar zxf ../db-2.6.4.tar.gz + $ mv db-2.6.4 db2-sleepycat + $ cp ../multidb_and_worddb/* . + $ patch -p < patch_to_pks-0.9.3db2test + $ ./configure + $ make + .... + gcc -o pksdctl pksdctl.o + sh mkpksdconf > pksd.conf + h2nppc$ + + --- + + + CHANGES + ======= + + 1) Keydb is splited. + + keydb is splited. Older version of pksd used one "keydb" file for key + database. this version use 3 splited keydbs (keydb000, keydb001 and + keydb002). + + $ pksclient ./db create + $ ls db + keydb000 keydb001 keydb002 timedb worddb + + 2) db I/O become efficient. + + worddb and timedb database element increasing algorithm was changed + and become more efficent. But still slow when database is initialized + by huge keyring. + + 3) Time-stamp Logging Format + + logging message for STDERR was changed. Message printed with + time-stamp. + + ex) + + $ pksclient ./db create + [Sun Jan 24 20:06:05 1999] kd_create: flags=0 + [Sun Jan 24 20:06:05 1999] kd_create: completed successfully + ... + + + 4) soft_err and more. + + 2 patch was added. Patches was posted in pgp-keyserver-folk@flame.org + by Marcel Waldvogel at 17/Jun/98 and 21/Jun/98. + + + --- + + + Configuration TIPS: + + + Need more splited keydb + ======================= + + Default is 3. If you need more splited file, change DB_ARRAY_SIZE as + 4, 5 or more. Remember file open limit when you change it. + + kd_generic_multi.h: + + /* + * number of keydb files + * prime number would be good for DB_ARRAY_SIZE. + */ + #define DB_ARRAY_SIZE 3 + + + + + Value of ASSIGNED_MEMORY_UNIT + ============================= + + ASSIGNED_MEMORY_UNIT value controls db cache size and alloc size of + worddb. This size depends on your machine configure. Default size is + '8'. If ASSIGNED_MEMORY_UNIT is assinged bigger, more memory size is + required but little bit faster than small size. If you have a lot of + physical memory, you'd better to make it bigger. For example, my + machine have 128Mbyte physical memory and ASSIGNED_MEMORY_UNIT is 16. + I estimate maximum limit will be 32. + + memory_config.h + ..... + + /* + * Memory size for one DB element. + */ + + #define ASSIGNED_MEMORY_UNIT 8 + + /* + #define ASSIGNED_MEMORY_UNIT 16 + #define ASSIGNED_MEMORY_UNIT 24 + #define ASSIGNED_MEMORY_UNIT 32 + */ + .... + + + + EPROTO error under FreeBSD + =========================== + + I you encounter this compile error, change EPROTO to EPROTOTYPE in + www.c + + gcc -Wall -pedantic -g -O -Idb2-sleepycat/dist -DDEBUG -DHAVE_SYS_SELECT_H=1 -\ + DHAVE_MMAP=1 -DHAVE_MADVISE=1 -c www.c + www.c: In function `listener': + www.c:407: `EPROTO' undeclared (first use this function) + www.c:407: (Each undeclared identifier is reported only once + www.c:407: for each function it appears in.) + *** Error code 1 + + ===== +