]> www.vanbest.org Git - sasc-ng.git/commitdiff
cardclient-camd: fix poll error handling
authorleslie <unknown>
Thu, 10 Sep 2009 23:48:41 +0000 (07:48 +0800)
committerleslie <unknown>
Thu, 10 Sep 2009 23:48:41 +0000 (07:48 +0800)
network.c
systems/cardclient/camd.c
systems/cardclient/cc.c

index b6cbe6ee4b6c986418069e3e3bc3bf4bf5fd40ff..2ece6d47413d03a80539a1744b275716be63edfb 100644 (file)
--- a/network.c
+++ b/network.c
@@ -305,7 +305,7 @@ int cNetSocket::Read(unsigned char *data, int len, int timeout)
   cTimeMs tim;
   do {
     r=timeout;
-    if(blockmode) { r-=tim.Elapsed(); if(r<10) r=10; }
+    if(r>0 && blockmode) { r-=tim.Elapsed(); if(r<10) r=10; }
     r=Select(true,r);
     if(r>0) {
       r=LOOP_EINTR(read(sd,data+cnt,len-cnt));
@@ -332,7 +332,8 @@ int cNetSocket::Write(const unsigned char *data, int len, int timeout)
   int cnt=0, r;
   cTimeMs tim;
   do {
-    r=timeout-tim.Elapsed(); if(r<10) r=10;
+    r=timeout;
+    if(r>0) { r-=tim.Elapsed(); if(r<10) r=10; }
     r=Select(false,r);
     if(r>0) {
       r=LOOP_EINTR(write(sd,data+cnt,len-cnt));
@@ -357,7 +358,8 @@ int cNetSocket::SendTo(const char *Host, int Port, const unsigned char *data, in
   if(GetAddr(&saddr,Host,Port)) {
     cTimeMs tim;
     do {
-      r=timeout-tim.Elapsed(); if(r<10) r=10;
+      r=timeout;
+      if(r>0) { r-=tim.Elapsed(); if(r<10) r=10; }
       r=Select(false,r);
       if(r>0) {
         r=LOOP_EINTR(sendto(sd,data+cnt,len-cnt,0,(struct sockaddr *)&saddr,sizeof(saddr)));
index 374161d303b901d6134734102af4ae0856b3aad3..d9ef6b798c7bca41c9d414abe7540d91831a8680 100644 (file)
@@ -485,12 +485,13 @@ bool cCardClientCamd35::SendBlock(struct CmdBlock *cb, int datalen)
 int cCardClientCamd35::RecvBlock(struct CmdBlock *cb, int maxlen, int to)
 {
   unsigned char *m=(unsigned char *)cb;
-  if(cCardClient::RecvMsg(m,16+UCSIZE(cb),to)<0) {
-    PRINTF(L_CC_CAMD35,"short packet received");
+  int n=cCardClient::RecvMsg(m,16+UCSIZE(cb),to);
+  if(n<=0) {
+    if(n<0) PRINTF(L_CC_CAMD35,"short packet received");
     return -1;
     }
   Decrypt(m+UCSIZE(cb),16);
-  int n=cb->udp_header.len+HDSIZE(cb);
+  n=cb->udp_header.len+HDSIZE(cb);
   if(n>maxlen) {
     PRINTF(L_CC_CAMD35,"received buffer overflow");
     return -1;
index 7334644d39d2aad5eb9f1dfa5c17d3217ee07cfb..f38ed71ac6b0828b89c2b72a0aaaa3be1500097c 100644 (file)
@@ -122,7 +122,7 @@ int cCardClient::RecvMsg(unsigned char *data, int len, int to)
   if(!so.Connected() && !Login()) return -1;
   int n=so.Read(data,len,to);
   if(n<0) {
-    if(len<0 && errno==ETIMEDOUT) return 0;
+    if(errno==ETIMEDOUT && (len<0 || to==0)) return 0;
     PRINTF(L_CC_CORE,"recv error. reconnecting...");;
     Logout();
     }