Blame nss/lib/ckfw/dbm/slot.c

Packit 40b132
/* This Source Code Form is subject to the terms of the Mozilla Public
Packit 40b132
 * License, v. 2.0. If a copy of the MPL was not distributed with this
Packit 40b132
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
Packit 40b132
Packit 40b132
#include "ckdbm.h"
Packit 40b132
Packit 40b132
static CK_RV
Packit 40b132
nss_dbm_mdSlot_Initialize
Packit 40b132
(
Packit 40b132
  NSSCKMDSlot *mdSlot,
Packit 40b132
  NSSCKFWSlot *fwSlot,
Packit 40b132
  NSSCKMDInstance *mdInstance,                                    
Packit 40b132
  NSSCKFWInstance *fwInstance
Packit 40b132
)
Packit 40b132
{
Packit 40b132
  nss_dbm_slot_t *slot = (nss_dbm_slot_t *)mdSlot->etc;
Packit 40b132
  nss_dbm_instance_t *instance = (nss_dbm_instance_t *)mdInstance->etc;
Packit 40b132
  CK_RV rv = CKR_OK;
Packit 40b132
Packit 40b132
  slot->token_db = nss_dbm_db_open(instance->arena, fwInstance, slot->filename, 
Packit 40b132
                                   slot->flags, &rv;;
Packit 40b132
  if( (nss_dbm_db_t *)NULL == slot->token_db ) {
Packit 40b132
    if( CKR_TOKEN_NOT_PRESENT == rv ) {
Packit 40b132
      /* This is not an error-- just means "the token isn't there" */
Packit 40b132
      rv = CKR_OK;
Packit 40b132
    }
Packit 40b132
  }
Packit 40b132
Packit 40b132
  return rv;
Packit 40b132
}
Packit 40b132
Packit 40b132
static void
Packit 40b132
nss_dbm_mdSlot_Destroy
Packit 40b132
(
Packit 40b132
  NSSCKMDSlot *mdSlot,
Packit 40b132
  NSSCKFWSlot *fwSlot,
Packit 40b132
  NSSCKMDInstance *mdInstance,                                    
Packit 40b132
  NSSCKFWInstance *fwInstance
Packit 40b132
)
Packit 40b132
{
Packit 40b132
  nss_dbm_slot_t *slot = (nss_dbm_slot_t *)mdSlot->etc;
Packit 40b132
Packit 40b132
  if( (nss_dbm_db_t *)NULL != slot->token_db ) {
Packit 40b132
    nss_dbm_db_close(slot->token_db);
Packit 40b132
    slot->token_db = (nss_dbm_db_t *)NULL;
Packit 40b132
  }
Packit 40b132
}
Packit 40b132
Packit 40b132
static NSSUTF8 *
Packit 40b132
nss_dbm_mdSlot_GetSlotDescription
Packit 40b132
(
Packit 40b132
  NSSCKMDSlot *mdSlot,
Packit 40b132
  NSSCKFWSlot *fwSlot,
Packit 40b132
  NSSCKMDInstance *mdInstance,                                    
Packit 40b132
  NSSCKFWInstance *fwInstance,
Packit 40b132
  CK_RV *pError
Packit 40b132
)
Packit 40b132
{
Packit 40b132
  return "Database";
Packit 40b132
}
Packit 40b132
Packit 40b132
static NSSUTF8 *
Packit 40b132
nss_dbm_mdSlot_GetManufacturerID
Packit 40b132
(
Packit 40b132
  NSSCKMDSlot *mdSlot,
Packit 40b132
  NSSCKFWSlot *fwSlot,
Packit 40b132
  NSSCKMDInstance *mdInstance,                                    
Packit 40b132
  NSSCKFWInstance *fwInstance,
Packit 40b132
  CK_RV *pError
Packit 40b132
)
Packit 40b132
{
Packit 40b132
  return "Berkeley";
Packit 40b132
}
Packit 40b132
Packit 40b132
static CK_BBOOL
Packit 40b132
nss_dbm_mdSlot_GetTokenPresent
Packit 40b132
(
Packit 40b132
  NSSCKMDSlot *mdSlot,
Packit 40b132
  NSSCKFWSlot *fwSlot,
Packit 40b132
  NSSCKMDInstance *mdInstance,                                    
Packit 40b132
  NSSCKFWInstance *fwInstance
Packit 40b132
)
Packit 40b132
{
Packit 40b132
  nss_dbm_slot_t *slot = (nss_dbm_slot_t *)mdSlot->etc;
Packit 40b132
Packit 40b132
  if( (nss_dbm_db_t *)NULL == slot->token_db ) {
Packit 40b132
    return CK_FALSE;
Packit 40b132
  } else {
Packit 40b132
    return CK_TRUE;
Packit 40b132
  }
Packit 40b132
}
Packit 40b132
Packit 40b132
static CK_BBOOL
Packit 40b132
nss_dbm_mdSlot_GetRemovableDevice
Packit 40b132
(
Packit 40b132
  NSSCKMDSlot *mdSlot,
Packit 40b132
  NSSCKFWSlot *fwSlot,
Packit 40b132
  NSSCKMDInstance *mdInstance,                                    
Packit 40b132
  NSSCKFWInstance *fwInstance
Packit 40b132
)
Packit 40b132
{
Packit 40b132
  /*
Packit 40b132
   * Well, this supports "tokens" (databases) that aren't there, so in
Packit 40b132
   * that sense they're removable.  It'd be nice to handle databases
Packit 40b132
   * that suddenly disappear (NFS-mounted home directories and network
Packit 40b132
   * errors, for instance) but that's a harder problem.  We'll say
Packit 40b132
   * we support removable devices, badly.
Packit 40b132
   */
Packit 40b132
Packit 40b132
  return CK_TRUE;
Packit 40b132
}
Packit 40b132
Packit 40b132
/* nss_dbm_mdSlot_GetHardwareSlot defaults to CK_FALSE */
Packit 40b132
/* 
Packit 40b132
 * nss_dbm_mdSlot_GetHardwareVersion
Packit 40b132
 * nss_dbm_mdSlot_GetFirmwareVersion
Packit 40b132
 *
Packit 40b132
 * These are kinda fuzzy concepts here.  I suppose we could return the
Packit 40b132
 * Berkeley DB version for one of them, if we had an actual number we
Packit 40b132
 * were confident in.  But mcom's "dbm" has been hacked enough that I
Packit 40b132
 * don't really know from what "real" version it stems..
Packit 40b132
 */
