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

📄 misc.c

📁 这是一个LINUX环境的 VDR 插件源代码,可支持Irdeto, Seca, Viaccess, Nagra, Conax & Cryptoworks等CA系统的读卡、共享等操作。
💻 C
字号:
/* * Softcam plugin to VDR (C++) * * This code is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This code is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * Or, point your browser to http://www.gnu.org/copyleft/gpl.html */#include <ctype.h>#include <stdlib.h>#include <stdio.h>#include <stdarg.h>#include <fcntl.h>#include <string.h>#include <sys/time.h>#include <vdr/tools.h>#include <vdr/thread.h>#include "misc.h"// -----------------------------------------------------------------------------void DvbName(const char *Name, int n, char *buffer, int len){  snprintf(buffer,len,"/dev/dvb/adapter%d/%s%d",n,Name,0);}int DvbOpen(const char *Name, int n, int Mode, bool ReportError){  char FileName[128];  DvbName(Name,n,FileName,sizeof(FileName));  int fd=open(FileName,Mode);  if(fd<0 && ReportError) LOG_ERROR_STR(FileName);  return fd;}const char *HexStr(char *str, const unsigned char *mem, int len){  for(int i=0 ; i<len ; i++) sprintf(&str[i*2],"%02X",mem[i]);  return str;}static int HexDigit(int asc){  if(asc>='A') return toupper(asc)-'A'+10;  return asc-'0';}int GetChar(const char * &line, int *store, int count){  line=skipspace(line);  const char *sline=line;  *store=0;  while(count) {    if(line[0]==0 || !isalnum(line[0])) break;    *store<<=8; *store+=line[0];    line++; count--;    }  if(!count && (!*line || isspace(*line) || *line==';')) return sline-line;  *store=0;  line=sline;  return 0;}static int GetHexBase(const char * &line, unsigned char *store, int count, bool fixedLen, bool asc){  line=skipspace(line);  const char *sline=line;  unsigned char *sstore=store;  int scount=count;  while(count) {    if(line[0]==0 || line[1]==0 || !isxdigit(line[0]) || !isxdigit(line[1])) break;    if(asc) {       *store++=line[0]; *store++=line[1];       }    else {      int d1=HexDigit(line[0]);      int d0=HexDigit(line[1]);      *store++=(d1<<4) + d0;      }    line+=2; count--;    }  if(asc) *store=0; // make sure strings are NULL terminated  if((!count || (!fixedLen && count!=scount)) &&     (!*line || isspace(*line) || *line==';' || *line==']' || *line=='/') ) return scount-count;  memset(sstore,0,scount);  line=sline;  return 0;}int GetHex(const char * &line, unsigned char *store, int count, bool fixedLen){  return GetHexBase(line,store,count,fixedLen,false);}int GetHexAsc(const char * &line, unsigned char *store, int count){  return GetHexBase(line,store,count/2,true,true)*2;}unsigned long long Bin2LongLong(unsigned char *mem, int len){  unsigned long long k=0;  for(int i=0 ; i<len ; i++) { k<<=8; k+=mem[i]; }  return k;}bool CheckNull(const unsigned char *data, int len){  while(--len>=0) if(data[len]) return false;  return true;}bool CheckFF(const unsigned char *data, int len){  while(--len>=0) if(data[len]!=0xFF) return false;  return true;}unsigned char XorSum(const unsigned char *mem, int len){  unsigned char cs=0;  while(len>0) { cs ^= *mem++; len--; }  return cs;}// crc stuff taken from linux-2.6.0/lib/crc32.c/* * There are multiple 16-bit CRC polynomials in common use, but this is * *the* standard CRC-32 polynomial, first popularized by Ethernet. * x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x^1+x^0 */#define CRCPOLY_LE 0xedb88320unsigned int crc32_le(unsigned int crc, unsigned char const *p, int len){  crc^=0xffffffff; // zlib mod  while(len--) {    crc^=*p++;    for(int i=0; i<8; i++)      crc=(crc&1) ? (crc>>1)^CRCPOLY_LE : (crc>>1);    }  crc^=0xffffffff; // zlib mod  return crc;}// -- cLineBuff -----------------------------------------------------------------cLineBuff::cLineBuff(int blocksize){  blockSize=blocksize;  work=0;  blen=wlen=0;}cLineBuff::~cLineBuff(){  free(work);}void cLineBuff::Flush(void){  blen=0;}char *cLineBuff::Grab(void){  char *w=work;  work=0; wlen=0;  Flush();  return w;}bool cLineBuff::Check(int num){  if(wlen-blen<num) {    if(num<blockSize) num=blockSize;    char *w=(char *)realloc(work,wlen+num);    if(w) {      wlen+=num;      work=w;      }    }  return work!=0;}void cLineBuff::Printf(const char *fmt, ...){  int q=120;  while(Check(q)) {    int s=wlen-blen;    va_list ap;    va_start(ap,fmt);    q=vsnprintf(work+blen,s,fmt,ap);    va_end(ap);    if(q<s) {      if(q>0) blen+=q;      break;      }    // truncated    q+=100;    }}void cLineBuff::Strcat(const char *str){  if(str) Printf("%s",str);}void cLineBuff::Back(int n){  if(n>blen) blen=0; else blen-=n;  if(work) work[blen]=0;}// -- cSimpleListBase --------------------------------------------------------------cSimpleListBase::cSimpleListBase(void){  first=last=0; count=0;}cSimpleListBase::~cSimpleListBase(){  Clear();}void cSimpleListBase::Add(cSimpleItem *Item, cSimpleItem *After){  if(After) {    Item->next=After->next;    After->next=Item;    }  else {    Item->next=0;    if(last) last->next=Item;    else first=Item;    }  if(!Item->next) last=Item;  count++;}void cSimpleListBase::Ins(cSimpleItem *Item){  Item->next=first;  first=Item;  if(!Item->next) last=Item;  count++;}void cSimpleListBase::Del(cSimpleItem *Item, bool Del){  if(first==Item) {    first=Item->next;    if(!first) last=0;    }  else {    cSimpleItem *item=first;    while(item) {      if(item->next==Item) {        item->next=Item->next;        if(!item->next) last=item;        break;        }      item=item->next;      }    }  count--;  if(Del) delete Item;}void cSimpleListBase::Clear(void){  while(first) Del(first);  first=last=0; count=0;}

⌨️ 快捷键说明

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