1 /* 2 * Copyright (c) 1997, 1998 Kungliga Tekniska H�gskolan 3 * (Royal Institute of Technology, Stockholm, Sweden). 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * 3. Neither the name of the Institute nor the names of its contributors 18 * may be used to endorse or promote products derived from this software 19 * without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 */ 33 34 #include "krb5_locl.h" 35 36 RCSID("$Id: net_write.c 13863 2004-05-25 21:46:46Z lha $"); 37 38 krb5_ssize_t KRB5_LIB_FUNCTION 39 krb5_net_write (krb5_context context, 40 void *p_fd, 41 const void *buf, 42 size_t len) 43 { 44 int fd = *((int *)p_fd); 45 46 return net_write (fd, buf, len); 47 } 48 49 krb5_ssize_t KRB5_LIB_FUNCTION 50 krb5_net_write_block(krb5_context context, 51 void *p_fd, 52 const void *buf, 53 size_t len, 54 time_t timeout) 55 { 56 int fd = *((int *)p_fd); 57 int ret; 58 struct timeval tv, *tvp; 59 const char *cbuf = (const char *)buf; 60 size_t rem = len; 61 ssize_t count; 62 fd_set wfds; 63 64 do { 65 FD_ZERO(&wfds); 66 FD_SET(fd, &wfds); 67 68 if (timeout != 0) { 69 tv.tv_sec = timeout; 70 tv.tv_usec = 0; 71 tvp = &tv; 72 } else 73 tvp = NULL; 74 75 ret = select(fd + 1, NULL, &wfds, NULL, tvp); 76 if (ret < 0) { 77 if (errno == EINTR) 78 continue; 79 return -1; 80 } else if (ret == 0) 81 return 0; 82 83 if (!FD_ISSET(fd, &wfds)) { 84 errno = ETIMEDOUT; 85 return -1; 86 } 87 88 #ifdef WIN32 89 count = send (fd, cbuf, rem, 0); 90 #else 91 count = write (fd, cbuf, rem); 92 #endif 93 if (count < 0) { 94 if (errno == EINTR) 95 continue; 96 else 97 return count; 98 } 99 cbuf += count; 100 rem -= count; 101 102 } while (rem > 0); 103 104 return len; 105 } 106