From: leslie Date: Thu, 10 Sep 2009 23:48:41 +0000 (+0800) Subject: cardclient-camd: fix poll error handling X-Git-Tag: upstream/620~173 X-Git-Url: http://www.vanbest.org/gitweb/?a=commitdiff_plain;h=5abf490729c847b5d3eb197d4d63805ad935c93f;p=sasc-ng.git cardclient-camd: fix poll error handling --- diff --git a/network.c b/network.c index b6cbe6e..2ece6d4 100644 --- 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))); diff --git a/systems/cardclient/camd.c b/systems/cardclient/camd.c index 374161d..d9ef6b7 100644 --- a/systems/cardclient/camd.c +++ b/systems/cardclient/camd.c @@ -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; diff --git a/systems/cardclient/cc.c b/systems/cardclient/cc.c index 7334644..f38ed71 100644 --- a/systems/cardclient/cc.c +++ b/systems/cardclient/cc.c @@ -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(); }