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

Reply via email to