Changeset View
Changeset View
Standalone View
Standalone View
b/g10/tdbio.c
| Context not available. | |||||
| static void open_db(void); | static void open_db(void); | ||||
| static void migrate_from_v2 (void); | static void migrate_from_v2 (void); | ||||
| static int | |||||
| take_write_lock (void) | |||||
| { | |||||
| if (!lockhandle) | |||||
| lockhandle = dotlock_create (db_name, 0); | |||||
| if (!lockhandle) | |||||
| log_fatal ( _("can't create lock for '%s'\n"), db_name ); | |||||
| if (!is_locked) | |||||
| { | |||||
| if (dotlock_take (lockhandle, -1) ) | |||||
| log_fatal ( _("can't lock '%s'\n"), db_name ); | |||||
| else | |||||
| is_locked = 1; | |||||
| return 0; | |||||
| } | |||||
| else | |||||
| return 1; | |||||
| } | |||||
| static void | |||||
| release_write_lock (void) | |||||
| { | |||||
| if (!opt.lock_once) | |||||
| if (!dotlock_release (lockhandle)) | |||||
| is_locked = 0; | |||||
| } | |||||
| ␌ | ␌ | ||||
| /************************************* | /************************************* | ||||
| ************* record cache ********** | ************* record cache ********** | ||||
| Context not available. | |||||
| int n = dirty_count / 5; /* discard some dirty entries */ | int n = dirty_count / 5; /* discard some dirty entries */ | ||||
| if( !n ) | if( !n ) | ||||
| n = 1; | n = 1; | ||||
| if( !is_locked ) { | take_write_lock (); | ||||
| if (dotlock_take (lockhandle, -1)) | |||||
| log_fatal("can't acquire lock - giving up\n"); | |||||
| else | |||||
| is_locked = 1; | |||||
| } | |||||
| for( unused = NULL, r = cache_list; r; r = r->next ) { | for( unused = NULL, r = cache_list; r; r = r->next ) { | ||||
| if( r->flags.used && r->flags.dirty ) { | if( r->flags.used && r->flags.dirty ) { | ||||
| int rc = write_cache_item( r ); | int rc = write_cache_item( r ); | ||||
| Context not available. | |||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| if( !opt.lock_once ) { | release_write_lock (); | ||||
| if (!dotlock_release (lockhandle)) | |||||
| is_locked = 0; | |||||
| } | |||||
| assert( unused ); | assert( unused ); | ||||
| r = unused; | r = unused; | ||||
| r->flags.used = 1; | r->flags.used = 1; | ||||
| Context not available. | |||||
| if( !cache_is_dirty ) | if( !cache_is_dirty ) | ||||
| return 0; | return 0; | ||||
| if( !is_locked ) { | if (!take_write_lock ()) | ||||
| if (dotlock_take (lockhandle, -1)) | did_lock = 1; | ||||
| log_fatal("can't acquire lock - giving up\n"); | |||||
| else | |||||
| is_locked = 1; | |||||
| did_lock = 1; | |||||
| } | |||||
| for( r = cache_list; r; r = r->next ) { | for( r = cache_list; r; r = r->next ) { | ||||
| if( r->flags.used && r->flags.dirty ) { | if( r->flags.used && r->flags.dirty ) { | ||||
| int rc = write_cache_item( r ); | int rc = write_cache_item( r ); | ||||
| Context not available. | |||||
| } | } | ||||
| } | } | ||||
| cache_is_dirty = 0; | cache_is_dirty = 0; | ||||
| if( did_lock && !opt.lock_once ) { | if (did_lock) | ||||
| if (!dotlock_release (lockhandle)) | release_write_lock (); | ||||
| is_locked = 0; | |||||
| } | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| Context not available. | |||||
| if( !in_transaction ) | if( !in_transaction ) | ||||
| log_bug("tdbio: no active transaction\n"); | log_bug("tdbio: no active transaction\n"); | ||||
| if( !is_locked ) { | take_write_lock (); | ||||
| if (dotlock_take (lockhandle, -1)) | |||||
| log_fatal("can't acquire lock - giving up\n"); | |||||
| else | |||||
| is_locked = 1; | |||||
| } | |||||
| block_all_signals(); | block_all_signals(); | ||||
| in_transaction = 0; | in_transaction = 0; | ||||
| rc = tdbio_sync(); | rc = tdbio_sync(); | ||||
| unblock_all_signals(); | unblock_all_signals(); | ||||
| if( !opt.lock_once ) { | release_write_lock (); | ||||
| if (!dotlock_release (lockhandle)) | |||||
| is_locked = 0; | |||||
| } | |||||
| return rc; | return rc; | ||||
| } | } | ||||
| Context not available. | |||||
| tdbio_set_dbname( const char *new_dbname, int create, int *r_nofile) | tdbio_set_dbname( const char *new_dbname, int create, int *r_nofile) | ||||
| { | { | ||||
| char *fname; | char *fname; | ||||
| struct stat statbuf; | |||||
| static int initialized = 0; | static int initialized = 0; | ||||
| if( !initialized ) { | if( !initialized ) { | ||||
| Context not available. | |||||
| else | else | ||||
| fname = xstrdup (new_dbname); | fname = xstrdup (new_dbname); | ||||
| xfree (db_name); | |||||
| db_name = fname; | |||||
| /* | |||||
| * Quick check for (likely) case where there is trustdb.gpg | |||||
| * already. This check is not required in theory, but it helps in | |||||
| * practice, avoiding costly operations of preparing and taking | |||||
| * the lock. | |||||
| */ | |||||
| if (stat (fname, &statbuf) == 0 && statbuf.st_size > 0) | |||||
| /* OK, we have the valid trustdb.gpg already. */ | |||||
| return 0; | |||||
| take_write_lock (); | |||||
| if( access( fname, R_OK ) ) { | if( access( fname, R_OK ) ) { | ||||
| if( errno != ENOENT ) { | if( errno != ENOENT ) | ||||
| log_error( _("can't access `%s': %s\n"), fname, strerror(errno) ); | log_fatal( _("can't access '%s': %s\n"), fname, strerror(errno) ); | ||||
| xfree(fname); | |||||
| return G10ERR_TRUSTDB; | |||||
| } | |||||
| if (!create) | if (!create) | ||||
| *r_nofile = 1; | *r_nofile = 1; | ||||
| else { | else { | ||||
| Context not available. | |||||
| } | } | ||||
| *p = DIRSEP_C; | *p = DIRSEP_C; | ||||
| xfree(db_name); | |||||
| db_name = fname; | |||||
| #ifdef __riscos__ | |||||
| if( !lockhandle ) | |||||
| lockhandle = dotlock_create (db_name, 0); | |||||
| if( !lockhandle ) | |||||
| log_fatal( _("can't create lock for `%s'\n"), db_name ); | |||||
| if (dotlock_take (lockhandle, -1)) | |||||
| log_fatal( _("can't lock `%s'\n"), db_name ); | |||||
| #endif /* __riscos__ */ | |||||
| oldmask=umask(077); | oldmask=umask(077); | ||||
| if (is_secured_filename (fname)) { | if (is_secured_filename (fname)) { | ||||
| fp = NULL; | fp = NULL; | ||||
| Context not available. | |||||
| if( db_fd == -1 ) | if( db_fd == -1 ) | ||||
| log_fatal( _("can't open `%s': %s\n"), db_name, strerror(errno) ); | log_fatal( _("can't open `%s': %s\n"), db_name, strerror(errno) ); | ||||
| #ifndef __riscos__ | |||||
| if( !lockhandle ) | |||||
| lockhandle = dotlock_create (db_name, 0); | |||||
| if( !lockhandle ) | |||||
| log_fatal( _("can't create lock for `%s'\n"), db_name ); | |||||
| #endif /* !__riscos__ */ | |||||
| rc = create_version_record (); | rc = create_version_record (); | ||||
| if( rc ) | if( rc ) | ||||
| log_fatal( _("%s: failed to create version record: %s"), | log_fatal( _("%s: failed to create version record: %s"), | ||||
| Context not available. | |||||
| if( !opt.quiet ) | if( !opt.quiet ) | ||||
| log_info(_("%s: trustdb created\n"), db_name); | log_info(_("%s: trustdb created\n"), db_name); | ||||
| return 0; | |||||
| } | } | ||||
| } | } | ||||
| xfree(db_name); | |||||
| db_name = fname; | release_write_lock (); | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| Context not available. | |||||
| assert( db_fd == -1 ); | assert( db_fd == -1 ); | ||||
| if (!lockhandle ) | |||||
| lockhandle = dotlock_create (db_name, 0); | |||||
| if (!lockhandle ) | |||||
| log_fatal( _("can't create lock for `%s'\n"), db_name ); | |||||
| #ifdef __riscos__ | |||||
| if (dotlock_take (lockhandle, -1)) | |||||
| log_fatal( _("can't lock `%s'\n"), db_name ); | |||||
| #endif /* __riscos__ */ | |||||
| db_fd = open (db_name, O_RDWR | MY_O_BINARY ); | db_fd = open (db_name, O_RDWR | MY_O_BINARY ); | ||||
| if (db_fd == -1 && (errno == EACCES | if (db_fd == -1 && (errno == EACCES | ||||
| #ifdef EROFS | #ifdef EROFS | ||||
| Context not available. | |||||