- Timestamp:
- 07/25/11 18:45:23 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
tags/1.10/reader-seca.c
r5596 r5729 2 2 #include "reader-common.h" 3 3 #include <stdlib.h> 4 5 static uint64_t get_pbm(struct s_reader * reader, size_t idx) 6 { 7 def_resp; 8 static const unsigned char ins34[] = { 0xc1, 0x34, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00 }; //data following is provider Package Bitmap Records 9 unsigned char ins32[] = { 0xc1, 0x32, 0x00, 0x00, 0x20 }; // get PBM 10 uint64_t pbm = 0; 11 12 ins32[2] = idx; 13 write_cmd(ins34, ins34 + 5); //prepare card for pbm request 14 write_cmd(ins32, NULL); //pbm request 15 16 switch (cta_res[0]) { 17 case 0x04: 18 cs_ri_log(reader, "[seca-reader] no PBM for provider %i", idx + 1); 19 break; 20 case 0x83: 21 pbm = b2ll(8, cta_res + 1); 22 cs_ri_log(reader, "[seca-reader] PBM for provider %i: %08llx", idx + 1, pbm); 23 break; 24 default: 25 cs_log("[seca-reader] ERROR: PBM returns unknown byte %02x", cta_res[0]); 26 } 27 return pbm; 28 } 4 29 5 30 static int32_t set_provider_info(struct s_reader * reader, int32_t i) … … 50 75 lt.tm_mon = month - 1; 51 76 lt.tm_mday = day; 52 // Add entitlements list 53 // PBM will be added in seca_card_info(...) by iterating the llist 54 if (i) // skip first issuer entry 77 78 // Check if entitlement entry exists 79 LL_ITER it = ll_iter_create(reader->ll_entitlements); 80 S_ENTITLEMENT *entry = NULL; 81 ssize_t prov = i; 82 do { 83 entry = ll_iter_next(&it); 84 } while(entry && --prov > 0); 85 86 if (entry) { 87 // update entitlement info 88 entry->provid = b2ll(4, reader->prid[i]); 89 entry->end = mktime(<); 90 entry->id = get_pbm(reader, i); 91 entry->type = 6; 92 } 93 else if (i) // skip first issuer entry 94 // add entitlement info 95 // PBM will be added in seca_card_info(...) by iterating the llist 55 96 cs_add_entitlement(reader, reader->caid, b2ll(4, reader->prid[i]), 0 , 0, 0, mktime(<), 0); 56 97 … … 366 407 //This module is therefore optical only 367 408 368 def_resp;369 static const unsigned char ins34[] = { 0xc1, 0x34, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00 }; //data following is provider Package Bitmap Records370 unsigned char ins32[] = { 0xc1, 0x32, 0x00, 0x00, 0x20 }; // get PBM371 char tmp[17];372 409 int32_t prov; 373 410 … … 376 413 377 414 for (prov = 0; prov < reader->nprov; prov++) { 378 ins32[2] = prov; 379 write_cmd (ins34, ins34 + 5); //prepare card for pbm request 380 write_cmd (ins32, NULL); //pbm request 381 uchar pbm[8]; //TODO should be arrayed per prov 382 383 if (prov) ent = ll_iter_next(&it); 384 385 switch (cta_res[0]) { 386 case 0x04: 387 cs_ri_log (reader, "[seca-reader] no PBM for provider %i", prov + 1); 388 break; 389 case 0x83: 390 memcpy (pbm, cta_res + 1, 8); 391 cs_ri_log (reader, "[seca-reader] PBM for provider %i: %s", prov + 1, cs_hexdump(0, pbm, 8, tmp, sizeof(tmp))); 392 393 if (ent) { 394 ent->id = b2ll(8, pbm); 395 ent->type = 6; // new type must be used 396 } 397 398 break; 399 default: 400 cs_log ("[seca-reader] ERROR: PBM returns unknown byte %02x", cta_res[0]); 401 } 402 415 if (prov) ent = ll_iter_next(&it); 416 if (ent) { 417 ent->id = get_pbm(reader, prov); 418 ent->type = 6; // new type must be used 419 } 403 420 } 404 421 return OK;
Note:
See TracChangeset
for help on using the changeset viewer.