Index: cackey.c ================================================================== --- cackey.c +++ cackey.c @@ -835,10 +835,14 @@ return(retval); } /* PC/SC Related Functions */ +static cackey_ret cackey_login_required(struct cackey_slot *slot) { + return(CACKEY_PCSC_E_NEEDLOGIN); +} + /* * SYNPOSIS * void cackey_slots_disconnect_all(void); * * ARGUMENTS @@ -1004,11 +1008,11 @@ /* * SYNPOSIS * void cackey_mark_slot_reset(struct cackey_slot *slot); * * ARGUMENTS - * None + * ... * * RETURN VALUE * None * * NOTES @@ -1015,10 +1019,12 @@ * This function marks a slot has having been reset, to later be cleaned up. * Cleanup only happens when a PKCS#11 client calls C_FindObjectsInit. * */ static void cackey_mark_slot_reset(struct cackey_slot *slot) { + int login_required = -1; + if (slot == NULL) { return; } CACKEY_DEBUG_PRINTF("Called."); @@ -1027,11 +1033,23 @@ SCardDisconnect(slot->pcsc_card, SCARD_LEAVE_CARD); } slot->slot_reset = 1; slot->pcsc_card_connected = 0; - slot->token_flags = CKF_LOGIN_REQUIRED; + slot->token_flags = 0; + + if (login_required == -1) { + if (cackey_login_required(slot) != CACKEY_PCSC_S_OK) { + login_required = 1; + } else { + login_required = 0; + } + } + + if (login_required) { + slot->token_flags |= CKF_LOGIN_REQUIRED; + } CACKEY_DEBUG_PRINTF("Returning."); return; } @@ -2396,20 +2414,18 @@ if (respcode == 0x6982) { CACKEY_DEBUG_PRINTF("Security status not satisified. Returning NEEDLOGIN"); cackey_mark_slot_reset(slot); - slot->token_flags = CKF_LOGIN_REQUIRED; return(CACKEY_PCSC_E_NEEDLOGIN); } if (send_ret == CACKEY_PCSC_E_TOKENABSENT) { CACKEY_DEBUG_PRINTF("Token absent. Returning TOKENABSENT"); cackey_mark_slot_reset(slot); - slot->token_flags = CKF_LOGIN_REQUIRED; return(CACKEY_PCSC_E_TOKENABSENT); } return(-1); @@ -3734,12 +3750,11 @@ cackey_slots[currslot].active = 1; cackey_slots[currslot].pcsc_reader = strdup(pcsc_readers); cackey_slots[currslot].pcsc_card_connected = 0; cackey_slots[currslot].transaction_depth = 0; cackey_slots[currslot].transaction_need_hw_lock = 0; - cackey_slots[currslot].slot_reset = 1; - cackey_slots[currslot].token_flags = CKF_LOGIN_REQUIRED; + cackey_slots[currslot].token_flags = 0; cackey_slots[currslot].label = NULL; cackey_mark_slot_reset(&cackey_slots[currslot]); } currslot++;