/crypto/external/bsd/heimdal/dist/lib/krb5/net_write.c

http://www.minix3.org/ · C · 120 lines · 69 code · 18 blank · 33 comment · 15 complexity · f3d65ea46f998ca42566691265d98f56 MD5 · raw file

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