Ejemplo n.º 1
0
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();
}
Ejemplo n.º 2
0
/**
 * 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';
    }
}
Ejemplo n.º 3
0
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 ();
        }
    }
}
Ejemplo n.º 4
0
/**
 * 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;
}