diff options
| author | Werner Koch <[email protected]> | 1998-08-07 08:53:38 +0000 |
|---|---|---|
| committer | Werner Koch <[email protected]> | 1998-08-07 08:53:38 +0000 |
| commit | 6d21f2838dcfee933f4c430fba68ba8ada3abd50 (patch) | |
| tree | ecf44aec40a55d3fd46fc6a6d96bb3afa7901029 /g10/tdbio.c | |
| parent | add salted and iterated mode (diff) | |
| download | gnupg-6d21f2838dcfee933f4c430fba68ba8ada3abd50.tar.gz gnupg-6d21f2838dcfee933f4c430fba68ba8ada3abd50.zip | |
chnages done at the train
Diffstat (limited to 'g10/tdbio.c')
| -rw-r--r-- | g10/tdbio.c | 69 |
1 files changed, 68 insertions, 1 deletions
diff --git a/g10/tdbio.c b/g10/tdbio.c index 034e092e3..02950b502 100644 --- a/g10/tdbio.c +++ b/g10/tdbio.c @@ -871,6 +871,33 @@ tdbio_search_dir_byfpr( const byte *fingerprint, size_t fingerlen, return rc; } +static int +del_reclist( ulong recno, int type ) +{ + TRUSTREC rec; + int rc; + + while( recno ) { + rc = tdbio_read_record( recno, &rec, type); + if( rc ) { + log_error_f(db_name, "can't read record %lu: %s\n", + recno, g10_errstr(rc)); + return rc; + } + switch( type ) { + case RECTYPE_PREF: recno = rec.r.pref.next; break; + case RECTYPE_UID: recno = rec.r.uid.next; break; + default: BUG(); + } + rc = tdbio_delete_record( rec.recnum ); + if( rc ) { + log_error_f(db_name, "can't delete record %lu: %s\n", + rec.recnum, g10_errstr(rc)); + return rc; + } + } + return 0; +} /**************** * Delete the Userid UIDLID from DIRLID @@ -878,7 +905,47 @@ tdbio_search_dir_byfpr( const byte *fingerprint, size_t fingerlen, int tdbio_delete_uidrec( ulong dirlid, ulong uidlid ) { - return G10ERR_GENERAL; /* not implemented */ + TRUSTREC dirrec, rec; + ulong recno; + int rc; + + rc = tdbio_read_record( dirlid, &dirrec, RECTYPE_DIR); + if( rc ) { + log_error_f(db_name, "can't read dirrec %lu: %s\n", dirlid, g10_errstr(rc)); + return rc; + } + recno = dirrec.r.dir.uidlist; + for( ; recno; recno = rec.r.uid.next ) { + rc = tdbio_read_record( recno, &rec, RECTYPE_UID); + if( rc ) { + log_error_f(db_name, "can't read uidrec %lu: %s\n", + recno, g10_errstr(rc)); + return rc; + } + if( recno == uidlid ) { + rc = del_reclist( rec.r.uid.prefrec, RECTYPE_PREF ); + if( rc ) + return rc; + rc = del_reclist( rec.r.uid.siglist, RECTYPE_SIG ); + if( rc ) + return rc; + rc = tdbio_delete_record( recno ); + if( rc ) { + log_error_f(db_name, "can't delete uidrec %lu: %s\n", + recno, g10_errstr(rc)); + return rc; + } + dirrec.r.dir.uidlist = 0; + rc = tdbio_write_record( &dirrec ); + if( rc ) { + log_error_f(db_name, "can't update dirrec %lu: %s\n", + dirrec.recnum, g10_errstr(rc)); + return rc; + } + return 0; + } + } + return -1; /* not found */ } |
