]> www.vanbest.org Git - sasc-ng.git/commitdiff
cardclient-CCcam: use core network code
authorleslie <unknown>
Mon, 9 Jun 2008 05:01:22 +0000 (13:01 +0800)
committerleslie <unknown>
Mon, 9 Jun 2008 05:01:22 +0000 (13:01 +0800)
systems/cardclient/cccam.c

index 79f3f0afa4ff0126fc1cbf76c4fa940de40a61a0..2b933b7af301a930314f0baec7becc4ceffc53a5 100644 (file)
@@ -33,7 +33,7 @@
 #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
@@ -42,6 +42,8 @@
 \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
@@ -49,14 +51,11 @@ private:
   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
@@ -72,8 +71,8 @@ static cCardClientLinkReg<cCardClientCCcam> __ncd("CCcam");
 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
@@ -95,14 +94,10 @@ bool cCardClientCCcam::CanHandle(unsigned short SysId)
 \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
@@ -117,28 +112,13 @@ bool cCardClientCCcam::lLogin(int cardnum)
     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
@@ -294,7 +274,7 @@ void cCardClientCCcam::Action()
 {\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
@@ -316,35 +296,3 @@ void cCardClientCCcam::Action()
       }\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