⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 compat.c

📁 这是一个LINUX环境的 VDR 插件源代码,可支持Irdeto, Seca, Viaccess, Nagra, Conax & Cryptoworks等CA系统的读卡、共享等操作。
💻 C
字号:
#include <stdio.h>#include <stdlib.h>#include <dlfcn.h>#include <dirent.h>#include <fnmatch.h>#define DEBUG#include "common.h"#include "data.h"#include "sc.h"#include "scsetup.h"#include "opts.h"#include "misc.h"#include "system.h"#include "smartcard.h"#include "cam.h"#include "log.h"#define LIBSC_PREFIX  "libsc-"#define SO_INDICATOR   ".so."static bool DllLoad(const char *fileName){  const char *base=rindex(fileName,'/');  if(!base) base=fileName;  void *handle=dlopen(fileName,RTLD_NOW|RTLD_LOCAL);  if(handle) return true;  printf("dload: %s: %s\n",base,dlerror());  return false;}bool DllsLoad(const char *libdir){  char pat[32];  snprintf(pat,sizeof(pat),"%s*-%d%s%s",LIBSC_PREFIX,SCAPIVERS,SO_INDICATOR,APIVERSION);  bool res=true;  cReadDir dir(libdir);  struct dirent *e;  while((e=dir.Next())) {    if(!fnmatch(pat,e->d_name,FNM_PATHNAME|FNM_NOESCAPE)) {      DllLoad(AddDirectory(libdir,e->d_name));      }    }  return res;}void InitAll(const char *cfgdir){  logcfg.logCon=1;  cSystems::ConfigParse("Cardclient.Immediate","0");  filemaps.SetCfgDir(cfgdir);  if(!keys.Load(cfgdir)) printf("ERROR: no keys loaded for softcam!\n");  if(!cSystems::Init(cfgdir)) exit(2);  cLoaders::LoadCache(cfgdir);  smartcards.LoadData(cfgdir);#ifdef DEFAULT_PORT  smartcards.AddPort(DEFAULT_PORT);#endif  smartcards.LaunchWatcher();}void LogAll(void){  for(int i=0; i<32; i++)    cLogging::SetModuleOptions(LCLASS(i,0xFFFFFFFF));}void SDump(const unsigned char *buffer, int n){  for(int l=0 ; l<n ; l++) printf("%02x ",buffer[l]);  printf("\n");}int ReadRaw(const char *name, unsigned char *buff, int maxlen){  FILE *f=fopen(name,"r");  if(f) {    char line[512];    int len=0;    while(len<maxlen && fgets(line,sizeof(line),f)) {      if(strstr(line,"dump: n=")) continue;      char *p=index(line,':');      if(p) p++; else p=line;      while(1) {        char *np;        int val=strtol(p,&np,16);        if(p!=np) {          buff[len++]=val;          p=np;          }        else break;        }      }    fclose(f);    printf("using raw from %s:\n",name);    HexDump(buff,len);    return len;    }  printf("failed to open raw file %s: %s\n",name,strerror(errno));  exit(1);}////extern const char *I18nTranslate(const char *s, const char *Plugin){  return s;}////static const struct LogModule lm_core = {  (LMOD_ENABLE|L_CORE_ALL)&LOPT_MASK,  (LMOD_ENABLE|L_CORE_LOAD|L_CORE_ECM|L_CORE_PIDS|L_CORE_AU|L_CORE_AUSTATS|L_CORE_CAIDS|L_CORE_NET|L_CORE_CI|L_CORE_SC)&LOPT_MASK,  "core",  { "load","action","ecm","ecmProc","pids","au","auStats","auExtra","auExtern",    "caids","keys","dynamic","csa","ci","av7110","net","netData","msgcache",    "serial","smartcard" }  };ADD_MODULE(L_CORE,lm_core)////cScSetup ScSetup;cScSetup::cScSetup(void){  AutoUpdate = 1;  memset(ScCaps,0,sizeof(ScCaps));  ScCaps[0] = 1;  ScCaps[1] = 2;  ConcurrentFF = 1;  memset(CaIgnore,0,sizeof(CaIgnore));}void cScSetup::Check(void) {}bool cScSetup::Ignore(unsigned short caid) { return false; }////void cSoftCAM::SetLogStatus(int CardNum, const cEcmInfo *ecm, bool on) {}////// --- cOpt --------------------------------------------------------------------cOpt::cOpt(const char *Name, const char *Title){  name=Name; title=Title;  fullname=0; persistant=true;}cOpt::~cOpt(){  free(fullname);}const char *cOpt::FullName(const char *PreStr){  if(PreStr) {    free(fullname);    asprintf(&fullname,"%s.%s",PreStr,name);    return fullname;    }  else return name;}// --- cOptInt -----------------------------------------------------------------cOptInt::cOptInt(const char *Name, const char *Title, int *Storage, int Min, int Max):cOpt(Name,Title){  storage=Storage; min=Min; max=Max;}void cOptInt::Parse(const char *Value){  *storage=atoi(Value);}void cOptInt::Backup(void){}bool cOptInt::Set(void){  if(value!=*storage) { *storage=value; return true; }  return false;}void cOptInt::Store(const char *PreStr){}void cOptInt::Create(cOsdMenu *menu){}// --- cOptSel -----------------------------------------------------------------cOptSel::cOptSel(const char *Name, const char *Title, int *Storage, int NumStr, const char * const *Strings):cOptInt(Name,Title,Storage,0,NumStr){  strings=Strings;  trStrings=0;}cOptSel::~cOptSel(){  free(trStrings);}void cOptSel::Create(cOsdMenu *menu){}// --- cOptBool -----------------------------------------------------------------cOptBool::cOptBool(const char *Name, const char *Title, int *Storage):cOptInt(Name,Title,Storage,0,1){}void cOptBool::Create(cOsdMenu *menu){}// --- cOptStr -----------------------------------------------------------------cOptStr::cOptStr(const char *Name, const char *Title, char *Storage, int Size, const char *Allowed):cOpt(Name,Title){  storage=Storage; size=Size; allowed=Allowed;  value=MALLOC(char,size);}cOptStr::~cOptStr(){  free(value);}void cOptStr::Parse(const char *Value){  strn0cpy(storage,Value,size);}void cOptStr::Backup(void){}bool cOptStr::Set(void){  if(strcmp(value,storage)) { strn0cpy(storage,value,size); return true; }  return false;}void cOptStr::Store(const char *PreStr){}void cOptStr::Create(cOsdMenu *menu){}// --- cOptCap -----------------------------------------------------------------class cOptCap : public cOpt {protected:  int *storage, *value;  int size, disp, len;public:  cOptCap(const char *Name, const char *Title, int *Storage, int Size, int Disp);  virtual ~cOptCap();  virtual void Parse(const char *Value);  virtual void Backup(void);  virtual bool Set(void);  virtual void Store(const char *PreStr);  virtual void Create(cOsdMenu *menu);  };cOptCap::cOptCap(const char *Name, const char *Title, int *Storage, int Size, int Disp):cOpt(Name,Title){  storage=Storage; size=Size; disp=Disp; len=sizeof(int)*size;  value=MALLOC(int,size);}cOptCap::~cOptCap(){  free(value);}void cOptCap::Parse(const char *Value){  memset(storage,0,len);  int i=0;  while(1) {    char *p;    const int c=strtol(Value,&p,10);    if(c<=0 || p==Value || i>=size) return;    storage[i++]=c;    Value=p;    }}void cOptCap::Backup(void){}bool cOptCap::Set(void){  if(memcmp(value,storage,len)) { memcpy(storage,value,len); return true; }  return false;}void cOptCap::Store(const char *PreStr){}void cOptCap::Create(cOsdMenu *menu){}// --- cOpts -------------------------------------------------------------------cOpts::cOpts(const char *PreStr, int NumOpts){  preStr=PreStr;  numOpts=NumOpts; numAdd=0;  if((opts=MALLOC(cOpt *,numOpts))) memset(opts,0,sizeof(cOpt *)*numOpts);}cOpts::~cOpts(){  if(opts) {    for(int i=0; i<numOpts; i++) delete opts[i];    free(opts);    }}void cOpts::Add(cOpt *opt){  if(opts && numAdd<numOpts) opts[numAdd++]=opt;}bool cOpts::Parse(const char *Name, const char *Value){  if(opts) {    for(int i=0; i<numAdd; i++)      if(opts[i] && opts[i]->Persistant() && !strcasecmp(Name,opts[i]->Name())) {        opts[i]->Parse(Value);        return true;        }    }  return false;}bool cOpts::Store(bool AsIs){  return false;}void cOpts::Backup(void){}void cOpts::Create(cOsdMenu *menu){}////// VDR////#include <vdr/sources.h>cString cSource::ToString(int Code){  char buffer[16];  char *q = buffer;  switch (Code & st_Mask) {    case stCable: *q++ = 'C'; break;    case stSat:   *q++ = 'S';                  {                    int pos = Code & ~st_Mask;                    q += snprintf(q, sizeof(buffer) - 2, "%u.%u", (pos & ~st_Neg) / 10, (pos & ~st_Neg) % 10); // can't simply use "%g" here since the silly 'locale' messes up the decimal point                    *q++ = (Code & st_Neg) ? 'E' : 'W';                  }                  break;    case stTerr:  *q++ = 'T'; break;    default:      *q++ = Code + '0'; // backward compatibility    }  *q = 0;  return buffer;}int cSource::FromString(const char *s){  int type = stNone;  switch (toupper(*s)) {    case 'C': type = stCable; break;    case 'S': type = stSat;   break;    case 'T': type = stTerr;  break;    case '0' ... '9': type = *s - '0'; break; // backward compatibility    default: esyslog("ERROR: unknown source key '%c'", *s);             return stNone;    }  int code = type;  if (type == stSat) {     int pos = 0;     bool dot = false;     bool neg = false;     while (*++s) {           switch (toupper(*s)) {             case '0' ... '9': pos *= 10;                               pos += *s - '0';                               break;             case '.':         dot = true;                               break;             case 'E':         neg = true; // fall through to 'W'             case 'W':         if (!dot)                                  pos *= 10;                               break;             default: esyslog("ERROR: unknown source character '%c'", *s);                      return stNone;             }           }     if (neg)        pos |= st_Neg;     code |= pos;     }  return code;}////#include <vdr/channels.h>int cChannel::Transponder(int Frequency, char Polarization){  // some satellites have transponders at the same frequency, just with different polarization:  switch (tolower(Polarization)) {    case 'h': Frequency += 100000; break;    case 'v': Frequency += 200000; break;    case 'l': Frequency += 300000; break;    case 'r': Frequency += 400000; break;    }  return Frequency;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -