Sfoglia il codice sorgente

better EINTR handling

z3APA3A 11 anni fa
parent
commit
8975b00cce
2 ha cambiato i file con 9 aggiunte e 5 eliminazioni
  1. 1 1
      src/sockgetchar.c
  2. 8 4
      src/sockmap.c

+ 1 - 1
src/sockgetchar.c

@@ -47,7 +47,7 @@ int socksendto(SOCKET sock, struct sockaddr * sin, unsigned char * buf, int bufs
 	if(res < 1) break;
 	res = so._sendto(sock, buf + sent, bufsize - sent, 0, sin, SASIZE(sin));
 	if(res < 0) {
-		if(errno !=  EAGAIN) break;
+		if(errno !=  EAGAIN && errno != EINTR) break;
 		continue;
 	}
 	sent += res;

+ 8 - 4
src/sockmap.c

@@ -130,7 +130,8 @@ int sockmap(struct clientparam * param, int timeo){
 		}
 		res = so._sendto(param->clisock, param->srvbuf + param->srvoffset,(!param->waitserver64 || (param->waitserver64 - received) > (param->srvinbuf - param->srvoffset))? param->srvinbuf - param->srvoffset : (int)(param->waitserver64 - received), 0, (struct sockaddr*)&param->sincr, sasize);
 		if(res < 0) {
-			if(errno != EAGAIN) return 96;
+			if(errno != EAGAIN && errno != EINTR) return 96;
+			if(errno == EINTR) usleep(SLEEPTIME);
 			continue;
 		}
 		param->srvoffset += res;
@@ -155,7 +156,8 @@ int sockmap(struct clientparam * param, int timeo){
 		}
 		res = so._sendto(param->remsock, param->clibuf + param->clioffset, (!param->waitclient64 || (param->waitclient64 - sent) > (param->cliinbuf - param->clioffset))? param->cliinbuf - param->clioffset : (int)(param->waitclient64 - sent), 0, (struct sockaddr*)&param->sins, sasize);
 		if(res < 0) {
-			if(errno != EAGAIN) return 97;
+			if(errno != EAGAIN && errno != EINTR) return 97;
+			if(errno == EINTR) usleep(SLEEPTIME);
 			continue;
 		}
 		param->clioffset += res;
@@ -180,7 +182,8 @@ int sockmap(struct clientparam * param, int timeo){
 		}
 		else {
 			if (res < 0){
-				if( errno != EAGAIN) return (94);
+				if(errno != EAGAIN && errno != EINTR) return 94;
+				if(errno == EINTR) usleep(SLEEPTIME);
 				continue;
 			}
 			param->cliinbuf += res;
@@ -210,7 +213,8 @@ int sockmap(struct clientparam * param, int timeo){
 		}
 		else {
 			if (res < 0){
-				if( errno != EAGAIN) return (93);
+				if(errno != EAGAIN && errno != EINTR) return 93;
+				if(errno == EINTR) usleep(SLEEPTIME);
 				continue;
 			}
 			param->srvinbuf += res;