Changeset 1682


Ignore:
Timestamp:
02/25/10 10:56:54 (11 years ago)
Author:
merek
Message:

Backport oscam-config.c cleanup and Bugfixes from WebIF branch

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/globals.h

    r1658 r1682  
    749749extern void cs_setpriority(int);
    750750extern struct s_auth *find_user(char *);
     751extern void long2bitchar(long value, char *result);
     752extern void clear_sip(struct s_ip **sip);
     753extern void clear_ptab(struct s_ptab *ptab);
     754void clear_caidtab(struct s_caidtab *ctab);
     755void clear_tuntab(struct s_tuntab *ttab);
     756extern void cs_strncpy(char * destination, const char * source, size_t num);
    751757
    752758// oscam variables
  • trunk/oscam-config.c

    r1674 r1682  
    33#  include "oscam-boxkeys.np"
    44#endif
     5
     6#define CONFVARWIDTH 20
    57
    68static char *cs_conf="oscam.conf";
     
    2022typedef enum cs_proto_type
    2123{
    22   TAG_GLOBAL,   // must be first !
    23   TAG_MONITOR,  // monitor
    24   TAG_CAMD33,   // camd 3.3x
    25   TAG_CAMD35,   // camd 3.5x UDP
    26   TAG_NEWCAMD,  // newcamd
    27   TAG_RADEGAST, // radegast
    28   TAG_SERIAL,   // serial (static)
    29   TAG_CS357X,   // camd 3.5x UDP
    30   TAG_CS378X,    // camd 3.5x TCP
    31 #ifdef CS_WITH_GBOX   
    32   TAG_GBOX, // gbox
    33 #endif
    34   TAG_CCCAM,  // cccam
    35   TAG_DVBAPI
     24    TAG_GLOBAL,     // must be first !
     25    TAG_MONITOR,    // monitor
     26    TAG_CAMD33,     // camd 3.3x
     27    TAG_CAMD35,     // camd 3.5x UDP
     28    TAG_NEWCAMD,    // newcamd
     29    TAG_RADEGAST,   // radegast
     30    TAG_SERIAL,     // serial (static)
     31    TAG_CS357X,     // camd 3.5x UDP
     32    TAG_CS378X,     // camd 3.5x TCP
     33#ifdef CS_WITH_GBOX
     34    TAG_GBOX,       // gbox
     35#endif
     36    TAG_CCCAM,      // cccam
     37    TAG_DVBAPI
    3638#ifdef CS_ANTICASC
    37   ,TAG_ANTICASC // anti-cascading
     39    ,TAG_ANTICASC   // anti-cascading
    3840#endif
    3941} cs_proto_type_t;
    4042
    41 static char *cctag[]={"global", "monitor", "camd33", "camd35", 
    42                       "newcamd", "radegast", "serial", "cs357x", "cs378x",
    43 #ifdef CS_WITH_GBOX 
     43static char *cctag[]={"global", "monitor", "camd33", "camd35",
     44                        "newcamd", "radegast", "serial", "cs357x", "cs378x",
     45#ifdef CS_WITH_GBOX
    4446              "gbox",
    4547#endif
    46               "cccam", "dvbapi",
     48                        "cccam", "dvbapi",
    4749#ifdef CS_ANTICASC
    4850                      "anticasc",
    4951#endif
    50                        NULL};
     52                      NULL};
    5153
    5254#ifdef DEBUG_SIDTAB
     
    7678void chk_iprange(char *value, struct s_ip **base)
    7779{
    78   int i = 0;
    79   char *ptr1, *ptr2;
    80   struct s_ip *lip, *cip;
    81 
    82   for (cip=lip=*base; cip; cip=cip->next)
    83     lip=cip;
    84   if (!(cip=malloc(sizeof(struct s_ip))))
    85   {
    86     fprintf(stderr, "Error allocating memory (errno=%d)\n", errno);
    87     exit(1);
    88   }
    89   if (*base)
    90     lip->next=cip;
    91   else
    92     *base=cip;
    93 
    94   memset(cip, 0, sizeof(struct s_ip));
    95   for (ptr1=strtok(value, ","); ptr1; ptr1=strtok(NULL, ","))
    96   {
    97     if (i == 0) ++i;
    98     else {
    99         if (!(cip=malloc(sizeof(struct s_ip)))){
    100             fprintf(stderr, "Error allocating memory (errno=%d)\n", errno);
    101             exit(1);
    102         }
    103         lip->next = cip;
    104         memset(cip, 0, sizeof(struct s_ip));
    105     }
    106     if( (ptr2=strchr(trim(ptr1), '-')) )
    107     {
    108       *ptr2++='\0';
    109       cip->ip[0]=cs_inet_addr(trim(ptr1));
    110       cip->ip[1]=cs_inet_addr(trim(ptr2));
    111     }
    112     else
    113       cip->ip[0]=cip->ip[1]=cs_inet_addr(ptr1);
    114     lip = cip;
    115   }
     80    int i = 0;
     81    char *ptr1, *ptr2;
     82    struct s_ip *lip, *cip;
     83
     84    for (cip=lip=*base; cip; cip=cip->next)
     85        lip = cip;
     86    if (!(cip=malloc(sizeof(struct s_ip)))) {
     87        fprintf(stderr, "Error allocating memory (errno=%d)\n", errno);
     88        exit(1);
     89    }
     90    if (*base)
     91        lip->next = cip;
     92    else
     93        *base = cip;
     94
     95    memset(cip, 0, sizeof(struct s_ip));
     96    for (ptr1=strtok(value, ","); ptr1; ptr1=strtok(NULL, ",")) {
     97            if (i == 0)
     98                ++i;
     99        else {
     100            if (!(cip=malloc(sizeof(struct s_ip)))) {
     101                fprintf(stderr, "Error allocating memory (errno=%d)\n", errno);
     102                exit(1);
     103            }
     104            lip->next = cip;
     105            memset(cip, 0, sizeof(struct s_ip));
     106        }
     107
     108        if( (ptr2=strchr(trim(ptr1), '-')) ) {
     109            *ptr2++ ='\0';
     110            cip->ip[0]=cs_inet_addr(trim(ptr1));
     111            cip->ip[1]=cs_inet_addr(trim(ptr2));
     112        } else {
     113            cip->ip[0]=cip->ip[1]=cs_inet_addr(ptr1);
     114        }
     115        lip = cip;
     116    }
    116117}
    117118
    118119void chk_caidtab(char *caidasc, CAIDTAB *ctab)
    119120{
    120   int i;
    121   char *ptr1, *ptr2, *ptr3;
    122   for (i=0, ptr1=strtok(caidasc, ","); (i<CS_MAXCAIDTAB) && (ptr1); ptr1=strtok(NULL, ","))
    123   {
    124     ulong caid, mask, cmap;
    125     if( (ptr3=strchr(trim(ptr1), ':')) )
    126       *ptr3++='\0';
    127     else
    128       ptr3="";
    129     if( (ptr2=strchr(trim(ptr1), '&')) )
    130       *ptr2++='\0';
    131     else
    132       ptr2="";
    133     if (((caid=a2i(ptr1, 2))|(mask=a2i(ptr2,-2))|(cmap=a2i(ptr3, 2))) < 0x10000)
    134     {
    135       ctab->caid[i]=caid;
    136       ctab->mask[i]=mask;
    137       ctab->cmap[i++]=cmap;
    138     }
    139 //    else
    140 //      cs_log("WARNING: wrong CAID in %s -> ignored", cs_user);
    141   }
     121    int i;
     122    char *ptr1, *ptr2, *ptr3;
     123
     124    for (i = 0, ptr1 = strtok(caidasc, ","); (i < CS_MAXCAIDTAB) && (ptr1); ptr1 = strtok(NULL, ",")) {
     125        ulong caid, mask, cmap;
     126        if( (ptr3 = strchr(trim(ptr1), ':')) )
     127            *ptr3++ = '\0';
     128        else
     129            ptr3 = "";
     130
     131        if( (ptr2 = strchr(trim(ptr1), '&')) )
     132            *ptr2++ = '\0';
     133        else
     134            ptr2 = "";
     135
     136        if (((caid = a2i(ptr1, 2)) | (mask = a2i(ptr2,-2)) | (cmap = a2i(ptr3, 2))) < 0x10000) {
     137            ctab->caid[i] = caid;
     138            ctab->mask[i] = mask;
     139            ctab->cmap[i++] = cmap;
     140        }
     141    }
    142142}
    143143
    144144void chk_tuntab(char *tunasc, TUNTAB *ttab)
    145145{
    146   int i;
    147   char *ptr1, *ptr2, *ptr3;
    148   for (i=0, ptr1=strtok(tunasc, ","); (i<CS_MAXTUNTAB) && (ptr1); ptr1=strtok(NULL, ","))
    149   {
    150     ulong bt_caidfrom, bt_caidto, bt_srvid;
    151     if( (ptr3=strchr(trim(ptr1), ':')) )
    152       *ptr3++='\0';
    153     else
    154       ptr3="";
    155     if( (ptr2=strchr(trim(ptr1), '.')) )
    156       *ptr2++='\0';
    157     else
    158       ptr2="";
    159     if ((bt_caidfrom=a2i(ptr1, 2))|(bt_srvid=a2i(ptr2,-2))|(bt_caidto=a2i(ptr3, 2)))
    160     {
    161       ttab->bt_caidfrom[i]=bt_caidfrom;
    162       ttab->bt_caidto[i]=bt_caidto;
    163       ttab->bt_srvid[i++]=bt_srvid;
    164     }
    165 //    else
    166 //      cs_log("WARNING: wrong Betatunnel in %s -> ignored", cs_user);
    167   }
     146    int i;
     147    char *ptr1, *ptr2, *ptr3;
     148
     149    for (i = 0, ptr1 = strtok(tunasc, ","); (i < CS_MAXTUNTAB) && (ptr1); ptr1 = strtok(NULL, ",")) {
     150        ulong bt_caidfrom, bt_caidto, bt_srvid;
     151        if( (ptr3 = strchr(trim(ptr1), ':')) )
     152            *ptr3++ = '\0';
     153        else
     154            ptr3 = "";
     155
     156        if( (ptr2 = strchr(trim(ptr1), '.')) )
     157            *ptr2++ = '\0';
     158        else
     159            ptr2 = "";
     160
     161        if ((bt_caidfrom = a2i(ptr1, 2)) | (bt_srvid = a2i(ptr2,-2)) | (bt_caidto = a2i(ptr3, 2))) {
     162            ttab->bt_caidfrom[i] = bt_caidfrom;
     163            ttab->bt_caidto[i] = bt_caidto;
     164            ttab->bt_srvid[i++] = bt_srvid;
     165        }
     166    }
    168167}
    169168
    170169void chk_services(char *labels, ulong *sidok, ulong *sidno)
    171170{
    172   int i;
    173   char *ptr;
    174   SIDTAB *sidtab;
    175   *sidok=*sidno=0;
    176   for (ptr=strtok(labels, ","); ptr; ptr=strtok(NULL, ","))
    177     for (trim(ptr), i=0, sidtab=cfg->sidtab; sidtab; sidtab=sidtab->next, i++)
    178     {
    179       if (!strcmp(sidtab->label, ptr)) *sidok|=(1<<i);
    180       if ((ptr[0]=='!') && (!strcmp(sidtab->label, ptr+1))) *sidno|=(1<<i);
    181     }
     171    int i;
     172    char *ptr;
     173    SIDTAB *sidtab;
     174    *sidok = *sidno = 0;
     175    for (ptr=strtok(labels, ","); ptr; ptr=strtok(NULL, ",")) {
     176        for (trim(ptr), i = 0, sidtab = cfg->sidtab; sidtab; sidtab = sidtab->next, i++) {
     177            if (!strcmp(sidtab->label, ptr)) *sidok|=(1<<i);
     178            if ((ptr[0]=='!') && (!strcmp(sidtab->label, ptr+1))) *sidno|=(1<<i);
     179        }
     180    }
    182181}
    183182
    184183void chk_ftab(char *zFilterAsc, FTAB *ftab, const char *zType, const char *zName, const char *zFiltName)
    185184{
    186   int i,j;
    187   char *ptr1,*ptr2,*ptr3;
    188   char *ptr[CS_MAXFILTERS] = {0};
    189  
    190   memset(ftab, 0, sizeof(FTAB));
    191   for( i=0, ptr1=strtok(zFilterAsc, ";"); (i<CS_MAXFILTERS) && (ptr1); ptr1=strtok(NULL, ";"), i++ )
    192   {
    193     //cs_log("ptr1=%s", ptr1);
    194     ptr[i] = ptr1;
    195     if( (ptr2=strchr(trim(ptr1), ':')) )
    196     {
    197       //cs_log("ptr2=%s", ptr2);
    198       *ptr2++='\0';
    199       //cs_log("ptr2=%s", ptr2);
    200       ftab->filts[i].caid = (ushort)a2i(ptr1, 4);
    201       //cs_log("caid=%04X", ftab->filts[i].caid);
    202       ptr[i] = ptr2;
    203     }
    204     else if (zFiltName && zFiltName[0]=='c')
    205     {
    206       cs_log("PANIC: CAID field not found in CHID parameter!");
    207       cs_exit(1);
    208     }
    209     ftab->nfilts++;
    210   }
    211 
    212   if( ftab->nfilts ) cs_debug("%s '%s' %s filter(s):", zType, zName, zFiltName);
    213   for( i=0; i<ftab->nfilts; i++ )
    214   {
    215     cs_debug("CAID #%d: %04X", i, ftab->filts[i].caid);
    216     for( j=0, ptr3=strtok(ptr[i], ","); (j<CS_MAXPROV) && (ptr3); ptr3=strtok(NULL, ","), j++ )
    217     {
    218       ftab->filts[i].prids[j] = a2i(ptr3,6);
    219       ftab->filts[i].nprids++;
    220       cs_debug("%s #%d: %06X", zFiltName, j, ftab->filts[i].prids[j]);
    221     }
    222   }
    223   //cs_log("exit chk_ftab");
     185    int i, j;
     186    char *ptr1, *ptr2, *ptr3;
     187    char *ptr[CS_MAXFILTERS] = {0};
     188
     189    memset(ftab, 0, sizeof(FTAB));
     190    for( i = 0, ptr1 = strtok(zFilterAsc, ";"); (i < CS_MAXFILTERS) && (ptr1); ptr1 = strtok(NULL, ";"), i++ ) {
     191        ptr[i] = ptr1;
     192        if( (ptr2 = strchr(trim(ptr1), ':')) ) {
     193            *ptr2++ ='\0';
     194            ftab->filts[i].caid = (ushort)a2i(ptr1, 4);
     195            ptr[i] = ptr2;
     196        }
     197        else if (zFiltName && zFiltName[0] == 'c') {
     198            cs_log("PANIC: CAID field not found in CHID parameter!");
     199            cs_exit(1);
     200        }
     201        ftab->nfilts++;
     202    }
     203
     204    if( ftab->nfilts ) cs_debug("%s '%s' %s filter(s):", zType, zName, zFiltName);
     205    for( i = 0; i < ftab->nfilts; i++ ) {
     206        cs_debug("CAID #%d: %04X", i, ftab->filts[i].caid);
     207        for( j = 0, ptr3 = strtok(ptr[i], ","); (j < CS_MAXPROV) && (ptr3); ptr3 = strtok(NULL, ","), j++ ) {
     208            ftab->filts[i].prids[j] = a2i(ptr3,6);
     209            ftab->filts[i].nprids++;
     210            cs_debug("%s #%d: %06X", zFiltName, j, ftab->filts[i].prids[j]);
     211        }
     212    }
    224213}
    225214
    226215void chk_cltab(char *classasc, CLASSTAB *clstab)
    227216{
    228   int i;
    229   char *ptr1;
    230   for( i=0, ptr1=strtok(classasc, ","); (i<CS_MAXCAIDTAB) && (ptr1); ptr1=strtok(NULL, ",") )
    231   {
    232     ptr1=trim(ptr1);
    233     if( ptr1[0] == '!' )
    234       clstab->bclass[clstab->bn++] = (uchar)a2i(ptr1+1, 2);
    235     else
    236       clstab->aclass[clstab->an++] = (uchar)a2i(ptr1, 2);
    237   }
     217    int i;
     218    char *ptr1;
     219    for( i = 0, ptr1 = strtok(classasc, ","); (i < CS_MAXCAIDTAB) && (ptr1); ptr1 = strtok(NULL, ",") ) {
     220        ptr1 = trim(ptr1);
     221        if( ptr1[0] == '!' )
     222            clstab->bclass[clstab->bn++] = (uchar)a2i(ptr1+1, 2);
     223        else
     224            clstab->aclass[clstab->an++] = (uchar)a2i(ptr1, 2);
     225    }
    238226}
    239227
    240228void chk_port_tab(char *portasc, PTAB *ptab)
    241229{
    242   int i,j,nfilts,ifilt,iport;
    243   char *ptr1,*ptr2,*ptr3;
    244   char *ptr[CS_MAXPORTS] = {0};
    245   int  port[CS_MAXPORTS] = {0};
    246   int previous_nports = ptab->nports;
    247 
    248   for (nfilts=i=previous_nports, ptr1=strtok(portasc, ";"); (i<CS_MAXCAIDTAB) && (ptr1); ptr1=strtok(NULL, ";"), i++)
    249   {
    250     ptr[i] = ptr1;
    251     if( (ptr2=strchr(trim(ptr1), '@')) )
    252     {
    253       *ptr2++='\0';
    254       ptab->ports[i].s_port = atoi(ptr1);
    255       ptr[i] = ptr2;
    256       port[i] = ptab->ports[i].s_port;
    257       ptab->nports++;
    258     }
    259     nfilts++;
    260   }
    261 
    262   if( nfilts==1 && strlen(portasc)<6 && ptab->ports[0].s_port == 0 ) {
    263     ptab->ports[0].s_port = atoi(portasc);
    264     ptab->nports = 1;
    265   }
    266 
    267   iport=ifilt = previous_nports;
    268   for (i=previous_nports; i<nfilts; i++)
    269   {
    270     if( port[i]!=0 ) iport = i;
    271     for (j=0, ptr3=strtok(ptr[i], ","); (j<CS_MAXPROV) && (ptr3); ptr3=strtok(NULL, ","), j++)
    272     {
    273       if( (ptr2=strchr(trim(ptr3), ':')) )
    274       {
    275         *ptr2++='\0';
    276         ptab->ports[iport].ftab.nfilts++;
    277         ifilt = ptab->ports[iport].ftab.nfilts-1;
    278         ptab->ports[iport].ftab.filts[ifilt].caid = (ushort)a2i(ptr3, 4);
    279         ptab->ports[iport].ftab.filts[ifilt].prids[j] = a2i(ptr2, 6);
    280       } else {
    281         ptab->ports[iport].ftab.filts[ifilt].prids[j] = a2i(ptr3, 6);
    282       }
    283       ptab->ports[iport].ftab.filts[ifilt].nprids++;
    284     }
    285   }
    286 }
    287 
    288 #ifdef NOTUSED
    289 static void chk_srvip(char *value, in_addr_t *ip)
    290 {
    291   int i;
    292   char *ptr;
    293   for (i=0, ptr=strtok(value, ","); ptr; ptr=strtok(NULL, ","))
    294     if (i<8) ip[i++]=inet_addr(ptr);
    295 }
    296 #endif
     230    int i, j, nfilts, ifilt, iport;
     231    char *ptr1, *ptr2, *ptr3;
     232    char *ptr[CS_MAXPORTS] = {0};
     233    int  port[CS_MAXPORTS] = {0};
     234    int previous_nports = ptab->nports;
     235
     236    for (nfilts = i = previous_nports, ptr1 = strtok(portasc, ";"); (i < CS_MAXCAIDTAB) && (ptr1); ptr1 = strtok(NULL, ";"), i++) {
     237        ptr[i] = ptr1;
     238        if( (ptr2=strchr(trim(ptr1), '@')) ) {
     239            *ptr2++ ='\0';
     240            ptab->ports[i].s_port = atoi(ptr1);
     241            ptr[i] = ptr2;
     242            port[i] = ptab->ports[i].s_port;
     243            ptab->nports++;
     244        }
     245        nfilts++;
     246    }
     247
     248    if( nfilts == 1 && strlen(portasc) < 6 && ptab->ports[0].s_port == 0 ) {
     249        ptab->ports[0].s_port = atoi(portasc);
     250        ptab->nports = 1;
     251    }
     252
     253    iport = ifilt = previous_nports;
     254    for (i=previous_nports; i<nfilts; i++) {
     255        if( port[i] != 0 )
     256            iport = i;
     257        for (j = 0, ptr3 = strtok(ptr[i], ","); (j < CS_MAXPROV) && (ptr3); ptr3 = strtok(NULL, ","), j++) {
     258            if( (ptr2=strchr(trim(ptr3), ':')) ) {
     259                *ptr2++='\0';
     260                ptab->ports[iport].ftab.nfilts++;
     261                ifilt = ptab->ports[iport].ftab.nfilts-1;
     262                ptab->ports[iport].ftab.filts[ifilt].caid = (ushort)a2i(ptr3, 4);
     263                ptab->ports[iport].ftab.filts[ifilt].prids[j] = a2i(ptr2, 6);
     264            } else {
     265                ptab->ports[iport].ftab.filts[ifilt].prids[j] = a2i(ptr3, 6);
     266            }
     267            ptab->ports[iport].ftab.filts[ifilt].nprids++;
     268        }
     269    }
     270}
    297271
    298272void chk_t_global(char *token, char *value)
    299273{
    300   if (!strcmp(token, "serverip")) { cfg->srvip=inet_addr(value); return; }
    301   if (!strcmp(token, "logfile")) {
    302           if (cfg->logfile != NULL) {
    303                   free(cfg->logfile);
    304                   cfg->logfile = NULL;
    305           }
    306           if (value[0])
    307                   asprintf(&(cfg->logfile), "%s", value);
    308           return;
    309   }
    310   if (!strcmp(token, "pidfile")) {
    311           if (cfg->pidfile != NULL) {
    312                   free(cfg->pidfile);
    313                   cfg->pidfile = NULL;
    314           }
    315           if (value[0])
    316                   asprintf(&(cfg->pidfile), "%s", value);
    317           return;
    318   }
    319   if (!strcmp(token, "usrfile")) {
    320           if (cfg->usrfile != NULL) {
    321                   free(cfg->usrfile);
    322                   cfg->usrfile = NULL;
    323           }
    324           if (value[0])
    325                   asprintf(&(cfg->usrfile), "%s", value);
    326           return;
    327   }
    328   if (!strcmp(token, "cwlogdir")) {
    329           if (cfg->cwlogdir != NULL) {
    330                   free(cfg->cwlogdir);
    331                   cfg->cwlogdir = NULL;
    332           }
    333           if (value[0])
    334                   asprintf(&(cfg->cwlogdir), "%s", value);
    335           return;
    336   }
    337   if (!strcmp(token, "clienttimeout"))
    338   {
    339       cfg->ctimeout = atoi(value);
    340       if (cfg->ctimeout < 100)
    341           cfg->ctimeout *= 1000;
    342       return;
    343   }
    344   if (!strcmp(token, "fallbacktimeout"))
    345   {
    346       cfg->ftimeout = atoi(value);
    347       if (cfg->ftimeout < 100)
    348           cfg->ftimeout *= 1000;
    349       return;
    350   }
    351 
    352   if (!strcmp(token, "clientmaxidle")) { cfg->cmaxidle=atoi(value); return; }
    353   if (!strcmp(token, "cachedelay")) { cfg->delay=atoi(value); return; }
    354   if (!strcmp(token, "bindwait")) { cfg->bindwait=atoi(value); return; }
    355   if (!strcmp(token, "netprio")) { cfg->netprio=atoi(value); return; }
    356   if (!strcmp(token, "resolvedelay")) { cfg->resolvedelay=atoi(value); return; }
    357   if (!strcmp(token, "sleep")) { cfg->tosleep=atoi(value); return; }
    358   if (!strcmp(token, "unlockparental")) { cfg->ulparent=atoi(value); return; }
    359   if (!strcmp(token, "nice"))
    360   {
    361     cfg->nice=atoi(value);
    362     if ((cfg->nice<-20) || (cfg->nice>20)) cfg->nice=99;
    363     if (cfg->nice!=99) cs_setpriority(cfg->nice);  // ignore errors
    364     return;
    365   }
    366   if (!strcmp(token, "serialreadertimeout"))
    367   {
    368     if (cfg->srtimeout < 100)
    369       cfg->srtimeout = atoi(value) * 1000;
    370     else
    371       cfg->srtimeout = atoi(value);
    372     if( cfg->srtimeout <=0 )
    373       cfg->srtimeout=1500;
    374     return;
    375   }
    376   if (!strcmp(token, "maxlogsize"))
    377   {
    378     cfg->max_log_size=atoi(value);
    379     if( cfg->max_log_size <=10 )
    380       cfg->max_log_size=10;
    381     return;
    382   }
    383   if( !strcmp(token, "waitforcards")) { cfg->waitforcards = atoi(value); return; }
    384   if( !strcmp(token, "preferlocalcards")) { cfg->preferlocalcards = atoi(value); return; }
    385   if (token[0] != '#')
    386     fprintf(stderr, "Warning: keyword '%s' in global section not recognized\n",token);
     274    if (!strcmp(token, "serverip")) {
     275        if (strlen(value) == 0) {
     276            cfg->srvip = 0;
     277            return;
     278        } else {
     279            cfg->srvip=inet_addr(value);
     280            return;
     281        }
     282    }
     283
     284    if (!strcmp(token, "logfile")) {
     285        if (cfg->logfile != NULL) {
     286            free(cfg->logfile);
     287            cfg->logfile = NULL;
     288        }
     289        if (strlen(value) > 0)
     290            asprintf(&(cfg->logfile), "%s", value);
     291        return;
     292    }
     293
     294    if (!strcmp(token, "pidfile")) {
     295        if (cfg->pidfile != NULL) {
     296            free(cfg->pidfile);
     297            cfg->pidfile = NULL;
     298        }
     299        if (strlen(value) > 0)
     300            asprintf(&(cfg->pidfile), "%s", value);
     301        return;
     302    }
     303
     304    if (!strcmp(token, "usrfile")) {
     305        if (cfg->usrfile != NULL) {
     306            free(cfg->usrfile);
     307            cfg->usrfile = NULL;
     308        }
     309        if (strlen(value) > 0)
     310            asprintf(&(cfg->usrfile), "%s", value);
     311        return;
     312    }
     313
     314    if (!strcmp(token, "cwlogdir")) {
     315        if (cfg->cwlogdir != NULL) {
     316            free(cfg->cwlogdir);
     317            cfg->cwlogdir = NULL;
     318        }
     319        if (strlen(value) > 0)
     320            asprintf(&(cfg->cwlogdir), "%s", value);
     321        return;
     322    }
     323
     324    if (!strcmp(token, "clienttimeout")) {
     325        if (strlen(value) == 0) {
     326            cfg->ctimeout = CS_CLIENT_TIMEOUT;
     327            return;
     328        } else {
     329            cfg->ctimeout = atoi(value);
     330            if (cfg->ctimeout < 100)
     331                cfg->ctimeout *= 1000;
     332            return;
     333        }
     334    }
     335
     336    if (!strcmp(token, "fallbacktimeout")) {
     337        if (strlen(value) == 0) {
     338            cfg->ftimeout = CS_CLIENT_TIMEOUT;
     339            return;
     340        } else {
     341            cfg->ftimeout = atoi(value);
     342            if (cfg->ftimeout < 100)
     343                cfg->ftimeout *= 1000;
     344            return;
     345        }
     346    }
     347
     348    if (!strcmp(token, "clientmaxidle")) {
     349        if (strlen(value) == 0) {
     350            cfg->cmaxidle = CS_CLIENT_MAXIDLE;
     351            return;
     352        } else {
     353            cfg->cmaxidle = atoi(value);
     354            return;
     355        }
     356    }
     357
     358    if (!strcmp(token, "cachedelay")) {
     359        if (strlen(value) == 0) {
     360            cfg->delay = CS_DELAY;
     361            return;
     362        } else {
     363            cfg->delay = atoi(value);
     364            return;
     365        }
     366    }
     367
     368    if (!strcmp(token, "bindwait")) {
     369        if (strlen(value) == 0) {
     370            cfg->bindwait = CS_BIND_TIMEOUT;
     371            return;
     372        } else {
     373            cfg->bindwait = atoi(value);
     374            return;
     375        }
     376    }
     377
     378    if (!strcmp(token, "netprio")) {
     379        if (strlen(value) == 0) {
     380            cfg->netprio = 0;
     381            return;
     382        } else {
     383            cfg->netprio = atoi(value);
     384            return;
     385        }
     386    }
     387
     388    if (!strcmp(token, "resolvedelay")) {
     389        if (strlen(value) == 0) {
     390            cfg->resolvedelay = CS_RESOLVE_DELAY;
     391            return;
     392        } else {
     393            cfg->resolvedelay = atoi(value);
     394            return;
     395        }
     396    }
     397
     398    if (!strcmp(token, "sleep")) {
     399        if (strlen(value) == 0) {
     400            cfg->tosleep = 0;
     401            return;
     402        } else {
     403            cfg->tosleep = atoi(value);
     404            return;
     405        }
     406    }
     407
     408    if (!strcmp(token, "unlockparental")) {
     409        if (strlen(value) == 0) {
     410            cfg->ulparent = 0;
     411            return;
     412        } else {
     413            cfg->ulparent = atoi(value);
     414            return;
     415        }
     416    }
     417
     418    if (!strcmp(token, "nice")) {
     419        if (strlen(value) == 0) {
     420            cfg->nice = 99;
     421            return;
     422        } else {
     423            cfg->nice = atoi(value);
     424            if ((cfg->nice<-20) || (cfg->nice>20)) cfg->nice = 99;
     425            if (cfg->nice != 99) cs_setpriority(cfg->nice);  // ignore errors
     426            return;
     427        }
     428    }
     429
     430    if (!strcmp(token, "serialreadertimeout")) {
     431        if (cfg->srtimeout < 100)
     432            cfg->srtimeout = atoi(value) * 1000;
     433        else
     434            cfg->srtimeout = atoi(value);
     435        if (cfg->srtimeout <= 0)
     436            cfg->srtimeout = 1500;
     437        return;
     438    }
     439
     440    if (!strcmp(token, "maxlogsize")) {
     441        if (strlen(value) == 0) {
     442            cfg->max_log_size = 10;
     443            return;
     444        } else {
     445            cfg->max_log_size = atoi(value);
     446            if( cfg->max_log_size <= 10 )
     447                cfg->max_log_size = 10;
     448            return;
     449        }
     450    }
     451
     452    if( !strcmp(token, "waitforcards")) {
     453        if (strlen(value) == 0) {
     454            cfg->waitforcards = 0;
     455            return;
     456        } else {
     457            cfg->waitforcards = atoi(value);
     458            return;
     459        }
     460    }
     461
     462    if( !strcmp(token, "preferlocalcards")) {
     463        if (strlen(value) == 0) {
     464            cfg->preferlocalcards = 0;
     465            return;
     466        } else {
     467            cfg->preferlocalcards = atoi(value);
     468            return;
     469        }
     470    }
     471
     472    if (token[0] != '#')
     473        cs_log("Warning: keyword '%s' in global section not recognized", token);
    387474}
    388475
     
    390477void chk_t_ac(char *token, char *value)
    391478{
    392   if (!strcmp(token, "enabled"))
    393   {
    394     cfg->ac_enabled=atoi(value);
    395     if( cfg->ac_enabled<=0 ) cfg->ac_enabled=0;
    396     else cfg->ac_enabled=1;
    397     return;
    398   }
    399 
    400   if (!strcmp(token, "numusers"))
    401   {
    402     cfg->ac_users=atoi(value);
    403     if( cfg->ac_users<0 ) cfg->ac_users=0;
    404     return;
    405   }
    406   if (!strcmp(token, "sampletime"))
    407   {
    408     cfg->ac_stime=atoi(value);
    409     if( cfg->ac_stime<0 ) cfg->ac_stime=2;
    410     return;
    411   }
    412   if (!strcmp(token, "samples"))
    413   {
    414     cfg->ac_samples=atoi(value);
    415     if( cfg->ac_samples<2 || cfg->ac_samples>10) cfg->ac_samples=10;
    416     return;
    417   }
    418   if (!strcmp(token, "penalty"))
    419   {
    420     cfg->ac_penalty=atoi(value);
    421     if( cfg->ac_penalty<0 ) cfg->ac_penalty=0;
    422     return;
    423   }
    424   if (!strcmp(token, "aclogfile"))
    425   {
    426     strncpy(cfg->ac_logfile, value, sizeof(cfg->ac_logfile)-1);
    427     return;
    428   }
    429   if( !strcmp(token, "fakedelay") )
    430   {
    431     cfg->ac_fakedelay=atoi(value);
    432     if( cfg->ac_fakedelay<100 || cfg->ac_fakedelay>1000 )
    433       cfg->ac_fakedelay=1000;
    434     return;
    435   }
    436   if( !strcmp(token, "denysamples") )
    437   {
    438     cfg->ac_denysamples=atoi(value);
    439     if( cfg->ac_denysamples<2 || cfg->ac_denysamples>cfg->ac_samples-1 )
    440       cfg->ac_denysamples=cfg->ac_samples-1;
    441     return;
    442   }
    443   if (token[0] != '#')
    444     fprintf(stderr, "Warning: keyword '%s' in anticascading section not recognized\n",token);
    445 //#endif moved this endif up two lines, I think this was erroneous - dingo35
     479    if (!strcmp(token, "enabled")) {
     480        cfg->ac_enabled = atoi(value);
     481        if( cfg->ac_enabled <= 0 )
     482            cfg->ac_enabled = 0;
     483        else
     484            cfg->ac_enabled = 1;
     485    return;
     486    }
     487
     488    if (!strcmp(token, "numusers")) {
     489        cfg->ac_users = atoi(value);
     490        if( cfg->ac_users < 0 )
     491            cfg->ac_users = 0;
     492        return;
     493    }
     494
     495    if (!strcmp(token, "sampletime")) {
     496        cfg->ac_stime = atoi(value);
     497        if( cfg->ac_stime < 0 )
     498            cfg->ac_stime = 2;
     499        return;
     500    }
     501
     502    if (!strcmp(token, "samples")) {
     503        cfg->ac_samples = atoi(value);
     504        if( cfg->ac_samples < 2 || cfg->ac_samples > 10)
     505            cfg->ac_samples = 10;
     506        return;
     507    }
     508
     509    if (!strcmp(token, "penalty")) {
     510        cfg->ac_penalty = atoi(value);
     511        if( cfg->ac_penalty < 0 )
     512            cfg->ac_penalty = 0;
     513        return;
     514    }
     515
     516    if (!strcmp(token, "aclogfile")) {
     517        cs_strncpy(cfg->ac_logfile, value, sizeof(cfg->ac_logfile));
     518        return;
     519    }
     520
     521    if( !strcmp(token, "fakedelay") ) {
     522        cfg->ac_fakedelay = atoi(value);
     523        if( cfg->ac_fakedelay < 100 || cfg->ac_fakedelay > 1000 )
     524            cfg->ac_fakedelay = 1000;
     525        return;
     526    }
     527
     528    if( !strcmp(token, "denysamples") ) {
     529        cfg->ac_denysamples = atoi(value);
     530        if( cfg->ac_denysamples < 2 || cfg->ac_denysamples > cfg->ac_samples - 1 )
     531            cfg->ac_denysamples=cfg->ac_samples-1;
     532        return;
     533    }
     534
     535    if (token[0] != '#')
     536        cs_log( "Warning: keyword '%s' in anticascading section not recognized",token);
    446537}
    447538#endif
     
    449540void chk_t_monitor(char *token, char *value)
    450541{
    451   if (!strcmp(token, "port")) { cfg->mon_port=atoi(value); return; }
    452   if (!strcmp(token, "serverip")) { cfg->mon_srvip=inet_addr(value); return; }
    453   if (!strcmp(token, "nocrypt")) { chk_iprange(value, &cfg->mon_allowed); return; }
    454   if (!strcmp(token, "aulow")) { cfg->mon_aulow=atoi(value); return; }
    455   if (!strcmp(token, "monlevel")) { cfg->mon_level=atoi(value); return; }
    456   if (!strcmp(token, "hideclient_to")) { cfg->mon_hideclient_to=atoi(value); return; }
    457   if (token[0] != '#')
    458     fprintf(stderr, "Warning: keyword '%s' in monitor section not recognized\n",token);
     542    if (!strcmp(token, "port")) {
     543        if(strlen(value) == 0) {
     544            cfg->mon_port = 0;
     545            return;
     546        } else {
     547            cfg->mon_port=atoi(value);
     548            return;
     549        }
     550    }
     551
     552    if (!strcmp(token, "serverip")) {
     553        if(strlen(value) == 0) {
     554            cfg->mon_srvip = 0;
     555            return;
     556        } else {
     557            cfg->mon_srvip=inet_addr(value);
     558            return;
     559        }
     560    }
     561
     562    if (!strcmp(token, "nocrypt")) {
     563        if(strlen(value) == 0) {
     564            clear_sip(&cfg->mon_allowed);
     565            return;
     566        } else {
     567            chk_iprange(value, &cfg->mon_allowed);
     568            return;
     569        }
     570    }
     571
     572    if (!strcmp(token, "aulow")) {
     573        if(strlen(value) == 0) {
     574            cfg->mon_aulow = 0;
     575            return;
     576        } else {
     577            cfg->mon_aulow = atoi(value);
     578            return;
     579        }
     580    }
     581
     582    if (!strcmp(token, "monlevel")) {
     583        if(strlen(value) == 0) {
     584            cfg->mon_level = 0;
     585            return;
     586        } else {
     587            cfg->mon_level = atoi(value);
     588            return;
     589        }
     590    }
     591
     592    if (!strcmp(token, "hideclient_to")) {
     593        if(strlen(value) == 0) {
     594            cfg->mon_hideclient_to = 0;
     595            return;
     596        } else {
     597            cfg->mon_hideclient_to = atoi(value);
     598            return;
     599        }
     600    }
     601
     602    if (token[0] != '#')
     603        cs_log("Warning: keyword '%s' in monitor section not recognized",token);
    459604}
    460605
    461606void chk_t_camd33(char *token, char *value)
    462607{
    463   if (!strcmp(token, "port")) { cfg->c33_port=atoi(value); return; }
    464   if (!strcmp(token, "serverip")) { cfg->c33_srvip=inet_addr(value); return; }
    465   if (!strcmp(token, "nocrypt")) { chk_iprange(value, &cfg->c33_plain); return; }
    466   if (!strcmp(token, "passive")) { cfg->c33_passive=(value[0]!='0'); return; }
    467   if (!strcmp(token, "key"))
    468   {
    469     if (key_atob(value, cfg->c33_key))
    470     {
    471       fprintf(stderr, "Configuration camd3.3x: Error in Key\n");
    472       exit(1);
    473     }
    474     cfg->c33_crypted=1;
    475     return;
    476   }
    477   if (token[0] != '#')
    478     fprintf(stderr, "Warning: keyword '%s' in camd33 section not recognized\n",token);
     608    if (!strcmp(token, "port")) {
     609        if(strlen(value) == 0) {
     610            cfg->c33_port = 0;
     611            return;
     612        } else {
     613            cfg->c33_port = atoi(value);
     614            return;
     615        }
     616    }
     617
     618    if (!strcmp(token, "serverip")) {
     619        if(strlen(value) == 0) {
     620            cfg->c33_srvip = 0;
     621            return;
     622        } else {
     623            cfg->c33_srvip = inet_addr(value);
     624            return;
     625        }
     626    }
     627
     628    if (!strcmp(token, "nocrypt")) {
     629        if(strlen(value) == 0) {
     630            return;
     631        } else {
     632            chk_iprange(value, &cfg->c33_plain);
     633            return;
     634        }
     635    }
     636
     637    if (!strcmp(token, "passive")) {
     638        cfg->c33_passive = (value[0]!='0');
     639        return;
     640    }
     641
     642    if (!strcmp(token, "key")) {
     643        if (key_atob(value, cfg->c33_key)) {
     644            fprintf(stderr, "Configuration camd3.3x: Error in Key\n");
     645            exit(1);
     646        }
     647        cfg->c33_crypted=1;
     648        return;
     649    }
     650
     651    if (token[0] != '#')
     652        cs_log( "Warning: keyword '%s' in camd33 section not recognized",token);
    479653}
    480654
    481655void chk_t_camd35(char *token, char *value)
    482656{
    483   if (!strcmp(token, "port")) { cfg->c35_port=atoi(value); return; }
    484   if (!strcmp(token, "serverip")) { cfg->c35_tcp_srvip=inet_addr(value); return; }
    485   if (!strcmp(token, "suppresscmd08")) { cfg->c35_suppresscmd08=atoi(value); return; }
    486   if (token[0] != '#')
    487     fprintf(stderr, "Warning: keyword '%s' in camd35 section not recognized\n",token);
     657    if (!strcmp(token, "port")) {
     658        if(strlen(value) == 0) {
     659            cfg->c35_port = 0;
     660            return;
     661        } else {
     662            cfg->c35_port = atoi(value);
     663            return;
     664        }
     665    }
     666
     667    if (!strcmp(token, "serverip")) {
     668        if(strlen(value) == 0) {
     669            cfg->c35_tcp_srvip = 0;
     670            return;
     671        } else {
     672            cfg->c35_tcp_srvip = inet_addr(value);
     673            return;
     674        }
     675    }
     676
     677    if (!strcmp(token, "suppresscmd08")) {
     678        if(strlen(value) == 0) {
     679            cfg->c35_suppresscmd08 = 0;
     680            return;
     681        } else {
     682            cfg->c35_suppresscmd08=atoi(value);
     683            return;
     684        }
     685    }
     686
     687    if (token[0] != '#')
     688        cs_log( "Warning: keyword '%s' in camd35 section not recognized", token);
    488689}
    489690
    490691void chk_t_camd35_tcp(char *token, char *value)
    491692{
    492   if (!strcmp(token, "port")) { chk_port_tab(value, &cfg->c35_tcp_ptab); return; }
    493   if (!strcmp(token, "serverip")) { cfg->c35_tcp_srvip=inet_addr(value); return; }
    494   if (!strcmp(token, "suppresscmd08")) { cfg->c35_suppresscmd08=atoi(value); return; }
    495   if (token[0] != '#')
    496     fprintf(stderr, "Warning: keyword '%s' in camd35 tcp section not recognized\n",token);
     693    if (!strcmp(token, "port")) {
     694        if(strlen(value) == 0) {
     695            clear_ptab(&cfg->c35_tcp_ptab);
     696            return;
     697        } else {
     698            chk_port_tab(value, &cfg->c35_tcp_ptab);
     699            return;
     700        }
     701    }
     702
     703    if (!strcmp(token, "serverip")) {
     704        if(strlen(value) == 0) {
     705            cfg->c35_tcp_srvip = 0;
     706            return;
     707        } else {
     708            cfg->c35_tcp_srvip = inet_addr(value);
     709            return;
     710        }
     711    }
     712
     713    if (!strcmp(token, "suppresscmd08")) {
     714        if(strlen(value) == 0) {
     715            cfg->c35_suppresscmd08 = 0;
     716            return;
     717        } else {
     718            cfg->c35_suppresscmd08 = atoi(value);
     719            return;
     720        }
     721    }
     722
     723    if (token[0] != '#')
     724        cs_log( "Warning: keyword '%s' in camd35 tcp section not recognized", token);
    497725}
    498726
    499727void chk_t_newcamd(char *token, char *value)
    500728{
    501   if (!strcmp(token, "port")) { chk_port_tab(value, &cfg->ncd_ptab); return; }
    502   if (!strcmp(token, "serverip")) { cfg->ncd_srvip=inet_addr(value); return; }
    503   if (!strcmp(token, "allowed")) { chk_iprange(value, &cfg->ncd_allowed); return; }
    504   if (!strcmp(token, "key"))
    505   {
    506     if (key_atob14(value, cfg->ncd_key))
    507     {
    508       fprintf(stderr, "Configuration newcamd: Error in Key\n");
    509       exit(1);
    510     }
    511     return;
    512   }
    513   if (!strcmp(token, "keepalive"))
    514   {
    515     cfg->ncd_keepalive=atoi(value);
    516     return;
    517   }
    518   if (token[0] != '#')
    519     fprintf(stderr, "Warning: keyword '%s' in newcamd section not recognized\n",token);
     729    if (!strcmp(token, "port")) {
     730        if(strlen(value) == 0) {
     731            clear_ptab(&cfg->ncd_ptab);
     732            return;
     733        } else {
     734            chk_port_tab(value, &cfg->ncd_ptab);
     735            return;
     736        }
     737    }
     738
     739    if (!strcmp(token, "serverip")) {
     740        if(strlen(value) == 0) {
     741            cfg->ncd_srvip = 0;
     742            return;
     743        } else {
     744            cfg->ncd_srvip = inet_addr(value);
     745            return;
     746        }
     747    }
     748
     749    if (!strcmp(token, "allowed")) {
     750        if(strlen(value) == 0) {
     751            clear_sip(&cfg->ncd_allowed);
     752            return;
     753        } else {
     754            chk_iprange(value, &cfg->ncd_allowed);
     755            return;
     756        }
     757    }
     758
     759    if (!strcmp(token, "key")) {
     760        if (key_atob14(value, cfg->ncd_key)) {
     761            fprintf(stderr, "Configuration newcamd: Error in Key\n");
     762            exit(1);
     763        }
     764        return;
     765    }
     766
     767    if (!strcmp(token, "keepalive")) {
     768        if(strlen(value) == 0) {
     769            cfg->ncd_keepalive = 1;
     770            return;
     771        } else {
     772            cfg->ncd_keepalive = atoi(value);
     773            return;
     774        }
     775    }
     776
     777    if (token[0] != '#')
     778        cs_log( "Warning: keyword '%s' in newcamd section not recognized", token);
    520779}
    521780
    522781void chk_t_cccam(char *token, char *value)
    523782{
    524   if (!strcmp(token, "port")) { cfg->cc_port=atoi(value); return; }
    525   //if (!strcmp(token, "serverip")) { cfg->cc_srvip=inet_addr(value); return; }
    526   if (!strcmp(token, "reshare")) { cfg->cc_reshare=atoi(value); return; }
    527   if (!strcmp(token, "version")) {  // cccam version
    528   if (strlen(value)>sizeof(cfg->cc_version)-1) {
    529       fprintf(stderr, "cccam config: version too long\n");
    530       exit(1);
    531     }
    532     memset(cfg->cc_version, 0, sizeof(cfg->cc_version));
    533     strncpy((char*)cfg->cc_version, value, sizeof(cfg->cc_version)-1);
    534     return;
    535   }
    536   if (!strcmp(token, "build")) {  // cccam build number
    537     if (strlen(value)>sizeof(cfg->cc_build)-1) {
    538       fprintf(stderr, "cccam config build number too long\n");
    539       exit(1);
    540     }
    541     memset(cfg->cc_build, 0, sizeof(cfg->cc_build));
    542     strncpy((char*)cfg->cc_build, value, sizeof(cfg->cc_build)-1);
    543     return;
    544   }
    545   if (token[0] != '#')
    546     fprintf(stderr, "Warning: keyword '%s' in cccam section not recognized\n",token);
     783    if (!strcmp(token, "port")) {
     784        if(strlen(value) == 0) {
     785            cfg->cc_port = 0;
     786            return;
     787        } else {
     788            cfg->cc_port = atoi(value);
     789            return;
     790        }
     791    }
     792    //if (!strcmp(token, "serverip")) { cfg->cc_srvip=inet_addr(value); return; }
     793
     794    if (!strcmp(token, "reshare")) {
     795        if(strlen(value) == 0) {
     796            cfg->cc_reshare = 0;
     797            return;
     798        } else {
     799            cfg->cc_reshare=atoi(value);
     800            return;
     801        }
     802    }
     803    // cccam version
     804    if (!strcmp(token, "version")) {
     805        if (strlen(value) > sizeof(cfg->cc_version) - 1) {
     806            fprintf(stderr, "cccam config: version too long\n");
     807            exit(1);
     808        }
     809        memset(cfg->cc_version, 0, sizeof(cfg->cc_version));
     810        strncpy((char*)cfg->cc_version, value, sizeof(cfg->cc_version) - 1);
     811        return;
     812    }
     813    // cccam build number
     814    if (!strcmp(token, "build")) {
     815        if (strlen(value) > sizeof(cfg->cc_build) - 1) {
     816            fprintf(stderr, "cccam config build number too long\n");
     817            exit(1);
     818        }
     819        memset(cfg->cc_build, 0, sizeof(cfg->cc_build));
     820        strncpy((char*)cfg->cc_build, value, sizeof(cfg->cc_build)-1);
     821        return;
     822    }
     823
     824    if (token[0] != '#')
     825        cs_log( "Warning: keyword '%s' in cccam section not recognized",token);
    547826}
    548827
    549828void chk_t_radegast(char *token, char *value)
    550829{
    551   if (!strcmp(token, "port")) { cfg->rad_port=atoi(value); return; }
    552   if (!strcmp(token, "serverip")) { cfg->rad_srvip=inet_addr(value); return; }
    553   if (!strcmp(token, "allowed")) { chk_iprange(value, &cfg->rad_allowed); return; }
    554   if (!strcmp(token, "user")) { strncpy(cfg->rad_usr, value, sizeof(cfg->rad_usr)-1); return; }
    555   if (token[0] != '#')
    556     fprintf(stderr, "Warning: keyword '%s' in radegast section not recognized\n",token);
     830    if (!strcmp(token, "port")) {
     831        if(strlen(value) == 0) {
     832            cfg->rad_port = 0;
     833            return;
     834        } else {
     835            cfg->rad_port = atoi(value);
     836            return;
     837        }
     838    }
     839
     840    if (!strcmp(token, "serverip")) {
     841        if(strlen(value) == 0) {
     842            cfg->rad_srvip = 0;
     843            return;
     844        } else {
     845            cfg->rad_srvip = inet_addr(value);
     846            return;
     847        }
     848    }
     849
     850    if (!strcmp(token, "allowed")) {
     851        if(strlen(value) == 0) {
     852            clear_sip(&cfg->rad_allowed);
     853            return;
     854        } else {
     855            chk_iprange(value, &cfg->rad_allowed);
     856            return;
     857        }
     858    }
     859
     860    if (!strcmp(token, "user")) {
     861        cs_strncpy(cfg->rad_usr, value, sizeof(cfg->rad_usr));
     862        return;
     863    }
     864
     865    if (token[0] != '#')
     866        cs_log( "Warning: keyword '%s' in radegast section not recognized", token);
    557867}
    558868
    559869void chk_t_serial(char *token, char *value)
    560870{
    561   if (!strcmp(token, "device"))
    562   {
    563     int l;
    564     l=strlen(cfg->ser_device);
    565     if (l) cfg->ser_device[l++]=1;  // use ctrl-a as delimiter
    566     strncpy(cfg->ser_device+l, value, sizeof(cfg->ser_device)-1-l);
    567     return;
    568   }
    569   if (token[0] != '#')
    570     fprintf(stderr, "Warning: keyword '%s' in serial section not recognized\n",token);
     871    if (!strcmp(token, "device")) {
     872        int l;
     873        l = strlen(cfg->ser_device);
     874        if (l)
     875            cfg->ser_device[l++]=1;  // use ctrl-a as delimiter
     876        cs_strncpy(cfg->ser_device+l, value, sizeof(cfg->ser_device)-l);
     877        return;
     878    }
     879    if (token[0] != '#')
     880        cs_log( "Warning: keyword '%s' in serial section not recognized", token);
    571881}
    572882
     
    577887  if (!strcmp(token, "password")) { cs_atob(cfg->gbox_pwd, value, 4); return; }
    578888  if (!strcmp(token, "maxdist")) { cfg->maxdist=atoi(value); return; }
    579   if (!strcmp(token, "ignorelist")) { strncpy((char *)cfg->ignorefile, value, sizeof(cfg->ignorefile)-1); return; }
    580   if (!strcmp(token, "onlineinfos")) { strncpy((char *)cfg->gbxShareOnl, value, sizeof(cfg->gbxShareOnl)-1); return; }
    581   if (!strcmp(token, "cardinfos")) { strncpy((char *)cfg->cardfile, value, sizeof(cfg->cardfile)-1); return; }
     889  if (!strcmp(token, "ignorelist")) { cs_strncpy((char *)cfg->ignorefile, value, sizeof(cfg->ignorefile)); return; }
     890  if (!strcmp(token, "onlineinfos")) { cs_strncpy((char *)cfg->gbxShareOnl, value, sizeof(cfg->gbxShareOnl)); return; }
     891  if (!strcmp(token, "cardinfos")) { cs_strncpy((char *)cfg->cardfile, value, sizeof(cfg->cardfile)); return; }
    582892  if (!strcmp(token, "locals"))
    583893  {
     
    600910void chk_t_dvbapi(char *token, char *value)
    601911{
    602     if (!strcmp(token, "enabled"))  { cfg->dvbapi_enabled=atoi(value); return; }
    603     if (!strcmp(token, "au"))   { cfg->dvbapi_au=atoi(value); return; }
    604     if (!strcmp(token, "boxtype"))  { strncpy(cfg->dvbapi_boxtype, value, sizeof(cfg->dvbapi_boxtype)-1); return; }
    605     if (!strcmp(token, "user"))     { strncpy(cfg->dvbapi_usr, value, sizeof(cfg->dvbapi_usr)-1); return; }
    606         if (!strcmp(token, "priority")) { strncpy(cfg->dvbapi_priority, value, sizeof(cfg->dvbapi_priority)-1); return; }
    607         if (!strcmp(token, "ignore"))   { strncpy(cfg->dvbapi_ignore, value, sizeof(cfg->dvbapi_ignore)-1); return; }
    608    
     912    if (!strcmp(token, "enabled"))  { cfg->dvbapi_enabled=atoi(value); return; }
     913    if (!strcmp(token, "au"))       { cfg->dvbapi_au=atoi(value); return; }
     914    if (!strcmp(token, "boxtype"))  { cs_strncpy(cfg->dvbapi_boxtype, value, sizeof(cfg->dvbapi_boxtype)); return; }
     915    if (!strcmp(token, "user"))     { cs_strncpy(cfg->dvbapi_usr, value, sizeof(cfg->dvbapi_usr)); return; }
     916    if (!strcmp(token, "priority")) { cs_strncpy(cfg->dvbapi_priority, value, sizeof(cfg->dvbapi_priority)); return; }
     917    if (!strcmp(token, "ignore"))   { cs_strncpy(cfg->dvbapi_ignore, value, sizeof(cfg->dvbapi_ignore)); return; }
     918
    609919    if (token[0] != '#')
    610         fprintf(stderr, "Warning: keyword '%s' in dvbapi section not recognized\n",token);
     920        fprintf(stderr, "Warning: keyword '%s' in dvbapi section not recognized\n",token);
    611921}
    612922#endif
     
    614924static void chk_token(char *token, char *value, int tag)
    615925{
    616   switch(tag)
    617   {
    618     case TAG_GLOBAL  : chk_t_global(token, value); break;
    619     case TAG_MONITOR : chk_t_monitor(token, value); break;
    620     case TAG_CAMD33  : chk_t_camd33(token, value); break;
    621     case TAG_CAMD35  :
    622     case TAG_CS357X  : chk_t_camd35(token, value); break;
    623     case TAG_NEWCAMD : chk_t_newcamd(token, value); break;
    624     case TAG_RADEGAST: chk_t_radegast(token, value); break;
    625     case TAG_SERIAL  : chk_t_serial(token, value); break;
    626     case TAG_CS378X  : chk_t_camd35_tcp(token, value); break;
     926    switch(tag) {
     927        case TAG_GLOBAL  : chk_t_global(token, value); break;
     928        case TAG_MONITOR : chk_t_monitor(token, value); break;
     929        case TAG_CAMD33  : chk_t_camd33(token, value); break;
     930        case TAG_CAMD35  :
     931        case TAG_CS357X  : chk_t_camd35(token, value); break;
     932        case TAG_NEWCAMD : chk_t_newcamd(token, value); break;
     933        case TAG_RADEGAST: chk_t_radegast(token, value); break;
     934        case TAG_SERIAL  : chk_t_serial(token, value); break;
     935        case TAG_CS378X  : chk_t_camd35_tcp(token, value); break;
    627936#ifdef CS_WITH_GBOX
    628     case TAG_GBOX    : chk_t_gbox(token, value); break;
    629 #endif
    630     case TAG_CCCAM   : chk_t_cccam(token, value); break;
     937        case TAG_GBOX    : chk_t_gbox(token, value); break;
     938#endif
     939        case TAG_CCCAM   : chk_t_cccam(token, value); break;
    631940#ifdef HAVE_DVBAPI
    632     case TAG_DVBAPI  : chk_t_dvbapi(token, value); break;
     941        case TAG_DVBAPI  : chk_t_dvbapi(token, value); break;
    633942#else
    634     case TAG_DVBAPI  : fprintf(stderr, "Warning: OSCam compiled without DVB API support.\n"); break;
     943        case TAG_DVBAPI  : fprintf(stderr, "Warning: OSCam compiled without DVB API support.\n"); break;
    635944#endif
    636945#ifdef CS_ANTICASC
    637     case TAG_ANTICASC: chk_t_ac(token, value); break;
    638 #endif
    639   }
     946        case TAG_ANTICASC: chk_t_ac(token, value); break;
     947#endif
     948    }
    640949}
    641950
    642951void init_len4caid()
    643952{
    644   int nr;
    645   FILE *fp;
    646   char *value;
    647 
    648   memset(len4caid, 0, sizeof(ushort)<<8);
    649   sprintf(token, "%s%s", cs_confdir, cs_l4ca);
    650   if (!(fp=fopen(token, "r")))
    651     return;
    652   for(nr=0; fgets(token, sizeof(token), fp);)
    653   {
    654     int i, c;
    655     char *ptr;
    656     if (!(value=strchr(token, ':'))) continue;
    657     *value++='\0';
    658     if( (ptr=strchr(value, '#')) )
    659       *ptr='\0';
    660     if (strlen(trim(token))!=2) continue;
    661     if (strlen(trim(value))!=4) continue;
    662     if ((i=byte_atob(token))<0) continue;
    663     if ((c=word_atob(value))<0) continue;
    664 //printf("idx %02X = %04X\n", i, c); fflush(stdout);
    665     len4caid[i]=c;
    666     nr++;
    667   }
    668   fclose(fp);
    669   cs_log("%d lengths for caid guessing loaded", nr);
    670   return;
     953    int nr;
     954    FILE *fp;
     955    char *value;
     956
     957    memset(len4caid, 0, sizeof(ushort)<<8);
     958    sprintf(token, "%s%s", cs_confdir, cs_l4ca);
     959    if (!(fp = fopen(token, "r")))
     960        return;
     961    for(nr = 0; fgets(token, sizeof(token), fp);) {
     962        int i, c;
     963        char *ptr;
     964        if (!(value=strchr(token, ':')))
     965            continue;
     966        *value++ ='\0';
     967        if( (ptr = strchr(value, '#')) )
     968            *ptr = '\0';
     969        if (strlen(trim(token)) != 2)
     970            continue;
     971        if (strlen(trim(value)) != 4)
     972            continue;
     973        if ((i = byte_atob(token)) < 0)
     974            continue;
     975        if ((c = word_atob(value)) < 0)
     976            continue;
     977        len4caid[i] = c;
     978        nr++;
     979    }
     980    fclose(fp);
     981    cs_log("%d lengths for caid guessing loaded", nr);
     982    return;
    671983}
    672984
    673985int search_boxkey(ushort caid, char *key)
    674986{
    675   int i, rc=0;
    676   FILE *fp;
    677   char c_caid[512];
    678 
    679   sprintf(c_caid, "%s%s", cs_confdir, cs_cert);
    680   fp=fopen(c_caid, "r");
    681   if (fp)
    682   {
    683     for (; (!rc) && fgets(c_caid, sizeof(c_caid), fp);)
    684     {
    685       char *c_provid, *c_key;
    686 
    687       c_provid=strchr(c_caid, '#');
    688       if (c_provid) *c_provid='\0';
    689       if (!(c_provid=strchr(c_caid, ':'))) continue;
    690       *c_provid++='\0';
    691       if (!(c_key=strchr(c_provid, ':'))) continue;
    692       *c_key++='\0';
    693       if (word_atob(trim(c_caid))!=caid) continue;
    694       if ((i=(strlen(trim(c_key))>>1))>256) continue;
    695       if (cs_atob((uchar *)key, c_key, i)<0)
    696       {
    697         cs_log("wrong key in \"%s\"", cs_cert);
    698         continue;
    699       }
    700       rc=1;
    701     }
    702     fclose(fp);
    703   }
     987    int i, rc = 0;
     988    FILE *fp;
     989    char c_caid[512];
     990
     991    sprintf(c_caid, "%s%s", cs_confdir, cs_cert);
     992    fp = fopen(c_caid, "r");
     993    if (fp) {
     994        for (; (!rc) && fgets(c_caid, sizeof(c_caid), fp);) {
     995            char *c_provid, *c_key;
     996
     997            c_provid = strchr(c_caid, '#');
     998            if (c_provid)
     999                *c_provid = '\0';
     1000            if (!(c_provid = strchr(c_caid, ':')))
     1001                continue;
     1002            *c_provid++ ='\0';
     1003            if (!(c_key = strchr(c_provid, ':')))
     1004                continue;
     1005            *c_key++ ='\0';
     1006            if (word_atob(trim(c_caid))!=caid)
     1007                continue;
     1008            if ((i=(strlen(trim(c_key))>>1)) > 256)
     1009                continue;
     1010            if (cs_atob((uchar *)key, c_key, i) < 0) {
     1011                cs_log("wrong key in \"%s\"", cs_cert);
     1012                continue;
     1013            }
     1014            rc = 1;
     1015        }
     1016        fclose(fp);
     1017    }
    7041018#ifdef OSCAM_INBUILD_KEYS
    705   for(i=0; (!rc) && (npkey[i].keylen); i++)
    706     if (rc=((caid==npkey[i].caid) && (npkey[i].provid==0)))
    707       memcpy(key, npkey[i].key, npkey[i].keylen);
    708 #endif
    709   return(rc);
     1019    for(i=0; (!rc) && (npkey[i].keylen); i++)
     1020        if (rc=((caid==npkey[i].caid) && (npkey[i].provid==0)))
     1021            memcpy(key, npkey[i].key, npkey[i].keylen);
     1022#endif
     1023    return(rc);
    7101024}
    7111025
    7121026int init_config()
    7131027{
    714   int tag=TAG_GLOBAL;
    715   FILE *fp;
    716   char *value;
     1028    int tag=TAG_GLOBAL;
     1029    FILE *fp;
     1030    char *value;
    7171031
    7181032#ifndef CS_EMBEDDED
    7191033#ifdef PRIO_PROCESS
    720   errno=0;
    721   if ((cfg->nice=getpriority(PRIO_PROCESS, 0))==(-1))
    722     if (errno)
    723 #endif
    724 #endif
    725   cfg->nice=99;
    726   cfg->ctimeout=CS_CLIENT_TIMEOUT;
    727   cfg->ftimeout=CS_CLIENT_TIMEOUT / 2;
    728   cfg->cmaxidle=CS_CLIENT_MAXIDLE;
    729   cfg->delay=CS_DELAY;
    730   cfg->bindwait=CS_BIND_TIMEOUT;
    731   cfg->resolvedelay=CS_RESOLVE_DELAY;
    732   cfg->mon_level=2;
    733   cfg->mon_hideclient_to=0;
    734   cfg->srtimeout=1500;
    735   cfg->ulparent=0;
    736     cfg->logfile=NULL;
    737     cfg->pidfile=NULL;
    738     cfg->usrfile=NULL;
    739     cfg->cwlogdir=NULL;
     1034    errno=0;
     1035    if ((cfg->nice = getpriority(PRIO_PROCESS, 0)) == (-1))
     1036    if (errno)
     1037#endif
     1038#endif
     1039    cfg->nice = 99;
     1040    cfg->ctimeout = CS_CLIENT_TIMEOUT;
     1041    cfg->ftimeout = CS_CLIENT_TIMEOUT / 2;
     1042    cfg->cmaxidle = CS_CLIENT_MAXIDLE;
     1043    cfg->delay = CS_DELAY;
     1044    cfg->bindwait = CS_BIND_TIMEOUT;
     1045    cfg->resolvedelay = CS_RESOLVE_DELAY;
     1046    cfg->mon_level = 2;
     1047    cfg->mon_hideclient_to = 0;
     1048    cfg->srtimeout = 1500;
     1049    cfg->ulparent = 0;
     1050    cfg->logfile = NULL;
     1051    cfg->pidfile = NULL;
     1052    cfg->usrfile = NULL;
     1053    cfg->cwlogdir = NULL;
    7401054#ifdef CS_ANTICASC
    741   cfg->ac_enabled=0;
    742   cfg->ac_users=0;
    743   cfg->ac_stime=2;
    744   cfg->ac_samples=10;
    745   cfg->ac_denysamples=8;
    746   cfg->ac_fakedelay=1000;
    747   strcpy(cfg->ac_logfile, "./oscam_ac.log");
    748 #endif
    749   cfg->ncd_keepalive=1;
    750   sprintf(token, "%s%s", cs_confdir, cs_conf);
    751   if (!(fp=fopen(token, "r")))
    752   {
    753     fprintf(stderr, "Cannot open config file '%s' (errno=%d)\n", token, errno);
    754     exit(1);
    755   }
    756   while (fgets(token, sizeof(token), fp))
    757   {
    758     int i, l;
    759     //void *ptr;
    760     if ((l=strlen(trim(token)))<3) continue;
    761     if ((token[0]=='[') && (token[l-1]==']'))
    762     {
    763       for (token[l-1]=0, tag=-1, i=TAG_GLOBAL; cctag[i]; i++)
    764         if (!strcmp(cctag[i], strtolower(token+1)))
    765           tag=i;
    766       continue;
    767     }
    768     if (!(value=strchr(token, '='))) continue;
    769     *value++='\0';
    770     chk_token(trim(strtolower(token)), trim(value), tag);
    771   }
    772   fclose(fp);
     1055    cfg->ac_enabled = 0;
     1056    cfg->ac_users = 0;
     1057    cfg->ac_stime = 2;
     1058    cfg->ac_samples = 10;
     1059    cfg->ac_denysamples = 8;
     1060    cfg->ac_fakedelay = 1000;
     1061    strcpy(cfg->ac_logfile, "./oscam_ac.log");
     1062#endif
     1063    cfg->ncd_keepalive=1;
     1064    sprintf(token, "%s%s", cs_confdir, cs_conf);
     1065    if (!(fp = fopen(token, "r"))) {
     1066        fprintf(stderr, "Cannot open config file '%s' (errno=%d)\n", token, errno);
     1067        exit(1);
     1068    }
     1069    while (fgets(token, sizeof(token), fp)) {
     1070        int i, l;
     1071        //void *ptr;
     1072        if ((l = strlen(trim(token))) < 3)
     1073            continue;
     1074        if ((token[0] == '[') && (token[l-1] == ']')) {
     1075            for (token[l-1] = 0, tag = -1, i = TAG_GLOBAL; cctag[i]; i++)
     1076                if (!strcmp(cctag[i], strtolower(token+1)))
     1077                    tag = i;
     1078            continue;
     1079        }
     1080        if (!(value=strchr(token, '=')))
     1081            continue;
     1082        *value++ ='\0';
     1083        chk_token(trim(strtolower(token)), trim(value), tag);
     1084    }
     1085    fclose(fp);
    7731086#ifdef CS_LOGFILE
    7741087    if (cfg->logfile == NULL)
    7751088        asprintf(&(cfg->logfile), "%s", CS_LOGFILE);
    7761089#endif
    777   cs_init_log(cfg->logfile);
    778   if (cfg->ftimeout>=cfg->ctimeout)
    779   {
    780     cfg->ftimeout = cfg->ctimeout - 100;
    781     cs_log("WARNING: fallbacktimeout adjusted to %lu ms (must be smaller than clienttimeout (%lu ms))", cfg->ftimeout, cfg->ctimeout);
    782   }
    783   if(cfg->ftimeout < cfg->srtimeout)
    784   {
    785     cfg->ftimeout = cfg->srtimeout + 100;
    786     cs_log("WARNING: fallbacktimeout adjusted to %lu ms (must be greater than serialreadertimeout (%lu ms))", cfg->ftimeout, cfg->srtimeout);
    787   }
    788   if(cfg->ctimeout < cfg->srtimeout)
    789   {
    790     cfg->ctimeout = cfg->srtimeout + 100;
    791     cs_log("WARNING: clienttimeout adjusted to %lu ms (must be greater than serialreadertimeout (%lu ms))", cfg->ctimeout, cfg->srtimeout);
    792   }
     1090    cs_init_log(cfg->logfile);
     1091    if (cfg->ftimeout >= cfg->ctimeout) {
     1092        cfg->ftimeout = cfg->ctimeout - 100;
     1093        cs_log("WARNING: fallbacktimeout adjusted to %lu ms (must be smaller than clienttimeout (%lu ms))", cfg->ftimeout, cfg->ctimeout);
     1094    }
     1095    if(cfg->ftimeout < cfg->srtimeout) {
     1096        cfg->ftimeout = cfg->srtimeout + 100;
     1097        cs_log("WARNING: fallbacktimeout adjusted to %lu ms (must be greater than serialreadertimeout (%lu ms))", cfg->ftimeout, cfg->srtimeout);
     1098    }
     1099    if(cfg->ctimeout < cfg->srtimeout) {
     1100        cfg->ctimeout = cfg->srtimeout + 100;
     1101        cs_log("WARNING: clienttimeout adjusted to %lu ms (must be greater than serialreadertimeout (%lu ms))", cfg->ctimeout, cfg->srtimeout);
     1102    }
    7931103#ifdef CS_ANTICASC
    794   if( cfg->ac_denysamples+1>cfg->ac_samples )
    795   {
    796     cfg->ac_denysamples=cfg->ac_samples-1;
    797     cs_log("WARNING: DenySamples adjusted to %d", cfg->ac_denysamples);
    798   }
    799 #endif
    800   return 0;
     1104    if( cfg->ac_denysamples+1 > cfg->ac_samples ) {
     1105        cfg->ac_denysamples = cfg->ac_samples - 1;
     1106        cs_log("WARNING: DenySamples adjusted to %d", cfg->ac_denysamples);
     1107    }
     1108#endif
     1109    return 0;
    8011110}
    8021111
    8031112void chk_account(char *token, char *value, struct s_auth *account)
    8041113{
    805   int i;
    806   char *ptr1;//, *ptr2;
    807   if (!strcmp(token, "user")) { strncpy(account->usr, value, sizeof(account->usr)-1); return; }
    808   if (!strcmp(token, "pwd")) { strncpy(account->pwd, value, sizeof(account->pwd)-1); return; }
    809   if (!strcmp(token, "hostname")) { strncpy((char *)account->dyndns, value, sizeof(account->dyndns)-1); return; }
    810   if (!strcmp(token, "betatunnel")) { chk_tuntab(value, &account->ttab); return; }
    811   if (!strcmp(token, "uniq")) { account->uniq=atoi(value); return; }
    812   if (!strcmp(token, "sleep")) { account->tosleep=atoi(value); return; }
    813   if (!strcmp(token, "monlevel")) { account->monlvl=atoi(value); return; }
    814   if (!strcmp(token, "caid")) { chk_caidtab(value, &account->ctab); return; }
    815   if (!strcmp(token, "disabled")) { account->disabled=atoi(value); return; }
    816   if (!strcmp(token, "suppresscmd08")) { account->c35_suppresscmd08=atoi(value); return; }
    817   if (!strcmp(token, "keepalive"))
    818   {
    819     account->ncd_keepalive = atoi(value);
    820     return;
    821   }
    822   /*
    823    *  case insensitive
    824    */
    825   strtolower(value);
    826   if (!strcmp(token, "au"))
    827   {
    828     if(value && value[0]=='1') account->autoau=1;
    829     for (i=0; i<CS_MAXREADER; i++)
    830       if ((reader[i].label[0]) &&
    831           (!strncmp(reader[i].label, value, strlen(reader[i].label))))
    832         account->au=i;
    833     return;
    834   }
    835   if (!strcmp(token, "group"))\
    836   {
    837     for (ptr1=strtok(value, ","); ptr1; ptr1=strtok(NULL, ","))
    838     {
    839       int g;
    840       g=atoi(ptr1);
    841       if ((g>0) && (g<33)) account->grp|=(1<<(g-1));
    842     }
    843     return;
    844   }
    845   if(!strcmp(token, "services")) { chk_services(value, &account->sidtabok, &account->sidtabno); return; }
    846   if(!strcmp(token, "ident")) { chk_ftab(value, &account->ftab, "user", account->usr, "provid"); return; }
    847   if(!strcmp(token, "class")) { chk_cltab(value, &account->cltab); return; }
    848   if(!strcmp(token, "chid")) {  chk_ftab(value, &account->fchid, "user", account->usr, "chid"); return; }
    849 
    850   if (!strcmp(token, "expdate"))
    851   {
    852         if (!value[0]) {
    853                 account->expirationdate=(time_t)NULL;
    854                 return;
    855         }
    856     struct tm cstime;
    857     memset(&cstime,0,sizeof(cstime));
    858     for (i=0, ptr1=strtok(value, "-/"); (i<3)&&(ptr1); ptr1=strtok(NULL, "-/"), i++)
    859     {
    860       switch(i)
    861       {
    862         case 0: cstime.tm_year=atoi(ptr1)-1900; break;
    863         case 1: cstime.tm_mon =atoi(ptr1)-1;    break;
    864         case 2: cstime.tm_mday=atoi(ptr1);      break;
    865       }
    866     }
    867     account->expirationdate=mktime(&cstime);
    868     return;
    869   }
     1114    int i;
     1115    char *ptr1;
     1116
     1117    if (!strcmp(token, "user")) {
     1118        cs_strncpy(account->usr, value, sizeof(account->usr));
     1119        return;
     1120    }
     1121
     1122    if (!strcmp(token, "pwd")) {
     1123        cs_strncpy(account->pwd, value, sizeof(account->pwd));
     1124        return;
     1125    }
     1126
     1127    if (!strcmp(token, "hostname")) {
     1128        cs_strncpy((char *)account->dyndns, value, sizeof(account->dyndns));
     1129        return;
     1130    }
     1131
     1132    if (!strcmp(token, "betatunnel")) {
     1133        if(strlen(value) == 0) {
     1134            clear_tuntab(&account->ttab);
     1135            return;
     1136        } else {
     1137            chk_tuntab(value, &account->ttab);
     1138            return;
     1139        }
     1140    }
     1141
     1142    if (!strcmp(token, "uniq")) {
     1143        if(strlen(value) == 0) {
     1144            account->uniq = 0;
     1145            return;
     1146        } else {
     1147            account->uniq = atoi(value);
     1148            return;
     1149        }
     1150    }
     1151
     1152    if (!strcmp(token, "sleep")) {
     1153        if(strlen(value) == 0) {
     1154            account->tosleep = 0;
     1155            return;
     1156        } else {
     1157            account->tosleep=atoi(value);
     1158            return;
     1159        }
     1160    }
     1161
     1162    if (!strcmp(token, "monlevel")) {
     1163        if(strlen(value) == 0) {
     1164            account->monlvl = 0;
     1165            return;
     1166        } else {
     1167            account->monlvl = atoi(value);
     1168            return;
     1169        }
     1170    }
     1171
     1172    if (!strcmp(token, "caid")) {
     1173        if(strlen(value) == 0) {
     1174            clear_caidtab(&account->ctab);
     1175            return;
     1176        } else {
     1177            chk_caidtab(value, &account->ctab);
     1178            return;
     1179        }
     1180    }
     1181
     1182    if (!strcmp(token, "disabled")) {
     1183        if(strlen(value) == 0) {
     1184            account->disabled = 0;
     1185            return;
     1186        } else {
     1187            account->disabled = atoi(value);
     1188            return;
     1189        }
     1190    }
     1191
     1192    if (!strcmp(token, "suppresscmd08")) {
     1193        if(strlen(value) == 0) {
     1194            account->c35_suppresscmd08 = 0;
     1195            return;
     1196        } else {
     1197            account->c35_suppresscmd08=atoi(value);
     1198            return;
     1199        }
     1200    }
     1201
     1202    if (!strcmp(token, "keepalive")) {
     1203        if(strlen(value) == 0) {
     1204            account->ncd_keepalive = 1;
     1205            return;
     1206        } else {
     1207            account->ncd_keepalive = atoi(value);
     1208            return;
     1209        }
     1210    }
     1211    /*
     1212    *  case insensitive
     1213    */
     1214    strtolower(value);
     1215
     1216    if (!strcmp(token, "au")) {
     1217        //set default values for usage during runtime from Webif
     1218        account->au=-1;
     1219        account->autoau=0;
     1220
     1221        if(value && value[0]=='1') account->autoau=1;
     1222            for (i=0; i<CS_MAXREADER; i++)
     1223                if ((reader[i].label[0]) && (!strncmp(reader[i].label, value, strlen(reader[i].label))))
     1224                    account->au=i;
     1225        return;
     1226    }
     1227
     1228    if (!strcmp(token, "group")) {
     1229        account->grp = 0;
     1230        for (ptr1=strtok(value, ","); ptr1; ptr1=strtok(NULL, ",")) {
     1231            int g;
     1232            g = atoi(ptr1);
     1233            if ((g>0) && (g < 33)) account->grp|=(1<<(g-1));
     1234        }
     1235        return;
     1236    }
     1237
     1238    if(!strcmp(token, "services")) {
     1239        chk_services(value, &account->sidtabok, &account->sidtabno);
     1240        return;
     1241    }
     1242
     1243    if(!strcmp(token, "ident")) { /*ToDo ftab clear*/
     1244        chk_ftab(value, &account->ftab, "user", account->usr, "provid");
     1245        return;
     1246    }
     1247
     1248    if(!strcmp(token, "class")) {
     1249        chk_cltab(value, &account->cltab);
     1250        return;
     1251    }
     1252
     1253    if(!strcmp(token, "chid")) {
     1254        chk_ftab(value, &account->fchid, "user", account->usr, "chid");
     1255        return;
     1256    }
     1257
     1258    if (!strcmp(token, "expdate")) {
     1259        if (!value[0]) {
     1260            account->expirationdate=(time_t)NULL;
     1261            return;
     1262        }
     1263        struct tm cstime;
     1264        memset(&cstime,0,sizeof(cstime));
     1265        for (i=0, ptr1=strtok(value, "-/"); (i<3)&&(ptr1); ptr1=strtok(NULL, "-/"), i++) {
     1266            switch(i) {
     1267                case 0: cstime.tm_year=atoi(ptr1)-1900; break;
     1268                case 1: cstime.tm_mon =atoi(ptr1)-1;    break;
     1269                case 2: cstime.tm_mday=atoi(ptr1);      break;
     1270            }
     1271        }
     1272        account->expirationdate=mktime(&cstime);
     1273        return;
     1274    }
    8701275
    8711276#ifdef CS_ANTICASC
    872   if( !strcmp(token, "numusers") )
    873   {
    874     account->ac_users = atoi(value);
    875     return;
    876   }
    877   if( !strcmp(token, "penalty") )
    878   {
    879     account->ac_penalty = atoi(value);
    880     return;
    881   }
    882 #endif
    883   if (token[0] != '#')
    884     fprintf(stderr, "Warning: keyword '%s' in account section not recognized\n",token);
    885 
    886 //  if (!strcmp(token, "caid"))
    887 //  {
    888 //    for (i=0, ptr1=strtok(value, ","); (i<CS_MAXCAIDTAB) && (ptr1); ptr1=strtok(NULL, ","))
    889 //    {
    890 //      ulong caid, mask;
    891 //      if (ptr2=strchr(trim(ptr1), '&'))
    892 //        *ptr2++='\0';
    893 //      else
    894 //        ptr2="";
    895 //      if (((caid=a2i(ptr1, 2))|(mask=a2i(ptr2,-2))) < 0x10000)
    896 //      {
    897 //        account->caidtab[i][0]=caid;
    898 //        account->caidtab[i++][1]=mask;
    899 //      }
    900 //      else
    901 //        cs_log("WARNING: wrong CAID in %s -> ignored", cs_user);
    902 //    }
    903 //  }
     1277    if( !strcmp(token, "numusers") ) {
     1278        account->ac_users = atoi(value);
     1279        return;
     1280    }
     1281
     1282    if( !strcmp(token, "penalty") ) {
     1283        account->ac_penalty = atoi(value);
     1284        return;
     1285    }
     1286#endif
     1287
     1288    if (token[0] != '#')
     1289        cs_log( "Warning: keyword '%s' in account section not recognized",token);
    9041290}
    9051291
     
    10021388  ulong caid;
    10031389  char buf[strlen(value) + 1];
    1004   strncpy(buf, value, sizeof(buf));
     1390  cs_strncpy(buf, value, sizeof(buf));
    10051391  b=(what==1) ? sizeof(ulong) : sizeof(ushort);
    10061392  for (i=0, ptr=strtok(value, ","); ptr; ptr=strtok(NULL, ","))
     
    10931479      nr++;
    10941480      memset(sidtab, 0, sizeof(struct s_sidtab));
    1095       strncpy(sidtab->label, strtolower(token+1), sizeof(sidtab->label));
     1481      cs_strncpy(sidtab->label, strtolower(token+1), sizeof(sidtab->label));
    10961482      continue;
    10971483    }
     
    11541540            switch(i){
    11551541                case 0:
    1156                     strncpy(srvid->prov, trim(ptr1), sizeof(srvid->prov)-1);
     1542                    cs_strncpy(srvid->prov, trim(ptr1), sizeof(srvid->prov));
    11571543                    break;
    11581544                case 1:
    1159                     strncpy(srvid->name, trim(ptr1), sizeof(srvid->name)-1);
     1545                    cs_strncpy(srvid->name, trim(ptr1), sizeof(srvid->name));
    11601546                    break;
    11611547                case 2:
    1162                     strncpy(srvid->type, trim(ptr1), sizeof(srvid->type)-1);
     1548                    cs_strncpy(srvid->type, trim(ptr1), sizeof(srvid->type));
    11631549                    break;
    11641550                case 3:
    1165                     strncpy(srvid->desc, trim(ptr1), sizeof(srvid->desc)-1);
     1551                    cs_strncpy(srvid->desc, trim(ptr1), sizeof(srvid->desc));
    11661552                    break;
    11671553            }
     
    11761562            srvid->caid[i] = word_atob(ptr1);
    11771563            srvid->ncaid = i+1;
     1564            //cs_debug("ld caid: %04X srvid: %04X Prov: %s Chan: %s",srvid->caid[i],srvid->srvid,srvid->prov,srvid->name);
    11781565        }
    11791566        nr++;
     
    12031590      switch(i)
    12041591      {
    1205         case 0: strncpy(rdr->device, ptr, sizeof(rdr->device)-1); break;
     1592        case 0: cs_strncpy(rdr->device, ptr, sizeof(rdr->device)); break;
    12061593        case 1: rdr->r_port=atoi(ptr); break;
    12071594        case 2: rdr->l_port=atoi(ptr); break;
     
    12201607  }
    12211608#ifdef CS_WITH_GBOX
    1222   if (!strcmp(token, "password")) { strncpy((char *)rdr->gbox_pwd, (const char *)i2b(4, a2i(value, 4)), 4); return; }
     1609  if (!strcmp(token, "password")) { cs_strncpy((char *)rdr->gbox_pwd, (const char *)i2b(4, a2i(value, 4)), 4); return; }
    12231610  if (!strcmp(token, "premium")) { rdr->gbox_prem=1; return; }
    12241611#endif
     
    12301617      switch(i)
    12311618      {
    1232         case 0: strncpy(rdr->r_usr, ptr, sizeof(rdr->r_usr)-1); break;
    1233         case 1: strncpy(rdr->r_pwd, ptr, sizeof(rdr->r_pwd)-1); break;
     1619        case 0: cs_strncpy(rdr->r_usr, ptr, sizeof(rdr->r_usr)); break;
     1620        case 1: cs_strncpy(rdr->r_pwd, ptr, sizeof(rdr->r_pwd)); break;
    12341621      }
    12351622    }
     
    12421629   */
    12431630  strtolower(value);
    1244  
     1631
    12451632  if (!strcmp(token, "enable")) { rdr->enable=atoi(value) ? 1 : 0; return; }
    12461633  if (!strcmp(token, "services")) { chk_services(value, &rdr->sidtabok, &rdr->sidtabno); return; }
     
    12501637  //FIXME workaround for Smargo until native mode works
    12511638  if (!strcmp(token, "smargopatch")) { rdr->smargopatch = atoi(value);  return; }
    1252   if (!strcmp(token, "label")) { strncpy(rdr->label, value, sizeof(rdr->label)-1); return; }
     1639  if (!strcmp(token, "label")) { cs_strncpy(rdr->label, value, sizeof(rdr->label)); return; }
    12531640  if (!strcmp(token, "fallback")) { rdr->fallback=atoi(value) ? 1 : 0; return; }
    12541641  if (!strcmp(token, "logport")) { rdr->log_port=atoi(value); return; }
     
    13261713    }
    13271714    if (!strcmp(value, "radegast")) {       rdr->typ=R_RADEGAST; return; }
    1328     if (!strcmp(value, "newcamd") || 
    1329         !strcmp(value, "newcamd525")) {rdr->typ=R_NEWCAMD; 
     1715    if (!strcmp(value, "newcamd") ||
     1716        !strcmp(value, "newcamd525")) {rdr->typ=R_NEWCAMD;
    13301717                                       rdr->ncd_proto=NCD_525; return; }
    1331     if (!strcmp(value, "newcamd524")) {rdr->typ=R_NEWCAMD; 
     1718    if (!strcmp(value, "newcamd524")) {rdr->typ=R_NEWCAMD;
    13321719                                       rdr->ncd_proto=NCD_524; return; }
    13331720    fprintf(stderr, "WARNING: value '%s' in protocol-line not recognized, assuming MOUSE\n",value);
     
    14011788    }
    14021789    memset(rdr->cc_version, 0, sizeof(rdr->cc_version));
    1403     strncpy(rdr->cc_version, value, sizeof(rdr->cc_version)-1);
     1790    cs_strncpy(rdr->cc_version, value, sizeof(rdr->cc_version));
    14041791    return;
    14051792  }
     
    14101797    }
    14111798    memset(rdr->cc_build, 0, sizeof(rdr->cc_build));
    1412     strncpy(rdr->cc_build, value, sizeof(rdr->cc_build)-1);
     1799    cs_strncpy(rdr->cc_build, value, sizeof(rdr->cc_build));
    14131800    return;
    14141801  }
     
    14191806  if (!strcmp(token, "deprecated")) { rdr->deprecated=atoi(value); return; }
    14201807  if (token[0] != '#')
    1421     fprintf(stderr, "Warning: keyword '%s' in reader section not recognized\n",token);
     1808    cs_log( "Warning: keyword '%s' in reader section not recognized",token);
    14221809}
    14231810
    14241811int init_readerdb()
    14251812{
    1426   int tag=0, nr;
    1427   FILE *fp;
    1428   char *value;
    1429 
    1430   sprintf(token, "%s%s", cs_confdir, cs_srvr);
    1431   if (!(fp=fopen(token, "r")))
    1432   {
    1433     cs_log("can't open file \"%s\" (errno=%d)\n", token, errno);
    1434     return(1);
    1435   }
    1436   nr=0;
    1437   while (fgets(token, sizeof(token), fp))
    1438   {
    1439     int i, l;
    1440     if ((l=strlen(trim(token)))<3) continue;
    1441     if ((token[0]=='[') && (token[l-1]==']'))
    1442     {
    1443       token[l-1]=0;
    1444       tag=(!strcmp("reader", strtolower(token+1)));
    1445       if (reader[nr].label[0] && reader[nr].typ) nr++;
    1446       memset(&reader[nr], 0, sizeof(struct s_reader));
    1447       reader[nr].enable = 1;
    1448       reader[nr].tcp_rto = 30;     
    1449       reader[nr].show_cls = 10;
    1450       reader[nr].maxqlen = CS_MAXQLEN;
    1451       reader[nr].mhz = 357;
    1452       reader[nr].cardmhz = 357;
     1813    int tag = 0, nr;
     1814    FILE *fp;
     1815    char *value;
     1816
     1817    sprintf(token, "%s%s", cs_confdir, cs_srvr);
     1818    if (!(fp=fopen(token, "r"))) {
     1819        cs_log("can't open file \"%s\" (errno=%d)\n", token, errno);
     1820        return(1);
     1821    }
     1822    nr = 0;
     1823    while (fgets(token, sizeof(token), fp)) {
     1824        int i, l;
     1825        if ((l = strlen(trim(token))) < 3)
     1826            continue;
     1827        if ((token[0] == '[') && (token[l-1] == ']')) {
     1828            token[l-1] = 0;
     1829            tag = (!strcmp("reader", strtolower(token+1)));
     1830            if (reader[nr].label[0] && reader[nr].typ) nr++;
     1831            memset(&reader[nr], 0, sizeof(struct s_reader));
     1832            reader[nr].enable = 1;
     1833            reader[nr].tcp_rto = 30;
     1834            reader[nr].show_cls = 10;
     1835            reader[nr].maxqlen = CS_MAXQLEN;
     1836            reader[nr].mhz = 357;
     1837            reader[nr].cardmhz = 357;
    14531838            reader[nr].deprecated = 0;
    1454       strcpy(reader[nr].pincode, "none");
    1455       for (i=1; i<CS_MAXCAIDTAB; reader[nr].ctab.mask[i++]=0xffff);
    1456       continue;
    1457     }
    1458     if (!tag) continue;
    1459     if (!(value=strchr(token, '='))) continue;
    1460     *value++='\0';
    1461     chk_reader(trim(strtolower(token)), trim(value), &reader[nr]);
    1462   }
    1463   fclose(fp);
    1464   return(0);
     1839            strcpy(reader[nr].pincode, "none");
     1840            for (i=1; i<CS_MAXCAIDTAB; reader[nr].ctab.mask[i++]=0xffff);
     1841            continue;
     1842        }
     1843
     1844        if (!tag)
     1845            continue;
     1846        if (!(value=strchr(token, '=')))
     1847            continue;
     1848        *value++ ='\0';
     1849        chk_reader(trim(strtolower(token)), trim(value), &reader[nr]);
     1850    }
     1851    fclose(fp);
     1852    return(0);
    14651853}
    14661854
     
    14811869  if (!(fp=fopen(token, "r")))
    14821870  {
    1483     cs_log("can't open file \"%s\" (errno=%d) irdeto guessing not loaded", 
     1871    cs_log("can't open file \"%s\" (errno=%d) irdeto guessing not loaded",
    14841872           token, errno);
    14851873    return(1);
     
    15001888        case 1: b47  = a2i(ptr, 8); break;
    15011889        case 2: caid = a2i(ptr, 4); break;
    1502         case 3: 
     1890        case 3:
    15031891          for( j=0; j<4; j++ )
    15041892            zSid[j]=ptr[j];
    15051893          zSid[4]=0;
    1506           sid  = a2i(zSid, 4); 
     1894          sid  = a2i(zSid, 4);
    15071895          break;
    15081896      }
    15091897    }
    1510     if( !skip ) 
     1898    if( !skip )
    15111899    {
    15121900      if (!(ird_row=(struct s_irdeto_quess*)malloc(sizeof(struct s_irdeto_quess))))
     
    15581946  if (!(fp=fopen(token, "r")))
    15591947  {
    1560     cs_log("can't open file \"%s\" (errno=%d) anti-cascading table not loaded", 
     1948    cs_log("can't open file \"%s\" (errno=%d) anti-cascading table not loaded",
    15611949            token, errno);
    15621950    return;
     
    15901978          ptr1=ptr;
    15911979          break;
    1592         case 1: 
     1980        case 1:
    15931981          dwtime = atoi(ptr);
    15941982          break;
     
    16031991        switch( i )
    16041992        {
    1605         case 0: 
     1993        case 0:
    16061994          if( *ptr=='*' ) caid = 0;
    1607           else caid = a2i(ptr, 4); 
     1995          else caid = a2i(ptr, 4);
    16081996          break;
    1609         case 1: 
     1997        case 1:
    16101998          if( *ptr=='*' ) provid = 0;
    1611           else provid = a2i(ptr, 6); 
     1999          else provid = a2i(ptr, 6);
    16122000          break;
    1613         case 2: 
     2001        case 2:
    16142002          if( *ptr=='*' ) sid = 0;
    1615           else sid = a2i(ptr, 4); 
     2003          else sid = a2i(ptr, 4);
    16162004          break;
    1617         case 3: 
     2005        case 3:
    16182006          if( *ptr=='*' ) chid = 0;
    1619           else chid = a2i(ptr, 4); 
     2007          else chid = a2i(ptr, 4);
    16202008          break;
    16212009        }
     
    16392027      cpmap->next   = 0;
    16402028
    1641       cs_debug("nr=%d, caid=%04X, provid=%06X, sid=%04X, chid=%04X, dwtime=%d", 
     2029      cs_debug("nr=%d, caid=%04X, provid=%06X, sid=%04X, chid=%04X, dwtime=%d",
    16422030                nr, caid, provid, sid, chid, dwtime);
    16432031      nr++;
     
    16492037}
    16502038#endif
     2039
     2040/*
     2041 * makes a char ready to write a token into config or webIf
     2042 */
     2043char *mk_t_caidtab(CAIDTAB *ctab){
     2044    int i = 0, needed = 1, pos = 0;
     2045    while(ctab->caid[i]){
     2046        if(ctab->mask[i]) needed += 10;
     2047        else needed += 5;
     2048        if(ctab->cmap[i]) needed += 5;
     2049        ++i;
     2050    }
     2051    char *value = (char *) malloc(needed * sizeof(char));
     2052    i = 0;
     2053    while(ctab->caid[i]) {
     2054        if(i == 0) {
     2055            sprintf(value + pos, "%04X", ctab->caid[i]);
     2056            pos += 4;
     2057        } else {
     2058            sprintf(value + pos, ",%04X", ctab->caid[i]);
     2059            pos += 5;
     2060        }
     2061        if(ctab->mask[i]){
     2062            sprintf(value + pos, "&%04X", ctab->mask[i]);
     2063            pos += 5;
     2064        }
     2065        if(ctab->cmap[i]){
     2066            sprintf(value + pos, ":%04X", ctab->cmap[i]);
     2067            pos += 5;
     2068        }
     2069        ++i;
     2070    }
     2071    value[pos] = '\0';
     2072    return value;
     2073}
     2074
     2075/*
     2076 * makes a char ready to write a token into config or webIf
     2077 */
     2078char *mk_t_tuntab(TUNTAB *ttab){
     2079    int i = 0, needed = 1, pos = 0;
     2080    while(ttab->bt_caidfrom[i]){
     2081        if(ttab->bt_srvid[i]) needed += 10;
     2082        else needed += 5;
     2083        if(ttab->bt_caidto[i]) needed += 5;
     2084        ++i;
     2085    }
     2086    char *value = (char *) malloc(needed * sizeof(char));
     2087    i = 0;
     2088    while(ttab->bt_caidfrom[i]) {
     2089        if(i == 0) {
     2090            sprintf(value + pos, "%04X", ttab->bt_caidfrom[i]);
     2091            pos += 4;
     2092        } else {
     2093            sprintf(value + pos, ",%04X", ttab->bt_caidfrom[i]);
     2094            pos += 5;
     2095        }
     2096        if(ttab->bt_srvid[i]){
     2097            sprintf(value + pos, ".%04X", ttab->bt_srvid[i]);
     2098            pos += 5;
     2099        }
     2100        if(ttab->bt_caidto[i]){
     2101            sprintf(value + pos, ":%04X", ttab->bt_caidto[i]);
     2102            pos += 5;
     2103        }
     2104        ++i;
     2105    }
     2106    value[pos] = '\0';
     2107    return value;
     2108}
     2109
     2110/*
     2111 * makes a char ready to write a token into config or webIf
     2112 */
     2113char *mk_t_group(ulong *grp){
     2114    int i = 0, needed = 1, pos = 0, dot = 0;
     2115    char grpbit[33];
     2116    long2bitchar((long) grp, grpbit);
     2117
     2118    for(i = 0; i < 32; i++){
     2119        if (grpbit[i] == '1'){
     2120            needed += 2;
     2121            if(i > 9) needed += 1;
     2122        }
     2123    }
     2124    char *value = (char *) malloc(needed * sizeof(char));
     2125
     2126    for(i = 0; i < 32; i++){
     2127        if (grpbit[i] == '1'){
     2128            if (dot == 0){
     2129                sprintf(value + pos, "%d", i+1);
     2130                if (i > 9)pos += 2;
     2131                else pos += 1;
     2132                dot = 1;
     2133            } else {
     2134                sprintf(value + pos, ",%d", i+1);
     2135                if (i > 9)pos += 3;
     2136                else pos += 2;
     2137            }
     2138        }
     2139    }
     2140    value[pos] = '\0';
     2141    return value;
     2142}
     2143
     2144/*
     2145 * makes a char ready to write a token into config or webIf
     2146 */
     2147char *mk_t_ftab(FTAB *ftab){
     2148    int i = 0, j = 0, needed = 1, pos = 0;
     2149
     2150    needed = ftab->nfilts * 5;
     2151    for (i = 0; i < ftab->nfilts; ++i)
     2152        needed += ftab->filts[i].nprids * 7;
     2153
     2154    char *value = (char *) malloc(needed * sizeof(char));
     2155
     2156    char *dot="";
     2157    for (i = 0; i < ftab->nfilts; ++i){
     2158        sprintf(value + pos, "%s%04X", dot, ftab->filts[i].caid);
     2159        pos += 4;
     2160        if (i > 0) pos += 1;
     2161        dot=":";
     2162        for (j = 0; j < ftab->filts[i].nprids; ++j) {
     2163            sprintf(value + pos, "%s%06lX", dot, ftab->filts[i].prids[j]);
     2164            pos += 7;
     2165            dot=",";
     2166        }
     2167        dot=";";
     2168    }
     2169
     2170    value[pos] = '\0';
     2171    return value;
     2172}
  • trunk/oscam-simples.c

    r1634 r1682  
    360360#endif
    361361
     362/* Clears the s_ip structure provided. The pointer will be set to NULL so everything is cleared.*/
     363void clear_sip(struct s_ip **sip){
     364        struct s_ip *cip = *sip, *lip;
     365        for (*sip = NULL; cip != NULL; cip = lip){
     366                lip = cip->next;
     367                free(cip);
     368        }
     369}
     370
     371/* Clears the s_ptab struct provided by setting nfilts and nprids to zero. */
     372void clear_ptab(struct s_ptab *ptab){
     373        int i;
     374        for (i = 0; i < ptab->nports; i++) {
     375                ptab->ports[i].ftab.nfilts = 0;
     376                ptab->ports[i].ftab.filts[0].nprids = 0;
     377        }
     378        ptab->nports = 0;
     379}
     380
     381/* Clears given caidtab */
     382void clear_caidtab(struct s_caidtab *ctab){
     383        int i;
     384        for (i = 0; i < CS_MAXCAIDTAB; i++) {
     385                ctab->caid[i] = 0;
     386                ctab->mask[i] = 0;
     387                ctab->cmap[i] = 0;
     388        }
     389}
     390
     391/* Clears given tuntab */
     392void clear_tuntab(struct s_tuntab *ttab){
     393        int i;
     394        for (i = 0; i < CS_MAXTUNTAB; i++) {
     395                ttab->bt_caidfrom[i] = 0;
     396                ttab->bt_caidto[i] = 0;
     397                ttab->bt_srvid[i] = 0;
     398        }
     399}
     400
     401/* Converts a long value to a char array in bitwise representation.
     402   Note that the result array MUST be at least 33 bit large and that
     403   this function assumes long values to hold only values up to 32bits and to be positive!
     404   the result of e.g. long 7 is 11100000000000000000000000000000 this means the array
     405   is reversed */
     406void long2bitchar(long value, char *result){
     407        int pos;
     408        for (pos=0;pos<32;pos++) result[pos]='0';
     409        result[pos] = '\0';
     410
     411        pos=0;
     412        while (value > 0 && pos < 32){
     413                if(value % 2 == 1) result[pos]='1';
     414                else result[pos]='0';
     415                value=value / 2;
     416                pos++;
     417        }
     418}
     419
    362420/*
    363421* Ordinary strncpy does not terminate the string if the source
Note: See TracChangeset for help on using the changeset viewer.