Packit 40b132
Packit 40b132
static NSSCKMDToken *
Packit 40b132
nss_dbm_mdSlot_GetToken
Packit 40b132
(
Packit 40b132
  NSSCKMDSlot *mdSlot,
Packit 40b132
  NSSCKFWSlot *fwSlot,
Packit 40b132
  NSSCKMDInstance *mdInstance,                                    
Packit 40b132
  NSSCKFWInstance *fwInstance,
Packit 40b132
  CK_RV *pError
Packit 40b132
)
Packit 40b132
{
Packit 40b132
  nss_dbm_slot_t *slot = (nss_dbm_slot_t *)mdSlot->etc;
Packit 40b132
  return nss_dbm_mdToken_factory(slot, pError);
Packit 40b132
}
Packit 40b132
Packit 40b132
NSS_IMPLEMENT NSSCKMDSlot *
Packit 40b132
nss_dbm_mdSlot_factory
Packit 40b132
(
Packit 40b132
  nss_dbm_instance_t *instance,
Packit 40b132
  char *filename,
Packit 40b132
  int flags,
Packit 40b132
  CK_RV *pError
Packit 40b132
)
Packit 40b132
{
Packit 40b132
  nss_dbm_slot_t *slot;
Packit 40b132
  NSSCKMDSlot *rv;
Packit 40b132
Packit 40b132
  slot = nss_ZNEW(instance->arena, nss_dbm_slot_t);
Packit 40b132
  if( (nss_dbm_slot_t *)NULL == slot ) {
Packit 40b132
    *pError = CKR_HOST_MEMORY;
Packit 40b132
    return (NSSCKMDSlot *)NULL;
Packit 40b132
  }
Packit 40b132
Packit 40b132
  slot->instance = instance;
Packit 40b132
  slot->filename = filename;
Packit 40b132
  slot->flags = flags;
Packit 40b132
  slot->token_db = (nss_dbm_db_t *)NULL;
Packit 40b132
Packit 40b132
  rv = nss_ZNEW(instance->arena, NSSCKMDSlot);
Packit 40b132
  if( (NSSCKMDSlot *)NULL == rv ) {
Packit 40b132
    *pError = CKR_HOST_MEMORY;
Packit 40b132
    return (NSSCKMDSlot *)NULL;
Packit 40b132
  }
Packit 40b132
Packit 40b132
  rv->etc = (void *)slot;
Packit 40b132
  rv->Initialize = nss_dbm_mdSlot_Initialize;
Packit 40b132
  rv->Destroy = nss_dbm_mdSlot_Destroy;
Packit 40b132
  rv->GetSlotDescription = nss_dbm_mdSlot_GetSlotDescription;
Packit 40b132
  rv->GetManufacturerID = nss_dbm_mdSlot_GetManufacturerID;
Packit 40b132
  rv->GetTokenPresent = nss_dbm_mdSlot_GetTokenPresent;
Packit 40b132
  rv->GetRemovableDevice = nss_dbm_mdSlot_GetRemovableDevice;
Packit 40b132
  /*  GetHardwareSlot */
Packit 40b132
  /*  GetHardwareVersion */
Packit 40b132
  /*  GetFirmwareVersion */
Packit 40b132
  rv->GetToken = nss_dbm_mdSlot_GetToken;
Packit 40b132
  rv->null = (void *)NULL;
Packit 40b132
Packit 40b132
  return rv;
Packit 40b132
}