Differences From Artifact [5667b1108e]:
- File
cackey.c
— part of check-in
[e4fd58cbb9]
at
2010-07-23 21:23:41
on branch trunk
— Added timing information to debug output
Fixed issue where readers that were removed and readded weren't connected to properly (user: rkeene, size: 170182) [annotate] [blame] [check-ins using]
To Artifact [6b202c653c]:
- File
cackey.c
— part of check-in
[1edf82bc16]
at
2010-07-23 21:46:17
on branch trunk
— Consolidated slot resetting into a single function.
Updated slot resetting to invalidate slot PC/SC handle. (user: rkeene, size: 170655) [annotate] [blame] [check-ins using]
︙ | |||
817 818 819 820 821 822 823 824 825 826 827 828 829 830 | 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 | + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + | if (scard_rel_context_ret != SCARD_S_SUCCESS) { return(CACKEY_PCSC_E_GENERIC); } return(CACKEY_PCSC_S_OK); } /* * SYNPOSIS * void cackey_mark_slot_reset(struct cackey_slot *slot); * * ARGUMENTS * None * * RETURN VALUE * None * * NOTES * 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) { if (slot == NULL) { return; } CACKEY_DEBUG_PRINTF("Called."); slot->slot_reset = 1; slot->pcsc_card_connected = 0; slot->token_flags = CKF_LOGIN_REQUIRED; CACKEY_DEBUG_PRINTF("Returning."); return; } /* * SYNPOSIS * LONG cackey_reconnect_card(struct cackey_slot *slot, DWORD default_protocol, LPDWORD selected_protocol); * * ARGUMENTS * cackey_slot *slot |
︙ | |||
1213 1214 1215 1216 1217 1218 1219 | 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 | - + | return(CACKEY_PCSC_E_RETRY); } if (scard_xmit_ret != SCARD_S_SUCCESS) { CACKEY_DEBUG_PRINTF("Failed to send APDU to card (SCardTransmit() = %s/%lx)", CACKEY_DEBUG_FUNC_SCARDERR_TO_STR(scard_xmit_ret), (unsigned long) scard_xmit_ret); CACKEY_DEBUG_PRINTF("Marking slot as having been reset"); |
︙ | |||
2175 2176 2177 2178 2179 2180 2181 | 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 | - + - + | /* End transaction */ cackey_end_transaction(slot); if (respcode == 0x6982) { CACKEY_DEBUG_PRINTF("Security status not satisified. Returning NEEDLOGIN"); |
︙ | |||
2397 2398 2399 2400 2401 2402 2403 | 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 | - - + - - + - | } atr_len = sizeof(atr); status_ret = SCardStatus(slot->pcsc_card, NULL, &reader_len, &state, &protocol, atr, &atr_len); if (status_ret == SCARD_E_INVALID_HANDLE) { CACKEY_DEBUG_PRINTF("SCardStatus() returned SCARD_E_INVALID_HANDLE, marking is not already connected and trying again"); |
︙ | |||
3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 | 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 | + + | 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].label = NULL; cackey_mark_slot_reset(&cackey_slots[currslot]); } currslot++; pcsc_readers += curr_reader_len + 1; } /* Start with Slot ID 1, to avoid a bug in GDM on RHEL */ |
︙ | |||
4533 4534 4535 4536 4537 4538 4539 | 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 | - + - - | } if (cackey_slots[slotID].label != NULL) { free(cackey_slots[slotID].label); cackey_slots[slotID].label = NULL; } |
︙ |