Example #1
0
/**
 * accept a new connection
 * @param sock the socket to connect on
 */
sock_t *sock_accept(sock_t * sock)
{
	sock_t *client;
	SOCKET tmp_sock;
	struct sockaddr tmp_addr;
	socklen_t sin_size = sizeof sock->addr;

#ifdef DEBUG
	assert(NULL != sock);
#endif

	if (!sock_has_data(sock)) {
		/* don't bother... */
		return NULL;
	}

	if ((tmp_sock =
		 accept(sock->sock, (struct sockaddr *)&tmp_addr, &sin_size)) == -1) {
		/* couldn't accept. */
		return NULL;
	}

	client = sock_new(sock->proto, sock->type, sock->host, sock->port);
	sock_destroy(client);

	client->sock = tmp_sock;
	memcpy(&client->addr, &tmp_addr, sizeof client->addr);

	snprintf(client->ip, sizeof client->ip,
			 "%s", inet_ntoa(client->addr.sin_addr));

	client->port = ntohs(client->addr.sin_port);

	return client;
}
Example #2
0
/**
 * duplicate a socket
 * @param sock the socket to duplicate
 */
sock_t *sock_dup(sock_t * sock)
{
	sock_t *copy;

#ifdef DEBUG
	assert(NULL != sock);
	assert(0 != sock->port);
	assert(NULL != sock->host);
	assert(!sock->type || sock->type == 1);
#endif

	copy = sock_new(sock->proto, sock->type, sock->host, sock->port);

	return copy;
}
Example #3
0
static int port__ctl_add(port_state_t* port_state,
                         SOCKET sock,
                         struct epoll_event* ev) {
  sock_state_t* sock_state = sock_new(port_state, sock);
  if (sock_state == NULL)
    return -1;

  if (sock_set_event(port_state, sock_state, ev) < 0) {
    sock_delete(port_state, sock_state);
    return -1;
  }

  port__update_events_if_polling(port_state);

  return 0;
}
Example #4
0
void
listen_in(void *arg)
{
	struct listen *f = arg;
	struct sockaddr caddr;
	socklen_t caddrlen;
	int sock, opt;

	caddrlen = sizeof(caddrlen);
	while ((sock = accept(f->fd, &caddr, &caddrlen)) < 0) {
		if (errno == EINTR)
			continue;
		if (errno == ENFILE || errno == EMFILE)
			file_slowaccept = 1;
		else if (errno != ECONNABORTED && errno != EWOULDBLOCK)
			perror("accept");
		return;
	}
	if (fcntl(sock, F_SETFL, O_NONBLOCK) < 0) {
		perror("fcntl(sock, O_NONBLOCK)");
		close(sock);
		return;
	}
	if (f->path == NULL) {
		opt = 1;
		if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY,
			&opt, sizeof(int)) < 0) {
			perror("setsockopt");
			close(sock);
			return;
		}
	}
	if (sock_new(sock) == NULL) {
		close(sock);
		return;
	}
}
Example #5
0
/*! \brief Create a new HTTP server
 *
 * \param config the configuratin from config file
 * \param monitor the monitor to be used
 * \param callback the function to be called when a request arrives
 * \param user_data the parameter to the callback
 *
 * \return A instance of the server
 */
HttpServer* hs_new(iks* config, hs_request_callback callback,
        void* user_data) {
    HttpServer* server;
    Socket* sock;
    const char* str;
    int port, ret;

    /* get the port to listen */
    if((str = iks_find_attrib(config, "port")) != NULL) {
        port = atoi(str);
    } else {
        port = HTTP_PORT;
    }

    /* create the socket */
    sock = sock_new();
    ret = sock_listen(sock, port);
    if(ret == 0) {
        log(ERROR, "Failed to listen http server port %d", port);
        return NULL;
    }

    /* alloc memomry for the server struct */
    server = malloc(sizeof(HttpServer));

    /* init values */
    server->sock = sock;
    server->http_connections = list_new();
	server->callback = callback;
	server->user_data = user_data;

    /* monitor the server socket for conenctions */
    sock_set_accept_callback(sock, hs_accept, server);

    return server;
}
Example #6
0
File: udp.c Project: ajrisi/network
sock *sock_new_udp()
{
  return sock_new(PF_INET, SOCK_DGRAM);
}