- fix for ticker #4787
[oscam.git] / module-ird-guess.c
blobcfd14a12eb05c1388f3a847af2cd9cb033229b32
1 #define MODULE_LOG_PREFIX "irdguess"
3 #include "globals.h"
5 #ifdef IRDETO_GUESSING
6 #include "module-ird-guess.h"
7 #include "oscam-string.h"
8 #include "oscam-conf.h"
10 struct s_irdeto_quess
12 int32_t b47;
13 uint16_t caid;
14 uint16_t sid;
15 struct s_irdeto_quess *next;
18 static struct s_irdeto_quess **itab;
20 int32_t init_irdeto_guess_tab(void)
22 FILE *fp = open_config_file("oscam.ird");
23 if(!fp)
24 { return 1; }
26 int32_t i, j, skip;
27 int32_t b47;
28 char token[128], *ptr, *saveptr1 = NULL;
29 char zSid[5];
30 uint8_t b3;
31 uint16_t caid, sid;
32 struct s_irdeto_quess *ird_row, *head;
34 if(!cs_malloc(&itab, sizeof(struct s_irdeto_quess *) * 0xff))
36 fclose(fp);
37 return 0;
40 while(fgets(token, sizeof(token), fp))
42 if(strlen(token) < 20) { continue; }
43 for(i = b3 = b47 = caid = sid = skip = 0, ptr = strtok_r(token, ":", &saveptr1); (i < 4) && (ptr); ptr = strtok_r(NULL, ":", &saveptr1), i++)
45 trim(ptr);
46 if(*ptr == ';' || *ptr == '#' || *ptr == '-')
48 skip = 1;
49 break;
52 switch(i)
54 case 0:
55 b3 = a2i(ptr, 2);
56 break;
58 case 1:
59 b47 = a2i(ptr, 8);
60 break;
62 case 2:
63 caid = a2i(ptr, 4);
64 break;
66 case 3:
67 for(j = 0; j < 4; j++)
69 zSid[j] = ptr[j];
71 zSid[4] = 0;
72 sid = a2i(zSid, 4);
73 break;
77 if(!skip)
79 if(!cs_malloc(&ird_row, sizeof(struct s_irdeto_quess)))
81 fclose(fp);
82 return (1);
85 ird_row->b47 = b47;
86 ird_row->caid = caid;
87 ird_row->sid = sid;
89 head = itab[b3];
90 if(head)
92 while(head->next)
93 { head = head->next; }
94 head->next = ird_row;
96 else
97 { itab[b3] = ird_row; }
98 //cs_log_dbg(D_CLIENT, "%02X:%08X:%04X:%04X", b3, b47, caid, sid);
101 fclose(fp);
103 for(i = 0; i < 0xff; i++)
105 head = itab[i];
106 while(head)
108 cs_log_dbg(D_CLIENT, "itab[%02X]: b47=%08X, caid=%04X, sid=%04X",
109 i, head->b47, head->caid, head->sid);
110 head = head->next;
113 return (0);
116 void free_irdeto_guess_tab(void)
118 uint8_t i;
119 if(!itab)
120 { return; }
122 for(i = 0; i < 0xff; i++)
124 struct s_irdeto_quess *head = itab[i];
125 while(head)
127 void *next = head->next;
128 NULLFREE(head);
129 head = next;
132 NULLFREE(itab);
135 void guess_irdeto(ECM_REQUEST *er)
137 uint8_t b3;
138 int32_t b47;
139 //uint16_t chid;
140 struct s_irdeto_quess *ptr;
142 if(!itab)
143 { return; }
145 b3 = er->ecm[3];
146 ptr = itab[b3];
147 if(!ptr)
149 cs_log_dbg(D_TRACE, "unknown irdeto byte 3: %02X", b3);
150 return;
153 b47 = b2i(4, er->ecm + 4);
154 //chid = b2i(2, er->ecm+6);
155 //cs_log_dbg(D_TRACE, "ecm: b47=%08X, ptr->b47=%08X, ptr->caid=%04X", b47, ptr->b47, ptr->caid);
157 while(ptr)
159 if(b47 == ptr->b47)
161 if(er->srvid && (er->srvid != ptr->sid))
163 cs_log_dbg(D_TRACE, "sid mismatched (ecm: %04X, guess: %04X), wrong oscam.ird file?",
164 er->srvid, ptr->sid);
165 return;
167 er->caid = ptr->caid;
168 er->srvid = ptr->sid;
169 er->chid = (uint16_t)ptr->b47;
170 //cs_log_dbg(D_TRACE, "quess_irdeto() found caid=%04X, sid=%04X, chid=%04X",
171 //er->caid, er->srvid, er->chid);
172 return;
174 ptr = ptr->next;
178 #endif