src/protocols/gg/common.c

changeset 3717
2fc0789e04e8
parent 3630
caa952062dc2
child 8896
8785fb2da2e6
equal deleted inserted replaced
3716:172593593072 3717:2fc0789e04e8
1 /* $Id: common.c 3753 2002-10-11 03:14:01Z robflynn $ */ 1 /* $Id: common.c 3850 2002-10-16 19:57:03Z hermanator $ */
2 2
3 /* 3 /*
4 * (C) Copyright 2001 Wojtek Kaniewski <wojtekka@irc.pl>, 4 * (C) Copyright 2001 Wojtek Kaniewski <wojtekka@irc.pl>,
5 * Robert J. Woźny <speedy@ziew.org> 5 * Robert J. Woźny <speedy@ziew.org>
6 * 6 *
27 #include <arpa/inet.h> 27 #include <arpa/inet.h>
28 #include <netdb.h> 28 #include <netdb.h>
29 #include <sys/ioctl.h> 29 #include <sys/ioctl.h>
30 #include <pwd.h> 30 #include <pwd.h>
31 #include <sys/wait.h> 31 #include <sys/wait.h>
32 #else
33 #include <winsock.h>
34 #endif 32 #endif
35 #include <sys/time.h> 33 #include <sys/time.h>
36 #include <errno.h> 34 #include <errno.h>
37 #ifndef _AIX 35 #ifndef _AIX
38 # include <string.h> 36 # include <string.h>
43 #include <sys/filio.h> 41 #include <sys/filio.h>
44 #endif 42 #endif
45 #include "libgg.h" 43 #include "libgg.h"
46 #include "config.h" 44 #include "config.h"
47 #include <glib.h> 45 #include <glib.h>
46
47 #ifdef _WIN32
48 #include "win32dep.h"
49 #endif
48 50
49 /* 51 /*
50 * gg_debug() 52 * gg_debug()
51 * 53 *
52 * wyrzuca komunikat o danym poziomie, o ile użytkownik sobie tego życzy. 54 * wyrzuca komunikat o danym poziomie, o ile użytkownik sobie tego życzy.
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 }

mercurial