static CK_RV nss_dbm_mdToken_InitToken ( NSSCKMDToken *mdToken, NSSCKFWToken *fwToken, NSSCKMDInstance *mdInstance, NSSCKFWInstance *fwInstance, NSSItem *pin, NSSUTF8 *label ) { nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc; nss_dbm_instance_t *instance = (nss_dbm_instance_t *)mdInstance->etc; CK_RV rv; /* Wipe the session object data */ if( (nss_dbm_db_t *)NULL != token->session_db ) { nss_dbm_db_close(token->session_db); } token->session_db = nss_dbm_db_open(token->arena, fwInstance, (char *)NULL, O_RDWR|O_CREAT, &rv); if( (nss_dbm_db_t *)NULL == token->session_db ) { return rv; } /* Wipe the token object data */ if( token->slot->flags & O_RDWR ) { if( (nss_dbm_db_t *)NULL != token->slot->token_db ) { nss_dbm_db_close(token->slot->token_db); } token->slot->token_db = nss_dbm_db_open(instance->arena, fwInstance, token->slot->filename, token->slot->flags | O_CREAT | O_TRUNC, &rv); if( (nss_dbm_db_t *)NULL == token->slot->token_db ) { return rv; } /* PIN is irrelevant */ rv = nss_dbm_db_set_label(token->slot->token_db, label); if( CKR_OK != rv ) { return rv; } } return CKR_OK; }
static void nss_dbm_mdToken_Invalidate( NSSCKMDToken *mdToken, NSSCKFWToken *fwToken, NSSCKMDInstance *mdInstance, NSSCKFWInstance *fwInstance) { nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc; if ((nss_dbm_db_t *)NULL != token->session_db) { nss_dbm_db_close(token->session_db); token->session_db = (nss_dbm_db_t *)NULL; } }
static void nss_dbm_mdSlot_Destroy ( NSSCKMDSlot *mdSlot, NSSCKFWSlot *fwSlot, NSSCKMDInstance *mdInstance, NSSCKFWInstance *fwInstance ) { nss_dbm_slot_t *slot = (nss_dbm_slot_t *)mdSlot->etc; if( (nss_dbm_db_t *)NULL != slot->token_db ) { nss_dbm_db_close(slot->token_db); slot->token_db = (nss_dbm_db_t *)NULL; } }
NSS_IMPLEMENT nss_dbm_db_t * nss_dbm_db_open ( NSSArena *arena, NSSCKFWInstance *fwInstance, char *filename, int flags, CK_RV *pError ) { nss_dbm_db_t *rv; CK_VERSION db_version; rv = nss_ZNEW(arena, nss_dbm_db_t); if( (nss_dbm_db_t *)NULL == rv ) { *pError = CKR_HOST_MEMORY; return (nss_dbm_db_t *)NULL; } rv->db = dbopen(filename, flags, 0600, DB_HASH, (const void *)NULL); if( (DB *)NULL == rv->db ) { *pError = CKR_TOKEN_NOT_PRESENT; return (nss_dbm_db_t *)NULL; } rv->crustylock = NSSCKFWInstance_CreateMutex(fwInstance, arena, pError); if( (NSSCKFWMutex *)NULL == rv->crustylock ) { return (nss_dbm_db_t *)NULL; } db_version = nss_dbm_db_get_format_version(rv); if( db_version.major != nss_dbm_db_format_version.major ) { nss_dbm_db_close(rv); *pError = CKR_TOKEN_NOT_RECOGNIZED; return (nss_dbm_db_t *)NULL; } return rv; }