xref: /freebsd/crypto/heimdal/lib/krb5/net_write.c (revision c19800e8cd5640693f36f2040db4ab5e8d738146)
1b528cefcSMark Murray /*
2b528cefcSMark Murray  * 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 
36c19800e8SDoug Rabson RCSID("$Id: net_write.c 13863 2004-05-25 21:46:46Z lha $");
37b528cefcSMark Murray 
38c19800e8SDoug Rabson krb5_ssize_t KRB5_LIB_FUNCTION
39b528cefcSMark Murray krb5_net_write (krb5_context context,
40b528cefcSMark Murray 		void *p_fd,
41b528cefcSMark Murray 		const void *buf,
42b528cefcSMark Murray 		size_t len)
43b528cefcSMark Murray {
44b528cefcSMark Murray   int fd = *((int *)p_fd);
45b528cefcSMark Murray 
46b528cefcSMark Murray   return net_write (fd, buf, len);
47b528cefcSMark Murray }
48c19800e8SDoug Rabson 
49c19800e8SDoug Rabson krb5_ssize_t KRB5_LIB_FUNCTION
50c19800e8SDoug Rabson krb5_net_write_block(krb5_context context,
51c19800e8SDoug Rabson 		     void *p_fd,
52c19800e8SDoug Rabson 		     const void *buf,
53c19800e8SDoug Rabson 		     size_t len,
54c19800e8SDoug Rabson 		     time_t timeout)
55c19800e8SDoug Rabson {
56c19800e8SDoug Rabson   int fd = *((int *)p_fd);
57c19800e8SDoug Rabson   int ret;
58c19800e8SDoug Rabson   struct timeval tv, *tvp;
59c19800e8SDoug Rabson   const char *cbuf = (const char *)buf;
60c19800e8SDoug Rabson   size_t rem = len;
61c19800e8SDoug Rabson   ssize_t count;
62c19800e8SDoug Rabson   fd_set wfds;
63c19800e8SDoug Rabson 
64c19800e8SDoug Rabson   do {
65c19800e8SDoug Rabson       FD_ZERO(&wfds);
66c19800e8SDoug Rabson       FD_SET(fd, &wfds);
67c19800e8SDoug Rabson 
68c19800e8SDoug Rabson       if (timeout != 0) {
69c19800e8SDoug Rabson 	  tv.tv_sec = timeout;
70c19800e8SDoug Rabson 	  tv.tv_usec = 0;
71c19800e8SDoug Rabson 	  tvp = &tv;
72c19800e8SDoug Rabson       } else
73c19800e8SDoug Rabson 	  tvp = NULL;
74c19800e8SDoug Rabson 
75c19800e8SDoug Rabson       ret = select(fd + 1, NULL, &wfds, NULL, tvp);
76c19800e8SDoug Rabson       if (ret < 0) {
77c19800e8SDoug Rabson 	  if (errno == EINTR)
78c19800e8SDoug Rabson 	      continue;
79c19800e8SDoug Rabson 	  return -1;
80c19800e8SDoug Rabson       } else if (ret == 0)
81c19800e8SDoug Rabson 	  return 0;
82c19800e8SDoug Rabson 
83c19800e8SDoug Rabson       if (!FD_ISSET(fd, &wfds)) {
84c19800e8SDoug Rabson 	  errno = ETIMEDOUT;
85c19800e8SDoug Rabson 	  return -1;
86c19800e8SDoug Rabson       }
87c19800e8SDoug Rabson 
88c19800e8SDoug Rabson #ifdef WIN32
89c19800e8SDoug Rabson       count = send (fd, cbuf, rem, 0);
90c19800e8SDoug Rabson #else
91c19800e8SDoug Rabson       count = write (fd, cbuf, rem);
92c19800e8SDoug Rabson #endif
93c19800e8SDoug Rabson       if (count < 0) {
94c19800e8SDoug Rabson 	  if (errno == EINTR)
95c19800e8SDoug Rabson 	      continue;
96c19800e8SDoug Rabson 	  else
97c19800e8SDoug Rabson 	      return count;
98c19800e8SDoug Rabson       }
99c19800e8SDoug Rabson       cbuf += count;
100c19800e8SDoug Rabson       rem -= count;
101c19800e8SDoug Rabson 
102c19800e8SDoug Rabson   } while (rem > 0);
103c19800e8SDoug Rabson 
104c19800e8SDoug Rabson   return len;
105c19800e8SDoug Rabson }
106