diff options
author | Dan Winship <danw@src.gnome.org> | 2001-01-17 07:27:51 +0800 |
---|---|---|
committer | Dan Winship <danw@src.gnome.org> | 2001-01-17 07:27:51 +0800 |
commit | 3f72f5232033c8ba639a73f96faf0b8d801e7d78 (patch) | |
tree | ad7d615dbf20b0f20cea59fcd793feb860bae22e | |
parent | b7e8dd7d688c1c302a834f35806f0509f15433fe (diff) | |
download | gsoc2013-evolution-3f72f5232033c8ba639a73f96faf0b8d801e7d78.tar gsoc2013-evolution-3f72f5232033c8ba639a73f96faf0b8d801e7d78.tar.gz gsoc2013-evolution-3f72f5232033c8ba639a73f96faf0b8d801e7d78.tar.bz2 gsoc2013-evolution-3f72f5232033c8ba639a73f96faf0b8d801e7d78.tar.lz gsoc2013-evolution-3f72f5232033c8ba639a73f96faf0b8d801e7d78.tar.xz gsoc2013-evolution-3f72f5232033c8ba639a73f96faf0b8d801e7d78.tar.zst gsoc2013-evolution-3f72f5232033c8ba639a73f96faf0b8d801e7d78.zip |
fcntl(fd, F_GETFL) returns the flags as the return value, not via a passed
* camel-tcp-stream-raw.c (stream_getsockopt, stream_setsockopt):
* camel-stream-fs.c (stream_read, stream_write):
* camel-remote-store.c (socket_connect): fcntl(fd, F_GETFL)
returns the flags as the return value, not via a passed in
pointer. And F_SETFL looks for an int, not a long, and you have to
pass it what it's expecting because it's a va_arg parameter. (Yes,
the man page lies on Linux. But check the UNIX98 spec or the glibc
source.) Also, fix another bug in socket_connect: if we manage to
connect right away, unset O_NONBLOCK so it doesn't mess us up
later.
Fixes a bunch of problems with non-blocking I/O being done in the
allegedly-blocking case and then returning EWOULDBLOCK.
svn path=/trunk/; revision=7555
-rw-r--r-- | camel/ChangeLog | 16 | ||||
-rw-r--r-- | camel/camel-remote-store.c | 9 | ||||
-rw-r--r-- | camel/camel-stream-fs.c | 10 | ||||
-rw-r--r-- | camel/camel-tcp-stream-raw.c | 10 |
4 files changed, 31 insertions, 14 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog index 66a08258f8..9c2ec12bb0 100644 --- a/camel/ChangeLog +++ b/camel/ChangeLog @@ -1,3 +1,19 @@ +2001-01-16 Dan Winship <danw@ximian.com> + + * camel-tcp-stream-raw.c (stream_getsockopt, stream_setsockopt): + * camel-stream-fs.c (stream_read, stream_write): + * camel-remote-store.c (socket_connect): fcntl(fd, F_GETFL) + returns the flags as the return value, not via a passed in + pointer. And F_SETFL looks for an int, not a long, and you have to + pass it what it's expecting because it's a va_arg parameter. (Yes, + the man page lies on Linux. But check the UNIX98 spec or the glibc + source.) Also, fix another bug in socket_connect: if we manage to + connect right away, unset O_NONBLOCK so it doesn't mess us up + later. + + Fixes a bunch of problems with non-blocking I/O being done in the + allegedly-blocking case and then returning EWOULDBLOCK. + 2001-01-16 Chris Toshok <toshok@ximian.com> * providers/Makefile.am (NNTP_DIR): set to nntp if ENABLE_NNTP diff --git a/camel/camel-remote-store.c b/camel/camel-remote-store.c index 993d9b5778..ef6fe56df0 100644 --- a/camel/camel-remote-store.c +++ b/camel/camel-remote-store.c @@ -240,15 +240,16 @@ static int socket_connect(struct hostent *h, int port) return fd; } else { fd_set rdset, wrset; - long flags; - int fdmax; + int flags, fdmax; - fcntl(fd, F_GETFL, &flags); + flags = fcntl(fd, F_GETFL); fcntl(fd, F_SETFL, flags | O_NONBLOCK); ret = connect(fd, (struct sockaddr *)&sin, sizeof (sin)); - if (ret == 0) + if (ret == 0) { + fcntl(fd, F_SETFL, flags); return fd; + } if (errno != EINPROGRESS) { close(fd); diff --git a/camel/camel-stream-fs.c b/camel/camel-stream-fs.c index 92c11435fa..c1758c1ab0 100644 --- a/camel/camel-stream-fs.c +++ b/camel/camel-stream-fs.c @@ -226,10 +226,9 @@ stream_read (CamelStream *stream, char *buffer, size_t n) } while (nread == -1 && errno == EINTR); } else { fd_set rdset; - long flags; - int fdmax; + int flags, fdmax; - fcntl(stream_fs->fd, F_GETFL, &flags); + flags = fcntl(stream_fs->fd, F_GETFL); fcntl(stream_fs->fd, F_SETFL, flags | O_NONBLOCK); FD_ZERO(&rdset); FD_SET(stream_fs->fd, &rdset); @@ -278,10 +277,9 @@ stream_write (CamelStream *stream, const char *buffer, size_t n) } while (v == -1 && errno == EINTR); } else { fd_set rdset, wrset; - long flags; - int fdmax; + int flags, fdmax; - fcntl(stream_fs->fd, F_GETFL, &flags); + flags = fcntl(stream_fs->fd, F_GETFL); fcntl(stream_fs->fd, F_SETFL, flags | O_NONBLOCK); FD_ZERO(&rdset); FD_ZERO(&wrset); diff --git a/camel/camel-tcp-stream-raw.c b/camel/camel-tcp-stream-raw.c index 5886a30663..6467eed5da 100644 --- a/camel/camel-tcp-stream-raw.c +++ b/camel/camel-tcp-stream-raw.c @@ -243,9 +243,10 @@ stream_getsockopt (CamelTcpStream *stream, CamelSockOptData *data) return -1; if (data->option == CAMEL_SOCKOPT_NONBLOCKING) { - long flags; + int flags; - if (fcntl (((CamelTcpStreamRaw *)stream)->sockfd, F_GETFL, &flags) == -1) + flags = fcntl (((CamelTcpStreamRaw *)stream)->sockfd, F_GETFL); + if (flags == -1) return -1; data->value.non_blocking = flags & O_NONBLOCK; @@ -269,9 +270,10 @@ stream_setsockopt (CamelTcpStream *stream, const CamelSockOptData *data) return -1; if (data->option == CAMEL_SOCKOPT_NONBLOCKING) { - guint32 flags, set; + int flags, set; - if (fcntl (((CamelTcpStreamRaw *)stream)->sockfd, F_GETFL, &flags) == -1) + fcntl (((CamelTcpStreamRaw *)stream)->sockfd, F_GETFL); + if (flags == -1) return -1; set = data->value.non_blocking ? 1 : 0; |