Module: sip-router Branch: master Commit: fe9c519ca6ef6625f0b0d9c7027158641c636087 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=fe9c519c...
Author: Daniel-Constantin Mierla miconda@gmail.com Committer: Daniel-Constantin Mierla miconda@gmail.com Date: Tue Apr 22 20:51:31 2014 +0200
sercmd: refactored reading the rest from socket on reply too long
- patch by by Savolainen Dmitri, FS#422
---
utils/sercmd/sercmd.c | 18 ++++++++++++++---- 1 files changed, 14 insertions(+), 4 deletions(-)
diff --git a/utils/sercmd/sercmd.c b/utils/sercmd/sercmd.c index a726eee..00f10e7 100644 --- a/utils/sercmd/sercmd.c +++ b/utils/sercmd/sercmd.c @@ -720,11 +720,21 @@ static int get_reply(int s, unsigned char* reply_buf, int max_reply_size, } msg_end=hdr_end+in_pkt->tlen; if ((int)(msg_end-reply_buf)>max_reply_size) { - int flags = fcntl(s, F_GETFL, 0); - fcntl(s, F_SETFL, flags | O_NONBLOCK); /* reading the rest from the socket */ - while(read(s, reply_buf, max_reply_size)>0); - fcntl(s, F_SETFL, flags & (~O_NONBLOCK)); + struct timeval timeout_save; + unsigned sizeoft = sizeof(timeout_save); + if (getsockopt(s, SOL_SOCKET, SO_RCVTIMEO, + &timeout_save, &sizeoft)==0) { + struct timeval timeout; + timeout.tv_sec = 1; + timeout.tv_usec = 0; + if (setsockopt (s, SOL_SOCKET, SO_RCVTIMEO, + (char*)&timeout,sizeof(timeout))==0) { + while(read(s, reply_buf, max_reply_size)>0); + setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, + (char*)&timeout_save,sizeof(timeout_save)); + } + } goto error_toolong; } }