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; }
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); }
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 (); }