static void recv_all (wr_socket sock, const char *text) { size_t len = strlen (text); char buf[len]; ssize_t ret; make_blocking (wr_fd (sock)); for (size_t off = 0; off < len; off += ret) { ret = wr_recv (sock, &buf[off], len - off); if (0 > ret) { if (MHD_SCKT_ERR_IS_EAGAIN_ (MHD_socket_get_error_ ())) { ret = 0; continue; } abort (); } } if (0 != strncmp (text, buf, len)) abort(); }
/** * Read character-by-character until we * get '\r\n\r\n'. */ static void recv_hdr (wr_socket sock) { unsigned int i; char next; char c; ssize_t ret; make_blocking (wr_fd (sock)); next = '\r'; i = 0; while (i < 4) { ret = wr_recv (sock, &c, 1); if (0 > ret) { if (MHD_SCKT_ERR_IS_EAGAIN_ (MHD_socket_get_error_ ())) continue; abort (); } if (0 == ret) continue; if (c == next) { i++; if (next == '\r') next = '\n'; else next = '\r'; continue; } if (c == '\r') { i = 1; next = '\n'; continue; } i = 0; next = '\r'; } }
static void send_all (wr_socket sock, const char *text) { size_t len = strlen (text); ssize_t ret; make_blocking (wr_fd (sock)); for (size_t off = 0; off < len; off += ret) { ret = wr_send (sock, &text[off], len - off); if (0 > ret) { if (MHD_SCKT_ERR_IS_EAGAIN_ (MHD_socket_get_error_ ())) { ret = 0; continue; } abort (); } } }
/** * Create a listen socket, with noninheritable flag if possible. * * @param use_ipv6 if set to non-zero IPv6 is used * @return created socket or MHD_INVALID_SOCKET in case of errors */ MHD_socket MHD_socket_create_listen_ (int use_ipv6) { int domain; MHD_socket fd; int cloexec_set; #if defined(OSX) && defined(SOL_SOCKET) && defined(SO_NOSIGPIPE) static const int on_val = 1; #endif #ifdef HAVE_INET6 domain = (use_ipv6) ? PF_INET6 : PF_INET; #else /* ! HAVE_INET6 */ if (use_ipv6) return MHD_INVALID_SOCKET; domain = PF_INET; #endif /* ! HAVE_INET6 */ #if defined(MHD_POSIX_SOCKETS) && defined(SOCK_CLOEXEC) fd = socket (domain, SOCK_STREAM | SOCK_CLOEXEC, 0); cloexec_set = !0; #elif defined(MHD_WINSOCK_SOCKETS) && defined (WSA_FLAG_NO_HANDLE_INHERIT) fd = WSASocketW (domain, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_NO_HANDLE_INHERIT); cloexec_set = !0; #else /* !SOCK_CLOEXEC */ fd = MHD_INVALID_SOCKET; #endif /* !SOCK_CLOEXEC */ if (MHD_INVALID_SOCKET == fd) { fd = socket (domain, SOCK_STREAM, 0); cloexec_set = 0; } if (MHD_INVALID_SOCKET == fd) return MHD_INVALID_SOCKET; #if defined(OSX) && defined(SOL_SOCKET) && defined(SO_NOSIGPIPE) if(0 != setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, &on_val, sizeof (on_val))) { int err = MHD_socket_get_error_ (); MHD_socket_close_ (fd); MHD_socket_fset_error_ (err); return MHD_INVALID_SOCKET; } #endif if (! cloexec_set) (void) MHD_socket_noninheritable_ (fd); return fd; }