W dniu 22 października 2011 02:31 użytkownik Tomasz Wasilczyk <tomkiewicz.gro...@gmail.com> napisał: > W dniu 21 października 2011 23:17 użytkownik Wojtek Kaniewski > <wojte...@toxygen.net> napisał: >> Jeśli jest FIONBIO, a nie ma ioctl() to prawdopodobnie powinniśmy użyć >> ioctlsocket(). Mógłbyś sprawdzić, czy dodanie >> >> #define ioctl ioctlsocket >> >> do network.h pomoże? > > Pomogło, tzn. kod się kompiluje. Ale znowu rzuca warningami o > nieprawidłowych typach (u_long vs int). > >> O ile cygwin sobie z tym poradzi, to pewnie MSVC++ będzie już miał z >> typami problem. Faktycznie, makra rzutujące się przydadzą. > > Ostatecznie kompilowałem z takim zestawem makr w sekcji Win32 > network.h - już bez żadnych warningów przy kompilacji, za to cały czas > z warningiem przy linkowaniu, którego nie wiem jak zmusić, żeby > zdradził mi który to symbol mu się nie podoba: > > # define ioctl(a, b, c) ioctlsocket(a, b, (u_long *)(c)) > # define getsockopt(a, b, c, d, e) getsockopt(a, b, c, (char *)(d), e) > # define send(a, b, c, d) send(a, (char *)(b), c, d) > # define recv(a, b, c, d) recv(a, (char *)(b), c, d)
Co do ioctlsocket(), to alternatywnie można wywoływać je z poprawnym typem, jak w załączonej łatce. Kwestia gustu, bo oba rozwiązania będą działać. Pozdrawiam, Bartosz
diff --git a/src/common.c b/src/common.c index 700a261..e7908f1 100644 --- a/src/common.c +++ b/src/common.c @@ -236,7 +236,7 @@ char *gg_read_line(int sock, char *buf, int length) */ int gg_connect(void *addr, int port, int async) { - int sock, one = 1, errno2; + int sock, errno2; struct sockaddr_in sin; struct in_addr *a = addr; struct sockaddr_in myaddr; @@ -263,11 +263,17 @@ int gg_connect(void *addr, int port, int async) if (async) { #ifdef FIONBIO +#ifdef _WIN32 + u_long one = 1; +#else + int one = 1; +#endif + if (ioctl(sock, FIONBIO, &one) == -1) { #else if (fcntl(sock, F_SETFL, O_NONBLOCK) == -1) { #endif - gg_debug(GG_DEBUG_MISC, "// gg_connect() ioctl() failed (errno=%d, %s)\n", errno, strerror(errno)); + gg_debug(GG_DEBUG_MISC, "// gg_connect() can't set nonblocking (errno=%d, %s)\n", errno, strerror(errno)); errno2 = errno; close(sock); errno = errno2; diff --git a/src/dcc.c b/src/dcc.c index c9b0760..e768f09 100644 --- a/src/dcc.c +++ b/src/dcc.c @@ -596,8 +596,15 @@ struct gg_event *gg_dcc_watch_fd(struct gg_dcc *h) if (h->type == GG_SESSION_DCC_SOCKET) { struct sockaddr_in sin; struct gg_dcc *c; - int fd, one = 1; + int fd; socklen_t sin_len = sizeof(sin); +#ifdef FIONBIO +#ifdef _WIN32 + u_long one = 1; +#else + int one = 1; +#endif +#endif if ((fd = accept(h->fd, (struct sockaddr*) &sin, &sin_len)) == -1) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() can't accept() new connection (errno=%d, %s)\n", errno, strerror(errno)); diff --git a/src/dcc7.c b/src/dcc7.c index cbccf0a..7ef2991 100644 --- a/src/dcc7.c +++ b/src/dcc7.c @@ -1048,6 +1048,13 @@ struct gg_event *gg_dcc7_watch_fd(struct gg_dcc7 *dcc) struct sockaddr_in sin; int fd, one = 1; socklen_t sin_len = sizeof(sin); +#ifdef FIONBIO +#ifdef _WIN32 + u_long one = 1; +#else + int one = 1; +#endif +#endif gg_debug_dcc(dcc, GG_DEBUG_MISC, "// gg_dcc7_watch_fd() GG_STATE_LISTENING\n");
_______________________________________________ libgadu-devel mailing list libgadu-devel@lists.ziew.org http://lists.ziew.org/mailman/listinfo/libgadu-devel