diff options
author | jani@ua141d10.elisa.omakaista.fi <> | 2005-10-13 18:23:53 +0300 |
---|---|---|
committer | jani@ua141d10.elisa.omakaista.fi <> | 2005-10-13 18:23:53 +0300 |
commit | 2dd1e4f94ef2e2ec8e9daeb4903a711dd9a3c1c9 (patch) | |
tree | 110201972d71b85d5c8e4bf068770a1ffd6fca61 /vio | |
parent | fbd5140f2bc7cd53042e633909ad5e4ade9e1200 (diff) | |
parent | cf173e553d7df42c53f4cdd4b29bbbf1c8b702d8 (diff) | |
download | mariadb-git-2dd1e4f94ef2e2ec8e9daeb4903a711dd9a3c1c9.tar.gz |
Merge ua141d10.elisa.omakaista.fi:/home/my/bk/mysql-4.1-tmp
into ua141d10.elisa.omakaista.fi:/home/my/bk/mysql-5.0
Diffstat (limited to 'vio')
-rw-r--r-- | vio/vio.c | 16 | ||||
-rw-r--r-- | vio/viosocket.c | 9 |
2 files changed, 20 insertions, 5 deletions
diff --git a/vio/vio.c b/vio/vio.c index e444c634c96..d1e723f292d 100644 --- a/vio/vio.c +++ b/vio/vio.c @@ -149,10 +149,18 @@ Vio *vio_new(my_socket sd, enum enum_vio_type type, uint flags) vio->sd); #if !defined(__WIN__) && !defined(__EMX__) && !defined(OS2) #if !defined(NO_FCNTL_NONBLOCK) -#if defined(__FreeBSD__) - fcntl(sd, F_SETFL, vio->fcntl_mode); /* Yahoo! FreeBSD patch */ -#endif - vio->fcntl_mode = fcntl(sd, F_GETFL); + /* + We call fcntl() to set the flags and then immediately read them back + to make sure that we and the system are in agreement on the state of + things. + + An example of why we need to do this is FreeBSD (and apparently some + other BSD-derived systems, like Mac OS X), where the system sometimes + reports that the socket is set for non-blocking when it really will + block. + */ + fcntl(sd, F_SETFL, vio->fcntl_mode); + vio->fcntl_mode= fcntl(sd, F_GETFL); #elif defined(HAVE_SYS_IOCTL_H) /* hpux */ /* Non blocking sockets doesn't work good on HPUX 11.0 */ (void) ioctl(sd,FIOSNBIO,0); diff --git a/vio/viosocket.c b/vio/viosocket.c index ea45d7ce5a7..5e0ed20b039 100644 --- a/vio/viosocket.c +++ b/vio/viosocket.c @@ -138,7 +138,14 @@ int vio_blocking(Vio * vio __attribute__((unused)), my_bool set_blocking_mode, else vio->fcntl_mode |= O_NONBLOCK; /* set bit */ if (old_fcntl != vio->fcntl_mode) - r = fcntl(vio->sd, F_SETFL, vio->fcntl_mode); + { + r= fcntl(vio->sd, F_SETFL, vio->fcntl_mode); + if (r == -1) + { + DBUG_PRINT("info", ("fcntl failed, errno %d", errno)); + vio->fcntl_mode= old_fcntl; + } + } } #else r= set_blocking_mode ? 0 : 1; |