| 164 struct in_addr *a = addr; |
166 struct in_addr *a = addr; |
| 165 |
167 |
| 166 gg_debug(GG_DEBUG_FUNCTION, "** gg_connect(%s, %d, %d);\n", inet_ntoa(*a), port, async); |
168 gg_debug(GG_DEBUG_FUNCTION, "** gg_connect(%s, %d, %d);\n", inet_ntoa(*a), port, async); |
| 167 |
169 |
| 168 if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) { |
170 if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) { |
| 169 gg_debug(GG_DEBUG_MISC, "-- socket() failed. errno = %d" |
171 gg_debug(GG_DEBUG_MISC, "-- socket() failed. errno = %d (%s)\n", errno, strerror(errno)); |
| 170 #ifndef _WIN32 |
|
| 171 " (%s)\n", errno, strerror(errno) |
|
| 172 #else |
|
| 173 "\n", WSAGetLastError() |
|
| 174 #endif |
|
| 175 ); |
|
| 176 return -1; |
172 return -1; |
| 177 } |
173 } |
| 178 |
174 |
| 179 if (async) { |
175 if (async) { |
| 180 #ifndef _WIN32 |
|
| 181 if (ioctl(sock, FIONBIO, &one) == -1) { |
176 if (ioctl(sock, FIONBIO, &one) == -1) { |
| 182 gg_debug(GG_DEBUG_MISC, "-- ioctl() failed. errno = %d (%s)\n", errno, strerror(errno)); |
177 gg_debug(GG_DEBUG_MISC, "-- ioctl() failed. errno = %d (%s)\n", errno, strerror(errno)); |
| 183 #else |
|
| 184 if (ioctlsocket(sock, FIONBIO, (unsigned long *)&one) == SOCKET_ERROR) { |
|
| 185 gg_debug(GG_DEBUG_MISC, "-- ioctlsocket() failed. errno = %d\n", WSAGetLastError()); |
|
| 186 #endif |
|
| 187 return -1; |
178 return -1; |
| 188 } |
179 } |
| 189 } |
180 } |
| 190 |
181 |
| 191 sin.sin_port = htons(port); |
182 sin.sin_port = htons(port); |
| 192 sin.sin_family = AF_INET; |
183 sin.sin_family = AF_INET; |
| 193 sin.sin_addr.s_addr = a->s_addr; |
184 sin.sin_addr.s_addr = a->s_addr; |
| 194 |
185 |
| 195 if ((ret = connect(sock, (struct sockaddr*) &sin, sizeof(sin))) == -1) { |
186 if ((ret = connect(sock, (struct sockaddr*) &sin, sizeof(sin))) == -1) { |
| 196 #ifndef _WIN32 |
|
| 197 if (errno && (!async || errno != EINPROGRESS)) { |
187 if (errno && (!async || errno != EINPROGRESS)) { |
| 198 gg_debug(GG_DEBUG_MISC, "-- connect() failed. errno = %d (%s)\n", errno, strerror(errno)); |
188 gg_debug(GG_DEBUG_MISC, "-- connect() failed. errno = %d (%s)\n", errno, strerror(errno)); |
| 199 return -1; |
189 return -1; |
| 200 } |
190 } |
| 201 #else |
|
| 202 if (ret == SOCKET_ERROR) { |
|
| 203 gg_debug(GG_DEBUG_MISC, "-- connect() SOCKET_ERROR: %d\n", WSAGetLastError()); |
|
| 204 if((WSAGetLastError() != WSAEWOULDBLOCK) && |
|
| 205 (!async || WSAGetLastError() != WSAEINPROGRESS)) { |
|
| 206 gg_debug(GG_DEBUG_MISC, "-- connect() failed. errno = %d\n", WSAGetLastError()); |
|
| 207 return -1; |
|
| 208 } |
|
| 209 } |
|
| 210 #endif |
|
| 211 gg_debug(GG_DEBUG_MISC, "-- connect() in progress\n"); |
191 gg_debug(GG_DEBUG_MISC, "-- connect() in progress\n"); |
| 212 } |
192 } |
| 213 |
193 |
| 214 return sock; |
194 return sock; |
| 215 } |
195 } |
| 231 |
211 |
| 232 gg_debug(GG_DEBUG_FUNCTION, "** gg_read_line(...);\n"); |
212 gg_debug(GG_DEBUG_FUNCTION, "** gg_read_line(...);\n"); |
| 233 |
213 |
| 234 for (; length > 1; buf++, length--) { |
214 for (; length > 1; buf++, length--) { |
| 235 do { |
215 do { |
| 236 #ifndef _WIN32 |
|
| 237 if ((ret = read(sock, buf, 1)) == -1 && errno != EINTR) { |
216 if ((ret = read(sock, buf, 1)) == -1 && errno != EINTR) { |
| 238 #else |
|
| 239 if ((ret = recv(sock, buf, 1, 0)) == SOCKET_ERROR && (WSAGetLastError() != WSAEINTR)) { |
|
| 240 #endif |
|
| 241 *buf = 0; |
217 *buf = 0; |
| 242 return; |
218 return; |
| 243 } |
219 } |
| 244 #ifndef _WIN32 |
|
| 245 } while (ret == -1 && errno == EINTR); |
220 } while (ret == -1 && errno == EINTR); |
| 246 #else |
|
| 247 } while (ret == SOCKET_ERROR && WSAGetLastError() == WSAEINTR); |
|
| 248 #endif |
|
| 249 |
221 |
| 250 if (*buf == '\n') { |
222 if (*buf == '\n') { |
| 251 buf++; |
223 buf++; |
| 252 break; |
224 break; |
| 253 } |
225 } |