- Try to fix pkcs11.hide_empty_slots

git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@818 c6295689-39f2-0310-b995-f0e70906c6a9
This commit is contained in:
okir 2003-01-03 11:40:11 +00:00
parent 0ffa466eab
commit 1c22c55655
2 changed files with 25 additions and 19 deletions

View File

@ -259,8 +259,12 @@ static void pkcs15_init_slot(struct sc_pkcs15_card *card,
if (auth != NULL) { if (auth != NULL) {
pin_info = (struct sc_pkcs15_pin_info*) auth->data; pin_info = (struct sc_pkcs15_pin_info*) auth->data;
snprintf(tmp, sizeof(tmp), "%s (%s)", if (auth->label[0]) {
snprintf(tmp, sizeof(tmp), "%s (%s)",
card->label, auth->label); card->label, auth->label);
} else {
snprintf(tmp, sizeof(tmp), "%s", card->label);
}
slot->token_info.flags |= CKF_LOGIN_REQUIRED; slot->token_info.flags |= CKF_LOGIN_REQUIRED;
} else } else
sprintf(tmp, "public"); sprintf(tmp, "public");
@ -389,11 +393,9 @@ static CK_RV pkcs15_create_tokens(struct sc_pkcs11_card *p11card)
} }
/* Create read/write slots */ /* Create read/write slots */
if (!sc_pkcs11_conf.hide_empty_slots) { while (slot_allocate(&slot, p11card) == CKR_OK) {
while (slot_allocate(&slot, p11card) == CKR_OK) { pkcs15_init_token_info(card, &slot->token_info);
pkcs15_init_token_info(card, &slot->token_info); slot->token_info.flags |= CKF_TOKEN_INITIALIZED;
slot->token_info.flags |= CKF_TOKEN_INITIALIZED;
}
} }
debug(context, "All tokens created\n"); debug(context, "All tokens created\n");

View File

@ -97,8 +97,9 @@ CK_RV C_GetSlotList(CK_BBOOL tokenPresent, /* only slots with token prese
CK_SLOT_ID_PTR pSlotList, /* receives the array of slot IDs */ CK_SLOT_ID_PTR pSlotList, /* receives the array of slot IDs */
CK_ULONG_PTR pulCount) /* receives the number of slots */ CK_ULONG_PTR pulCount) /* receives the number of slots */
{ {
int numMatches, i, flags = 0; CK_SLOT_ID found[SC_PKCS11_MAX_VIRTUAL_SLOTS];
struct sc_pkcs11_slot *slot; int numMatches, i;
sc_pkcs11_slot_t *slot;
if (context == NULL_PTR) if (context == NULL_PTR)
return CKR_CRYPTOKI_NOT_INITIALIZED; return CKR_CRYPTOKI_NOT_INITIALIZED;
@ -108,13 +109,20 @@ CK_RV C_GetSlotList(CK_BBOOL tokenPresent, /* only slots with token prese
for (i=0; i<context->reader_count; i++) for (i=0; i<context->reader_count; i++)
card_detect(i); card_detect(i);
if (tokenPresent)
flags |= CKF_TOKEN_PRESENT;
numMatches = 0; numMatches = 0;
for (i=0, slot = virtual_slots; i<SC_PKCS11_MAX_VIRTUAL_SLOTS; i++, slot++) for (i=0; i<SC_PKCS11_MAX_VIRTUAL_SLOTS; i++) {
if (slot->card && (slot->slot_info.flags & flags) == flags) slot = &virtual_slots[i];
numMatches++; if (!slot->card)
continue;
if (tokenPresent && !(slot->slot_info.flags & CKF_TOKEN_PRESENT))
continue;
/* Hide all empty slots */
if (sc_pkcs11_conf.hide_empty_slots && !slot->fw_data)
continue;
found[numMatches++] = i;
}
if (pSlotList == NULL_PTR) { if (pSlotList == NULL_PTR) {
debug(context, "was only a size inquiry (%d)\n", numMatches); debug(context, "was only a size inquiry (%d)\n", numMatches);
@ -128,11 +136,7 @@ CK_RV C_GetSlotList(CK_BBOOL tokenPresent, /* only slots with token prese
return CKR_BUFFER_TOO_SMALL; return CKR_BUFFER_TOO_SMALL;
} }
numMatches = 0; memcpy(pSlotList, found, numMatches * sizeof(CK_SLOT_ID));
for (i=0, slot = virtual_slots; i<SC_PKCS11_MAX_VIRTUAL_SLOTS; i++, slot++)
if (slot->card && (slot->slot_info.flags & flags) == flags)
pSlotList[numMatches++] = i;
*pulCount = numMatches; *pulCount = numMatches;
debug(context, "returned %d slots\n", numMatches); debug(context, "returned %d slots\n", numMatches);