Exemple #1
0
IO *
http_init(int port)
{
	struct sockaddr_in addr;
	int fd;

	memset(&addr, 0, sizeof(addr));
	addr.sin_family = AF_INET;
	addr.sin_port = htons(port);
	addr.sin_addr.s_addr = INADDR_ANY;

	fd = socket(AF_INET, SOCK_STREAM, 0);
	if (fd < 0)
		die("socket on port %d failed\n", port);

	socket_set_reuseaddr(fd, 1);
	socket_set_nonblock(fd);

	if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) == -1)
		die("bind on port %d failed\n", port);
	if (listen(fd, 10) == -1)
		die("listen on port %d failed\n", port);

	return io_new_fd(fd);
}
int raft_create_udp_socket(raft_t r) {
	assert(r->me != NOBODY);
	raft_peer_t *me = r->peers + r->me;

	r->sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if (r->sock == -1) {
		shout(
			"cannot create the listening"
			" socket: %s\n",
			strerror(errno)
		);
		return -1;
	}

	socket_set_reuseaddr(r->sock);
	socket_set_recv_timeout(r->sock, r->config.heartbeat_ms);

	// zero out the structure
	memset((char*)&me->addr, 0, sizeof(me->addr));

	me->addr.sin_family = AF_INET;
	if (inet_aton(me->host, &me->addr.sin_addr) == 0) {
		shout(
			"cannot convert the host string"
			" '%s' to a valid address\n",
			me->host
		);
		return -1;
	}
	me->addr.sin_port = htons(me->port);
	debug("binding udp %s:%d\n", me->host, me->port);
	if (bind(r->sock, (struct sockaddr*)&me->addr, sizeof(me->addr)) == -1) {
		shout("cannot bind the socket: %s\n", strerror(errno));
		return -1;
	}

	return r->sock;
}
Exemple #3
0
void
start_server(krb5_context context, const char *port_str)
{
    int e;
    struct kadm_port *p;

    krb5_socket_t *socks = NULL, *tmp;
    unsigned int num_socks = 0;
    int i;

    if (port_str == NULL)
	port_str = "+";

    parse_ports(context, port_str);

    for(p = kadm_ports; p; p = p->next) {
	struct addrinfo hints, *ai, *ap;
	char portstr[32];
	memset (&hints, 0, sizeof(hints));
	hints.ai_flags    = AI_PASSIVE;
	hints.ai_socktype = SOCK_STREAM;

	e = getaddrinfo(NULL, p->port, &hints, &ai);
	if(e) {
	    snprintf(portstr, sizeof(portstr), "%u", p->def_port);
	    e = getaddrinfo(NULL, portstr, &hints, &ai);
	}

	if(e) {
	    krb5_warn(context, krb5_eai_to_heim_errno(e, errno),
		      "%s", portstr);
	    continue;
	}
	i = 0;
	for(ap = ai; ap; ap = ap->ai_next)
	    i++;
	tmp = realloc(socks, (num_socks + i) * sizeof(*socks));
	if(tmp == NULL) {
	    krb5_warnx(context, "failed to reallocate %lu bytes",
		       (unsigned long)(num_socks + i) * sizeof(*socks));
	    continue;
	}
	socks = tmp;
	for(ap = ai; ap; ap = ap->ai_next) {
	    krb5_socket_t s = socket(ap->ai_family, ap->ai_socktype, ap->ai_protocol);
	    if(rk_IS_BAD_SOCKET(s)) {
		krb5_warn(context, rk_SOCK_ERRNO, "socket");
		continue;
	    }

	    socket_set_reuseaddr(s, 1);
	    socket_set_ipv6only(s, 1);

	    if (rk_IS_SOCKET_ERROR(bind (s, ap->ai_addr, ap->ai_addrlen))) {
		krb5_warn(context, rk_SOCK_ERRNO, "bind");
		rk_closesocket(s);
		continue;
	    }
	    if (rk_IS_SOCKET_ERROR(listen (s, SOMAXCONN))) {
		krb5_warn(context, rk_SOCK_ERRNO, "listen");
		rk_closesocket(s);
		continue;
	    }
	    socks[num_socks++] = s;
	}
	freeaddrinfo (ai);
    }
    if(num_socks == 0)
	krb5_errx(context, 1, "no sockets to listen to - exiting");

    wait_for_connection(context, socks, num_socks);
}
Exemple #4
0
void ROKEN_LIB_FUNCTION
mini_inetd_addrinfo (struct addrinfo *ai)
{
    int ret;
    struct addrinfo *a;
    int n, nalloc, i;
    int *fds;
    fd_set orig_read_set, read_set;
    int max_fd = -1;

    for (nalloc = 0, a = ai; a != NULL; a = a->ai_next)
	++nalloc;

    fds = malloc (nalloc * sizeof(*fds));
    if (fds == NULL)
	errx (1, "mini_inetd: out of memory");

    FD_ZERO(&orig_read_set);

    for (i = 0, a = ai; a != NULL; a = a->ai_next) {
	fds[i] = socket (a->ai_family, a->ai_socktype, a->ai_protocol);
	if (fds[i] < 0) {
	    warn ("socket af = %d", a->ai_family);
	    continue;
	}
	socket_set_reuseaddr (fds[i], 1);
	if (bind (fds[i], a->ai_addr, a->ai_addrlen) < 0) {
	    warn ("bind af = %d", a->ai_family);
	    close(fds[i]);
	    continue;
	}
	if (listen (fds[i], SOMAXCONN) < 0) {
	    warn ("listen af = %d", a->ai_family);
	    close(fds[i]);
	    continue;
	}
	if (fds[i] >= FD_SETSIZE)
	    errx (1, "fd too large");
	FD_SET(fds[i], &orig_read_set);
	max_fd = max(max_fd, fds[i]);
	++i;
    }
    if (i == 0)
	errx (1, "no sockets");
    n = i;

    do {
	read_set = orig_read_set;

	ret = select (max_fd + 1, &read_set, NULL, NULL, NULL);
	if (ret < 0 && errno != EINTR)
	    err (1, "select");
    } while (ret <= 0);

    for (i = 0; i < n; ++i)
	if (FD_ISSET (fds[i], &read_set)) {
	    accept_it (fds[i]);
	    return;
	}
    abort ();
}