#include <vdr/pat.h>\r
\r
#include "cc.h"\r
-//#include "network.h"\r
+#include "network.h"\r
//#include "parse.h"\r
\r
#define LIST_ONLY 0x03 /* CA application should clear the list when an 'ONLY' CAPMT object is received, and start working with the object */\r
\r
class cCardClientCCcam : public cCardClient , private cThread {\r
private:\r
+ cNetSocket so;\r
+ //\r
int pmtversion;\r
unsigned char sacapmt[4][2048];\r
unsigned char savedcw[4][16];\r
int newcw[4];\r
uint64_t timecw[4];\r
int ccam_fd[4];\r
- int cwccam_fd;\r
int lastcard;\r
int lastpid;\r
int failedcw;\r
//\r
void Writecapmt(int j);\r
- int CCSelect(int sd, bool forRead, int s);\r
- bool GetCCamCw(unsigned char *cw, int s);\r
protected:\r
virtual bool lLogin(int cardnum);\r
virtual void Action(void);\r
cCardClientCCcam::cCardClientCCcam(const char *Name)\r
:cCardClient(Name)\r
,cThread("CCcam listener")\r
+,so(DEFAULT_CONNECT_TIMEOUT,2,3600,true)\r
{\r
- cwccam_fd=-1;\r
pmtversion=0;\r
ccam_fd[0]=-1; ccam_fd[1]=-1; ccam_fd[2]=-1; ccam_fd[3]=-1;\r
}\r
\r
bool cCardClientCCcam::lLogin(int cardnum)\r
{\r
- int rc;\r
- int so =0;\r
sockaddr_un serv_addr_un;\r
char camdsock[256];\r
int res;\r
\r
- struct sockaddr_in servAddr;\r
- fflush(NULL);\r
close(ccam_fd[cardnum]);\r
sprintf(camdsock,"/var/emu/chroot%d/tmp/camd.socket",cardnum);\r
printf(" socket = %s\n",camdsock);\r
ccam_fd[cardnum] = -1;\r
}\r
PRINTF(L_CC_CCCAM,"Opened camd.socket..... ccamd_fd = %d ",ccam_fd[cardnum]);\r
- if (cwccam_fd!=-1) return 1;\r
- PRINTF(L_CC_CCCAM,"logging in");\r
- so=socket(AF_INET, SOCK_DGRAM, 0);\r
- if(so<0) {\r
- close(so);\r
- return false;\r
- }\r
- bzero(&servAddr, sizeof(servAddr));\r
- servAddr.sin_family = AF_INET;\r
- servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");\r
- servAddr.sin_port = htons(port);\r
- rc = bind (so, (struct sockaddr *) &servAddr,sizeof(servAddr));\r
- if(rc<0) {\r
- close(so);\r
- PRINTF(L_CC_CCCAM,"not logged in");\r
- return false;\r
- }\r
- cwccam_fd =so;\r
- PRINTF(L_CC_CCCAM,"logged in");\r
\r
- PRINTF(L_CC_CCCAM,"starting UDP listener");\r
- Start();\r
+ if(!so.Connected()) {\r
+ so.Disconnect();\r
+ if(!so.Bind("127.0.0.1",port)) return false;\r
+ PRINTF(L_CC_CCCAM,"Bound to port %d, starting UDP listener",port);\r
+ Start();\r
+ }\r
return true;\r
}\r
\r
{\r
unsigned char cw[18];\r
while(Running()) {\r
- if (GetCCamCw(cw,0)) {\r
+ if(so.Read(cw,sizeof(cw))==sizeof(cw)) {\r
PRINTF(L_CC_CCCAM," Got: %02hhx%02hhx %02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx %02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx",\r
cw[0],cw[1],\r
cw[2],cw[3],cw[4],cw[5],cw[6],cw[7],cw[8],cw[9],\r
}\r
}\r
}\r
-\r
-bool cCardClientCCcam::GetCCamCw(unsigned char *cw, int s)\r
-{\r
- unsigned char msg[18];\r
- int n;\r
- struct sockaddr cliAddr;\r
- socklen_t cliLen;\r
- cliLen = sizeof(cliAddr);\r
- if (CCSelect(cwccam_fd, true,100))\r
- n = ::recvfrom(cwccam_fd, msg, 18, 0, (struct sockaddr *) &cliAddr, &cliLen);\r
- else\r
- return false;\r
- if(n<0)\r
- return false;\r
- memcpy(cw, msg, 18);\r
- return(true);\r
-}\r
-\r
-int cCardClientCCcam::CCSelect(int sd, bool forRead, int s)\r
-{\r
- if(sd>=0) {\r
- fd_set fds;\r
- FD_ZERO(&fds); FD_SET(sd,&fds);\r
- struct timeval tv;\r
- tv.tv_sec=4; tv.tv_usec=000;\r
- int r=::select(sd+1,forRead ? &fds:0,forRead ? 0:&fds,0,&tv);\r
- if(r>0) return 1;\r
- else if(r<0) return 0;\r
- else return 0;\r
- }\r
- return 0;\r
-}\r