static void device_fn(const char *token, char *value, void *setting, FILE *f) { struct s_reader *rdr = setting; int32_t isphysical = !is_network_reader(rdr); if(value) { int32_t i; char *ptr, *saveptr1 = NULL; for(i = 0, ptr = strtok_r(value, ",", &saveptr1); (i < 3) && (ptr); ptr = strtok_r(NULL, ",", &saveptr1), i++) { trim(ptr); switch(i) { case 0: cs_strncpy(rdr->device, ptr, sizeof(rdr->device)); break; case 1: rdr->r_port = atoi(ptr); break; case 2: rdr->l_port = atoi(ptr); break; } } return; } fprintf_conf(f, token, "%s", rdr->device); // it should not have \n at the end if((rdr->r_port || cfg.http_full_cfg) && !isphysical) { fprintf(f, ",%d", rdr->r_port); } if((rdr->l_port || cfg.http_full_cfg) && !isphysical && strncmp(reader_get_type_desc(rdr, 0), "cccam", 5)) { fprintf(f, ",%d", rdr->l_port); } fprintf(f, "\n"); }
const char *reader_get_type_desc(struct s_reader *rdr, int32_t extended) { const char *desc = "unknown"; if(rdr->crdr && rdr->crdr->desc) { return rdr->crdr->desc; } if(is_network_reader(rdr) || rdr->typ == R_SERIAL) { if(rdr->ph.desc) { desc = rdr->ph.desc; } } if(rdr->typ == R_NEWCAMD && rdr->ncd_proto == NCD_524) { desc = "newcamd524"; } else if(extended && rdr->typ == R_CCCAM && cccam_client_extended_mode(rdr->client) && !cccam_client_multics_mode(rdr->client)) { desc = "cccam_ext"; } else if(!extended && rdr->typ == R_CCCAM && cccam_client_extended_mode(rdr->client) && !cccam_client_multics_mode(rdr->client)) { desc = "cccam_ext"; } else if(rdr->typ == R_CCCAM && cccam_client_multics_mode(rdr->client)) { desc = "cccam_mcs"; } return desc; }
int32_t emm_reader_match(struct s_reader *reader, uint16_t caid, uint32_t provid) { int32_t i; // if physical reader a card needs to be inserted if (!is_network_reader(reader) && reader->card_status != CARD_INSERTED) return 0; if (reader->audisabled) return 0; if (reader->caid != caid) { int caid_found = 0; for (i = 0; i < 2; i++) { if (reader->csystem.caids[i] == caid) { caid_found = 1; break; } } if (!caid_found) { rdr_debug_mask(reader, D_EMM, "reader_caid %04X != caid %04X", reader->caid, caid); return 0; } } //if (!hexserialset(reader)) { There are cards without serial, they should get emm of type global and shared! // rdr_debug_mask(reader, D_EMM, "no hexserial is set"); // return 0; //} if (!provid) { rdr_debug_mask(reader, D_EMM, "caid %04X has no provider", caid); return 1; } if (reader->auprovid && reader->auprovid == provid) { rdr_debug_mask(reader, D_EMM, "matched auprovid %06X", reader->auprovid); return 1; } if (!reader->nprov) { rdr_debug_mask(reader, D_EMM, "no provider is set"); return 1; } for (i=0; i<reader->nprov; i++) { uint32_t prid = b2i(4, reader->prid[i]); if (prid == provid || ( (reader->typ == R_CAMD35 || reader->typ == R_CS378X) && (prid & 0xFFFF) == (provid & 0xFFFF) )) { rdr_debug_mask(reader, D_EMM, "provider match %04X:%06X", caid, provid); return 1; } } rdr_debug_mask(reader, D_EMM, "skip provider %04X:%06X", caid, provid); return 0; }