Changeset 4144


Ignore:
Timestamp:
12/18/10 08:49:32 (13 years ago)
Author:
dingo35
Message:

oscam-chk, oscam-nano: cleanup + check threadsafety

Location:
trunk
Files:
1 deleted
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Maketype

    r4136 r4144  
    6464          $(LIBFILE1)(module-stat.o) \
    6565          $(LIBFILE1)(module-datastruct-llist.o) \
    66           $(LIBFILE1)(oscam-nano.o) \
    6766          $(LIBFILE1)(oscam-chk.o) \
    6867          $(LIBFILE1)(oscam-http.o) \
  • trunk/globals.h

    r4141 r4144  
    13241324extern int chk_sfilter(ECM_REQUEST *, PTAB*);
    13251325extern int chk_ufilters(ECM_REQUEST *);
    1326 extern int chk_rfilter(ECM_REQUEST *, struct s_reader *);
    13271326extern int chk_rsfilter(struct s_reader * reader, ECM_REQUEST *);
    1328 extern int chk_avail_reader(ECM_REQUEST *, struct s_reader *);
    13291327extern int matching_reader(ECM_REQUEST *, struct s_reader *);
    13301328extern void set_signal_handler(int , int , void (*));
     
    13351333extern void update_reader_config(uchar *ptr);
    13361334extern int chk_ctab(ushort caid, CAIDTAB *ctab);
    1337 extern int chk_srvid_match_by_caid_prov(ushort caid, ulong provid, SIDTAB *sidtab);
    13381335extern int chk_srvid_by_caid_prov(struct s_client *, ushort caid, ulong provid);
    13391336extern void kill_thread(struct s_client *cl);
     
    13561353extern void ac_chk(ECM_REQUEST*, int);
    13571354#endif
    1358 
    1359 // oscam-nano
    1360 extern int chk_class(ECM_REQUEST *, CLASSTAB*, const char*, const char*);
    13611355
    13621356// oscam-config
  • trunk/oscam-chk.c

    r4141 r4144  
    1 //FIXME Not checked on threadsafety yet; after checking please remove this line
    21#include "globals.h"
     2
     3#define CS_NANO_CLASS 0xE2
     4
     5static int find_nano(uchar *ecm, int l, uchar nano, int s)
     6{
     7  uchar *snano;
     8
     9  if( s >= l ) return 0;
     10  if( !s ) s=(ecm[4]==0xD2) ? 12 : 9;   // tpsflag -> offset+3
     11  snano = ecm + s;
     12
     13  while( (*snano!=nano) && (s<l) )
     14  {
     15    if( *snano == 0xEA ) return 0;
     16    snano++;
     17    s++;
     18  }
     19
     20  return (s<l)?++s:0;
     21}
     22
     23static int chk_class(ECM_REQUEST *er, CLASSTAB *clstab, const char *D_USE(type), const char *D_USE(name))
     24{
     25  int i, j, an, cl_n, l;
     26  uchar ecm_class;
     27
     28  if( er->caid!=0x0500 ) return 1;
     29  if( !clstab->bn && !clstab->an ) return 1;
     30
     31  j=an=cl_n=l=0;
     32  while( (j=find_nano(er->ecm, er->l, CS_NANO_CLASS, j)) > 0 )
     33  {
     34    l = er->ecm[j];
     35    ecm_class = er->ecm[j+l];
     36    cs_debug_mask(D_CLIENT, "ecm class=%02X", ecm_class);
     37    for( i=0; i<clstab->bn; i++ )  // search in blocked
     38      if( ecm_class==clstab->bclass[i] )
     39      {
     40        cs_debug_mask(D_CLIENT, "class %02X rejected by %s '%s' !%02X filter",
     41                 ecm_class, type, name, ecm_class);
     42        return 0;
     43      }
     44
     45    cl_n++;
     46    for( i=0; i<clstab->an; i++ )  // search in allowed
     47      if( ecm_class==clstab->aclass[i] )
     48      {
     49        an++;
     50        break;
     51      }
     52    j+=l;
     53  }
     54
     55  if( cl_n && clstab->an )
     56  {
     57    if( an )
     58      cs_debug_mask(D_CLIENT, "ECM classes allowed by %s '%s' filter", type, name);
     59    else {
     60      cs_debug_mask(D_CLIENT, "ECM classes don't match %s '%s' filter, rejecting", type, name);
     61      return 0;
     62    }
     63  }
     64
     65  return 1;
     66}
    367
    468int chk_srvid_match(ECM_REQUEST *er, SIDTAB *sidtab)
     
    50114}
    51115
    52 int chk_srvid_match_by_caid_prov(ushort caid, ulong provid, SIDTAB *sidtab)
     116static int chk_srvid_match_by_caid_prov(ushort caid, ulong provid, SIDTAB *sidtab)
    53117{
    54118  int i, rc=0;
     
    262326}
    263327
    264 int chk_rfilter(ECM_REQUEST *er, struct s_reader *rdr)
     328static int chk_rfilter(ECM_REQUEST *er, struct s_reader *rdr)
    265329{
    266330  int i, j, rc=1;
     
    299363}
    300364
    301 int chk_avail_reader(ECM_REQUEST *er, struct s_reader *rdr)
    302 {
    303   if( !chk_rfilter(er, rdr) ) {
    304     if( !er->rcEx ) er->rcEx=(E1_READER<<4)|E2_IDENT;
    305     return 0;
    306   }
    307   if( !chk_class(er, &rdr->cltab, "reader", rdr->label) ) {
    308     if( !er->rcEx ) er->rcEx=(E1_READER<<4)|E2_CLASS;
    309     return 0;
    310   }
    311   if( !chk_chid(er, &rdr->fchid, "reader", rdr->label) ) {
    312     if( !er->rcEx ) er->rcEx=(E1_READER<<4)|E2_CHID;
    313     return 0;
    314   }
    315 //fixme re-activated code for testing
    316   if( rdr->typ=='r' )
    317   {
    318     if( rdr->qlen>=rdr->maxqlen )
    319     {
    320       cs_log("reader '%s' max. queue length(%d) reached, rejected", rdr->label, rdr->qlen);
    321       if( !er->rcEx ) er->rcEx=(E1_READER<<4)|E2_QUEUE;
    322       return 0;
    323     }
    324     else {
    325       cs_log("reader '%s' qlen=%d", rdr->label, rdr->qlen);
    326       rdr->qlen++;
    327     }
    328   }
    329 
    330   return 1;
    331 }
    332 
    333365int chk_ctab(ushort caid, CAIDTAB *ctab) {
    334366  if (!caid || !ctab->caid[0])
Note: See TracChangeset for help on using the changeset viewer.