source: trunk/oscam-config.c @ 1768

Last change on this file since 1768 was 1768, checked in by merek, 10 years ago

Some fixes and code cleanup for blockemm-*

File size: 71.3 KB
Line 
1#include "globals.h"
2#ifdef CS_WITH_BOXKEYS
3#  include "oscam-boxkeys.np"
4#endif
5
6#define CONFVARWIDTH 20
7
8static char *cs_conf="oscam.conf";
9static char *cs_user="oscam.user";
10static char *cs_srvr="oscam.server";
11static char *cs_srid="oscam.srvid";
12static char *cs_l4ca="oscam.guess";
13static char *cs_cert="oscam.cert";
14static char *cs_sidt="oscam.services";
15#ifdef CS_ANTICASC
16static char *cs_ac="oscam.ac";
17#endif
18
19#ifdef IRDETO_GUESSING
20static char *cs_ird="oscam.ird";
21#endif
22
23static char token[4096];
24
25typedef enum cs_proto_type
26{
27    TAG_GLOBAL,     // must be first !
28    TAG_MONITOR,        // monitor
29    TAG_CAMD33,     // camd 3.3x
30    TAG_CAMD35,     // camd 3.5x UDP
31    TAG_NEWCAMD,        // newcamd
32    TAG_RADEGAST,       // radegast
33    TAG_SERIAL,     // serial (static)
34    TAG_CS357X,     // camd 3.5x UDP
35    TAG_CS378X,     // camd 3.5x TCP
36    TAG_GBOX,       // gbox
37    TAG_CCCAM,      // cccam
38    TAG_DVBAPI,     // dvbapi
39    TAG_WEBIF,      // webif
40    TAG_ANTICASC        // anti-cascading
41} cs_proto_type_t;
42
43static char *cctag[]={"global", "monitor", "camd33", "camd35", "newcamd", "radegast", "serial",
44              "cs357x", "cs378x", "gbox", "cccam", "dvbapi", "webif", "anticasc", NULL};
45
46#ifdef DEBUG_SIDTAB
47static void show_sidtab(struct s_sidtab *sidtab)
48{
49  for (; sidtab; sidtab=sidtab->next)
50  {
51    int i;
52    char buf[1024];
53    cs_log("label=%s", sidtab->label);
54    sprintf(buf, "caid(%d)=", sidtab->num_caid);
55    for (i=0; i<sidtab->num_caid; i++)
56      sprintf(buf+strlen(buf), "%04X ", sidtab->caid[i]);
57    cs_log("%s", buf);
58    sprintf(buf, "provider(%d)=", sidtab->num_provid);
59    for (i=0; i<sidtab->num_provid; i++)
60      sprintf(buf+strlen(buf), "%08X ", sidtab->provid[i]);
61    cs_log("%s", buf);
62    sprintf(buf, "services(%d)=", sidtab->num_srvid);
63    for (i=0; i<sidtab->num_srvid; i++)
64      sprintf(buf+strlen(buf), "%04X ", sidtab->srvid[i]);
65    cs_log("%s", buf);
66  }
67}
68#endif
69
70void chk_iprange(char *value, struct s_ip **base)
71{
72    int i = 0;
73    char *ptr1, *ptr2;
74    struct s_ip *lip, *cip;
75
76    for (cip=lip=*base; cip; cip=cip->next)
77        lip = cip;
78    if (!(cip=malloc(sizeof(struct s_ip)))) {
79        fprintf(stderr, "Error allocating memory (errno=%d)\n", errno);
80        exit(1);
81    }
82    if (*base)
83        lip->next = cip;
84    else
85        *base = cip;
86
87    memset(cip, 0, sizeof(struct s_ip));
88    for (ptr1=strtok(value, ","); ptr1; ptr1=strtok(NULL, ",")) {
89            if (i == 0)
90                ++i;
91        else {
92            if (!(cip=malloc(sizeof(struct s_ip)))) {
93                fprintf(stderr, "Error allocating memory (errno=%d)\n", errno);
94                exit(1);
95            }
96            lip->next = cip;
97            memset(cip, 0, sizeof(struct s_ip));
98        }
99
100        if( (ptr2=strchr(trim(ptr1), '-')) ) {
101            *ptr2++ ='\0';
102            cip->ip[0]=cs_inet_addr(trim(ptr1));
103            cip->ip[1]=cs_inet_addr(trim(ptr2));
104        } else {
105            cip->ip[0]=cip->ip[1]=cs_inet_addr(ptr1);
106        }
107        lip = cip;
108    }
109}
110
111void chk_caidtab(char *caidasc, CAIDTAB *ctab)
112{
113    int i;
114    char *ptr1, *ptr2, *ptr3;
115
116    for (i = 0, ptr1 = strtok(caidasc, ","); (i < CS_MAXCAIDTAB) && (ptr1); ptr1 = strtok(NULL, ",")) {
117        ulong caid, mask, cmap;
118        if( (ptr3 = strchr(trim(ptr1), ':')) )
119            *ptr3++ = '\0';
120        else
121            ptr3 = "";
122
123        if( (ptr2 = strchr(trim(ptr1), '&')) )
124            *ptr2++ = '\0';
125        else
126            ptr2 = "";
127
128        if (((caid = a2i(ptr1, 2)) | (mask = a2i(ptr2,-2)) | (cmap = a2i(ptr3, 2))) < 0x10000) {
129            ctab->caid[i] = caid;
130            ctab->mask[i] = mask;
131            ctab->cmap[i++] = cmap;
132        }
133    }
134}
135
136void chk_tuntab(char *tunasc, TUNTAB *ttab)
137{
138    int i;
139    char *ptr1, *ptr2, *ptr3;
140
141    for (i = 0, ptr1 = strtok(tunasc, ","); (i < CS_MAXTUNTAB) && (ptr1); ptr1 = strtok(NULL, ",")) {
142        ulong bt_caidfrom, bt_caidto, bt_srvid;
143        if( (ptr3 = strchr(trim(ptr1), ':')) )
144            *ptr3++ = '\0';
145        else
146            ptr3 = "";
147
148        if( (ptr2 = strchr(trim(ptr1), '.')) )
149            *ptr2++ = '\0';
150        else
151            ptr2 = "";
152
153        if ((bt_caidfrom = a2i(ptr1, 2)) | (bt_srvid = a2i(ptr2,-2)) | (bt_caidto = a2i(ptr3, 2))) {
154            ttab->bt_caidfrom[i] = bt_caidfrom;
155            ttab->bt_caidto[i] = bt_caidto;
156            ttab->bt_srvid[i++] = bt_srvid;
157        }
158    }
159}
160
161void chk_services(char *labels, ulong *sidok, ulong *sidno)
162{
163    int i;
164    char *ptr;
165    SIDTAB *sidtab;
166    *sidok = *sidno = 0;
167    for (ptr=strtok(labels, ","); ptr; ptr=strtok(NULL, ",")) {
168        for (trim(ptr), i = 0, sidtab = cfg->sidtab; sidtab; sidtab = sidtab->next, i++) {
169            if (!strcmp(sidtab->label, ptr)) *sidok|=(1<<i);
170            if ((ptr[0]=='!') && (!strcmp(sidtab->label, ptr+1))) *sidno|=(1<<i);
171        }
172    }
173}
174
175void chk_ftab(char *zFilterAsc, FTAB *ftab, const char *zType, const char *zName, const char *zFiltName)
176{
177    int i, j;
178    char *ptr1, *ptr2, *ptr3;
179    char *ptr[CS_MAXFILTERS] = {0};
180
181    memset(ftab, 0, sizeof(FTAB));
182    for( i = 0, ptr1 = strtok(zFilterAsc, ";"); (i < CS_MAXFILTERS) && (ptr1); ptr1 = strtok(NULL, ";"), i++ ) {
183        ptr[i] = ptr1;
184        if( (ptr2 = strchr(trim(ptr1), ':')) ) {
185            *ptr2++ ='\0';
186            ftab->filts[i].caid = (ushort)a2i(ptr1, 4);
187            ptr[i] = ptr2;
188        }
189        else if (zFiltName && zFiltName[0] == 'c') {
190            cs_log("PANIC: CAID field not found in CHID parameter!");
191            cs_exit(1);
192        }
193        ftab->nfilts++;
194    }
195
196    if( ftab->nfilts ) cs_debug("%s '%s' %s filter(s):", zType, zName, zFiltName);
197    for( i = 0; i < ftab->nfilts; i++ ) {
198        cs_debug("CAID #%d: %04X", i, ftab->filts[i].caid);
199        for( j = 0, ptr3 = strtok(ptr[i], ","); (j < CS_MAXPROV) && (ptr3); ptr3 = strtok(NULL, ","), j++ ) {
200            ftab->filts[i].prids[j] = a2i(ptr3,6);
201            ftab->filts[i].nprids++;
202            cs_debug("%s #%d: %06X", zFiltName, j, ftab->filts[i].prids[j]);
203        }
204    }
205}
206
207void chk_cltab(char *classasc, CLASSTAB *clstab)
208{
209    int i;
210    char *ptr1;
211    for( i = 0, ptr1 = strtok(classasc, ","); (i < CS_MAXCAIDTAB) && (ptr1); ptr1 = strtok(NULL, ",") ) {
212        ptr1 = trim(ptr1);
213        if( ptr1[0] == '!' )
214            clstab->bclass[clstab->bn++] = (uchar)a2i(ptr1+1, 2);
215        else
216            clstab->aclass[clstab->an++] = (uchar)a2i(ptr1, 2);
217    }
218}
219
220void chk_port_tab(char *portasc, PTAB *ptab)
221{
222    int i, j, nfilts, ifilt, iport;
223    char *ptr1, *ptr2, *ptr3;
224    char *ptr[CS_MAXPORTS] = {0};
225    int  port[CS_MAXPORTS] = {0};
226    int previous_nports = ptab->nports;
227
228    for (nfilts = i = previous_nports, ptr1 = strtok(portasc, ";"); (i < CS_MAXCAIDTAB) && (ptr1); ptr1 = strtok(NULL, ";"), i++) {
229        ptr[i] = ptr1;
230        if( (ptr2=strchr(trim(ptr1), '@')) ) {
231            *ptr2++ ='\0';
232            ptab->ports[i].s_port = atoi(ptr1);
233            ptr[i] = ptr2;
234            port[i] = ptab->ports[i].s_port;
235            ptab->nports++;
236        }
237        nfilts++;
238    }
239
240    if( nfilts == 1 && strlen(portasc) < 6 && ptab->ports[0].s_port == 0 ) {
241        ptab->ports[0].s_port = atoi(portasc);
242        ptab->nports = 1;
243    }
244
245    iport = ifilt = previous_nports;
246    for (i=previous_nports; i<nfilts; i++) {
247        if( port[i] != 0 )
248            iport = i;
249        for (j = 0, ptr3 = strtok(ptr[i], ","); (j < CS_MAXPROV) && (ptr3); ptr3 = strtok(NULL, ","), j++) {
250            if( (ptr2=strchr(trim(ptr3), ':')) ) {
251                *ptr2++='\0';
252                ptab->ports[iport].ftab.nfilts++;
253                ifilt = ptab->ports[iport].ftab.nfilts-1;
254                ptab->ports[iport].ftab.filts[ifilt].caid = (ushort)a2i(ptr3, 4);
255                ptab->ports[iport].ftab.filts[ifilt].prids[j] = a2i(ptr2, 6);
256            } else {
257                ptab->ports[iport].ftab.filts[ifilt].prids[j] = a2i(ptr3, 6);
258            }
259            ptab->ports[iport].ftab.filts[ifilt].nprids++;
260        }
261    }
262}
263
264#ifdef NOTUSED
265static void chk_srvip(char *value, in_addr_t *ip)
266{
267    int i;
268    char *ptr;
269    for (i=0, ptr=strtok(value, ","); ptr; ptr=strtok(NULL, ","))
270        if (i<8) ip[i++] = inet_addr(ptr);
271}
272#endif
273
274void chk_t_global(char *token, char *value)
275{
276    if (!strcmp(token, "disablelog")) {
277        if (strlen(value) == 0) {
278            cfg->disablelog = 0;
279            return;
280        } else {
281            cfg->disablelog = atoi(value);
282            return;
283        }
284    }
285
286    if (!strcmp(token, "disableuserfile")) {
287        if (strlen(value) == 0) {
288            cfg->disableuserfile = 0;
289            return;
290        } else {
291            cfg->disableuserfile = atoi(value);
292            return;
293        }
294    }
295
296    if (!strcmp(token, "serverip")) {
297        if (strlen(value) == 0) {
298            cfg->srvip = 0;
299            return;
300        } else {
301            cfg->srvip=inet_addr(value);
302            return;
303        }
304    }
305
306    if (!strcmp(token, "logfile")) {
307        if (cfg->logfile != NULL) {
308            free(cfg->logfile);
309            cfg->logfile = NULL;
310        }
311        if (strlen(value) > 0)
312            asprintf(&(cfg->logfile), "%s", value);
313        return;
314    }
315
316    if (!strcmp(token, "pidfile")) {
317        if (cfg->pidfile != NULL) {
318            free(cfg->pidfile);
319            cfg->pidfile = NULL;
320        }
321        if (strlen(value) > 0)
322            asprintf(&(cfg->pidfile), "%s", value);
323        return;
324    }
325
326    if (!strcmp(token, "usrfile")) {
327        if (cfg->usrfile != NULL) {
328            free(cfg->usrfile);
329            cfg->usrfile = NULL;
330        }
331        if (strlen(value) > 0)
332            asprintf(&(cfg->usrfile), "%s", value);
333        return;
334    }
335
336    if (!strcmp(token, "cwlogdir")) {
337        if (cfg->cwlogdir != NULL) {
338            free(cfg->cwlogdir);
339            cfg->cwlogdir = NULL;
340        }
341        if (strlen(value) > 0)
342            asprintf(&(cfg->cwlogdir), "%s", value);
343        return;
344    }
345
346    if (!strcmp(token, "usrfileflag")) {
347        if (strlen(value) == 0) {
348            cfg->usrfileflag = 0;
349            return;
350        } else {
351            cfg->usrfileflag = atoi(value);
352            return;
353        }
354    }
355
356    if (!strcmp(token, "clienttimeout")) {
357        if (strlen(value) == 0) {
358            cfg->ctimeout = CS_CLIENT_TIMEOUT;
359            return;
360        } else {
361            cfg->ctimeout = atoi(value);
362            if (cfg->ctimeout < 100)
363                cfg->ctimeout *= 1000;
364            return;
365        }
366    }
367
368    if (!strcmp(token, "fallbacktimeout")) {
369        if (strlen(value) == 0) {
370            cfg->ftimeout = CS_CLIENT_TIMEOUT;
371            return;
372        } else {
373            cfg->ftimeout = atoi(value);
374            if (cfg->ftimeout < 100)
375                cfg->ftimeout *= 1000;
376            return;
377        }
378    }
379
380    if (!strcmp(token, "clientmaxidle")) {
381        if (strlen(value) == 0) {
382            cfg->cmaxidle = CS_CLIENT_MAXIDLE;
383            return;
384        } else {
385            cfg->cmaxidle = atoi(value);
386            return;
387        }
388    }
389
390    if (!strcmp(token, "cachedelay")) {
391        if (strlen(value) == 0) {
392            cfg->delay = CS_DELAY;
393            return;
394        } else {
395            cfg->delay = atoi(value);
396            return;
397        }
398    }
399
400    if (!strcmp(token, "bindwait")) {
401        if (strlen(value) == 0) {
402            cfg->bindwait = CS_BIND_TIMEOUT;
403            return;
404        } else {
405            cfg->bindwait = atoi(value);
406            return;
407        }
408    }
409
410    if (!strcmp(token, "netprio")) {
411        if (strlen(value) == 0) {
412            cfg->netprio = 0;
413            return;
414        } else {
415            cfg->netprio = atoi(value);
416            return;
417        }
418    }
419
420    if (!strcmp(token, "resolvedelay")) {
421        if (strlen(value) == 0) {
422            cfg->resolvedelay = CS_RESOLVE_DELAY;
423            return;
424        } else {
425            cfg->resolvedelay = atoi(value);
426            return;
427        }
428    }
429
430    if (!strcmp(token, "sleep")) {
431        if (strlen(value) == 0) {
432            cfg->tosleep = 0;
433            return;
434        } else {
435            cfg->tosleep = atoi(value);
436            return;
437        }
438    }
439
440    if (!strcmp(token, "unlockparental")) {
441        if (strlen(value) == 0) {
442            cfg->ulparent = 0;
443            return;
444        } else {
445            cfg->ulparent = atoi(value);
446            return;
447        }
448    }
449
450    if (!strcmp(token, "nice")) {
451        if (strlen(value) == 0) {
452            cfg->nice = 99;
453            return;
454        } else {
455            cfg->nice = atoi(value);
456            if ((cfg->nice<-20) || (cfg->nice>20)) cfg->nice = 99;
457            if (cfg->nice != 99) cs_setpriority(cfg->nice);  // ignore errors
458            return;
459        }
460    }
461
462    if (!strcmp(token, "serialreadertimeout")) {
463        if (cfg->srtimeout < 100)
464            cfg->srtimeout = atoi(value) * 1000;
465        else
466            cfg->srtimeout = atoi(value);
467        if (cfg->srtimeout <= 0)
468            cfg->srtimeout = 1500;
469        return;
470    }
471
472    if (!strcmp(token, "maxlogsize")) {
473        if (strlen(value) == 0) {
474            cfg->max_log_size = 10;
475            return;
476        } else {
477            cfg->max_log_size = atoi(value);
478            if( cfg->max_log_size <= 10 )
479                cfg->max_log_size = 10;
480            return;
481        }
482    }
483
484    if( !strcmp(token, "waitforcards")) {
485        if (strlen(value) == 0) {
486            cfg->waitforcards = 0;
487            return;
488        } else {
489            cfg->waitforcards = atoi(value);
490            return;
491        }
492    }
493
494    if( !strcmp(token, "preferlocalcards")) {
495        if (strlen(value) == 0) {
496            cfg->preferlocalcards = 0;
497            return;
498        } else {
499            cfg->preferlocalcards = atoi(value);
500            return;
501        }
502    }
503
504    if (token[0] != '#')
505        fprintf(stderr, "Warning: keyword '%s' in global section not recognized\n", token);
506}
507
508#ifdef CS_ANTICASC
509void chk_t_ac(char *token, char *value)
510{
511    if (!strcmp(token, "enabled")) {
512        cfg->ac_enabled = atoi(value);
513        if( cfg->ac_enabled <= 0 )
514            cfg->ac_enabled = 0;
515        else
516            cfg->ac_enabled = 1;
517    return;
518    }
519
520    if (!strcmp(token, "numusers")) {
521        cfg->ac_users = atoi(value);
522        if( cfg->ac_users < 0 )
523            cfg->ac_users = 0;
524        return;
525    }
526
527    if (!strcmp(token, "sampletime")) {
528        cfg->ac_stime = atoi(value);
529        if( cfg->ac_stime < 0 )
530            cfg->ac_stime = 2;
531        return;
532    }
533
534    if (!strcmp(token, "samples")) {
535        cfg->ac_samples = atoi(value);
536        if( cfg->ac_samples < 2 || cfg->ac_samples > 10)
537            cfg->ac_samples = 10;
538        return;
539    }
540
541    if (!strcmp(token, "penalty")) {
542        cfg->ac_penalty = atoi(value);
543        if( cfg->ac_penalty < 0 )
544            cfg->ac_penalty = 0;
545        return;
546    }
547
548    if (!strcmp(token, "aclogfile")) {
549        cs_strncpy(cfg->ac_logfile, value, sizeof(cfg->ac_logfile));
550        return;
551    }
552
553    if( !strcmp(token, "fakedelay") ) {
554        cfg->ac_fakedelay = atoi(value);
555        if( cfg->ac_fakedelay < 100 || cfg->ac_fakedelay > 1000 )
556            cfg->ac_fakedelay = 1000;
557        return;
558    }
559
560    if( !strcmp(token, "denysamples") ) {
561        cfg->ac_denysamples = atoi(value);
562        if( cfg->ac_denysamples < 2 || cfg->ac_denysamples > cfg->ac_samples - 1 )
563            cfg->ac_denysamples=cfg->ac_samples-1;
564        return;
565    }
566
567    if (token[0] != '#')
568        fprintf(stderr, "Warning: keyword '%s' in anticascading section not recognized\n",token);
569}
570#endif
571
572void chk_t_monitor(char *token, char *value)
573{
574    if (!strcmp(token, "port")) {
575        if(strlen(value) == 0) {
576            cfg->mon_port = 0;
577            return;
578        } else {
579            cfg->mon_port=atoi(value);
580            return;
581        }
582    }
583
584    if (!strcmp(token, "serverip")) {
585        if(strlen(value) == 0) {
586            cfg->mon_srvip = 0;
587            return;
588        } else {
589            cfg->mon_srvip=inet_addr(value);
590            return;
591        }
592    }
593
594    if (!strcmp(token, "nocrypt")) {
595        if(strlen(value) == 0) {
596            clear_sip(&cfg->mon_allowed);
597            return;
598        } else {
599            chk_iprange(value, &cfg->mon_allowed);
600            return;
601        }
602    }
603
604    if (!strcmp(token, "aulow")) {
605        if(strlen(value) == 0) {
606            cfg->mon_aulow = 0;
607            return;
608        } else {
609            cfg->mon_aulow = atoi(value);
610            return;
611        }
612    }
613
614    if (!strcmp(token, "monlevel")) {
615        if(strlen(value) == 0) {
616            cfg->mon_level = 0;
617            return;
618        } else {
619            cfg->mon_level = atoi(value);
620            return;
621        }
622    }
623
624    if (!strcmp(token, "hideclient_to")) {
625        if(strlen(value) == 0) {
626            cfg->mon_hideclient_to = 0;
627            return;
628        } else {
629            cfg->mon_hideclient_to = atoi(value);
630            return;
631        }
632    }
633
634    if (!strcmp(token, "appendchaninfo")) {
635        if(strlen(value) == 0) {
636            cfg->mon_appendchaninfo = 0;
637            return;
638        } else {
639            cfg->mon_appendchaninfo = atoi(value);
640            return;
641        }
642    }
643
644    if (token[0] != '#')
645        fprintf(stderr, "Warning: keyword '%s' in monitor section not recognized\n",token);
646}
647
648#ifdef WEBIF
649void chk_t_webif(char *token, char *value)
650{
651    if (!strcmp(token, "httpport")) {
652        if(strlen(value) == 0) {
653            cfg->http_port = 0;
654            return;
655        } else {
656            cfg->http_port = atoi(value);
657            return;
658        }
659    }
660
661    if (!strcmp(token, "httpuser")) {
662        cs_strncpy(cfg->http_user, value, sizeof(cfg->http_user));
663        return;
664    }
665
666    if (!strcmp(token, "httppwd")) {
667        cs_strncpy(cfg->http_pwd, value, sizeof(cfg->http_pwd));
668        return;
669    }
670
671    if (!strcmp(token, "httpcss")) {
672        cs_strncpy(cfg->http_css, value, sizeof(cfg->http_css));
673        return;
674    }
675
676    if (!strcmp(token, "httpscript")) {
677        cs_strncpy(cfg->http_script, value, sizeof(cfg->http_script));
678        return;
679    }
680
681    if (!strcmp(token, "httptpl")) {
682        cfg->http_tpl[0] = '\0';
683        cs_strncpy(cfg->http_tpl, value, sizeof(cfg->http_tpl));
684        if(strlen(value) != 0) {
685            if(strlen(cfg->http_tpl) < (sizeof(cfg->http_tpl)-2) && cfg->http_tpl[strlen(cfg->http_tpl)-1] != '/') {
686                cfg->http_tpl[strlen(cfg->http_tpl)] = '/';
687                cfg->http_tpl[strlen(cfg->http_tpl)] = '\0';
688            }
689        }
690        return;
691    }
692
693    if (!strcmp(token, "httprefresh")) {
694        if(strlen(value) == 0) {
695            cfg->http_refresh = 0;
696            return;
697        } else {
698            cfg->http_refresh = atoi(value);
699            return;
700        }
701    }
702
703    if (!strcmp(token, "httphideidleclients")) {
704        if(strlen(value) == 0) {
705            cfg->http_hide_idle_clients = 0;
706            return;
707        } else {
708            cfg->http_hide_idle_clients = atoi(value);
709            return;
710        }
711    }
712
713    if (!strcmp(token, "httpallowed")) {
714        if(strlen(value) == 0) {
715            clear_sip(&cfg->http_allowed);
716            return;
717        } else {
718            chk_iprange(value, &cfg->http_allowed);
719            return;
720        }
721    }
722
723    if (!strcmp(token, "httpreadonly")) {
724        if(strlen(value) == 0) {
725            cfg->http_readonly = 0;
726            return;
727        } else {
728            cfg->http_readonly = atoi(value);
729            return;
730        }
731    }
732
733    if (!strcmp(token, "httpdyndns")) {
734        cs_strncpy((char *)cfg->http_dyndns, value, sizeof(cfg->http_dyndns));
735        return;
736    }
737
738    if (token[0] != '#')
739        fprintf(stderr, "Warning: keyword '%s' in webif section not recognized\n",token);
740}
741#endif
742
743
744void chk_t_camd33(char *token, char *value)
745{
746    if (!strcmp(token, "port")) {
747        if(strlen(value) == 0) {
748            cfg->c33_port = 0;
749            return;
750        } else {
751            cfg->c33_port = atoi(value);
752            return;
753        }
754    }
755
756    if (!strcmp(token, "serverip")) {
757        if(strlen(value) == 0) {
758            cfg->c33_srvip = 0;
759            return;
760        } else {
761            cfg->c33_srvip = inet_addr(value);
762            return;
763        }
764    }
765
766    if (!strcmp(token, "nocrypt")) {
767        if(strlen(value) == 0) {
768            return;
769        } else {
770            chk_iprange(value, &cfg->c33_plain);
771            return;
772        }
773    }
774
775    if (!strcmp(token, "passive")) {
776        cfg->c33_passive = (value[0]!='0');
777        return;
778    }
779
780    if (!strcmp(token, "key")) {
781        if (key_atob(value, cfg->c33_key)) {
782            fprintf(stderr, "Configuration camd3.3x: Error in Key\n");
783            exit(1);
784        }
785        cfg->c33_crypted=1;
786        return;
787    }
788
789    if (token[0] != '#')
790        fprintf(stderr, "Warning: keyword '%s' in camd33 section not recognized\n",token);
791}
792
793void chk_t_camd35(char *token, char *value)
794{
795    if (!strcmp(token, "port")) {
796        if(strlen(value) == 0) {
797            cfg->c35_port = 0;
798            return;
799        } else {
800            cfg->c35_port = atoi(value);
801            return;
802        }
803    }
804
805    if (!strcmp(token, "serverip")) {
806        if(strlen(value) == 0) {
807            cfg->c35_tcp_srvip = 0;
808            return;
809        } else {
810            cfg->c35_tcp_srvip = inet_addr(value);
811            return;
812        }
813    }
814
815    if (!strcmp(token, "suppresscmd08")) {
816        if(strlen(value) == 0) {
817            cfg->c35_suppresscmd08 = 0;
818            return;
819        } else {
820            cfg->c35_suppresscmd08=atoi(value);
821            return;
822        }
823    }
824
825    if (token[0] != '#')
826        fprintf(stderr, "Warning: keyword '%s' in camd35 section not recognized\n", token);
827}
828
829void chk_t_camd35_tcp(char *token, char *value)
830{
831    if (!strcmp(token, "port")) {
832        if(strlen(value) == 0) {
833            clear_ptab(&cfg->c35_tcp_ptab);
834            return;
835        } else {
836            chk_port_tab(value, &cfg->c35_tcp_ptab);
837            return;
838        }
839    }
840
841    if (!strcmp(token, "serverip")) {
842        if(strlen(value) == 0) {
843            cfg->c35_tcp_srvip = 0;
844            return;
845        } else {
846            cfg->c35_tcp_srvip = inet_addr(value);
847            return;
848        }
849    }
850
851    if (!strcmp(token, "suppresscmd08")) {
852        if(strlen(value) == 0) {
853            cfg->c35_suppresscmd08 = 0;
854            return;
855        } else {
856            cfg->c35_suppresscmd08 = atoi(value);
857            return;
858        }
859    }
860
861    if (token[0] != '#')
862        fprintf(stderr, "Warning: keyword '%s' in camd35 tcp section not recognized\n", token);
863}
864
865void chk_t_newcamd(char *token, char *value)
866{
867    if (!strcmp(token, "port")) {
868        if(strlen(value) == 0) {
869            clear_ptab(&cfg->ncd_ptab);
870            return;
871        } else {
872            chk_port_tab(value, &cfg->ncd_ptab);
873            return;
874        }
875    }
876
877    if (!strcmp(token, "serverip")) {
878        if(strlen(value) == 0) {
879            cfg->ncd_srvip = 0;
880            return;
881        } else {
882            cfg->ncd_srvip = inet_addr(value);
883            return;
884        }
885    }
886
887    if (!strcmp(token, "allowed")) {
888        if(strlen(value) == 0) {
889            clear_sip(&cfg->ncd_allowed);
890            return;
891        } else {
892            chk_iprange(value, &cfg->ncd_allowed);
893            return;
894        }
895    }
896
897    if (!strcmp(token, "key")) {
898        if (key_atob14(value, cfg->ncd_key)) {
899            fprintf(stderr, "Configuration newcamd: Error in Key\n");
900            exit(1);
901        }
902        return;
903    }
904
905    if (!strcmp(token, "keepalive")) {
906        if(strlen(value) == 0) {
907            cfg->ncd_keepalive = 1;
908            return;
909        } else {
910            cfg->ncd_keepalive = atoi(value);
911            return;
912        }
913    }
914
915    if (token[0] != '#')
916        fprintf(stderr, "Warning: keyword '%s' in newcamd section not recognized\n", token);
917}
918
919void chk_t_cccam(char *token, char *value)
920{
921    if (!strcmp(token, "port")) {
922        if(strlen(value) == 0) {
923            cfg->cc_port = 0;
924            return;
925        } else {
926            cfg->cc_port = atoi(value);
927            return;
928        }
929    }
930    //if (!strcmp(token, "serverip")) { cfg->cc_srvip=inet_addr(value); return; }
931
932    if (!strcmp(token, "reshare")) {
933        if(strlen(value) == 0) {
934            cfg->cc_reshare = 0;
935            return;
936        } else {
937            cfg->cc_reshare=atoi(value);
938            return;
939        }
940    }
941    // cccam version
942    if (!strcmp(token, "version")) {
943        if (strlen(value) > sizeof(cfg->cc_version) - 1) {
944            fprintf(stderr, "cccam config: version too long\n");
945            exit(1);
946        }
947        memset(cfg->cc_version, 0, sizeof(cfg->cc_version));
948        strncpy((char*)cfg->cc_version, value, sizeof(cfg->cc_version) - 1);
949        return;
950    }
951    // cccam build number
952    if (!strcmp(token, "build")) {
953        if (strlen(value) > sizeof(cfg->cc_build) - 1) {
954            fprintf(stderr, "cccam config build number too long\n");
955            exit(1);
956        }
957        memset(cfg->cc_build, 0, sizeof(cfg->cc_build));
958        strncpy((char*)cfg->cc_build, value, sizeof(cfg->cc_build)-1);
959        return;
960    }
961
962    if (token[0] != '#')
963        fprintf(stderr, "Warning: keyword '%s' in cccam section not recognized\n",token);
964}
965
966void chk_t_radegast(char *token, char *value)
967{
968    if (!strcmp(token, "port")) {
969        if(strlen(value) == 0) {
970            cfg->rad_port = 0;
971            return;
972        } else {
973            cfg->rad_port = atoi(value);
974            return;
975        }
976    }
977
978    if (!strcmp(token, "serverip")) {
979        if(strlen(value) == 0) {
980            cfg->rad_srvip = 0;
981            return;
982        } else {
983            cfg->rad_srvip = inet_addr(value);
984            return;
985        }
986    }
987
988    if (!strcmp(token, "allowed")) {
989        if(strlen(value) == 0) {
990            clear_sip(&cfg->rad_allowed);
991            return;
992        } else {
993            chk_iprange(value, &cfg->rad_allowed);
994            return;
995        }
996    }
997
998    if (!strcmp(token, "user")) {
999        cs_strncpy(cfg->rad_usr, value, sizeof(cfg->rad_usr));
1000        return;
1001    }
1002
1003    if (token[0] != '#')
1004        fprintf(stderr, "Warning: keyword '%s' in radegast section not recognized\n", token);
1005}
1006
1007void chk_t_serial(char *token, char *value)
1008{
1009    if (!strcmp(token, "device")) {
1010        int l;
1011        l = strlen(cfg->ser_device);
1012        if (l)
1013            cfg->ser_device[l++]=1;  // use ctrl-a as delimiter
1014        cs_strncpy(cfg->ser_device+l, value, sizeof(cfg->ser_device)-l);
1015        return;
1016    }
1017    if (token[0] != '#')
1018        fprintf(stderr, "Warning: keyword '%s' in serial section not recognized\n", token);
1019}
1020
1021#ifdef CS_WITH_GBOX
1022static void chk_t_gbox(char *token, char *value)
1023{
1024    //if (!strcmp(token, "password")) strncpy(cfg->gbox_pwd, i2b(4, a2i(value, 4)), 4);
1025    if (!strcmp(token, "password")) {
1026        cs_atob(cfg->gbox_pwd, value, 4);
1027        return;
1028    }
1029
1030    if (!strcmp(token, "maxdist")) {
1031        cfg->maxdist=atoi(value);
1032        return;
1033    }
1034
1035    if (!strcmp(token, "ignorelist")) {
1036        cs_strncpy((char *)cfg->ignorefile, value, sizeof(cfg->ignorefile));
1037        return;
1038    }
1039
1040    if (!strcmp(token, "onlineinfos")) {
1041        cs_strncpy((char *)cfg->gbxShareOnl, value, sizeof(cfg->gbxShareOnl));
1042        return;
1043    }
1044
1045    if (!strcmp(token, "cardinfos")) {
1046        cs_strncpy((char *)cfg->cardfile, value, sizeof(cfg->cardfile));
1047        return;
1048    }
1049
1050    if (!strcmp(token, "locals"))
1051    {
1052        char *ptr1;
1053        int n = 0, i;
1054        for (i = 0, ptr1 = strtok(value, ","); (i < CS_MAXLOCALS) && (ptr1); ptr1 = strtok(NULL, ",")) {
1055            cfg->locals[n++] = a2i(ptr1, 8);
1056            //printf("%i %08X",n,cfg->locals[n-1]);
1057        }
1058        cfg->num_locals = n;
1059        return;
1060    }
1061
1062    if (token[0] != '#')
1063        fprintf(stderr, "Warning: keyword '%s' in gbox section not recognized\n",token);
1064}
1065#endif
1066
1067#ifdef HAVE_DVBAPI
1068void chk_t_dvbapi(char *token, char *value)
1069{
1070    if (!strcmp(token, "enabled")) {
1071        cfg->dvbapi_enabled = atoi(value);
1072        return;
1073    }
1074
1075    if (!strcmp(token, "au")) {
1076        cfg->dvbapi_au = atoi(value);
1077        return;
1078    }
1079
1080    if (!strcmp(token, "boxtype")) {
1081        cs_strncpy(cfg->dvbapi_boxtype, value, sizeof(cfg->dvbapi_boxtype));
1082        return;
1083    }
1084
1085    if (!strcmp(token, "user")) {
1086        cs_strncpy(cfg->dvbapi_usr, value, sizeof(cfg->dvbapi_usr));
1087        return;
1088    }
1089
1090    if (!strcmp(token, "priority")) {
1091        cs_strncpy(cfg->dvbapi_priority, value, sizeof(cfg->dvbapi_priority));
1092        return;
1093    }
1094
1095    if (!strcmp(token, "ignore")) {
1096        cs_strncpy(cfg->dvbapi_ignore, value, sizeof(cfg->dvbapi_ignore));
1097        return;
1098    }
1099
1100    if (token[0] != '#')
1101        fprintf(stderr, "Warning: keyword '%s' in dvbapi section not recognized\n",token);
1102}
1103#endif
1104
1105static void chk_token(char *token, char *value, int tag)
1106{
1107    switch(tag) {
1108        case TAG_GLOBAL  : chk_t_global(token, value); break;
1109        case TAG_MONITOR : chk_t_monitor(token, value); break;
1110        case TAG_CAMD33  : chk_t_camd33(token, value); break;
1111        case TAG_CAMD35  :
1112        case TAG_CS357X  : chk_t_camd35(token, value); break;
1113        case TAG_NEWCAMD : chk_t_newcamd(token, value); break;
1114        case TAG_RADEGAST: chk_t_radegast(token, value); break;
1115        case TAG_SERIAL  : chk_t_serial(token, value); break;
1116        case TAG_CS378X  : chk_t_camd35_tcp(token, value); break;
1117        case TAG_CCCAM   : chk_t_cccam(token, value); break;
1118
1119#ifdef CS_WITH_GBOX
1120        case TAG_GBOX    : chk_t_gbox(token, value); break;
1121#else
1122        case TAG_GBOX    : fprintf(stderr, "Warning: OSCam compiled without gbox support.\n"); break;
1123#endif
1124
1125
1126#ifdef HAVE_DVBAPI
1127        case TAG_DVBAPI  : chk_t_dvbapi(token, value); break;
1128#else
1129        case TAG_DVBAPI  : fprintf(stderr, "Warning: OSCam compiled without DVB API support.\n"); break;
1130#endif
1131
1132
1133#ifdef WEBIF
1134        case TAG_WEBIF   : chk_t_webif(token, value); break;
1135#else
1136        case TAG_WEBIF   : fprintf(stderr, "Warning: OSCam compiled without Webinterface support.\n"); break;
1137#endif
1138
1139
1140#ifdef CS_ANTICASC
1141        case TAG_ANTICASC: chk_t_ac(token, value); break;
1142#else
1143        case TAG_ANTICASC: fprintf(stderr, "Warning: OSCam compiled without anticascading support.\n"); break;
1144#endif
1145
1146    }
1147}
1148
1149void init_len4caid()
1150{
1151    int nr;
1152    FILE *fp;
1153    char *value;
1154
1155    memset(len4caid, 0, sizeof(ushort)<<8);
1156    sprintf(token, "%s%s", cs_confdir, cs_l4ca);
1157    if (!(fp = fopen(token, "r")))
1158        return;
1159    for(nr = 0; fgets(token, sizeof(token), fp);) {
1160        int i, c;
1161        char *ptr;
1162        if (!(value=strchr(token, ':')))
1163            continue;
1164        *value++ ='\0';
1165        if( (ptr = strchr(value, '#')) )
1166            *ptr = '\0';
1167        if (strlen(trim(token)) != 2)
1168            continue;
1169        if (strlen(trim(value)) != 4)
1170            continue;
1171        if ((i = byte_atob(token)) < 0)
1172            continue;
1173        if ((c = word_atob(value)) < 0)
1174            continue;
1175        len4caid[i] = c;
1176        nr++;
1177    }
1178    fclose(fp);
1179    cs_log("%d lengths for caid guessing loaded", nr);
1180    return;
1181}
1182
1183int search_boxkey(ushort caid, char *key)
1184{
1185    int i, rc = 0;
1186    FILE *fp;
1187    char c_caid[512];
1188
1189    sprintf(c_caid, "%s%s", cs_confdir, cs_cert);
1190    fp = fopen(c_caid, "r");
1191    if (fp) {
1192        for (; (!rc) && fgets(c_caid, sizeof(c_caid), fp);) {
1193            char *c_provid, *c_key;
1194
1195            c_provid = strchr(c_caid, '#');
1196            if (c_provid)
1197                *c_provid = '\0';
1198            if (!(c_provid = strchr(c_caid, ':')))
1199                continue;
1200            *c_provid++ ='\0';
1201            if (!(c_key = strchr(c_provid, ':')))
1202                continue;
1203            *c_key++ ='\0';
1204            if (word_atob(trim(c_caid))!=caid)
1205                continue;
1206            if ((i=(strlen(trim(c_key))>>1)) > 256)
1207                continue;
1208            if (cs_atob((uchar *)key, c_key, i) < 0) {
1209                cs_log("wrong key in \"%s\"", cs_cert);
1210                continue;
1211            }
1212            rc = 1;
1213        }
1214        fclose(fp);
1215    }
1216#ifdef OSCAM_INBUILD_KEYS
1217    for(i=0; (!rc) && (npkey[i].keylen); i++)
1218        if (rc=((caid==npkey[i].caid) && (npkey[i].provid==0)))
1219            memcpy(key, npkey[i].key, npkey[i].keylen);
1220#endif
1221    return(rc);
1222}
1223
1224int init_config()
1225{
1226    int tag=TAG_GLOBAL;
1227    FILE *fp;
1228    char *value;
1229
1230#ifndef CS_EMBEDDED
1231#ifdef PRIO_PROCESS
1232    errno=0;
1233    if ((cfg->nice = getpriority(PRIO_PROCESS, 0)) == (-1))
1234    if (errno)
1235#endif
1236#endif
1237    cfg->nice = 99;
1238    cfg->ctimeout = CS_CLIENT_TIMEOUT;
1239    cfg->ftimeout = CS_CLIENT_TIMEOUT / 2;
1240    cfg->cmaxidle = CS_CLIENT_MAXIDLE;
1241    cfg->delay = CS_DELAY;
1242    cfg->bindwait = CS_BIND_TIMEOUT;
1243    cfg->resolvedelay = CS_RESOLVE_DELAY;
1244    cfg->mon_level = 2;
1245    cfg->mon_hideclient_to = 0;
1246    cfg->srtimeout = 1500;
1247    cfg->ulparent = 0;
1248    cfg->logfile = NULL;
1249    cfg->pidfile = NULL;
1250    cfg->usrfile = NULL;
1251    cfg->cwlogdir = NULL;
1252#ifdef WEBIF
1253    strcpy(cfg->http_user, "");
1254    strcpy(cfg->http_pwd, "");
1255    strcpy(cfg->http_css, "");
1256    cfg->http_refresh = 0;
1257    cfg->http_hide_idle_clients = 0;
1258    strcpy(cfg->http_tpl, "");
1259#endif
1260    cfg->ncd_keepalive = 1;
1261#ifdef CS_ANTICASC
1262    cfg->ac_enabled = 0;
1263    cfg->ac_users = 0;
1264    cfg->ac_stime = 2;
1265    cfg->ac_samples = 10;
1266    cfg->ac_denysamples = 8;
1267    cfg->ac_fakedelay = 1000;
1268    strcpy(cfg->ac_logfile, "./oscam_ac.log");
1269#endif
1270    sprintf(token, "%s%s", cs_confdir, cs_conf);
1271    if (!(fp = fopen(token, "r"))) {
1272        fprintf(stderr, "Cannot open config file '%s' (errno=%d)\n", token, errno);
1273        exit(1);
1274    }
1275    while (fgets(token, sizeof(token), fp)) {
1276        int i, l;
1277        //void *ptr;
1278        if ((l = strlen(trim(token))) < 3)
1279            continue;
1280        if ((token[0] == '[') && (token[l-1] == ']')) {
1281            for (token[l-1] = 0, tag = -1, i = TAG_GLOBAL; cctag[i]; i++)
1282                if (!strcmp(cctag[i], strtolower(token+1)))
1283                    tag = i;
1284            continue;
1285        }
1286        if (!(value=strchr(token, '=')))
1287            continue;
1288        *value++ ='\0';
1289        chk_token(trim(strtolower(token)), trim(value), tag);
1290    }
1291    fclose(fp);
1292#ifdef CS_LOGFILE
1293    if (cfg->logfile == NULL)
1294        asprintf(&(cfg->logfile), "%s", CS_LOGFILE);
1295#endif
1296    cs_init_log(cfg->logfile);
1297    if (cfg->ftimeout >= cfg->ctimeout) {
1298        cfg->ftimeout = cfg->ctimeout - 100;
1299        cs_log("WARNING: fallbacktimeout adjusted to %lu ms (must be smaller than clienttimeout (%lu ms))", cfg->ftimeout, cfg->ctimeout);
1300    }
1301    if(cfg->ftimeout < cfg->srtimeout) {
1302        cfg->ftimeout = cfg->srtimeout + 100;
1303        cs_log("WARNING: fallbacktimeout adjusted to %lu ms (must be greater than serialreadertimeout (%lu ms))", cfg->ftimeout, cfg->srtimeout);
1304    }
1305    if(cfg->ctimeout < cfg->srtimeout) {
1306        cfg->ctimeout = cfg->srtimeout + 100;
1307        cs_log("WARNING: clienttimeout adjusted to %lu ms (must be greater than serialreadertimeout (%lu ms))", cfg->ctimeout, cfg->srtimeout);
1308    }
1309#ifdef CS_ANTICASC
1310    if( cfg->ac_denysamples+1 > cfg->ac_samples ) {
1311        cfg->ac_denysamples = cfg->ac_samples - 1;
1312        cs_log("WARNING: DenySamples adjusted to %d", cfg->ac_denysamples);
1313    }
1314#endif
1315    return 0;
1316}
1317
1318void chk_account(char *token, char *value, struct s_auth *account)
1319{
1320    int i;
1321    char *ptr1;
1322
1323    if (!strcmp(token, "user")) {
1324        cs_strncpy(account->usr, value, sizeof(account->usr));
1325        return;
1326    }
1327
1328    if (!strcmp(token, "pwd")) {
1329        cs_strncpy(account->pwd, value, sizeof(account->pwd));
1330        return;
1331    }
1332
1333    if (!strcmp(token, "hostname")) {
1334        cs_strncpy((char *)account->dyndns, value, sizeof(account->dyndns));
1335        return;
1336    }
1337
1338    if (!strcmp(token, "betatunnel")) {
1339        if(strlen(value) == 0) {
1340            clear_tuntab(&account->ttab);
1341            return;
1342        } else {
1343            chk_tuntab(value, &account->ttab);
1344            return;
1345        }
1346    }
1347
1348    if (!strcmp(token, "uniq")) {
1349        if(strlen(value) == 0) {
1350            account->uniq = 0;
1351            return;
1352        } else {
1353            account->uniq = atoi(value);
1354            return;
1355        }
1356    }
1357
1358    if (!strcmp(token, "sleep")) {
1359        if(strlen(value) == 0) {
1360            account->tosleep = 0;
1361            return;
1362        } else {
1363            account->tosleep=atoi(value);
1364            return;
1365        }
1366    }
1367
1368    if (!strcmp(token, "monlevel")) {
1369        if(strlen(value) == 0) {
1370            account->monlvl = 0;
1371            return;
1372        } else {
1373            account->monlvl = atoi(value);
1374            return;
1375        }
1376    }
1377
1378    if (!strcmp(token, "caid")) {
1379        if(strlen(value) == 0) {
1380            clear_caidtab(&account->ctab);
1381            return;
1382        } else {
1383            chk_caidtab(value, &account->ctab);
1384            return;
1385        }
1386    }
1387
1388    if (!strcmp(token, "disabled")) {
1389        if(strlen(value) == 0) {
1390            account->disabled = 0;
1391            return;
1392        } else {
1393            account->disabled = atoi(value);
1394            return;
1395        }
1396    }
1397
1398    if (!strcmp(token, "suppresscmd08")) {
1399        if(strlen(value) == 0) {
1400            account->c35_suppresscmd08 = 0;
1401            return;
1402        } else {
1403            account->c35_suppresscmd08=atoi(value);
1404            return;
1405        }
1406    }
1407
1408    if (!strcmp(token, "keepalive")) {
1409        if(strlen(value) == 0) {
1410            account->ncd_keepalive = 1;
1411            return;
1412        } else {
1413            account->ncd_keepalive = atoi(value);
1414            return;
1415        }
1416    }
1417    /*
1418    *  case insensitive
1419    */
1420    strtolower(value);
1421
1422    if (!strcmp(token, "au")) {
1423        //set default values for usage during runtime from Webif
1424        account->au=-1;
1425        account->autoau=0;
1426
1427        if(value && value[0]=='1') account->autoau=1;
1428            for (i=0; i<CS_MAXREADER; i++)
1429                if ((reader[i].label[0]) && (!strncmp(reader[i].label, value, strlen(reader[i].label))))
1430                    account->au=i;
1431        return;
1432    }
1433
1434    if (!strcmp(token, "group")) {
1435        account->grp = 0;
1436        for (ptr1=strtok(value, ","); ptr1; ptr1=strtok(NULL, ",")) {
1437            int g;
1438            g = atoi(ptr1);
1439            if ((g>0) && (g < 33)) account->grp|=(1<<(g-1));
1440        }
1441        return;
1442    }
1443
1444    if(!strcmp(token, "services")) {
1445        chk_services(value, &account->sidtabok, &account->sidtabno);
1446        return;
1447    }
1448
1449    if(!strcmp(token, "ident")) { /*ToDo ftab clear*/
1450        chk_ftab(value, &account->ftab, "user", account->usr, "provid");
1451        return;
1452    }
1453
1454    if(!strcmp(token, "class")) {
1455        chk_cltab(value, &account->cltab);
1456        return;
1457    }
1458
1459    if(!strcmp(token, "chid")) {
1460        chk_ftab(value, &account->fchid, "user", account->usr, "chid");
1461        return;
1462    }
1463
1464    if (!strcmp(token, "expdate")) {
1465        if (!value[0]) {
1466            account->expirationdate=(time_t)NULL;
1467            return;
1468        }
1469        struct tm cstime;
1470        memset(&cstime,0,sizeof(cstime));
1471        for (i=0, ptr1=strtok(value, "-/"); (i<3)&&(ptr1); ptr1=strtok(NULL, "-/"), i++) {
1472            switch(i) {
1473                case 0: cstime.tm_year=atoi(ptr1)-1900; break;
1474                case 1: cstime.tm_mon =atoi(ptr1)-1;    break;
1475                case 2: cstime.tm_mday=atoi(ptr1);      break;
1476            }
1477        }
1478        account->expirationdate=mktime(&cstime);
1479        return;
1480    }
1481
1482#ifdef CS_ANTICASC
1483    if( !strcmp(token, "numusers") ) {
1484        account->ac_users = atoi(value);
1485        return;
1486    }
1487
1488    if( !strcmp(token, "penalty") ) {
1489        account->ac_penalty = atoi(value);
1490        return;
1491    }
1492#endif
1493
1494    if (token[0] != '#')
1495        fprintf(stderr, "Warning: keyword '%s' in account section not recognized\n",token);
1496}
1497
1498int write_services()
1499{
1500    int i;
1501    FILE *f;
1502    struct s_sidtab *sidtab = cfg->sidtab;
1503    char tmpfile[256];
1504    char destfile[256];
1505    char bakfile[256];
1506
1507    snprintf(destfile, 255,"%s%s", cs_confdir, cs_sidt);
1508    snprintf(tmpfile, 255, "%s%s.tmp", cs_confdir, cs_sidt);
1509    snprintf(bakfile, 255,"%s%s.bak", cs_confdir, cs_sidt);
1510
1511    if (!(f=fopen(tmpfile, "w"))){
1512        cs_log("Cannot open file \"%s\" (errno=%d)", tmpfile, errno);
1513        return(1);
1514    }
1515    fprintf(f,"#oscam.services generated automatically\n\n");
1516
1517    while(sidtab != NULL){
1518        fprintf(f,"[%s]\n", sidtab->label);
1519        fprintf_conf(f, CONFVARWIDTH, "caid", "");
1520        for (i=0; i<sidtab->num_caid; i++){
1521            if (i==0) fprintf(f,"%04X", sidtab->caid[i]);
1522            else fprintf(f,",%04X", sidtab->caid[i]);
1523        }
1524        fputc((int)'\n', f);
1525        fprintf_conf(f, CONFVARWIDTH, "provid", "");
1526        for (i=0; i<sidtab->num_provid; i++){
1527            if (i==0) fprintf(f,"%06lX", sidtab->provid[i]);
1528            else fprintf(f,",%06lX", sidtab->provid[i]);
1529        }
1530        fputc((int)'\n', f);
1531        fprintf_conf(f, CONFVARWIDTH, "srvid", "");
1532        for (i=0; i<sidtab->num_srvid; i++){
1533            if (i==0) fprintf(f,"%04X", sidtab->srvid[i]);
1534            else fprintf(f,",%04X", sidtab->srvid[i]);
1535        }
1536        fprintf(f,"\n\n");
1537        sidtab=sidtab->next;
1538    }
1539
1540    fclose(f);
1541    return(safe_overwrite_with_bak(destfile, tmpfile, bakfile, 0));
1542}
1543
1544int write_config()
1545{
1546    int i,j;
1547    FILE *f;
1548    char *dot = "", *dot1 = "", *dot2 = ""; //flags for delimiters
1549    char tmpfile[256];
1550    char destfile[256];
1551    char bakfile[256];
1552
1553    snprintf(destfile, 255,"%s%s", cs_confdir, cs_conf);
1554    snprintf(tmpfile, 255, "%s%s.tmp", cs_confdir, cs_conf);
1555    snprintf(bakfile, 255,"%s%s.bak", cs_confdir, cs_conf);
1556
1557    if (!(f=fopen(tmpfile, "w"))){
1558    cs_log("Cannot open file \"%s\" (errno=%d)", tmpfile, errno);
1559    return(1);
1560  }
1561  fprintf(f,"#oscam.config generated automatically\n\n");
1562
1563    /*global settings*/
1564    fprintf(f,"[global]\n");
1565    if (cfg->srvip != 0)
1566        fprintf_conf(f, CONFVARWIDTH, "serverip", "%s\n", inet_ntoa(*(struct in_addr *)&cfg->srvip));
1567    if (cfg->pidfile != NULL) fprintf_conf(f, CONFVARWIDTH, "pidfile", "%s\n", cfg->pidfile);
1568    if (cfg->usrfile != NULL) fprintf_conf(f, CONFVARWIDTH, "usrfile", "%s\n", cfg->usrfile);
1569    if (cfg->logfile != NULL) fprintf_conf(f, CONFVARWIDTH, "logfile", "%s\n", cfg->logfile);
1570    if (cfg->cwlogdir != NULL) fprintf_conf(f, CONFVARWIDTH, "cwlogdir", "%s\n", cfg->cwlogdir);
1571    fprintf_conf(f, CONFVARWIDTH, "disablelog", "%d\n", cfg->disablelog);
1572    fprintf_conf(f, CONFVARWIDTH, "disableuserfile", "%d\n", cfg->disableuserfile);
1573    fprintf_conf(f, CONFVARWIDTH, "usrfileflag", "%d\n", cfg->usrfileflag);
1574    fprintf_conf(f, CONFVARWIDTH, "clienttimeout", "%ld\n", cfg->ctimeout);
1575    fprintf_conf(f, CONFVARWIDTH, "fallbacktimeout", "%ld\n", cfg->ftimeout);
1576    fprintf_conf(f, CONFVARWIDTH, "clientmaxidle", "%d\n", cfg->cmaxidle);
1577    fprintf_conf(f, CONFVARWIDTH, "cachedelay", "%ld\n", cfg->delay);
1578    fprintf_conf(f, CONFVARWIDTH, "bindwait", "%d\n", cfg->bindwait);
1579    fprintf_conf(f, CONFVARWIDTH, "netprio", "%ld\n", cfg->netprio);
1580    fprintf_conf(f, CONFVARWIDTH, "resolvedelay", "%d\n", cfg->resolvedelay);
1581    if (cfg->tosleep) fprintf_conf(f, CONFVARWIDTH, "sleep", "%d\n", cfg->tosleep);
1582    fprintf_conf(f, CONFVARWIDTH, "unlockparental", "%d\n", cfg->ulparent);
1583    fprintf_conf(f, CONFVARWIDTH, "nice", "%d\n", cfg->nice);
1584    fprintf_conf(f, CONFVARWIDTH, "serialreadertimeout", "%d\n", cfg->srtimeout);
1585    fprintf_conf(f, CONFVARWIDTH, "maxlogsize", "%d\n", cfg->max_log_size);
1586    fprintf_conf(f, CONFVARWIDTH, "waitforcards", "%d\n", cfg->waitforcards);
1587    fprintf_conf(f, CONFVARWIDTH, "preferlocalcards", "%d\n", cfg->preferlocalcards);
1588    fputc((int)'\n', f);
1589
1590    /*monitor settings*/
1591    fprintf(f,"[monitor]\n");
1592    fprintf_conf(f, CONFVARWIDTH, "port", "%d\n", cfg->mon_port);
1593    if (cfg->mon_srvip != 0)
1594        fprintf_conf(f, CONFVARWIDTH, "serverip", "%s\n", inet_ntoa(*(struct in_addr *)&cfg->mon_srvip));
1595
1596    fprintf_conf(f, CONFVARWIDTH, "nocrypt", "");
1597    struct s_ip *cip;
1598    for (cip = cfg->mon_allowed; cip; cip = cip->next){
1599        fprintf(f,"%s%s", dot, cs_inet_ntoa(cip->ip[0]));
1600    if (cip->ip[0] != cip->ip[1])   fprintf(f,"-%s", cs_inet_ntoa(cip->ip[1]));
1601    dot=",";
1602    }
1603    fputc((int)'\n', f);
1604    fprintf_conf(f, CONFVARWIDTH, "aulow", "%d\n", cfg->mon_aulow);
1605    fprintf_conf(f, CONFVARWIDTH, "hideclient_to", "%d\n", cfg->mon_hideclient_to);
1606    fprintf_conf(f, CONFVARWIDTH, "monlevel", "%d\n", cfg->mon_level);
1607    fprintf_conf(f, CONFVARWIDTH, "appendchaninfo", "%d\n", cfg->mon_appendchaninfo);
1608    fputc((int)'\n', f);
1609
1610    /*newcamd*/
1611    if ((cfg->ncd_ptab.nports > 0) && (cfg->ncd_ptab.ports[0].s_port > 0)){
1612        fprintf(f,"[newcamd]\n");
1613        fprintf_conf(f, CONFVARWIDTH, "port", "");
1614        dot1 = "";
1615        for(i = 0; i < cfg->ncd_ptab.nports; ++i){
1616            fprintf(f,"%s%d@%04X", dot1, cfg->ncd_ptab.ports[i].s_port, cfg->ncd_ptab.ports[i].ftab.filts[0].caid);
1617            if (cfg->ncd_ptab.ports[i].ftab.filts[0].nprids > 0){
1618                fprintf(f,":");
1619                dot2 = "";
1620                for (j = 0; j < cfg->ncd_ptab.ports[i].ftab.filts[0].nprids; ++j){
1621                    fprintf(f,"%s%06X", dot2, (int)cfg->ncd_ptab.ports[i].ftab.filts[0].prids[j]);
1622                    dot2 = ",";
1623                }
1624            }
1625            dot1=";";
1626        }
1627
1628        fputc((int)'\n', f);
1629        if (cfg->ncd_srvip != 0)
1630            fprintf_conf(f, CONFVARWIDTH, "serverip", "%s\n", inet_ntoa(*(struct in_addr *)&cfg->ncd_srvip));
1631        fprintf_conf(f, CONFVARWIDTH, "key", "");
1632        for (i=0;i<14;i++) fprintf(f,"%02X", cfg->ncd_key[i]);
1633        fprintf(f,"\n");
1634        fprintf_conf(f, CONFVARWIDTH, "allowed", "");
1635        struct s_ip *cip;
1636        dot="";
1637        for (cip = cfg->ncd_allowed; cip; cip = cip->next){
1638            fprintf(f,"%s%s", dot, cs_inet_ntoa(cip->ip[0]));
1639            if (cip->ip[0] != cip->ip[1])   fprintf(f,"-%s", cs_inet_ntoa(cip->ip[1]));
1640            dot=",";
1641        }
1642        fprintf(f,"\n");
1643        fprintf_conf(f, CONFVARWIDTH, "keepalive", "%d\n", cfg->ncd_keepalive);
1644        fprintf(f,"\n");
1645    }
1646
1647    /*camd3.3*/
1648    if ( cfg->c33_port > 0) {
1649        fprintf(f,"[camd33]\n");
1650        fprintf_conf(f, CONFVARWIDTH, "port", "%d\n", cfg->c33_port);
1651        if (cfg->c33_srvip != 0)
1652            fprintf_conf(f, CONFVARWIDTH, "serverip", "%s\n", inet_ntoa(*(struct in_addr *)&cfg->c33_srvip));
1653        fprintf_conf(f, CONFVARWIDTH, "passive", "%d\n", cfg->c33_passive);
1654        fprintf_conf(f, CONFVARWIDTH, "key", ""); for (i = 0; i < (int) sizeof(cfg->c33_key); ++i) fprintf(f,"%02X", cfg->c33_key[i]); fputc((int)'\n', f);
1655        fprintf_conf(f, CONFVARWIDTH, "nocrypt", "");
1656        dot="";
1657        for (cip = cfg->c33_plain; cip; cip = cip->next){
1658            fprintf(f,"%s%s", dot, cs_inet_ntoa(cip->ip[0]));
1659            if (cip->ip[0] != cip->ip[1])   fprintf(f,"-%s", cs_inet_ntoa(cip->ip[1]));
1660            dot=",";
1661      }
1662        fprintf(f,"\n\n");
1663    }
1664
1665    /*camd3.5*/
1666    if ( cfg->c35_port > 0) {
1667        fprintf(f,"[cs357x]\n");
1668        fprintf_conf(f, CONFVARWIDTH, "port", "%d\n", cfg->c35_port);
1669        if (cfg->c35_tcp_srvip != 0)
1670            fprintf_conf(f, CONFVARWIDTH, "serverip", "%s\n", inet_ntoa(*(struct in_addr *)&cfg->c35_tcp_srvip));
1671        if (cfg->c35_suppresscmd08)
1672            fprintf_conf(f, CONFVARWIDTH, "suppresscmd08", "%d\n", cfg->c35_suppresscmd08);
1673        fprintf(f,"\n");
1674    }
1675
1676    /*camd3.5 TCP*/
1677    if ((cfg->c35_tcp_ptab.nports > 0) && (cfg->c35_tcp_ptab.ports[0].s_port > 0)) {
1678        fprintf(f,"[cs378x]\n");
1679        fprintf_conf(f, CONFVARWIDTH, "port", "");
1680        dot1 = "";
1681        for(i = 0; i < cfg->c35_tcp_ptab.nports; ++i){
1682            fprintf(f,"%s%d@%04X", dot1, cfg->c35_tcp_ptab.ports[i].s_port, cfg->c35_tcp_ptab.ports[i].ftab.filts[0].caid);
1683            if (cfg->c35_tcp_ptab.ports[i].ftab.filts[0].nprids > 0){
1684                fprintf(f,":");
1685                dot2 = "";
1686                for (j = 0; j < cfg->c35_tcp_ptab.ports[i].ftab.filts[0].nprids; ++j){
1687                    fprintf(f,"%s%lX", dot2, cfg->c35_tcp_ptab.ports[i].ftab.filts[0].prids[j]);
1688                    dot2 = ",";
1689                }
1690            }
1691            dot1=";";
1692        }
1693
1694        fputc((int)'\n', f);
1695        if (cfg->c35_tcp_srvip != 0)
1696            fprintf_conf(f, CONFVARWIDTH, "serverip", "%s\n", inet_ntoa(*(struct in_addr *)&cfg->c35_tcp_srvip));
1697        fputc((int)'\n', f);
1698    }
1699
1700    /*Radegast*/
1701    if ( cfg->rad_port > 0) {
1702        fprintf(f,"[radegast]\n");
1703        fprintf_conf(f, CONFVARWIDTH, "port", "%d\n", cfg->rad_port);
1704        if (cfg->rad_srvip != 0)
1705            fprintf_conf(f, CONFVARWIDTH, "serverip", "%s\n", inet_ntoa(*(struct in_addr *)&cfg->rad_srvip));
1706        fprintf_conf(f, CONFVARWIDTH, "user", "%s\n", cfg->rad_usr);
1707        fprintf_conf(f, CONFVARWIDTH, "allowed", "");
1708        struct s_ip *cip;
1709        for (cip = cfg->rad_allowed; cip; cip = cip->next){
1710            fprintf(f,"%s%s", dot, inet_ntoa(*(struct in_addr *)&cip->ip[0]));
1711            if (cip->ip[0] == cip->ip[1])   fprintf(f,"-%s", inet_ntoa(*(struct in_addr *)&cip->ip[1]));
1712            dot=",";
1713        }
1714        fprintf(f,"\n\n");
1715    }
1716
1717#ifdef CS_WITH_GBOX
1718    /*Gbox*/
1719    if ((cfg->gbox_pwd[0] > 0) || (cfg->gbox_pwd[1] > 0) || (cfg->gbox_pwd[2] > 0) || (cfg->gbox_pwd[3] > 0)){
1720        fprintf(f,"[gbox]\n");
1721        fprintf_conf(f, CONFVARWIDTH, "password", ""); for (i=0;i<4;i++) fprintf(f,"%02X", cfg->gbox_pwd[i]); fputc((int)'\n', f);;
1722        fprintf_conf(f, CONFVARWIDTH, "maxdist", "%d\n", cfg->maxdist);
1723        fprintf_conf(f, CONFVARWIDTH, "ignorelist", "%s\n", cfg->ignorefile);
1724        fprintf_conf(f, CONFVARWIDTH, "onlineinfos", "%s\n", cfg->gbxShareOnl);
1725        fprintf_conf(f, CONFVARWIDTH, "cardinfos", "%s\n", cfg->cardfile);
1726        fprintf_conf(f, CONFVARWIDTH, "locals", "");
1727        char *dot = "";
1728        for (i = 0; i < cfg->num_locals; i++){
1729            fprintf(f,"%s%06lX", dot, cfg->locals[i]);
1730            dot=";";
1731        }
1732        fprintf(f,"\n\n");
1733    }
1734#endif
1735
1736    /*serial*/
1737
1738
1739    /*cccam*/
1740    if ( cfg->cc_port > 0) {
1741        fprintf(f,"[cccam]\n");
1742        fprintf_conf(f, CONFVARWIDTH, "port", "%d\n", cfg->cc_port);
1743        fprintf_conf(f, CONFVARWIDTH, "reshare", "%d\n", cfg->cc_reshare);
1744        fprintf_conf(f, CONFVARWIDTH, "version", "%s\n", cfg->cc_version);
1745        fprintf_conf(f, CONFVARWIDTH, "build", "%s\n", cfg->cc_build);
1746        fprintf(f,"\n");
1747    }
1748
1749#ifdef HAVE_DVBAPI
1750    /*dvb-api*/
1751    if (cfg->dvbapi_enabled > 0) {
1752        fprintf(f,"[dvbapi]\n");
1753        fprintf_conf(f, CONFVARWIDTH, "enabled", "%d\n", cfg->dvbapi_enabled);
1754        fprintf_conf(f, CONFVARWIDTH, "au", "%d\n", cfg->dvbapi_au);
1755        fprintf_conf(f, CONFVARWIDTH, "boxtype", "%s\n", cfg->dvbapi_boxtype);
1756        fprintf_conf(f, CONFVARWIDTH, "user", "%s\n", cfg->dvbapi_usr);
1757        fputc((int)'\n', f);
1758    }
1759#endif
1760
1761#ifdef WEBIF
1762    /*webinterface*/
1763    if (cfg->http_port > 0) {
1764        fprintf(f,"[webif]\n");
1765        fprintf_conf(f, CONFVARWIDTH, "httpport", "%d\n", cfg->http_port);
1766        fprintf_conf(f, CONFVARWIDTH, "httpuser", "%s\n", cfg->http_user);
1767        fprintf_conf(f, CONFVARWIDTH, "httppwd", "%s\n", cfg->http_pwd);
1768        fprintf_conf(f, CONFVARWIDTH, "httpcss", "%s\n", cfg->http_css);
1769        fprintf_conf(f, CONFVARWIDTH, "httptpl", "%s\n", cfg->http_tpl);
1770        fprintf_conf(f, CONFVARWIDTH, "httpscript", "%s\n", cfg->http_script);
1771        fprintf_conf(f, CONFVARWIDTH, "httprefresh", "%d\n", cfg->http_refresh);
1772        fprintf_conf(f, CONFVARWIDTH, "httpallowed", "");
1773        dot = "";
1774        for (cip = cfg->http_allowed; cip; cip = cip->next){
1775            fprintf(f,"%s%s", dot, cs_inet_ntoa(cip->ip[0]));
1776        if (cip->ip[0] != cip->ip[1])   fprintf(f,"-%s", cs_inet_ntoa(cip->ip[1]));
1777        dot = ",";
1778        }
1779        fputc((int)'\n', f);
1780        fprintf_conf(f, CONFVARWIDTH, "httpdyndns", "%s\n", cfg->http_dyndns);
1781        fprintf_conf(f, CONFVARWIDTH, "httphideidleclients", "%d\n", cfg->http_hide_idle_clients);
1782        fprintf_conf(f, CONFVARWIDTH, "httpreadonly", "%d\n", cfg->http_readonly);
1783        fputc((int)'\n', f);
1784    }
1785#endif
1786
1787#ifdef CS_ANTICASC
1788    fprintf(f,"[anticasc]\n");
1789    fprintf_conf(f, CONFVARWIDTH, "enabled", "%d\n", cfg->ac_enabled);
1790    fprintf_conf(f, CONFVARWIDTH, "numusers", "%d\n", cfg->ac_users);
1791    fprintf_conf(f, CONFVARWIDTH, "sampletime", "%d\n", cfg->ac_stime);
1792    fprintf_conf(f, CONFVARWIDTH, "samples", "%d\n", cfg->ac_samples);
1793    fprintf_conf(f, CONFVARWIDTH, "penalty", "%d\n", cfg->ac_penalty);
1794    fprintf_conf(f, CONFVARWIDTH, "aclogfile", "%s\n", cfg->ac_logfile);
1795    fprintf_conf(f, CONFVARWIDTH, "denysamples", "%d\n", cfg->ac_denysamples);
1796    fprintf_conf(f, CONFVARWIDTH, "fakedelay", "%d\n", cfg->ac_fakedelay);
1797    fputc((int)'\n', f);
1798#endif
1799
1800    fclose(f);
1801
1802    return(safe_overwrite_with_bak(destfile, tmpfile, bakfile, 0));
1803}
1804
1805int write_userdb()
1806{
1807    int i;
1808    FILE *f;
1809    struct s_auth *account;
1810    char *dot = ""; //flag for comma
1811    char tmpfile[256];
1812    char destfile[256];
1813    char bakfile[256];
1814
1815    snprintf(destfile, 255,"%s%s", cs_confdir, cs_user);
1816    snprintf(tmpfile, 255, "%s%s.tmp", cs_confdir, cs_user);
1817    snprintf(bakfile, 255,"%s%s.bak", cs_confdir, cs_user);
1818
1819  if (!(f=fopen(tmpfile, "w"))){
1820    cs_log("Cannot open file \"%s\" (errno=%d)", tmpfile, errno);
1821    return(1);
1822  }
1823  fprintf(f,"#oscam.user generated automatically\n\n");
1824
1825  //each account
1826    for (account=cfg->account; (account) ; account=account->next){
1827        fprintf(f,"[account]\n");
1828        fprintf_conf(f, CONFVARWIDTH, "user", "%s\n", account->usr);
1829        fprintf_conf(f, CONFVARWIDTH, "pwd", "%s\n", account->pwd);
1830        fprintf_conf(f, CONFVARWIDTH, "disabled", "%d\n", account->disabled);
1831        struct tm * timeinfo = localtime (&account->expirationdate);
1832        char buf [80];
1833        strftime (buf,80,"%Y-%m-%d",timeinfo);
1834        if(strcmp(buf,"1970-01-01"))
1835            fprintf_conf(f, CONFVARWIDTH, "expdate", "%s\n", buf);
1836        else
1837            fprintf_conf(f, CONFVARWIDTH, "expdate", "\n");
1838
1839        //group
1840        char *value = mk_t_group((ulong*)account->grp);
1841        fprintf_conf(f, CONFVARWIDTH, "group", "%s\n", value);
1842        free(value);
1843
1844        fprintf_conf(f, CONFVARWIDTH, "hostname", "%s\n", account->dyndns);
1845        fprintf_conf(f, CONFVARWIDTH, "uniq", "%d\n", account->uniq);
1846        fprintf_conf(f, CONFVARWIDTH, "sleep", "%d\n", account->tosleep);
1847        fprintf_conf(f, CONFVARWIDTH, "monlevel", "%d\n", account->monlvl);
1848
1849        if (account->au > -1)
1850            if (account->au < CS_MAXREADER)
1851                fprintf_conf(f, CONFVARWIDTH, "au", "%s\n", reader[account->au].label);
1852        if (account->autoau == 1) fprintf_conf(f, CONFVARWIDTH, "au", "1\n");
1853
1854        fprintf_conf(f, CONFVARWIDTH, "services", "");
1855        char sidok[33]; long2bitchar(account->sidtabok,sidok);
1856        char sidno[33]; long2bitchar(account->sidtabno,sidno);
1857        struct s_sidtab *sidtab = cfg->sidtab;
1858        i=0; dot = "";
1859        for (; sidtab; sidtab=sidtab->next){
1860            if(sidok[i]=='1')   {fprintf(f,"%s%s", dot, sidtab->label); dot = ",";}
1861            if(sidno[i]=='1') {fprintf(f,"%s!%s", dot, sidtab->label); dot = ",";}
1862            i++;
1863        }
1864        fputc((int)'\n', f);
1865
1866        //CAID
1867        value = mk_t_caidtab(&account->ctab);
1868        fprintf_conf(f, CONFVARWIDTH, "caid", "%s\n", value);
1869        free(value);
1870
1871        //betatunnel
1872        value = mk_t_tuntab(&account->ttab);
1873        fprintf_conf(f, CONFVARWIDTH, "betatunnel", "%s\n", value);
1874        free(value);
1875
1876        //ident
1877        value = mk_t_ftab(&account->ftab);
1878        fprintf_conf(f, CONFVARWIDTH, "ident", "%s\n", value);
1879        free(value);
1880
1881        if (account->c35_suppresscmd08)
1882            fprintf_conf(f, CONFVARWIDTH, "suppresscmd08", "%d\n", account->c35_suppresscmd08);
1883
1884        fprintf_conf(f, CONFVARWIDTH, "keepalive", "%d\n", account->ncd_keepalive);
1885
1886#ifdef CS_ANTICASC
1887        fprintf_conf(f, CONFVARWIDTH, "numusers", "%d\n", account->ac_users);
1888        fprintf_conf(f, CONFVARWIDTH, "penalty", "%d\n", account->ac_penalty);
1889#endif
1890        fputc((int)'\n', f);
1891    }
1892  fclose(f);
1893
1894  return(safe_overwrite_with_bak(destfile, tmpfile, bakfile, 0));
1895}
1896
1897int init_userdb()
1898{
1899    int tag = 0, nr, nro, expired, disabled;
1900    //int first=1;
1901    FILE *fp;
1902    char *value;
1903    struct s_auth *ptr;
1904    /*static */struct s_auth *account=(struct s_auth *)0;
1905
1906    sprintf(token, "%s%s", cs_confdir, cs_user);
1907    if (!(fp = fopen(token, "r"))) {
1908        cs_log("Cannot open file \"%s\" (errno=%d)", token, errno);
1909        return(1);
1910    }
1911
1912    for (nro = 0, ptr = cfg->account; ptr; nro++) {
1913        struct s_auth *ptr_next;
1914        ptr_next = ptr->next;
1915        free(ptr);
1916        ptr = ptr_next;
1917    }
1918    nr = 0;
1919
1920    while (fgets(token, sizeof(token), fp)) {
1921        int i, l;
1922        void *ptr;
1923
1924        if ((l=strlen(trim(token))) < 3)
1925            continue;
1926
1927        if ((token[0] == '[') && (token[l-1] == ']')) {
1928            token[l - 1] = 0;
1929            tag = (!strcmp("account", strtolower(token + 1)));
1930
1931            if (!(ptr=malloc(sizeof(struct s_auth)))) {
1932                cs_log("Error allocating memory (errno=%d)", errno);
1933                return(1);
1934            }
1935
1936            if (account)
1937                account->next = ptr;
1938            else
1939                cfg->account = ptr;
1940
1941            account = ptr;
1942            memset(account, 0, sizeof(struct s_auth));
1943            account->au = (-1);
1944            account->monlvl = cfg->mon_level;
1945            account->tosleep = cfg->tosleep;
1946            account->c35_suppresscmd08 = cfg->c35_suppresscmd08;
1947            account->ncd_keepalive = cfg->ncd_keepalive;
1948            for (i = 1; i < CS_MAXCAIDTAB; account->ctab.mask[i++] = 0xffff);
1949            for (i = 1; i < CS_MAXTUNTAB; account->ttab.bt_srvid[i++] = 0x0000);
1950            nr++;
1951
1952#ifdef CS_ANTICASC
1953            account->ac_users = cfg->ac_users;
1954            account->ac_penalty = cfg->ac_penalty;
1955            account->ac_idx = nr;
1956#endif
1957            continue;
1958        }
1959
1960        if (!tag)
1961            continue;
1962
1963        if (!(value=strchr(token, '=')))
1964            continue;
1965
1966        *value++ = '\0';
1967        chk_account(trim(strtolower(token)), trim(value), account);
1968    }
1969
1970    fclose(fp);
1971
1972    for (expired = 0, disabled = 0, ptr = cfg->account; ptr;) {
1973
1974        if(ptr->expirationdate && ptr->expirationdate < time(NULL))
1975            expired++;
1976
1977        if(ptr->disabled != 0)
1978            disabled++;
1979
1980        ptr = ptr->next;
1981    }
1982
1983    cs_log("userdb reloaded: %d accounts freed, %d accounts loaded, %d expired, %d disabled", nro, nr, expired, disabled);
1984    return(0);
1985}
1986
1987static void chk_entry4sidtab(char *value, struct s_sidtab *sidtab, int what)
1988{
1989  int i, b;
1990  char *ptr;
1991  ushort *slist=(ushort *) 0;
1992  ulong *llist=(ulong *) 0;
1993  ulong caid;
1994  char buf[strlen(value) + 1];
1995  cs_strncpy(buf, value, sizeof(buf));
1996  b=(what==1) ? sizeof(ulong) : sizeof(ushort);
1997  for (i=0, ptr=strtok(value, ","); ptr; ptr=strtok(NULL, ","))
1998  {
1999    caid=a2i(ptr, b);
2000    if (!errno) i++;
2001  }
2002  //if (!i) return(0);
2003  if (b==sizeof(ushort))
2004    slist=malloc(i*sizeof(ushort));
2005  else
2006    llist=malloc(i*sizeof(ulong));
2007  strcpy(value, buf);
2008  for (i=0, ptr=strtok(value, ","); ptr; ptr=strtok(NULL, ","))
2009  {
2010    caid=a2i(ptr, b);
2011    if (errno) continue;
2012    if (b==sizeof(ushort))
2013      slist[i++]=(ushort) caid;
2014    else
2015      llist[i++]=caid;
2016  }
2017  switch (what)
2018  {
2019    case 0: sidtab->caid=slist;
2020            sidtab->num_caid=i;
2021            break;
2022    case 1: sidtab->provid=llist;
2023            sidtab->num_provid=i;
2024            break;
2025    case 2: sidtab->srvid=slist;
2026            sidtab->num_srvid=i;
2027            break;
2028  }
2029}
2030
2031void chk_sidtab(char *token, char *value, struct s_sidtab *sidtab)
2032{
2033  if (!strcmp(token, "caid")) { chk_entry4sidtab(value, sidtab, 0); return; }
2034  if (!strcmp(token, "provid")) { chk_entry4sidtab(value, sidtab, 1); return; }
2035  if (!strcmp(token, "ident")) { chk_entry4sidtab(value, sidtab, 1); return; }
2036  if (!strcmp(token, "srvid")) { chk_entry4sidtab(value, sidtab, 2); return; }
2037  if (token[0] != '#')
2038    fprintf(stderr, "Warning: keyword '%s' in sidtab section not recognized\n",token);
2039}
2040
2041int init_sidtab()
2042{
2043  int nr, nro;
2044  FILE *fp;
2045  char *value;
2046  struct s_sidtab *ptr;
2047  struct s_sidtab *sidtab=(struct s_sidtab *)0;
2048
2049  sprintf(token, "%s%s", cs_confdir, cs_sidt);
2050  if (!(fp=fopen(token, "r")))
2051  {
2052    cs_log("Cannot open file \"%s\" (errno=%d)", token, errno);
2053    return(1);
2054  }
2055  for (nro=0, ptr=cfg->sidtab; ptr; nro++)
2056  {
2057    struct s_sidtab *ptr_next;
2058    ptr_next=ptr->next;
2059    if (ptr->caid) free(ptr->caid);
2060    if (ptr->provid) free(ptr->provid);
2061    if (ptr->srvid) free(ptr->srvid);
2062    free(ptr);
2063    ptr=ptr_next;
2064  }
2065  nr=0;
2066  while (fgets(token, sizeof(token), fp))
2067  {
2068    int l;
2069    void *ptr;
2070    if ((l=strlen(trim(token)))<3) continue;
2071    if ((token[0]=='[') && (token[l-1]==']'))
2072    {
2073      token[l-1]=0;
2074      if (!(ptr=malloc(sizeof(struct s_sidtab))))
2075      {
2076        cs_log("Error allocating memory (errno=%d)", errno);
2077        return(1);
2078      }
2079      if (sidtab)
2080        sidtab->next=ptr;
2081      else
2082        cfg->sidtab=ptr;
2083      sidtab=ptr;
2084      nr++;
2085      memset(sidtab, 0, sizeof(struct s_sidtab));
2086      cs_strncpy(sidtab->label, strtolower(token+1), sizeof(sidtab->label));
2087      continue;
2088    }
2089    if (!sidtab) continue;
2090    if (!(value=strchr(token, '='))) continue;
2091    *value++='\0';
2092    chk_sidtab(trim(strtolower(token)), trim(strtolower(value)), sidtab);
2093  }
2094  fclose(fp);
2095
2096#ifdef DEBUG_SIDTAB
2097  show_sidtab(cfg->sidtab);
2098#endif
2099  cs_log("services reloaded: %d services freed, %d services loaded", nro, nr);
2100  return(0);
2101}
2102
2103int init_srvid()
2104{
2105  int nr;
2106  FILE *fp;
2107  char *payload;
2108  static struct s_srvid *srvid=(struct s_srvid *)0;
2109  sprintf(token, "%s%s", cs_confdir, cs_srid);
2110
2111  if (!(fp=fopen(token, "r"))) {
2112    cs_log("can't open file \"%s\" (err=%d), no service-id's loaded", token, errno);
2113    return(0);
2114  }
2115
2116  nr=0;
2117  while (fgets(token, sizeof(token), fp)) {
2118
2119        int l;
2120        void *ptr;
2121                char *tmp;
2122                tmp = trim(token);
2123
2124                if (tmp[0] == '#') continue;
2125                if ((l=strlen(tmp)) < 6) continue;
2126        if (!(payload=strchr(token, '|'))) continue;
2127        *payload++ = '\0';
2128
2129        if (!(ptr = malloc(sizeof(struct s_srvid)))) {
2130      cs_log("Error allocating memory (errno=%d)", errno);
2131      return(1);
2132    }
2133
2134    if (srvid)
2135      srvid->next = ptr;
2136    else
2137      cfg->srvid = ptr;
2138
2139    srvid = ptr;
2140    memset(srvid, 0, sizeof(struct s_srvid));
2141
2142    int i;
2143    char *ptr1;
2144    for (i = 0, ptr1 = strtok(payload, "|"); ptr1; ptr1 = strtok(NULL, "|"), i++){
2145            switch(i){
2146                case 0:
2147                    cs_strncpy(srvid->prov, trim(ptr1), sizeof(srvid->prov));
2148                    break;
2149                case 1:
2150                    cs_strncpy(srvid->name, trim(ptr1), sizeof(srvid->name));
2151                    break;
2152                case 2:
2153                    cs_strncpy(srvid->type, trim(ptr1), sizeof(srvid->type));
2154                    break;
2155                case 3:
2156                    cs_strncpy(srvid->desc, trim(ptr1), sizeof(srvid->desc));
2157                    break;
2158            }
2159        }
2160
2161    char *srvidasc = strchr(token, ':');
2162    *srvidasc++ = '\0';
2163    srvid->srvid = word_atob(srvidasc);
2164
2165    srvid->ncaid = 0;
2166        for (i = 0, ptr1 = strtok(token, ","); (ptr1) && (i < 10) ; ptr1 = strtok(NULL, ","), i++){
2167            srvid->caid[i] = word_atob(ptr1);
2168            srvid->ncaid = i+1;
2169            //cs_debug("ld caid: %04X srvid: %04X Prov: %s Chan: %s",srvid->caid[i],srvid->srvid,srvid->prov,srvid->name);
2170        }
2171        nr++;
2172    }
2173
2174  fclose(fp);
2175  if (nr>0)
2176        cs_log("%d service-id's loaded", nr);
2177    else{
2178        cs_log("oscam.srvid loading failed, old format");
2179    }
2180  return(0);
2181}
2182
2183static void chk_reader(char *token, char *value, struct s_reader *rdr)
2184{
2185    int i;
2186    char *ptr;
2187    /*
2188     *  case sensitive first
2189     */
2190    if (!strcmp(token, "device")) {
2191        for (i = 0, ptr = strtok(value, ","); (i < 3) && (ptr); ptr = strtok(NULL, ","), i++) {
2192            trim(ptr);
2193            switch(i) {
2194                case 0:
2195                    cs_strncpy(rdr->device, ptr, sizeof(rdr->device));
2196                    break;
2197
2198                case 1:
2199                    rdr->r_port = atoi(ptr);
2200                    break;
2201
2202                case 2:
2203                    rdr->l_port = atoi(ptr);
2204                    break;
2205            }
2206        }
2207        return;
2208    }
2209
2210    if (!strcmp(token, "key")) {
2211        if (key_atob14(value, rdr->ncd_key)) {
2212            fprintf(stderr, "Configuration newcamd: Error in Key\n");
2213            exit(1);
2214        }
2215        return;
2216    }
2217
2218#ifdef CS_WITH_GBOX
2219    if (!strcmp(token, "password")) {
2220        cs_strncpy((char *)rdr->gbox_pwd, (const char *)i2b(4, a2i(value, 4)), 4); 
2221        return;
2222    }
2223
2224    if (!strcmp(token, "premium")) {
2225        rdr->gbox_prem = 1;
2226        return;
2227    }
2228#endif
2229    if (!strcmp(token, "account")) {
2230        for (i = 0, ptr = strtok(value, ","); (i < 2) && (ptr); ptr = strtok(NULL, ","), i++) {
2231            trim(ptr);
2232            switch(i) {
2233                case 0:
2234                    cs_strncpy(rdr->r_usr, ptr, sizeof(rdr->r_usr));
2235                    break;
2236
2237                case 1:
2238                    cs_strncpy(rdr->r_pwd, ptr, sizeof(rdr->r_pwd));
2239                    break;
2240            }
2241        }
2242        return;
2243    }
2244
2245    if (!strcmp(token, "pincode")) {
2246        strncpy(rdr->pincode, value, sizeof(rdr->pincode) - 1);
2247        return;
2248    }
2249
2250    if (!strcmp(token, "readnano") && value[0]) {
2251        if (rdr->emmfile != NULL) {
2252            free(rdr->emmfile);
2253            rdr->emmfile = NULL;
2254        }
2255        if (strlen(value) > 0)
2256            asprintf(&(rdr->emmfile), "%s", value);
2257        return;
2258    }
2259
2260    /*
2261     *  case insensitive
2262    */
2263    strtolower(value);
2264
2265    if (!strcmp(token, "enable")) {
2266        if(strlen(value) == 0) {
2267            rdr->enable = 0;
2268            return;
2269        } else {
2270            rdr->enable = atoi(value) ? 1 : 0;
2271            return;
2272        }
2273    }
2274
2275    if (!strcmp(token, "services")) {
2276        if(strlen(value) == 0) {
2277            rdr->sidtabok = 0;
2278            rdr->sidtabno = 0;
2279            return;
2280        } else {
2281            chk_services(value, &rdr->sidtabok, &rdr->sidtabno);
2282            return;
2283        }
2284    }
2285
2286    if (!strcmp(token, "inactivitytimeout")) {
2287        if(strlen(value) == 0) {
2288            rdr->tcp_ito = 0;
2289            return;
2290        } else {
2291            rdr->tcp_ito = atoi(value);
2292            return;
2293        }
2294    }
2295
2296    if (!strcmp(token, "reconnecttimeout")) {
2297        if(strlen(value) == 0) {
2298            rdr->tcp_rto = 0;
2299            return;
2300        } else {
2301            rdr->tcp_rto = atoi(value);
2302            return;
2303        }
2304    }
2305
2306    if (!strcmp(token, "disableserverfilter")) {
2307        if(strlen(value) == 0) {
2308            rdr->ncd_disable_server_filt = 0;
2309            return;
2310        } else {
2311            rdr->ncd_disable_server_filt = atoi(value);
2312            return;
2313        }
2314    }
2315
2316    //FIXME workaround for Smargo until native mode works
2317    if (!strcmp(token, "smargopatch")) {
2318        if(strlen(value) == 0) {
2319            rdr->smargopatch = 0;
2320            return;
2321        } else {
2322            rdr->smargopatch = atoi(value);
2323            return;
2324        }
2325    }
2326
2327    if (!strcmp(token, "label")) {
2328        cs_strncpy(rdr->label, value, sizeof(rdr->label));
2329        return;
2330    }
2331
2332    if (!strcmp(token, "fallback")) {
2333        if(strlen(value) == 0) {
2334            rdr->fallback = 0;
2335            return;
2336        } else {
2337            rdr->fallback = atoi(value) ? 1 : 0;
2338            return;
2339        }
2340    }
2341
2342    if (!strcmp(token, "logport")) {
2343        if(strlen(value) == 0) {
2344            rdr->log_port = 0;
2345            return;
2346        } else {
2347            rdr->log_port = atoi(value);
2348            return;
2349        }
2350    }
2351
2352    if (!strcmp(token, "caid")) {
2353        if(strlen(value) == 0) {
2354            clear_caidtab(&rdr->ctab);
2355            return;
2356        } else {
2357            chk_caidtab(value, &rdr->ctab);
2358            return;
2359        }
2360    }
2361
2362    if (!strcmp(token, "boxid")) {
2363        if(strlen(value) == 0) {
2364            rdr->boxid = 0;
2365            return;
2366        } else {
2367            rdr->boxid = a2i(value, 4);
2368            return;
2369        }
2370    }
2371
2372    if (!strcmp(token, "aeskey")) {
2373        if (key_atob(value, rdr->aes_key)) {
2374            fprintf(stderr, "Configuration reader: Error in AES Key\n");
2375            exit(1);
2376        }
2377        return;
2378    }
2379
2380    if ((!strcmp(token, "n3_rsakey")) || (!strcmp(token, "rsakey"))) {
2381        rdr->has_rsa = 1;
2382        if (key_atob_l(value, rdr->rsa_mod, 128)) {
2383            fprintf(stderr, "Configuration reader: Error in rsakey\n");
2384            exit(1);
2385        }
2386        return;
2387    }
2388
2389    if (!strcmp(token, "tiger_rsakey")) {
2390        if (key_atob_l(value, rdr->rsa_mod, 240)) {
2391            fprintf(stderr, "Configuration reader: Error in tiger_rsakey\n");
2392            exit(1);
2393        }
2394        return;
2395    }
2396
2397    if ((!strcmp(token, "n3_boxkey")) || (!strcmp(token, "boxkey"))) {
2398        if (key_atob_l(value, rdr->nagra_boxkey, 16)) {
2399            fprintf(stderr, "Configuration reader: Error in boxkey\n");
2400            exit(1);
2401        }
2402        return;
2403    }
2404
2405    if (!strcmp(token, "detect")) {
2406        for (i = 0; RDR_CD_TXT[i]; i++) {
2407            if (!strcmp(value, RDR_CD_TXT[i])) {
2408                rdr->detect = i;
2409            }
2410            else {
2411                if ((value[0] == '!') && (!strcmp(value+1, RDR_CD_TXT[i])))
2412                    rdr->detect = i|0x80;
2413            }
2414        }
2415        return;
2416    }
2417
2418    if (!strcmp(token, "mhz")) {
2419        if(strlen(value) == 0) {
2420            rdr->mhz = 0;
2421            return;
2422        } else {
2423            rdr->mhz = atoi(value);
2424            return;
2425        }
2426    }
2427
2428    if (!strcmp(token, "cardmhz")) {
2429        if(strlen(value) == 0) {
2430            rdr->cardmhz = 0;
2431            return;
2432        } else {
2433            rdr->cardmhz = atoi(value);
2434            return;
2435        }
2436    }
2437
2438    if (!strcmp(token, "protocol")) {
2439
2440        if (!strcmp(value, "mouse")) {
2441            rdr->typ = R_MOUSE;
2442            return;
2443        }
2444
2445        if (!strcmp(value, "smartreader")) {
2446            rdr->typ = R_SMART;
2447            return;
2448        }
2449
2450        if (!strcmp(value, "internal")) {
2451            rdr->typ = R_INTERNAL;
2452            return;
2453        }
2454
2455#ifdef HAVE_PCSC
2456        if (!strcmp(value, "pcsc")) {
2457            rdr->typ = R_PCSC;
2458            return;
2459        }
2460#endif
2461
2462        if (!strcmp(value, "serial")) {
2463            rdr->typ = R_SERIAL;
2464            return;
2465        }
2466
2467        if (!strcmp(value, "camd35")) {
2468            rdr->typ = R_CAMD35;
2469            return;
2470        }
2471
2472        if (!strcmp(value, "cs378x")) {
2473            rdr->typ = R_CS378X;
2474            return;
2475        }
2476
2477        if (!strcmp(value, "cs357x")) {
2478            rdr->typ = R_CAMD35;
2479            return;
2480        }
2481
2482#ifdef CS_WITH_GBOX
2483        if (!strcmp(value, "gbox")) {
2484            rdr->typ = R_GBOX;
2485            return;
2486        }
2487#endif
2488
2489        if (!strcmp(value, "cccam")) {
2490            rdr->typ = R_CCCAM;
2491            //strcpy(value, "1");
2492            //chk_caidtab(value, &rdr->ctab);
2493            //this is a MAJOR hack for auto multiple caid support (not currently working due to ncd table issue)
2494            return;
2495        }
2496
2497        if (!strcmp(value, "radegast")) {
2498            rdr->typ = R_RADEGAST;
2499            return;
2500        }
2501
2502        if (!strcmp(value, "newcamd") || !strcmp(value, "newcamd525")) {
2503            rdr->typ = R_NEWCAMD;
2504            rdr->ncd_proto = NCD_525;
2505            return;
2506        }
2507
2508        if (!strcmp(value, "newcamd524")) {
2509            rdr->typ = R_NEWCAMD;
2510            rdr->ncd_proto = NCD_524;
2511            return;
2512        }
2513
2514        fprintf(stderr, "WARNING: value '%s' in protocol-line not recognized, assuming MOUSE\n",value);
2515        rdr->typ = R_MOUSE;
2516        return;
2517    }
2518
2519    if (!strcmp(token, "loadbalanced")) {
2520        if(strlen(value) == 0) {
2521            rdr->loadbalanced = 0;
2522            return;
2523        } else {
2524            rdr->loadbalanced = atoi(value);
2525            return;
2526        }
2527    }
2528
2529    if (!strcmp(token, "ident")) {
2530        if(strlen(value) == 0) {
2531            clear_ftab(&rdr->ftab);
2532            return;
2533        } else {
2534            chk_ftab(value, &rdr->ftab,"reader",rdr->label,"provid");
2535            return;
2536        }
2537    }
2538
2539    if (!strcmp(token, "class")) {
2540        chk_cltab(value, &rdr->cltab);
2541        return;
2542    }
2543
2544    if (!strcmp(token, "chid")) {
2545        chk_ftab(value, &rdr->fchid,"reader",rdr->label,"chid");
2546        return;
2547    }
2548
2549    if (!strcmp(token, "showcls")) {
2550        rdr->show_cls = atoi(value);
2551        return;
2552    }
2553
2554    if (!strcmp(token, "maxqlen")) {
2555        rdr->maxqlen = atoi(value);
2556        if( rdr->maxqlen < 0 || rdr->maxqlen > CS_MAXQLEN) {
2557            rdr->maxqlen = CS_MAXQLEN;
2558        }
2559        return;
2560    }
2561
2562    if (!strcmp(token, "group")) {
2563        if(strlen(value) == 0) {
2564            rdr->grp = 0;
2565            return;
2566        } else {
2567            for (ptr = strtok(value, ","); ptr; ptr = strtok(NULL, ",")) {
2568                int g;
2569                g = atoi(ptr);
2570                if ((g>0) && (g<33)) {
2571                    rdr->grp |= (1<<(g-1));
2572                }
2573            }
2574            return;
2575        }
2576    }
2577
2578    if (!strcmp(token, "emmcache")) {
2579        if(strlen(value) == 0) {
2580            rdr->cachemm = 0;
2581            rdr->rewritemm = 0;
2582            rdr->logemm = 0;
2583            return;
2584        } else {
2585            for (i = 0, ptr = strtok(value, ","); (i < 3) && (ptr); ptr = strtok(NULL, ","), i++) {
2586                switch(i)
2587                {
2588                    case 0:
2589                        rdr->cachemm = atoi(ptr);
2590                        break;
2591
2592                    case 1:
2593                        rdr->rewritemm = atoi(ptr);
2594                        break;
2595
2596                    case 2: rdr->logemm = atoi(ptr);
2597                        break;
2598                }
2599            }
2600
2601            if (rdr->rewritemm <= 0) {
2602                fprintf(stderr, "Notice: Setting EMMCACHE to %i,1,%i instead of %i,%i,%i. ",
2603                    rdr->cachemm, rdr->logemm,
2604                    rdr->cachemm, rdr->rewritemm,
2605                    rdr->logemm);
2606
2607                fprintf(stderr, "Zero or negative number of rewrites is silly\n");
2608                rdr->rewritemm = 1;
2609            }
2610            return;
2611        }
2612    }
2613
2614    if (!strcmp(token, "blocknano")) {
2615        //wildcard is used
2616        if (!strcmp(value,"all")) {
2617            for (i = 0 ; i < 256; i++) {
2618                rdr->b_nano[i] |= 0x01; //set all lsb's to block all nanos
2619            }
2620        }
2621        else {
2622            for (ptr = strtok(value, ","); ptr; ptr = strtok(NULL, ",")) {
2623                if ((i = byte_atob(ptr)) >= 0) {
2624                    rdr->b_nano[i] |= 0x01; //lsb is set when to block nano
2625                }
2626            }
2627        }
2628        return;
2629    }
2630
2631    if (!strcmp(token, "blockemm-unknown")) {
2632        if (strlen(value) == 0) {
2633            rdr->blockemm_unknown = 0;
2634            return;
2635        }
2636        else {
2637            rdr->blockemm_unknown = atoi(value);
2638            return;
2639        }
2640    }
2641
2642    if (!strcmp(token, "blockemm-u")) {
2643        if (strlen(value) == 0) {
2644            rdr->blockemm_u = 0;
2645            return;
2646        }
2647        else {
2648            rdr->blockemm_u = atoi(value);
2649            return;
2650        }
2651    }
2652
2653    if (!strcmp(token, "blockemm-s")) {
2654        if (strlen(value) == 0) {
2655            rdr->blockemm_s = 0;
2656            return;
2657        }
2658        else {
2659            rdr->blockemm_s = atoi(value);
2660            return;
2661        }
2662    }
2663
2664    if (!strcmp(token, "blockemm-g")) {
2665        if (strlen(value) == 0) {
2666            rdr->blockemm_g = 0;
2667            return;
2668        }
2669        else {
2670            rdr->blockemm_g = atoi(value);
2671            return;
2672        }
2673    }
2674
2675    if (!strcmp(token, "savenano")) {
2676        //wildcard is used
2677        if (!strcmp(value,"all")) {
2678            for (i = 0 ; i < 256; i++) {
2679                rdr->b_nano[i] |= 0x02; //set all lsb+1 to save all nanos to file
2680            }
2681        }
2682        else {
2683            for (ptr = strtok(value, ","); ptr; ptr = strtok(NULL, ",")) {
2684                if ((i = byte_atob(ptr)) >= 0) {
2685                    rdr->b_nano[i] |= 0x02; //lsb+1 is set when to save nano to file
2686                }
2687            }
2688        }
2689        return;
2690    }
2691
2692    if (!strcmp(token, "cccversion")) {
2693        // cccam version
2694        if (strlen(value) > sizeof(rdr->cc_version) - 1) {
2695            fprintf(stderr, "cccam config: version too long\n");
2696            exit(1);
2697        }
2698        memset(rdr->cc_version, 0, sizeof(rdr->cc_version));
2699        cs_strncpy(rdr->cc_version, value, sizeof(rdr->cc_version));
2700        return;
2701    }
2702
2703    if (!strcmp(token, "cccbuild")) {
2704        // cccam build number
2705        if (strlen(value) > sizeof(rdr->cc_build) - 1) {
2706            fprintf(stderr, "cccam config build number too long\n");
2707            exit(1);
2708        }
2709
2710        memset(rdr->cc_build, 0, sizeof(rdr->cc_build));
2711        cs_strncpy(rdr->cc_build, value, sizeof(rdr->cc_build));
2712        return;
2713    }
2714
2715    if (!strcmp(token, "cccmaxhop")) {
2716        // cccam max card distance
2717        rdr->cc_maxhop = atoi(value);
2718        return;
2719    }
2720
2721    if (!strcmp(token, "deprecated")) {
2722        rdr->deprecated = atoi(value);
2723        return;
2724    }
2725
2726    if (token[0] != '#')
2727        fprintf(stderr, "Warning: keyword '%s' in reader section not recognized\n",token);
2728}
2729
2730#ifdef IRDETO_GUESSING
2731int init_irdeto_guess_tab()
2732{
2733  int i, j, skip;
2734  int b47;
2735  FILE *fp;
2736  char token[128], *ptr;
2737  char zSid[5];
2738  uchar b3;
2739  ushort caid, sid;
2740  struct s_irdeto_quess *ird_row, *head;
2741
2742  memset(cfg->itab, 0, sizeof(cfg->itab));
2743  sprintf(token, "%s%s", cs_confdir, cs_ird);
2744  if (!(fp=fopen(token, "r")))
2745  {
2746    cs_log("can't open file \"%s\" (errno=%d) irdeto guessing not loaded",
2747           token, errno);
2748    return(1);
2749  }
2750  while (fgets(token, sizeof(token), fp))
2751  {
2752    if( strlen(token)<20 ) continue;
2753    for( i=b3=b47=caid=sid=skip=0, ptr=strtok(token, ":"); (i<4)&&(ptr); ptr=strtok(NULL, ":"), i++ )
2754    {
2755      trim(ptr);
2756      if( *ptr==';' || *ptr=='#' || *ptr=='-' ) {
2757        skip=1;
2758        break;
2759      }
2760      switch(i)
2761      {
2762        case 0: b3   = a2i(ptr, 2); break;
2763        case 1: b47  = a2i(ptr, 8); break;
2764        case 2: caid = a2i(ptr, 4); break;
2765        case 3:
2766          for( j=0; j<4; j++ )
2767            zSid[j]=ptr[j];
2768          zSid[4]=0;
2769          sid  = a2i(zSid, 4);
2770          break;
2771      }
2772    }
2773    if( !skip )
2774    {
2775      if (!(ird_row=(struct s_irdeto_quess*)malloc(sizeof(struct s_irdeto_quess))))
2776      {
2777        cs_log("Error allocating memory (errno=%d)", errno);
2778        return(1);
2779      }
2780      ird_row->b47  = b47;
2781      ird_row->caid = caid;
2782      ird_row->sid  = sid;
2783      ird_row->next = 0;
2784
2785      head = cfg->itab[b3];
2786      if( head ) {
2787        while( head->next )
2788          head=head->next;
2789        head->next=ird_row;
2790      }
2791      else
2792        cfg->itab[b3]=ird_row;
2793        //cs_debug("%02X:%08X:%04X:%04X", b3, b47, caid, sid);
2794    }
2795  }
2796  fclose(fp);
2797
2798  for( i=0; i<0xff; i++ )
2799  {
2800    head=cfg->itab[i];
2801    while(head)
2802    {
2803      cs_debug("itab[%02X]: b47=%08X, caid=%04X, sid=%04X",
2804               i, head->b47, head->caid, head->sid);
2805      head=head->next;
2806    }
2807  }
2808  return(0);
2809}
2810#endif
2811
2812int init_readerdb()
2813{
2814    int tag = 0, nr;
2815    FILE *fp;
2816    char *value;
2817
2818    sprintf(token, "%s%s", cs_confdir, cs_srvr);
2819    if (!(fp=fopen(token, "r"))) {
2820        cs_log("can't open file \"%s\" (errno=%d)\n", token, errno);
2821        return(1);
2822    }
2823    nr = 0;
2824    while (fgets(token, sizeof(token), fp)) {
2825        int i, l;
2826        if ((l = strlen(trim(token))) < 3)
2827            continue;
2828        if ((token[0] == '[') && (token[l-1] == ']')) {
2829            token[l-1] = 0;
2830            tag = (!strcmp("reader", strtolower(token+1)));
2831            if (reader[nr].label[0] && reader[nr].typ) nr++;
2832            memset(&reader[nr], 0, sizeof(struct s_reader));
2833            reader[nr].enable = 1;
2834            reader[nr].tcp_rto = 30;
2835            reader[nr].show_cls = 10;
2836            reader[nr].maxqlen = CS_MAXQLEN;
2837            reader[nr].mhz = 357;
2838            reader[nr].cardmhz = 357;
2839            reader[nr].deprecated = 0;
2840            strcpy(reader[nr].pincode, "none");
2841            for (i=1; i<CS_MAXCAIDTAB; reader[nr].ctab.mask[i++]=0xffff);
2842            continue;
2843        }
2844
2845        if (!tag)
2846            continue;
2847        if (!(value=strchr(token, '=')))
2848            continue;
2849        *value++ ='\0';
2850        chk_reader(trim(strtolower(token)), trim(value), &reader[nr]);
2851    }
2852    fclose(fp);
2853    return(0);
2854}
2855
2856#ifdef CS_ANTICASC
2857void init_ac()
2858{
2859  int nr;
2860  FILE *fp;
2861  //char *value;
2862
2863  sprintf(token, "%s%s", cs_confdir, cs_ac);
2864  if (!(fp=fopen(token, "r")))
2865  {
2866    cs_log("can't open file \"%s\" (errno=%d) anti-cascading table not loaded",
2867            token, errno);
2868    return;
2869  }
2870
2871  for(nr=0; fgets(token, sizeof(token), fp);)
2872  {
2873    int i, skip;
2874    ushort caid, sid, chid, dwtime;
2875    ulong  provid;
2876    char *ptr, *ptr1;
2877    struct s_cpmap *ptr_cpmap;
2878    static struct s_cpmap *cpmap=(struct s_cpmap *)0;
2879
2880    if( strlen(token)<4 ) continue;
2881
2882    caid=sid=chid=dwtime=0;
2883    provid=0;
2884    skip=0;
2885    ptr1=0;
2886    for( i=0, ptr=strtok(token, "="); (i<2)&&(ptr); ptr=strtok(NULL, "="), i++ )
2887    {
2888      trim(ptr);
2889      if( *ptr==';' || *ptr=='#' || *ptr=='-' ) {
2890        skip=1;
2891        break;
2892      }
2893      switch( i )
2894      {
2895        case 0:
2896          ptr1=ptr;
2897          break;
2898        case 1:
2899          dwtime = atoi(ptr);
2900          break;
2901      }
2902    }
2903
2904    if( !skip )
2905    {
2906      for( i=0, ptr=strtok(ptr1, ":"); (i<4)&&(ptr); ptr=strtok(NULL, ":"), i++ )
2907      {
2908        trim(ptr);
2909        switch( i )
2910        {
2911        case 0:
2912          if( *ptr=='*' ) caid = 0;
2913          else caid = a2i(ptr, 4);
2914          break;
2915        case 1:
2916          if( *ptr=='*' ) provid = 0;
2917          else provid = a2i(ptr, 6);
2918          break;
2919        case 2:
2920          if( *ptr=='*' ) sid = 0;
2921          else sid = a2i(ptr, 4);
2922          break;
2923        case 3:
2924          if( *ptr=='*' ) chid = 0;
2925          else chid = a2i(ptr, 4);
2926          break;
2927        }
2928      }
2929      if (!(ptr_cpmap=(struct s_cpmap*)malloc(sizeof(struct s_cpmap))))
2930      {
2931        cs_log("Error allocating memory (errno=%d)", errno);
2932        return;
2933      }
2934      if( cpmap )
2935        cpmap->next=ptr_cpmap;
2936      else
2937        cfg->cpmap=ptr_cpmap;
2938      cpmap=ptr_cpmap;
2939
2940      cpmap->caid   = caid;
2941      cpmap->provid = provid;
2942      cpmap->sid    = sid;
2943      cpmap->chid   = chid;
2944      cpmap->dwtime = dwtime;
2945      cpmap->next   = 0;
2946
2947      cs_debug("nr=%d, caid=%04X, provid=%06X, sid=%04X, chid=%04X, dwtime=%d",
2948                nr, caid, provid, sid, chid, dwtime);
2949      nr++;
2950    }
2951  }
2952  fclose(fp);
2953  //cs_log("%d lengths for caid guessing loaded", nr);
2954  return;
2955}
2956#endif
2957
2958/*
2959 * makes a char ready to write a token into config or webIf
2960 */
2961char *mk_t_caidtab(CAIDTAB *ctab){
2962    int i = 0, needed = 1, pos = 0;
2963    while(ctab->caid[i]){
2964        if(ctab->mask[i]) needed += 10;
2965        else needed += 5;
2966        if(ctab->cmap[i]) needed += 5;
2967        ++i;
2968    }
2969    char *value = (char *) malloc(needed * sizeof(char));
2970    i = 0;
2971    while(ctab->caid[i]) {
2972        if(i == 0) {
2973            sprintf(value + pos, "%04X", ctab->caid[i]);
2974            pos += 4;
2975        } else {
2976            sprintf(value + pos, ",%04X", ctab->caid[i]);
2977            pos += 5;
2978        }
2979        if(ctab->mask[i]){
2980            sprintf(value + pos, "&%04X", ctab->mask[i]);
2981            pos += 5;
2982        }
2983        if(ctab->cmap[i]){
2984            sprintf(value + pos, ":%04X", ctab->cmap[i]);
2985            pos += 5;
2986        }
2987        ++i;
2988    }
2989    value[pos] = '\0';
2990    return value;
2991}
2992
2993/*
2994 * makes a char ready to write a token into config or webIf
2995 */
2996char *mk_t_tuntab(TUNTAB *ttab){
2997    int i = 0, needed = 1, pos = 0;
2998    while(ttab->bt_caidfrom[i]){
2999        if(ttab->bt_srvid[i]) needed += 10;
3000        else needed += 5;
3001        if(ttab->bt_caidto[i]) needed += 5;
3002        ++i;
3003    }
3004    char *value = (char *) malloc(needed * sizeof(char));
3005    i = 0;
3006    while(ttab->bt_caidfrom[i]) {
3007        if(i == 0) {
3008            sprintf(value + pos, "%04X", ttab->bt_caidfrom[i]);
3009            pos += 4;
3010        } else {
3011            sprintf(value + pos, ",%04X", ttab->bt_caidfrom[i]);
3012            pos += 5;
3013        }
3014        if(ttab->bt_srvid[i]){
3015            sprintf(value + pos, ".%04X", ttab->bt_srvid[i]);
3016            pos += 5;
3017        }
3018        if(ttab->bt_caidto[i]){
3019            sprintf(value + pos, ":%04X", ttab->bt_caidto[i]);
3020            pos += 5;
3021        }
3022        ++i;
3023    }
3024    value[pos] = '\0';
3025    return value;
3026}
3027
3028/*
3029 * makes a char ready to write a token into config or webIf
3030 */
3031char *mk_t_group(ulong *grp){
3032    int i = 0, needed = 1, pos = 0, dot = 0;
3033    char grpbit[33];
3034    long2bitchar((long) grp, grpbit);
3035
3036    for(i = 0; i < 32; i++){
3037        if (grpbit[i] == '1'){
3038            needed += 2;
3039            if(i > 9) needed += 1;
3040        }
3041    }
3042    char *value = (char *) malloc(needed * sizeof(char));
3043
3044    for(i = 0; i < 32; i++){
3045        if (grpbit[i] == '1'){
3046            if (dot == 0){
3047                sprintf(value + pos, "%d", i+1);
3048                if (i > 9)pos += 2;
3049                else pos += 1;
3050                dot = 1;
3051            } else {
3052                sprintf(value + pos, ",%d", i+1);
3053                if (i > 9)pos += 3;
3054                else pos += 2;
3055            }
3056        }
3057    }
3058    value[pos] = '\0';
3059    return value;
3060}
3061
3062/*
3063 * makes a char ready to write a token into config or webIf
3064 */
3065char *mk_t_ftab(FTAB *ftab){
3066    int i = 0, j = 0, needed = 1, pos = 0;
3067
3068    needed = ftab->nfilts * 5;
3069    for (i = 0; i < ftab->nfilts; ++i)
3070        needed += ftab->filts[i].nprids * 7;
3071
3072    char *value = (char *) malloc(needed * sizeof(char));
3073
3074    char *dot="";
3075    for (i = 0; i < ftab->nfilts; ++i){
3076        sprintf(value + pos, "%s%04X", dot, ftab->filts[i].caid);
3077        pos += 4;
3078        if (i > 0) pos += 1;
3079        dot=":";
3080        for (j = 0; j < ftab->filts[i].nprids; ++j) {
3081            sprintf(value + pos, "%s%06lX", dot, ftab->filts[i].prids[j]);
3082            pos += 7;
3083            dot=",";
3084        }
3085        dot=";";
3086    }
3087
3088    value[pos] = '\0';
3089    return value;
3090}
Note: See TracBrowser for help on using the repository browser.