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