diff options
| author | Stanislav Sedov <stas@FreeBSD.org> | 2011-10-05 07:23:29 +0000 | 
|---|---|---|
| committer | Stanislav Sedov <stas@FreeBSD.org> | 2011-10-05 07:23:29 +0000 | 
| commit | 7c450da7b446c557e05f34a100b597800967d987 (patch) | |
| tree | 57a48e7e9b592f2d5b713e80a4455820625c2b7b /lib/krb5/net_write.c | |
| parent | b4e3a10e9339a8400197298021d6ca9b8e3aa039 (diff) | |
Diffstat (limited to 'lib/krb5/net_write.c')
| -rw-r--r-- | lib/krb5/net_write.c | 97 | 
1 files changed, 55 insertions, 42 deletions
| diff --git a/lib/krb5/net_write.c b/lib/krb5/net_write.c index 868015fa9214..289b96541feb 100644 --- a/lib/krb5/net_write.c +++ b/lib/krb5/net_write.c @@ -1,59 +1,56 @@  /* - * Copyright (c) 1997, 1998 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden).  - * All rights reserved.  + * Copyright (c) 1997, 1998 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved.   * - * Redistribution and use in source and binary forms, with or without  - * modification, are permitted provided that the following conditions  - * are met:  + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met:   * - * 1. Redistributions of source code must retain the above copyright  - *    notice, this list of conditions and the following disclaimer.  + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer.   * - * 2. Redistributions in binary form must reproduce the above copyright  - *    notice, this list of conditions and the following disclaimer in the  - *    documentation and/or other materials provided with the distribution.  + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution.   * - * 3. Neither the name of the Institute nor the names of its contributors  - *    may be used to endorse or promote products derived from this software  - *    without specific prior written permission.  + * 3. Neither the name of the Institute nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission.   * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND  - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE  - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE  - * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE  - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL  - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS  - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)  - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT  - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY  - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF  - * SUCH DAMAGE.  + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE.   */  #include "krb5_locl.h" -RCSID("$Id: net_write.c 13863 2004-05-25 21:46:46Z lha $"); - -krb5_ssize_t KRB5_LIB_FUNCTION +KRB5_LIB_FUNCTION krb5_ssize_t KRB5_LIB_CALL  krb5_net_write (krb5_context context,  		void *p_fd,  		const void *buf,  		size_t len)  { -  int fd = *((int *)p_fd); - -  return net_write (fd, buf, len); +    krb5_socket_t fd = *((krb5_socket_t *)p_fd); +    return net_write(fd, buf, len);  } -krb5_ssize_t KRB5_LIB_FUNCTION +KRB5_LIB_FUNCTION krb5_ssize_t KRB5_LIB_CALL  krb5_net_write_block(krb5_context context,  		     void *p_fd,  		     const void *buf,  		     size_t len,  		     time_t timeout)  { -  int fd = *((int *)p_fd); +  krb5_socket_t fd = *((krb5_socket_t *)p_fd);    int ret;    struct timeval tv, *tvp;    const char *cbuf = (const char *)buf; @@ -64,7 +61,7 @@ krb5_net_write_block(krb5_context context,    do {        FD_ZERO(&wfds);        FD_SET(fd, &wfds); -       +        if (timeout != 0) {  	  tv.tv_sec = timeout;  	  tv.tv_usec = 0; @@ -73,29 +70,45 @@ krb5_net_write_block(krb5_context context,  	  tvp = NULL;        ret = select(fd + 1, NULL, &wfds, NULL, tvp); -      if (ret < 0) { -	  if (errno == EINTR) +      if (rk_IS_SOCKET_ERROR(ret)) { +	  if (rk_SOCK_ERRNO == EINTR)  	      continue;  	  return -1; -      } else if (ret == 0) +      } + +#ifdef HAVE_WINSOCK +      if (ret == 0) { +	  WSASetLastError( WSAETIMEDOUT ); +	  return 0; +      } + +      count = send (fd, cbuf, rem, 0); + +      if (rk_IS_SOCKET_ERROR(count)) { +	  return -1; +      } + +#else +      if (ret == 0) {  	  return 0; -       +      } +        if (!FD_ISSET(fd, &wfds)) {  	  errno = ETIMEDOUT;  	  return -1;        } -#ifdef WIN32 -      count = send (fd, cbuf, rem, 0); -#else        count = write (fd, cbuf, rem); -#endif +        if (count < 0) {  	  if (errno == EINTR)  	      continue;  	  else  	      return count;        } + +#endif +        cbuf += count;        rem -= count; | 
