Changeset 1839


Ignore:
Timestamp:
03/17/10 00:29:38 (10 years ago)
Author:
_network
Message:

modular: fix choosing of caid in dvbapi

Location:
branches/modular
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • branches/modular/globals.h

    r1832 r1839  
    351351    void (*post_process)();
    352352    int  (*get_emm_type)();
     353    uchar* (*get_emm_filter)();
    353354};
    354355
     
    622623    int     bindwait;
    623624    int     resolvedelay;
     625    int     clientdyndns;
    624626    int     tosleep;
    625627    in_addr_t   srvip;
  • branches/modular/module-dvbapi.c

    r1836 r1839  
    608608                demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].CA_PID=descriptor_ca_pid;
    609609                demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].CA_System_ID=descriptor_ca_system_id;
     610                demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].checked=0;
    610611                demux[demux_id].ECMpids[demux[demux_id].ECMpidcount++].EMM_PID=0;
    611612            }
  • branches/modular/module-newcamd.c

    r1776 r1839  
    652652            else
    653653                {
    654                 cs_log("AU flag %d for user %s",au,usr);
     654                cs_debug("AU flag %d for user %s", au ,usr);
    655655                }
    656656            }
  • branches/modular/oscam-config.c

    r1769 r1839  
    424424        } else {
    425425            cfg->resolvedelay = atoi(value);
     426            return;
     427        }
     428    }
     429
     430    if (!strcmp(token, "clientdyndns")) {
     431        if (strlen(value) == 0) {
     432            cfg->clientdyndns = 0;
     433            return;
     434        } else {
     435            cfg->clientdyndns = atoi(value);
    426436            return;
    427437        }
  • branches/modular/oscam.c

    r1832 r1839  
    902902static void cs_client_resolve()
    903903{
    904   while (1)
    905   {
    906     struct hostent *rht;
    907     struct s_auth *account;
    908     struct sockaddr_in udp_sa;
    909 
    910     for (account=cfg->account; account; account=account->next)
    911       if (account->dyndns[0])
    912       {
    913         rht=gethostbyname((const char *)account->dyndns);
    914         if (rht)
    915         {
    916           memcpy(&udp_sa.sin_addr, rht->h_addr, sizeof(udp_sa.sin_addr));
    917           account->dynip=cs_inet_order(udp_sa.sin_addr.s_addr);
    918         }
    919         else
    920           cs_log("can't resolve hostname %s (user: %s)", account->dyndns, account->usr);
    921         client[cs_idx].last=time((time_t)0);
    922       }
    923     sleep(cfg->resolvedelay);
    924   }
     904    while (1)
     905    {
     906        struct hostent *rht;
     907        struct s_auth *account;
     908        struct sockaddr_in udp_sa;
     909
     910        for (account=cfg->account; account; account=account->next)
     911            if (account->dyndns[0])
     912            {
     913                rht=gethostbyname((const char *)account->dyndns);
     914                if (rht)
     915                {
     916                    memcpy(&udp_sa.sin_addr, rht->h_addr, sizeof(udp_sa.sin_addr));
     917                    account->dynip=cs_inet_order(udp_sa.sin_addr.s_addr);
     918                }
     919                else
     920                    cs_log("can't resolve hostname %s (user: %s)", account->dyndns, account->usr);
     921                client[cs_idx].last=time((time_t)0);
     922            }
     923        sleep(cfg->resolvedelay);
     924    }
    925925}
    926926
    927927static void start_client_resolver()
    928928{
    929   int i;
    930   pthread_t tid;
    931 
    932   i=pthread_create(&tid, (pthread_attr_t *)0, (void *)&cs_client_resolve, (void *) 0);
    933   if (i)
    934     cs_log("ERROR: can't create resolver-thread (err=%d)", i);
    935   else
    936   {
    937     cs_log("resolver thread started");
    938     pthread_detach(tid);
    939   }
     929    int i;
     930    pthread_t tid;
     931
     932    i=pthread_create(&tid, (pthread_attr_t *)0, (void *)&cs_client_resolve, (void *) 0);
     933    if (i)
     934        cs_log("ERROR: can't create resolver-thread (err=%d)", i);
     935    else
     936    {
     937        cs_log("resolver thread started");
     938        pthread_detach(tid);
     939    }
    940940}
    941941
    942942void cs_resolve()
    943943{
    944   int i, idx;
    945   struct hostent *rht;
    946   struct s_auth;
    947   for (i=0; i<CS_MAXREADER; i++)
    948     if ((idx=reader[i].cs_idx) && (reader[i].typ & R_IS_NETWORK))
    949     {
    950       client[cs_idx].last=time((time_t)0);
    951       rht=gethostbyname(reader[i].device);
    952       if (rht)
    953       {
    954         memcpy(&client[idx].udp_sa.sin_addr, rht->h_addr,
    955                sizeof(client[idx].udp_sa.sin_addr));
    956         client[idx].ip=cs_inet_order(client[idx].udp_sa.sin_addr.s_addr);
    957       }
    958       else
    959         cs_log("can't resolve %s", reader[i].device);
    960       client[cs_idx].last=time((time_t)0);
    961     }
     944    int i, idx;
     945    struct hostent *rht;
     946    struct s_auth;
     947    for (i=0; i<CS_MAXREADER; i++)
     948        if ((idx=reader[i].cs_idx) && (reader[i].typ & R_IS_NETWORK))
     949        {
     950            client[cs_idx].last=time((time_t)0);
     951            rht = gethostbyname(reader[i].device);
     952            if (rht)
     953            {
     954                memcpy(&client[idx].udp_sa.sin_addr, rht->h_addr,
     955                        sizeof(client[idx].udp_sa.sin_addr));
     956                client[idx].ip=cs_inet_order(client[idx].udp_sa.sin_addr.s_addr);
     957            }
     958            else
     959                cs_log("can't resolve %s", reader[i].device);
     960            client[cs_idx].last=time((time_t)0);
     961        }
    962962}
    963963
     
    996996static void start_resolver()
    997997{
    998   int i;
    999 
    1000   cs_sleepms(1000); // wait for reader
    1001   while(1)
    1002   {
    1003     if (master_pid!=getppid())
    1004       cs_exit(0);
    1005     cs_resolve();
    1006     for (i=0; i<cfg->resolvedelay; i++)
    1007       if (master_pid!=getppid())
    1008         cs_exit(0);
    1009       else
    1010         cs_sleepms(1000);
    1011 //        sleep(cfg->resolvedelay);
    1012   }
     998    int i;
     999
     1000    cs_sleepms(1000); // wait for reader
     1001    while(1)
     1002    {
     1003        if (master_pid!=getppid())
     1004            cs_exit(0);
     1005        cs_resolve();
     1006        for (i=0; i<cfg->resolvedelay; i++)
     1007            if (master_pid!=getppid())
     1008                cs_exit(0);
     1009            else
     1010                cs_sleepms(1000);
     1011        //        sleep(cfg->resolvedelay);
     1012    }
    10131013}
    10141014
     
    11411141int cs_auth_client(struct s_auth *account, char *e_txt)
    11421142{
    1143   int rc=0;
    1144   char buf[32];
    1145   char *t_crypt="encrypted";
    1146   char *t_plain="plain";
    1147   char *t_grant=" granted";
    1148   char *t_reject=" rejected";
    1149   char *t_msg[]= { buf, "invalid access", "invalid ip", "unknown reason" };
    1150   client[cs_idx].grp=0xffffffff;
    1151   client[cs_idx].au=(-1);
    1152   switch((long)account)
    1153   {
    1154     case -2:            // gbx-dummy
    1155       client[cs_idx].dup=0;
    1156       break;
    1157     case 0:           // reject access
    1158       rc=1;
    1159       cs_log("%s %s-client %s%s (%s)",
    1160              client[cs_idx].crypted ? t_crypt : t_plain,
    1161              ph[client[cs_idx].ctyp].desc,
    1162              client[cs_idx].ip ? cs_inet_ntoa(client[cs_idx].ip) : "",
    1163              client[cs_idx].ip ? t_reject : t_reject+1,
    1164              e_txt ? e_txt : t_msg[rc]);
    1165       break;
    1166     default:            // grant/check access
    1167       if (client[cs_idx].ip && account->dyndns[0])
    1168         if (client[cs_idx].ip != account->dynip)
    1169           rc=2;
    1170       if (!rc)
    1171       {
    1172         client[cs_idx].dup=0;
    1173         if (client[cs_idx].typ=='c')
    1174         {
    1175           client[cs_idx].expirationdate=account->expirationdate;
    1176           client[cs_idx].disabled=account->disabled;
    1177           client[cs_idx].c35_suppresscmd08 = account->c35_suppresscmd08;
    1178           client[cs_idx].ncd_keepalive = account->ncd_keepalive;
    1179       client[cs_idx].grp=account->grp;
    1180           client[cs_idx].au=account->au;
    1181           client[cs_idx].autoau=account->autoau;
    1182           client[cs_idx].tosleep=(60*account->tosleep);
    1183           memcpy(&client[cs_idx].ctab, &account->ctab, sizeof(client[cs_idx].ctab));
    1184           if (account->uniq)
    1185             cs_fake_client(account->usr, account->uniq, client[cs_idx].ip);
    1186           client[cs_idx].ftab  = account->ftab;   // IDENT filter
    1187           client[cs_idx].cltab = account->cltab;  // CLASS filter
    1188           client[cs_idx].fchid = account->fchid;  // CHID filter
    1189           client[cs_idx].sidtabok= account->sidtabok;   // services
    1190           client[cs_idx].sidtabno= account->sidtabno;   // services
    1191           client[cs_idx].pcrc  = crc32(0L, MD5((uchar *)account->pwd, strlen(account->pwd), NULL), 16);
    1192           memcpy(&client[cs_idx].ttab, &account->ttab, sizeof(client[cs_idx].ttab));
     1143    int rc=0;
     1144    char buf[32];
     1145    char *t_crypt="encrypted";
     1146    char *t_plain="plain";
     1147    char *t_grant=" granted";
     1148    char *t_reject=" rejected";
     1149    char *t_msg[]= { buf, "invalid access", "invalid ip", "unknown reason" };
     1150    client[cs_idx].grp=0xffffffff;
     1151    client[cs_idx].au=(-1);
     1152    switch((long)account)
     1153    {
     1154    case -2:            // gbx-dummy
     1155    client[cs_idx].dup=0;
     1156    break;
     1157    case 0:           // reject access
     1158        rc=1;
     1159        cs_log("%s %s-client %s%s (%s)",
     1160                client[cs_idx].crypted ? t_crypt : t_plain,
     1161                ph[client[cs_idx].ctyp].desc,
     1162                client[cs_idx].ip ? cs_inet_ntoa(client[cs_idx].ip) : "",
     1163                client[cs_idx].ip ? t_reject : t_reject+1,
     1164                e_txt ? e_txt : t_msg[rc]);
     1165        break;
     1166    default:            // grant/check access
     1167        if (client[cs_idx].ip && account->dyndns[0])
     1168            if (client[cs_idx].ip != account->dynip)
     1169                rc=2;
     1170        if (!rc)
     1171        {
     1172            client[cs_idx].dup=0;
     1173            if (client[cs_idx].typ=='c')
     1174            {
     1175                client[cs_idx].expirationdate=account->expirationdate;
     1176                client[cs_idx].disabled=account->disabled;
     1177                client[cs_idx].c35_suppresscmd08 = account->c35_suppresscmd08;
     1178                client[cs_idx].ncd_keepalive = account->ncd_keepalive;
     1179                client[cs_idx].grp=account->grp;
     1180                client[cs_idx].au=account->au;
     1181                client[cs_idx].autoau=account->autoau;
     1182                client[cs_idx].tosleep=(60*account->tosleep);
     1183                memcpy(&client[cs_idx].ctab, &account->ctab, sizeof(client[cs_idx].ctab));
     1184                if (account->uniq)
     1185                    cs_fake_client(account->usr, account->uniq, client[cs_idx].ip);
     1186                client[cs_idx].ftab  = account->ftab;   // IDENT filter
     1187                client[cs_idx].cltab = account->cltab;  // CLASS filter
     1188                client[cs_idx].fchid = account->fchid;  // CHID filter
     1189                client[cs_idx].sidtabok= account->sidtabok;   // services
     1190                client[cs_idx].sidtabno= account->sidtabno;   // services
     1191                client[cs_idx].pcrc  = crc32(0L, MD5((uchar *)account->pwd, strlen(account->pwd), NULL), 16);
     1192                memcpy(&client[cs_idx].ttab, &account->ttab, sizeof(client[cs_idx].ttab));
    11931193#ifdef CS_ANTICASC
    1194           ac_init_client(account);
    1195 #endif
    1196         }
    1197       }
    1198       client[cs_idx].monlvl=account->monlvl;
    1199       strcpy(client[cs_idx].usr, account->usr);
    1200     case -1:            // anonymous grant access
    1201       if (rc)
    1202         t_grant=t_reject;
    1203       else
    1204       {
    1205         if (client[cs_idx].typ=='m')
    1206           sprintf(t_msg[0], "lvl=%d", client[cs_idx].monlvl);
    1207         else
    1208         {
    1209           if(client[cs_idx].autoau)
    1210           {
    1211             if(client[cs_idx].ncd_server)
    1212             {
    1213               int r=0;
    1214               for(r=0;r<CS_MAXREADER;r++)
    1215               {
    1216                 if(reader[r].caid[0]==cfg->ncd_ptab.ports[client[cs_idx].port_idx].ftab.filts[0].caid)
    1217                 {
    1218                   client[cs_idx].au=r;
    1219                   break;
    1220                 }
    1221               }
    1222               if(client[cs_idx].au<0) sprintf(t_msg[0], "au(auto)=%d", client[cs_idx].au+1);
    1223                 else sprintf(t_msg[0], "au(auto)=%s", reader[client[cs_idx].au].label);
    1224             }
    1225             else
    1226             {
    1227               sprintf(t_msg[0], "au=auto");
    1228             }
    1229           }
    1230           else
    1231           {
    1232             if(client[cs_idx].au<0) sprintf(t_msg[0], "au=%d", client[cs_idx].au+1);
    1233               else sprintf(t_msg[0], "au=%s", reader[client[cs_idx].au].label);
    1234           }
    1235         }
    1236       }
    1237       if(client[cs_idx].ncd_server)
    1238       {
    1239         cs_log("%s %s:%d-client %s%s (%s, %s)",
    1240              client[cs_idx].crypted ? t_crypt : t_plain,
    1241              e_txt ? e_txt : ph[client[cs_idx].ctyp].desc,
    1242              cfg->ncd_ptab.ports[client[cs_idx].port_idx].s_port,
    1243              client[cs_idx].ip ? cs_inet_ntoa(client[cs_idx].ip) : "",
    1244              client[cs_idx].ip ? t_grant : t_grant+1,
    1245              username(cs_idx), t_msg[rc]);
    1246       }
    1247       else
    1248       {
    1249         cs_log("%s %s-client %s%s (%s, %s)",
    1250              client[cs_idx].crypted ? t_crypt : t_plain,
    1251              e_txt ? e_txt : ph[client[cs_idx].ctyp].desc,
    1252              client[cs_idx].ip ? cs_inet_ntoa(client[cs_idx].ip) : "",
    1253              client[cs_idx].ip ? t_grant : t_grant+1,
    1254              username(cs_idx), t_msg[rc]);
    1255       }
    1256 
    1257       break;
    1258   }
    1259   return(rc);
     1194                ac_init_client(account);
     1195#endif
     1196            }
     1197        }
     1198        client[cs_idx].monlvl=account->monlvl;
     1199        strcpy(client[cs_idx].usr, account->usr);
     1200    case -1:            // anonymous grant access
     1201    if (rc)
     1202        t_grant=t_reject;
     1203    else
     1204    {
     1205        if (client[cs_idx].typ=='m')
     1206            sprintf(t_msg[0], "lvl=%d", client[cs_idx].monlvl);
     1207        else
     1208        {
     1209            if(client[cs_idx].autoau)
     1210            {
     1211                if(client[cs_idx].ncd_server)
     1212                {
     1213                    int r=0;
     1214                    for(r=0;r<CS_MAXREADER;r++)
     1215                    {
     1216                        if(reader[r].caid[0]==cfg->ncd_ptab.ports[client[cs_idx].port_idx].ftab.filts[0].caid)
     1217                        {
     1218                            client[cs_idx].au=r;
     1219                            break;
     1220                        }
     1221                    }
     1222                    if(client[cs_idx].au<0) sprintf(t_msg[0], "au(auto)=%d", client[cs_idx].au+1);
     1223                    else sprintf(t_msg[0], "au(auto)=%s", reader[client[cs_idx].au].label);
     1224                }
     1225                else
     1226                {
     1227                    sprintf(t_msg[0], "au=auto");
     1228                }
     1229            }
     1230            else
     1231            {
     1232                if(client[cs_idx].au<0) sprintf(t_msg[0], "au=%d", client[cs_idx].au+1);
     1233                else sprintf(t_msg[0], "au=%s", reader[client[cs_idx].au].label);
     1234            }
     1235        }
     1236    }
     1237    if(client[cs_idx].ncd_server)
     1238    {
     1239        cs_log("%s %s:%d-client %s%s (%s, %s)",
     1240                client[cs_idx].crypted ? t_crypt : t_plain,
     1241                        e_txt ? e_txt : ph[client[cs_idx].ctyp].desc,
     1242                                cfg->ncd_ptab.ports[client[cs_idx].port_idx].s_port,
     1243                                client[cs_idx].ip ? cs_inet_ntoa(client[cs_idx].ip) : "",
     1244                                        client[cs_idx].ip ? t_grant : t_grant+1,
     1245                                                username(cs_idx), t_msg[rc]);
     1246    }
     1247    else
     1248    {
     1249        cs_log("%s %s-client %s%s (%s, %s)",
     1250                client[cs_idx].crypted ? t_crypt : t_plain,
     1251                        e_txt ? e_txt : ph[client[cs_idx].ctyp].desc,
     1252                                client[cs_idx].ip ? cs_inet_ntoa(client[cs_idx].ip) : "",
     1253                                        client[cs_idx].ip ? t_grant : t_grant+1,
     1254                                                username(cs_idx), t_msg[rc]);
     1255    }
     1256
     1257    break;
     1258    }
     1259    return(rc);
    12601260}
    12611261
     
    25692569    client[0].last=time((time_t *)0);
    25702570
    2571   start_client_resolver();
     2571    if(cfg->clientdyndns)
     2572        start_client_resolver();
     2573
    25722574  init_service(97); // logger
    25732575  init_service(98); // resolver
  • branches/modular/reader-nagra.c

    r1833 r1839  
    818818    ph->card_init=nagra2_card_init;
    819819    ph->get_emm_type=nagra2_get_emm_type;
    820 }
     820    ph->get_emm_filter=nagra2_get_emm_filter;
     821}
Note: See TracChangeset for help on using the changeset viewer.