diff options
| author | Mike Buland <eichlan@xagasoft.com> | 2010-05-25 02:29:05 +0000 |
|---|---|---|
| committer | Mike Buland <eichlan@xagasoft.com> | 2010-05-25 02:29:05 +0000 |
| commit | a0c6e974a3393642bda80fed5bce464a6c6cf2ec (patch) | |
| tree | 30e3098bb9a4da43bf5f94bd1e1944e070144615 /src/socket.cpp | |
| parent | ecc191f590f76584a14c9c51727412b0b7b3086e (diff) | |
| download | libbu++-a0c6e974a3393642bda80fed5bce464a6c6cf2ec.tar.gz libbu++-a0c6e974a3393642bda80fed5bce464a6c6cf2ec.tar.bz2 libbu++-a0c6e974a3393642bda80fed5bce464a6c6cf2ec.tar.xz libbu++-a0c6e974a3393642bda80fed5bce464a6c6cf2ec.zip | |
We now have a portable tempfile function, cool, it compiles on windows.
Fixed a bug in Socket, it wasn't closing the socket in all exception cases.
Also fixed a few things in the unit test framework, going to add some more
helpers soon.
Diffstat (limited to 'src/socket.cpp')
| -rw-r--r-- | src/socket.cpp | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/src/socket.cpp b/src/socket.cpp index 41e0763..696db1e 100644 --- a/src/socket.cpp +++ b/src/socket.cpp | |||
| @@ -77,6 +77,7 @@ Bu::Socket::Socket( const Bu::FString &sAddr, int nPort, int nTimeout ) : | |||
| 77 | if( (ret = bu_getaddrinfo( | 77 | if( (ret = bu_getaddrinfo( |
| 78 | sAddr.getStr(), ibuf, &aiHints, &pAddr )) != 0 ) | 78 | sAddr.getStr(), ibuf, &aiHints, &pAddr )) != 0 ) |
| 79 | { | 79 | { |
| 80 | close(); | ||
| 80 | throw Bu::SocketException("Couldn't resolve hostname %s (%s).\n", | 81 | throw Bu::SocketException("Couldn't resolve hostname %s (%s).\n", |
| 81 | sAddr.getStr(), bu_gai_strerror(ret)); | 82 | sAddr.getStr(), bu_gai_strerror(ret)); |
| 82 | } | 83 | } |
| @@ -151,7 +152,11 @@ size_t Bu::Socket::read( void *pBuf, size_t nBytes ) | |||
| 151 | FD_SET(nSocket, &rfds); | 152 | FD_SET(nSocket, &rfds); |
| 152 | struct timeval tv = {0, 0}; | 153 | struct timeval tv = {0, 0}; |
| 153 | if( bu_select( nSocket+1, &rfds, NULL, NULL, &tv ) < 0 ) | 154 | if( bu_select( nSocket+1, &rfds, NULL, NULL, &tv ) < 0 ) |
| 154 | throw SocketException( SocketException::cRead, strerror(errno) ); | 155 | { |
| 156 | int iErr = errno; | ||
| 157 | close(); | ||
| 158 | throw SocketException( SocketException::cRead, strerror(iErr) ); | ||
| 159 | } | ||
| 155 | if( FD_ISSET( nSocket, &rfds ) || bBlocking ) | 160 | if( FD_ISSET( nSocket, &rfds ) || bBlocking ) |
| 156 | { | 161 | { |
| 157 | int nRead = TEMP_FAILURE_RETRY( | 162 | int nRead = TEMP_FAILURE_RETRY( |
| @@ -176,7 +181,9 @@ size_t Bu::Socket::read( void *pBuf, size_t nBytes ) | |||
| 176 | } | 181 | } |
| 177 | if( errno == EAGAIN ) | 182 | if( errno == EAGAIN ) |
| 178 | return 0; | 183 | return 0; |
| 179 | throw SocketException( SocketException::cRead, strerror(errno) ); | 184 | int iErr = errno; |
| 185 | close(); | ||
| 186 | throw SocketException( SocketException::cRead, strerror(iErr) ); | ||
| 180 | #endif | 187 | #endif |
| 181 | } | 188 | } |
| 182 | return nRead; | 189 | return nRead; |
