From: shingil.kang Date: Thu, 18 Dec 2014 09:59:40 +0000 (+0900) Subject: SDB: Fixed to send notify to sdbd using nonblock api on linux X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a8e69173fe45a3591cc82272d296ce8335e98317;p=sdk%2Ftools%2Fsdb.git SDB: Fixed to send notify to sdbd using nonblock api on linux Change-Id: I1b83fa0b90f4d3f328e05d455a2bb1aa226dcdd0 Signed-off-by: shingil.kang --- diff --git a/src/utils_unix.c b/src/utils_unix.c index 4f9f7db..f05441d 100755 --- a/src/utils_unix.c +++ b/src/utils_unix.c @@ -320,15 +320,67 @@ static int _sdb_host_connect(const char *host, int port, int type) return -1; } - if(connect(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) { - sdb_close(s); - return -1; - } + int connect_timeout = 1; + if(connect_nonb(s, (struct sockaddr *) &addr, sizeof(addr), connect_timeout) < 0) { + sdb_close(s); + return -1; + } return s; } +int connect_nonb(int sockfd, const struct sockaddr *saptr, socklen_t salen, int nsec) +{ + int flags, n, error; + socklen_t len; + fd_set rset, wset; + struct timeval tval; + + flags = fcntl(sockfd, F_GETFL, 0); + fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); + + error = 0; + if ((n = connect(sockfd, (struct sockaddr *) saptr, salen)) < 0) + if (errno != EINPROGRESS) + return (-1); + + /* Do whatever we want while the connect is taking place. */ + + if (n == 0) + goto done; + /* connect completed immediately */ + + FD_ZERO(&rset); + FD_SET(sockfd, &rset); + wset = rset; + tval.tv_sec = nsec; + tval.tv_usec = 0; + if ((n = select(sockfd + 1, &rset, &wset, NULL, nsec ? &tval : NULL)) + == 0) { + sdb_close(sockfd); /* timeout */ + errno = ETIMEDOUT; + return (-1); + } + if (FD_ISSET(sockfd, &rset) || FD_ISSET(sockfd, &wset)) { + len = sizeof(error); + if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) + return (-1); /* Solaris pending error */ + } else + D("select error: sockfd not set\n"); + + done: fcntl(sockfd, F_SETFL, flags); /* restore file status flags */ + + if (error) { + sdb_close(sockfd); /* just in case */ + errno = error; + return (-1); + } + return (0); +} + + + static int _sdb_port_listen(uint32_t inet, int port, int type) { struct sockaddr_in addr;