3 # include "oscam-boxkeys.np"
6 static char *cs_conf
="oscam.conf";
7 static char *cs_user
="oscam.user";
8 static char *cs_srvr
="oscam.server";
9 static char *cs_srid
="oscam.srvid";
10 static char *cs_l4ca
="oscam.guess";
11 static char *cs_cert
="oscam.cert";
12 static char *cs_sidt
="oscam.services";
13 //static char *cs_ird="oscam.ird";
15 static char *cs_ac
="oscam.ac";
18 static char token
[4096];
20 typedef enum cs_proto_type
22 TAG_GLOBAL
, // must be first !
23 TAG_MONITOR
, // monitor
24 TAG_CAMD33
, // camd 3.3x
25 TAG_CAMD35
, // camd 3.5x UDP
26 TAG_NEWCAMD
, // newcamd
27 TAG_RADEGAST
, // radegast
28 TAG_SERIAL
, // serial (static)
29 TAG_CS357X
, // camd 3.5x UDP
30 TAG_CS378X
, // camd 3.5x TCP
33 ,TAG_ANTICASC
// anti-cascading
37 static char *cctag
[]={"global", "monitor", "camd33", "camd35",
38 "newcamd", "radegast", "serial", "cs357x", "cs378x", "gbox",
45 static void show_sidtab(struct s_sidtab
*sidtab
)
47 for (; sidtab
; sidtab
=sidtab
->next
)
51 cs_log("label=%s", sidtab
->label
);
52 sprintf(buf
, "caid(%d)=", sidtab
->num_caid
);
53 for (i
=0; i
<sidtab
->num_caid
; i
++)
54 sprintf(buf
+strlen(buf
), "%04X ", sidtab
->caid
[i
]);
56 sprintf(buf
, "provider(%d)=", sidtab
->num_provid
);
57 for (i
=0; i
<sidtab
->num_provid
; i
++)
58 sprintf(buf
+strlen(buf
), "%08X ", sidtab
->provid
[i
]);
60 sprintf(buf
, "services(%d)=", sidtab
->num_srvid
);
61 for (i
=0; i
<sidtab
->num_srvid
; i
++)
62 sprintf(buf
+strlen(buf
), "%04X ", sidtab
->srvid
[i
]);
68 static void chk_iprange(char *value
, struct s_ip
**base
)
72 struct s_ip
*lip
, *cip
;
74 for (cip
=lip
=*base
; cip
; cip
=cip
->next
)
76 if (!(cip
=malloc(sizeof(struct s_ip
))))
78 fprintf(stderr
, "Error allocating memory (errno=%d)\n", errno
);
86 memset(cip
, 0, sizeof(struct s_ip
));
87 for (ptr1
=strtok(value
, ","); ptr1
; ptr1
=strtok(NULL
, ","))
89 if( (ptr2
=strchr(trim(ptr1
), '-')) )
92 cip
->ip
[0]=cs_inet_addr(trim(ptr1
));
93 cip
->ip
[1]=cs_inet_addr(trim(ptr2
));
96 cip
->ip
[0]=cip
->ip
[1]=cs_inet_addr(ptr1
);
100 static void chk_caidtab(char *caidasc
, CAIDTAB
*ctab
)
103 char *ptr1
, *ptr2
, *ptr3
;
104 for (i
=0, ptr1
=strtok(caidasc
, ","); (i
<CS_MAXCAIDTAB
) && (ptr1
); ptr1
=strtok(NULL
, ","))
106 ulong caid
, mask
, cmap
;
107 if( (ptr3
=strchr(trim(ptr1
), ':')) )
111 if( (ptr2
=strchr(trim(ptr1
), '&')) )
115 if (((caid
=a2i(ptr1
, 2))|(mask
=a2i(ptr2
,-2))|(cmap
=a2i(ptr3
, 2))) < 0x10000)
119 ctab
->cmap
[i
++]=cmap
;
122 // cs_log("WARNING: wrong CAID in %s -> ignored", cs_user);
126 static void chk_services(char *labels
, ulong
*sidok
, ulong
*sidno
)
132 for (ptr
=strtok(labels
, ","); ptr
; ptr
=strtok(NULL
, ","))
133 for (trim(ptr
), i
=0, sidtab
=cfg
->sidtab
; sidtab
; sidtab
=sidtab
->next
, i
++)
135 if (!strcmp(sidtab
->label
, ptr
)) *sidok
|=(1<<i
);
136 if ((ptr
[0]=='!') && (!strcmp(sidtab
->label
, ptr
+1))) *sidno
|=(1<<i
);
141 void chk_ftab(char *zFilterAsc
, FTAB
*ftab
, const char *zType
, const char *zName
,
142 const char *zFiltName
)
145 char *ptr1
,*ptr2
,*ptr3
;
146 char *ptr
[CS_MAXFILTERS
] = {0};
148 memset(ftab
, 0, sizeof(FTAB
));
149 for( i
=0, ptr1
=strtok(zFilterAsc
, ";"); (i
<CS_MAXFILTERS
) && (ptr1
); ptr1
=strtok(NULL
, ";"), i
++ )
151 //cs_log("ptr1=%s", ptr1);
153 if( (ptr2
=strchr(trim(ptr1
), ':')) )
155 //cs_log("ptr2=%s", ptr2);
157 //cs_log("ptr2=%s", ptr2);
158 ftab
->filts
[i
].caid
= (ushort
)a2i(ptr1
, 4);
159 //cs_log("caid=%04X", ftab->filts[i].caid);
162 else if (zFiltName
&& zFiltName
[0]=='c')
164 cs_log("PANIC: CAID field not found in CHID parameter!");
170 if( ftab
->nfilts
) cs_debug("%s '%s' %s filter(s):", zType
, zName
, zFiltName
);
171 for( i
=0; i
<ftab
->nfilts
; i
++ )
173 cs_debug("CAID #%d: %04X", i
, ftab
->filts
[i
].caid
);
174 for( j
=0, ptr3
=strtok(ptr
[i
], ","); (j
<CS_MAXPROV
) && (ptr3
); ptr3
=strtok(NULL
, ","), j
++ )
176 ftab
->filts
[i
].prids
[j
] = a2i(ptr3
,6);
177 ftab
->filts
[i
].nprids
++;
178 cs_debug("%s #%d: %06X", zFiltName
, j
, ftab
->filts
[i
].prids
[j
]);
181 //cs_log("exit chk_ftab");
184 static void chk_cltab(char *classasc
, CLASSTAB
*clstab
)
188 for( i
=0, ptr1
=strtok(classasc
, ","); (i
<CS_MAXCAIDTAB
) && (ptr1
); ptr1
=strtok(NULL
, ",") )
192 clstab
->bclass
[clstab
->bn
++] = (uchar
)a2i(ptr1
+1, 2);
194 clstab
->aclass
[clstab
->an
++] = (uchar
)a2i(ptr1
, 2);
198 static void chk_port_tab(char *portasc
, PTAB
*ptab
)
200 int i
,j
,nfilts
,ifilt
,iport
;
201 char *ptr1
,*ptr2
,*ptr3
;
202 char *ptr
[CS_MAXPORTS
] = {0};
203 int port
[CS_MAXPORTS
] = {0};
204 int previous_nports
= ptab
->nports
;
206 for (nfilts
=i
=previous_nports
, ptr1
=strtok(portasc
, ";"); (i
<CS_MAXCAIDTAB
) && (ptr1
); ptr1
=strtok(NULL
, ";"), i
++)
209 if( (ptr2
=strchr(trim(ptr1
), '@')) )
212 ptab
->ports
[i
].s_port
= atoi(ptr1
);
214 port
[i
] = ptab
->ports
[i
].s_port
;
220 if( nfilts
==1 && strlen(portasc
)<6 && ptab
->ports
[0].s_port
== 0 ) {
221 ptab
->ports
[0].s_port
= atoi(portasc
);
225 iport
=ifilt
= previous_nports
;
226 for (i
=previous_nports
; i
<nfilts
; i
++)
228 if( port
[i
]!=0 ) iport
= i
;
229 for (j
=0, ptr3
=strtok(ptr
[i
], ","); (j
<CS_MAXPROV
) && (ptr3
); ptr3
=strtok(NULL
, ","), j
++)
231 if( (ptr2
=strchr(trim(ptr3
), ':')) )
234 ptab
->ports
[iport
].ftab
.nfilts
++;
235 ifilt
= ptab
->ports
[iport
].ftab
.nfilts
-1;
236 ptab
->ports
[iport
].ftab
.filts
[ifilt
].caid
= (ushort
)a2i(ptr3
, 4);
237 ptab
->ports
[iport
].ftab
.filts
[ifilt
].prids
[j
] = a2i(ptr2
, 6);
239 ptab
->ports
[iport
].ftab
.filts
[ifilt
].prids
[j
] = a2i(ptr3
, 6);
241 ptab
->ports
[iport
].ftab
.filts
[ifilt
].nprids
++;
247 static void chk_srvip(char *value
, in_addr_t
*ip
)
251 for (i
=0, ptr
=strtok(value
, ","); ptr
; ptr
=strtok(NULL
, ","))
252 if (i
<8) ip
[i
++]=inet_addr(ptr
);
256 static void chk_t_global(char *token
, char *value
)
258 if (!strcmp(token
, "serverip")) cfg
->srvip
=inet_addr(value
);
259 if (!strcmp(token
, "logfile")) strncpy(logfile
, value
, sizeof(logfile
)-1);
260 if (!strcmp(token
, "pidfile")) strncpy(cfg
->pidfile
, value
, sizeof(cfg
->pidfile
)-1);
261 if (!strcmp(token
, "usrfile")) strncpy(cfg
->usrfile
, value
, sizeof(cfg
->usrfile
)-1);
262 if (!strcmp(token
, "clienttimeout")) cfg
->ctimeout
=atoi(value
);
263 if (!strcmp(token
, "fallbacktimeout")) cfg
->ftimeout
=atoi(value
);
264 if (!strcmp(token
, "clientmaxidle")) cfg
->cmaxidle
=atoi(value
);
265 if (!strcmp(token
, "cachedelay")) cfg
->delay
=atoi(value
);
266 if (!strcmp(token
, "bindwait")) cfg
->bindwait
=atoi(value
);
267 if (!strcmp(token
, "netprio")) cfg
->netprio
=atoi(value
);
268 if (!strcmp(token
, "resolvedelay")) cfg
->resolvedelay
=atoi(value
);
269 if (!strcmp(token
, "sleep")) cfg
->tosleep
=atoi(value
);
270 if (!strcmp(token
, "nice"))
272 cfg
->nice
=atoi(value
);
273 if ((cfg
->nice
<-20) || (cfg
->nice
>20)) cfg
->nice
=99;
274 if (cfg
->nice
!=99) cs_setpriority(cfg
->nice
); // ignore errors
276 if (!strcmp(token
, "serialreadertimeout"))
278 cfg
->srtimeout
=atoi(value
)*1000;
279 if( cfg
->srtimeout
<=0 )
282 if (!strcmp(token
, "maxlogsize"))
284 cfg
->max_log_size
=atoi(value
);
285 if( cfg
->max_log_size
<=10 )
286 cfg
->max_log_size
=10;
288 if( !strcmp(token
, "showecmdw") )
289 cfg
->show_ecm_dw
= atoi(value
);
293 static void chk_t_ac(char *token
, char *value
)
295 if (!strcmp(token
, "enabled"))
297 cfg
->ac_enabled
=atoi(value
);
298 if( cfg
->ac_enabled
<=0 ) cfg
->ac_enabled
=0;
299 else cfg
->ac_enabled
=1;
302 if (!strcmp(token
, "numusers"))
304 cfg
->ac_users
=atoi(value
);
305 if( cfg
->ac_users
<0 ) cfg
->ac_users
=0;
307 if (!strcmp(token
, "sampletime"))
309 cfg
->ac_stime
=atoi(value
);
310 if( cfg
->ac_stime
<0 ) cfg
->ac_stime
=2;
312 if (!strcmp(token
, "samples"))
314 cfg
->ac_samples
=atoi(value
);
315 if( cfg
->ac_samples
<2 || cfg
->ac_samples
>10) cfg
->ac_samples
=10;
317 if (!strcmp(token
, "penalty"))
319 cfg
->ac_penalty
=atoi(value
);
320 if( cfg
->ac_penalty
<0 ) cfg
->ac_penalty
=0;
323 if (!strcmp(token
, "aclogfile"))
324 strncpy(cfg
->ac_logfile
, value
, sizeof(cfg
->ac_logfile
)-1);
325 if( !strcmp(token
, "fakedelay") )
327 cfg
->ac_fakedelay
=atoi(value
);
328 if( cfg
->ac_fakedelay
<100 || cfg
->ac_fakedelay
>1000 )
329 cfg
->ac_fakedelay
=1000;
331 if( !strcmp(token
, "denysamples") )
333 cfg
->ac_denysamples
=atoi(value
);
334 if( cfg
->ac_denysamples
<2 || cfg
->ac_denysamples
>cfg
->ac_samples
-1 )
335 cfg
->ac_denysamples
=cfg
->ac_samples
-1;
340 static void chk_t_monitor(char *token
, char *value
)
342 if (!strcmp(token
, "port")) cfg
->mon_port
=atoi(value
);
343 if (!strcmp(token
, "serverip")) cfg
->mon_srvip
=inet_addr(value
);
344 if (!strcmp(token
, "nocrypt")) chk_iprange(value
, &cfg
->mon_allowed
);
345 if (!strcmp(token
, "aulow")) cfg
->mon_aulow
=atoi(value
);
346 if (!strcmp(token
, "monlevel")) cfg
->mon_level
=atoi(value
);
347 if (!strcmp(token
, "hideclient_to")) cfg
->mon_hideclient_to
=atoi(value
);
350 static void chk_t_camd33(char *token
, char *value
)
352 if (!strcmp(token
, "port")) cfg
->c33_port
=atoi(value
);
353 if (!strcmp(token
, "serverip")) cfg
->c33_srvip
=inet_addr(value
);
354 if (!strcmp(token
, "nocrypt")) chk_iprange(value
, &cfg
->c33_plain
);
355 if (!strcmp(token
, "passive")) cfg
->c33_passive
=(value
[0]!='0');
356 if (!strcmp(token
, "key"))
358 if (key_atob(value
, cfg
->c33_key
))
360 fprintf(stderr
, "Configuration camd3.3x: Error in Key\n");
367 static void chk_t_camd35(char *token
, char *value
)
369 if (!strcmp(token
, "port")) cfg
->c35_port
=atoi(value
);
370 if (!strcmp(token
, "serverip")) cfg
->c35_tcp_srvip
=inet_addr(value
);
373 static void chk_t_camd35_tcp(char *token
, char *value
)
375 if (!strcmp(token
, "port")) chk_port_tab(value
, &cfg
->c35_tcp_ptab
);
376 if (!strcmp(token
, "serverip")) cfg
->c35_tcp_srvip
=inet_addr(value
);
379 static void chk_t_newcamd(char *token
, char *value
)
381 if (!strcmp(token
, "port")) chk_port_tab(value
, &cfg
->ncd_ptab
);
382 if (!strcmp(token
, "serverip")) cfg
->ncd_srvip
=inet_addr(value
);
383 if (!strcmp(token
, "key"))
385 if (key_atob14(value
, cfg
->ncd_key
))
387 fprintf(stderr
, "Configuration newcamd: Error in Key\n");
394 static void chk_t_radegast(char *token
, char *value
)
396 if (!strcmp(token
, "port")) cfg
->rad_port
=atoi(value
);
397 if (!strcmp(token
, "serverip")) cfg
->rad_srvip
=inet_addr(value
);
398 if (!strcmp(token
, "allowed")) chk_iprange(value
, &cfg
->rad_allowed
);
399 if (!strcmp(token
, "user")) strncpy(cfg
->rad_usr
, value
, sizeof(cfg
->rad_usr
)-1);
402 static void chk_t_serial(char *token
, char *value
)
404 if (!strcmp(token
, "device"))
407 l
=strlen(cfg
->ser_device
);
408 if (l
) cfg
->ser_device
[l
++]=1; // use ctrl-a as delimiter
409 strncpy(cfg
->ser_device
+l
, value
, sizeof(cfg
->ser_device
)-1-l
);
413 static void chk_t_gbox(char *token
, char *value
)
415 // if (!strcmp(token, "password")) strncpy(cfg->gbox_pwd, i2b(4, a2i(value, 4)), 4);
416 if (!strcmp(token
, "password")) cs_atob(cfg
->gbox_pwd
, value
, 4);
417 if (!strcmp(token
, "maxdist")) cfg
->maxdist
=atoi(value
);
418 if (!strcmp(token
, "ignorelist")) strncpy(cfg
->ignorefile
, value
, sizeof(cfg
->ignorefile
)-1);
419 if (!strcmp(token
, "onlineinfos")) strncpy(cfg
->gbxShareOnl
, value
, sizeof(cfg
->gbxShareOnl
)-1);
420 if (!strcmp(token
, "cardinfos")) strncpy(cfg
->cardfile
, value
, sizeof(cfg
->cardfile
)-1);
421 if (!strcmp(token
, "locals"))
425 for (i
=0, ptr1
=strtok(value
, ","); (i
<CS_MAXLOCALS
) && (ptr1
); ptr1
=strtok(NULL
, ","))
427 cfg
->locals
[n
++]=a2i(ptr1
, 8);
428 //printf("%i %08X",n,cfg->locals[n-1]);
434 static void chk_token(char *token
, char *value
, int tag
)
438 case TAG_GLOBAL
: chk_t_global(token
, value
); break;
439 case TAG_MONITOR
: chk_t_monitor(token
, value
); break;
440 case TAG_CAMD33
: chk_t_camd33(token
, value
); break;
442 case TAG_CS357X
: chk_t_camd35(token
, value
); break;
443 case TAG_NEWCAMD
: chk_t_newcamd(token
, value
); break;
444 case TAG_RADEGAST
: chk_t_radegast(token
, value
); break;
445 case TAG_SERIAL
: chk_t_serial(token
, value
); break;
446 case TAG_CS378X
: chk_t_camd35_tcp(token
, value
); break;
447 case TAG_GBOX
: chk_t_gbox(token
, value
); break;
449 case TAG_ANTICASC
: chk_t_ac(token
, value
); break;
460 memset(len4caid
, 0, sizeof(ushort
)<<8);
461 sprintf(token
, "%s%s", cs_confdir
, cs_l4ca
);
462 if (!(fp
=fopen(token
, "r")))
464 for(nr
=0; fgets(token
, sizeof(token
), fp
);)
468 if (!(value
=strchr(token
, ':'))) continue;
470 if( (ptr
=strchr(value
, '#')) )
472 if (strlen(trim(token
))!=2) continue;
473 if (strlen(trim(value
))!=4) continue;
474 if ((i
=byte_atob(token
))<0) continue;
475 if ((c
=word_atob(value
))<0) continue;
476 //printf("idx %02X = %04X\n", i, c); fflush(stdout);
481 cs_log("%d lengths for caid guessing loaded", nr
);
485 int search_boxkey(ushort caid
, ulong provid
, char *key
)
491 sprintf(c_caid
, "%s%s", cs_confdir
, cs_cert
);
492 if (fp
=fopen(c_caid
, "r"))
494 for (; (!rc
) && fgets(c_caid
, sizeof(c_caid
), fp
);)
496 char *c_provid
, *c_key
;
497 if (c_provid
=strchr(c_caid
, '#'))
499 if (!(c_provid
=strchr(c_caid
, ':'))) continue;
501 if (!(c_key
=strchr(c_provid
, ':'))) continue;
503 if (word_atob(trim(c_caid
))!=caid
) continue;
504 if ((i
=(strlen(trim(c_key
))>>1))>256) continue;
505 if (cs_atob(key
, c_key
, i
)<0)
507 cs_log("wrong key in \"%s\"", cs_cert
);
514 #ifdef OSCAM_INBUILD_KEYS
515 for(i
=0; (!rc
) && (npkey
[i
].keylen
); i
++)
516 if (rc
=((caid
==npkey
[i
].caid
) && (provid
==npkey
[i
].provid
)))
517 memcpy(key
, npkey
[i
].key
, npkey
[i
].keylen
);
531 if ((cfg
->nice
=getpriority(PRIO_PROCESS
, 0))==(-1))
536 cfg
->ctimeout
=CS_CLIENT_TIMEOUT
;
538 cfg
->cmaxidle
=CS_CLIENT_MAXIDLE
;
540 cfg
->bindwait
=CS_BIND_TIMEOUT
;
541 cfg
->resolvedelay
=CS_RESOLVE_DELAY
;
543 cfg
->mon_hideclient_to
=0;
550 cfg
->ac_denysamples
=8;
551 cfg
->ac_fakedelay
=1000;
552 strcpy(cfg
->ac_logfile
, "./oscam_ac.log");
554 sprintf(token
, "%s%s", cs_confdir
, cs_conf
);
555 if (!(fp
=fopen(token
, "r")))
557 fprintf(stderr
, "Cannot open config file '%s' (errno=%d)\n", token
, errno
);
560 while (fgets(token
, sizeof(token
), fp
))
564 if ((l
=strlen(trim(token
)))<3) continue;
565 if ((token
[0]=='[') && (token
[l
-1]==']'))
567 for (token
[l
-1]=0, tag
=-1, i
=TAG_GLOBAL
; cctag
[i
]; i
++)
568 if (!strcmp(cctag
[i
], strtolower(token
+1)))
572 if (!(value
=strchr(token
, '='))) continue;
574 chk_token(trim(strtolower(token
)), trim(value
), tag
);
577 cs_init_log(logfile
);
578 if (cfg
->ftimeout
>=cfg
->ctimeout
)
580 cfg
->ftimeout
=cfg
->ctimeout
+1;
581 cs_log("WARNING: fallbacktimeout adjusted to %d", cfg
->ftimeout
);
583 if( cfg
->ftimeout
<(cfg
->srtimeout
/1000) )
585 cfg
->ftimeout
=(cfg
->srtimeout
/1000)+1;
586 cs_log("WARNING: fallbacktimeout adjusted to %d", cfg
->ftimeout
);
588 if( cfg
->ctimeout
<(cfg
->srtimeout
/1000) )
590 cfg
->ctimeout
=(cfg
->srtimeout
/1000)+1;
591 cs_log("WARNING: clienttimeout adjusted to %d", cfg
->ctimeout
);
594 if( cfg
->ac_denysamples
+1>cfg
->ac_samples
)
596 cfg
->ac_denysamples
=cfg
->ac_samples
-1;
597 cs_log("WARNING: DenySamples adjusted to %d", cfg
->ac_denysamples
);
603 static void chk_account(char *token
, char *value
, struct s_auth
*account
)
606 char *ptr1
;//, *ptr2;
607 if (!strcmp(token
, "user")) strncpy(account
->usr
, value
, sizeof(account
->usr
)-1);
608 if (!strcmp(token
, "pwd")) strncpy(account
->pwd
, value
, sizeof(account
->pwd
)-1);
609 if (!strcmp(token
, "hostname")) strncpy(account
->dyndns
, value
, sizeof(account
->dyndns
)-1);
610 if (!strcmp(token
, "1801to1702")) account
->premhack
=atoi(value
);
611 if (!strcmp(token
, "uniq")) account
->uniq
=atoi(value
);
612 if (!strcmp(token
, "sleep")) account
->tosleep
=atoi(value
);
613 if (!strcmp(token
, "monlevel")) account
->monlvl
=atoi(value
);
614 if (!strcmp(token
, "caid")) chk_caidtab(value
, &account
->ctab
);
619 if (!strcmp(token
, "au"))
620 for (i
=0; i
<CS_MAXREADER
; i
++)
621 if ((reader
[i
].label
[0]) &&
622 (!strncmp(reader
[i
].label
, value
, strlen(reader
[i
].label
))))
624 if (!strcmp(token
, "group"))
625 for (ptr1
=strtok(value
, ","); ptr1
; ptr1
=strtok(NULL
, ","))
629 if ((g
>0) && (g
<33)) account
->grp
|=(1<<(g
-1));
631 if(!strcmp(token
, "services")) chk_services(value
, &account
->sidtabok
, &account
->sidtabno
);
632 if(!strcmp(token
, "ident")) chk_ftab(value
, &account
->ftab
, "user", account
->usr
, "provid");
633 if(!strcmp(token
, "class")) chk_cltab(value
, &account
->cltab
);
634 if(!strcmp(token
, "chid")) chk_ftab(value
, &account
->fchid
, "user", account
->usr
, "chid");
637 if( !strcmp(token
, "numusers") )
638 account
->ac_users
= atoi(value
);
639 if( !strcmp(token
, "penalty") )
640 account
->ac_penalty
= atoi(value
);
643 // if (!strcmp(token, "caid"))
645 // for (i=0, ptr1=strtok(value, ","); (i<CS_MAXCAIDTAB) && (ptr1); ptr1=strtok(NULL, ","))
648 // if (ptr2=strchr(trim(ptr1), '&'))
652 // if (((caid=a2i(ptr1, 2))|(mask=a2i(ptr2,-2))) < 0x10000)
654 // account->caidtab[i][0]=caid;
655 // account->caidtab[i++][1]=mask;
658 // cs_log("WARNING: wrong CAID in %s -> ignored", cs_user);
670 /*static */struct s_auth
*account
=(struct s_auth
*)0;
672 sprintf(token
, "%s%s", cs_confdir
, cs_user
);
673 if (!(fp
=fopen(token
, "r")))
675 cs_log("Cannot open file \"%s\" (errno=%d)", token
, errno
);
678 for (nro
=0, ptr
=cfg
->account
; ptr
; nro
++)
680 struct s_auth
*ptr_next
;
686 while (fgets(token
, sizeof(token
), fp
))
690 if ((l
=strlen(trim(token
)))<3) continue;
691 if ((token
[0]=='[') && (token
[l
-1]==']'))
694 tag
=(!strcmp("account", strtolower(token
+1)));
695 if (!(ptr
=malloc(sizeof(struct s_auth
))))
697 cs_log("Error allocating memory (errno=%d)", errno
);
705 memset(account
, 0, sizeof(struct s_auth
));
707 account
->monlvl
=cfg
->mon_level
;
708 account
->tosleep
=cfg
->tosleep
;
709 for (i
=1; i
<CS_MAXCAIDTAB
; account
->ctab
.mask
[i
++]=0xffff);
712 account
->ac_users
=cfg
->ac_users
;
713 account
->ac_penalty
=cfg
->ac_penalty
;
714 account
->ac_idx
= nr
;
719 if (!(value
=strchr(token
, '='))) continue;
721 chk_account(trim(strtolower(token
)), trim(value
), account
);
724 cs_log("userdb reloaded: %d accounts freed, %d accounts loaded", nro
, nr
);
728 static ushort
*chk_entry4sidtab(char *value
, struct s_sidtab
*sidtab
, int what
)
732 ushort
*slist
=(ushort
*) 0;
733 ulong
*llist
=(ulong
*) 0;
736 strncpy(buf
, value
, sizeof(buf
));
737 b
=(what
==1) ? sizeof(ulong
) : sizeof(ushort
);
738 for (i
=0, ptr
=strtok(value
, ","); ptr
; ptr
=strtok(NULL
, ","))
744 if (b
==sizeof(ushort
))
745 slist
=malloc(i
*sizeof(ushort
));
747 llist
=malloc(i
*sizeof(ulong
));
749 for (i
=0, ptr
=strtok(value
, ","); ptr
; ptr
=strtok(NULL
, ","))
753 if (b
==sizeof(ushort
))
754 slist
[i
++]=(ushort
) caid
;
760 case 0: sidtab
->caid
=slist
;
763 case 1: sidtab
->provid
=llist
;
764 sidtab
->num_provid
=i
;
766 case 2: sidtab
->srvid
=slist
;
772 static void chk_sidtab(char *token
, char *value
, struct s_sidtab
*sidtab
)
774 if (!strcmp(token
, "caid")) chk_entry4sidtab(value
, sidtab
, 0);
775 if (!strcmp(token
, "provid")) chk_entry4sidtab(value
, sidtab
, 1);
776 if (!strcmp(token
, "ident")) chk_entry4sidtab(value
, sidtab
, 1);
777 if (!strcmp(token
, "srvid")) chk_entry4sidtab(value
, sidtab
, 2);
785 struct s_sidtab
*ptr
;
786 struct s_sidtab
*sidtab
=(struct s_sidtab
*)0;
788 sprintf(token
, "%s%s", cs_confdir
, cs_sidt
);
789 if (!(fp
=fopen(token
, "r")))
791 cs_log("Cannot open file \"%s\" (errno=%d)", token
, errno
);
794 for (nro
=0, ptr
=cfg
->sidtab
; ptr
; nro
++)
796 struct s_sidtab
*ptr_next
;
798 if (ptr
->caid
) free(ptr
->caid
);
799 if (ptr
->provid
) free(ptr
->provid
);
800 if (ptr
->srvid
) free(ptr
->srvid
);
805 while (fgets(token
, sizeof(token
), fp
))
809 if ((l
=strlen(trim(token
)))<3) continue;
810 if ((token
[0]=='[') && (token
[l
-1]==']'))
813 if (!(ptr
=malloc(sizeof(struct s_sidtab
))))
815 cs_log("Error allocating memory (errno=%d)", errno
);
824 memset(sidtab
, 0, sizeof(struct s_sidtab
));
825 strncpy(sidtab
->label
, strtolower(token
+1), sizeof(sidtab
->label
));
828 if (!sidtab
) continue;
829 if (!(value
=strchr(token
, '='))) continue;
831 chk_sidtab(trim(strtolower(token
)), trim(strtolower(value
)), sidtab
);
836 show_sidtab(cfg
->sidtab
);
838 cs_log("services reloaded: %d services freed, %d services loaded", nro
, nr
);
847 static struct s_srvid
*srvid
=(struct s_srvid
*)0;
849 sprintf(token
, "%s%s", cs_confdir
, cs_srid
);
850 if (!(fp
=fopen(token
, "r")))
852 cs_log("can't open file \"%s\" (err=%d), no service-id's loaded",
857 while (fgets(token
, sizeof(token
), fp
))
861 if ((l
=strlen(trim(token
)))<6) continue;
862 if (!(value
=strchr(token
, ':'))) continue;
864 if (strlen(token
)!=4) continue;
865 if (!(ptr
=malloc(sizeof(struct s_srvid
))))
867 cs_log("Error allocating memory (errno=%d)", errno
);
875 memset(srvid
, 0, sizeof(struct s_srvid
));
876 srvid
->srvid
=word_atob(token
);
877 strncpy(srvid
->name
, value
, sizeof(srvid
->name
)-1);
881 cs_log("%d service-id's loaded", nr
);
885 static void chk_reader(char *token
, char *value
, struct s_reader
*rdr
)
891 * case sensitive first
893 if (!strcmp(token
, "device"))
894 for (i
=0, ptr
=strtok(value
, ","); (i
<3)&&(ptr
); ptr
=strtok(NULL
, ","), i
++)
899 case 0: strncpy(rdr
->device
, ptr
, sizeof(rdr
->device
)-1); break;
900 case 1: rdr
->r_port
=atoi(ptr
); break;
901 case 2: rdr
->l_port
=atoi(ptr
); break;
904 if (!strcmp(token
, "key"))
906 if (key_atob14(value
, rdr
->ncd_key
))
908 fprintf(stderr
, "Configuration newcamd: Error in Key\n");
912 if (!strcmp(token
, "password")) strncpy(rdr
->gbox_pwd
, i2b(4, a2i(value
, 4)), 4);
913 if (!strcmp(token
, "premium")) rdr
->gbox_prem
=1;
914 if (!strcmp(token
, "account"))
915 for (i
=0, ptr
=strtok(value
, ","); (i
<2)&&(ptr
); ptr
=strtok(NULL
, ","), i
++)
920 case 0: strncpy(rdr
->r_usr
, ptr
, sizeof(rdr
->r_usr
)-1); break;
921 case 1: strncpy(rdr
->r_pwd
, ptr
, sizeof(rdr
->r_pwd
)-1); break;
929 if (!strcmp(token
, "services")) chk_services(value
, &rdr
->sidtabok
, &rdr
->sidtabno
);
930 if (!strcmp(token
, "inactivitytimeout")) rdr
->tcp_ito
= atoi(value
);
931 if (!strcmp(token
, "reconnecttimeout")) rdr
->tcp_rto
= atoi(value
);
932 if (!strcmp(token
, "disableserverfilter")) rdr
->ncd_disable_server_filt
= atoi(value
);
934 if (!strcmp(token
, "label")) strncpy(rdr
->label
, value
, sizeof(rdr
->label
)-1);
935 if (!strcmp(token
, "fallback")) rdr
->fallback
=atoi(value
) ? 1 : 0;
936 if (!strcmp(token
, "logport")) rdr
->log_port
=atoi(value
);
937 if (!strcmp(token
, "caid")) chk_caidtab(value
, &rdr
->ctab
);
938 if (!strcmp(token
, "detect"))
939 for (i
=0; RDR_CD_TXT
[i
]; i
++)
941 if (!strcmp(value
, RDR_CD_TXT
[i
]))
944 if ((value
[0]=='!') && (!strcmp(value
+1, RDR_CD_TXT
[i
])))
947 if (!strcmp(token
, "mhz"))
949 if (!strcmp(value
, "600")) rdr
->mhz
=600;
950 if (!strcmp(value
, "357")) rdr
->mhz
=357;
951 if (!strcmp(value
, "358")) rdr
->mhz
=358;
953 if (!strcmp(token
, "customspeed"))
955 if (!strcmp(value
, "0")) rdr
->custom_speed
=0;
956 if (!strcmp(value
, "1"))rdr
->custom_speed
=1;
958 if (!strcmp(token
, "protocol"))
960 if (!strcmp(value
, "mouse")) rdr
->typ
=R_MOUSE
;
961 if (!strcmp(value
, "internal")) rdr
->typ
=R_INTERN
;
962 if (!strcmp(value
, "intern")) rdr
->typ
=R_INTERN
;
963 if (!strcmp(value
, "serial")) rdr
->typ
=R_SERIAL
;
964 if (!strcmp(value
, "camd35")) rdr
->typ
=R_CAMD35
;
965 if (!strcmp(value
, "cs378x")) rdr
->typ
=R_CS378X
;
966 if (!strcmp(value
, "cs357x")) rdr
->typ
=R_CAMD35
;
967 if (!strcmp(value
, "gbox")) rdr
->typ
=R_GBOX
;
968 if (!strcmp(value
, "newcamd") ||
969 !strcmp(value
, "newcamd525")) {rdr
->typ
=R_NEWCAMD
;
970 rdr
->ncd_proto
=NCD_525
;}
971 if (!strcmp(value
, "newcamd524")) {rdr
->typ
=R_NEWCAMD
;
972 rdr
->ncd_proto
=NCD_524
;}
974 if (!strcmp(token
, "ident")) chk_ftab(value
, &rdr
->ftab
,"reader",rdr
->label
,"provid");
975 if (!strcmp(token
, "class")) chk_cltab(value
, &rdr
->cltab
);
976 if (!strcmp(token
, "chid")) chk_ftab(value
, &rdr
->fchid
,"reader",rdr
->label
,"chid");
977 if (!strcmp(token
, "showcls")) rdr
->show_cls
= atoi(value
);
978 if (!strcmp(token
, "maxqlen")) rdr
->maxqlen
= atoi(value
);
979 if( rdr
->maxqlen
<0 || rdr
->maxqlen
>CS_MAXQLEN
) rdr
->maxqlen
=CS_MAXQLEN
;
981 if (!strcmp(token
, "group"))
982 for (ptr
=strtok(value
, ","); ptr
; ptr
=strtok(NULL
, ","))
986 if ((g
>0) && (g
<33)) rdr
->grp
|=(1<<(g
-1));
988 if (!strcmp(token
, "emmcache"))
989 for (i
=0, ptr
=strtok(value
, ","); (i
<3)&&(ptr
); ptr
=strtok(NULL
, ","), i
++)
992 case 0: rdr
->cachemm
=atoi(ptr
); break;
993 case 1: rdr
->rewritemm
=atoi(ptr
); break;
994 case 2: rdr
->logemm
=atoi(ptr
); break;
996 if (!strcmp(token
, "blocknano"))
997 for (ptr
=strtok(value
, ","); ptr
; ptr
=strtok(NULL
, ","))
998 if ((i
=byte_atob(ptr
))>=0)
1008 sprintf(token
, "%s%s", cs_confdir
, cs_srvr
);
1009 if (!(fp
=fopen(token
, "r")))
1011 cs_log("can't open file \"%s\" (errno=%d)\n", token
, errno
);
1015 while (fgets(token
, sizeof(token
), fp
))
1018 if ((l
=strlen(trim(token
)))<3) continue;
1019 if ((token
[0]=='[') && (token
[l
-1]==']'))
1022 tag
=(!strcmp("reader", strtolower(token
+1)));
1023 if (reader
[nr
].label
[0] && reader
[nr
].typ
) nr
++;
1024 memset(&reader
[nr
], 0, sizeof(struct s_reader
));
1025 reader
[nr
].tcp_rto
= 30;
1026 reader
[nr
].show_cls
= 10;
1027 reader
[nr
].maxqlen
= CS_MAXQLEN
;
1028 reader
[nr
].mhz
= 357;
1029 reader
[nr
].custom_speed
= 1;
1030 for (i
=1; i
<CS_MAXCAIDTAB
; reader
[nr
].ctab
.mask
[i
++]=0xffff);
1034 if (!(value
=strchr(token
, '='))) continue;
1036 chk_reader(trim(strtolower(token
)), trim(value
), &reader
[nr
]);
1043 int init_irdeto_guess_tab()
1048 char token[128], *value, *ptr;
1052 struct s_irdeto_quess *ird_row, *head;
1054 memset(cfg->itab, 0, sizeof(cfg->itab));
1055 sprintf(token, "%s%s", cs_confdir, cs_ird);
1056 if (!(fp=fopen(token, "r")))
1058 cs_log("can't open file \"%s\" (errno=%d) irdeto guessing not loaded",
1062 while (fgets(token, sizeof(token), fp))
1064 if( strlen(token)<20 ) continue;
1065 for( i=b3=b47=caid=sid=skip=0, ptr=strtok(token, ":"); (i<4)&&(ptr); ptr=strtok(NULL, ":"), i++ )
1068 if( *ptr==';' || *ptr=='#' || *ptr=='-' ) {
1074 case 0: b3 = a2i(ptr, 2); break;
1075 case 1: b47 = a2i(ptr, 8); break;
1076 case 2: caid = a2i(ptr, 4); break;
1078 for( j=0; j<4; j++ )
1087 if (!(ird_row=(struct s_irdeto_quess*)malloc(sizeof(struct s_irdeto_quess))))
1089 cs_log("Error allocating memory (errno=%d)", errno);
1093 ird_row->caid = caid;
1097 head = cfg->itab[b3];
1104 cfg->itab[b3]=ird_row;
1106 //cs_debug("%02X:%08X:%04X:%04X", b3, b47, caid, sid);
1111 for( i=0; i<0xff; i++ )
1116 cs_debug("itab[%02X]: b47=%08X, caid=%04X, sid=%04X",
1117 i, head->b47, head->caid, head->sid);
1132 sprintf(token
, "%s%s", cs_confdir
, cs_ac
);
1133 if (!(fp
=fopen(token
, "r")))
1135 cs_log("can't open file \"%s\" (errno=%d) anti-cascading table not loaded",
1140 for(nr
=0; fgets(token
, sizeof(token
), fp
);)
1143 ushort caid
, sid
, chid
, dwtime
;
1146 struct s_cpmap
*ptr_cpmap
;
1147 static struct s_cpmap
*cpmap
=(struct s_cpmap
*)0;
1149 if( strlen(token
)<4 ) continue;
1151 caid
=sid
=chid
=dwtime
=0;
1155 for( i
=0, ptr
=strtok(token
, "="); (i
<2)&&(ptr
); ptr
=strtok(NULL
, "="), i
++ )
1158 if( *ptr
==';' || *ptr
=='#' || *ptr
=='-' ) {
1175 for( i
=0, ptr
=strtok(ptr1
, ":"); (i
<4)&&(ptr
); ptr
=strtok(NULL
, ":"), i
++ )
1181 if( *ptr
=='*' ) caid
= 0;
1182 else caid
= a2i(ptr
, 4);
1185 if( *ptr
=='*' ) provid
= 0;
1186 else provid
= a2i(ptr
, 6);
1189 if( *ptr
=='*' ) sid
= 0;
1190 else sid
= a2i(ptr
, 4);
1193 if( *ptr
=='*' ) chid
= 0;
1194 else chid
= a2i(ptr
, 4);
1198 if (!(ptr_cpmap
=(struct s_cpmap
*)malloc(sizeof(struct s_cpmap
))))
1200 cs_log("Error allocating memory (errno=%d)", errno
);
1204 cpmap
->next
=ptr_cpmap
;
1206 cfg
->cpmap
=ptr_cpmap
;
1210 cpmap
->provid
= provid
;
1213 cpmap
->dwtime
= dwtime
;
1216 cs_debug("nr=%d, caid=%04X, provid=%06X, sid=%04X, chid=%04X, dwtime=%d",
1217 nr
, caid
, provid
, sid
, chid
, dwtime
);
1222 //cs_log("%d lengths for caid guessing loaded", nr);