static rstatus_t proxy_reuse(struct conn *p) { rstatus_t status; struct sockaddr_un *un; switch (p->family) { case AF_INET: case AF_INET6: status = nc_set_reuseaddr(p->sd); break; case AF_UNIX: /* * bind() will fail if the pathname already exist. So, we call unlink() * to delete the pathname, in case it already exists. If it does not * exist, unlink() returns error, which we ignore */ un = (struct sockaddr_un *) p->addr; unlink(un->sun_path); status = NC_OK; break; default: NOT_REACHED(); status = NC_ERROR; } return status; }
static rstatus_t stats_listen(struct stats *st) { rstatus_t status; struct sockinfo si; status = nc_resolve(&st->addr, st->port, &si); if (status < 0) { return status; } st->sd = socket(si.family, SOCK_STREAM, 0); if (st->sd < 0) { log_error("socket failed: %s", strerror(errno)); return NC_ERROR; } status = nc_set_reuseaddr(st->sd); if (status < 0) { log_error("set reuseaddr on m %d failed: %s", st->sd, strerror(errno)); return NC_ERROR; } status = bind(st->sd, (struct sockaddr *)&si.addr, si.addrlen); if (status < 0) { log_error("bind on m %d to addr '%.*s:%u' failed: %s", st->sd, st->addr.len, st->addr.data, st->port, strerror(errno)); return NC_ERROR; } status = listen(st->sd, SOMAXCONN); if (status < 0) { log_error("listen on m %d failed: %s", st->sd, strerror(errno)); return NC_ERROR; } log_debug(LOG_NOTICE, "m %d listening on '%.*s:%u'", st->sd, st->addr.len, st->addr.data, st->port); return NC_OK; }
rstatus_t stats_master_server(uint16_t stats_port, char *stats_ip) { rstatus_t status; //struct stats *st; struct sockinfo si; struct string addr; //int sd; string_set_raw(&addr, stats_ip); status = nc_resolve(&addr, stats_port, &si); if (status < 0) { return status; } nc_stats_listen_sd = socket(si.family, SOCK_STREAM, 0); if (nc_stats_listen_sd < 0) { log_error("socket failed: %s", strerror(errno)); return NC_ERROR; } status = nc_set_reuseaddr(nc_stats_listen_sd); if (status < 0) { log_error("set reuseaddr on m %d failed: %s", nc_stats_listen_sd, strerror(errno)); return NC_ERROR; } pthread_t *ptid = nc_alloc(sizeof(pthread_t)); *ptid = (pthread_t) -1; log_error("master sd %d", nc_stats_listen_sd); status = pthread_create(ptid, NULL, stats_master_loop, (void*)(&nc_stats_listen_sd)); if (status < 0) { log_error("stats aggregator create failed: %s", strerror(status)); return NC_ERROR; } log_debug(LOG_NOTICE, "pthread stats master create success %d'", status); status = bind(nc_stats_listen_sd, (struct sockaddr *)&si.addr, si.addrlen); if (status < 0) { log_error("bind on m %d to addr '%.*s:%u' failed: %s", nc_stats_listen_sd, addr.len, addr.data, stats_port, strerror(errno)); return NC_ERROR; } status = listen(nc_stats_listen_sd, SOMAXCONN); if (status < 0) { log_error("listen on m %d failed: %s", nc_stats_listen_sd, strerror(errno)); return NC_ERROR; } log_debug(LOG_NOTICE, "m %d listening on '%.*s:%u'",nc_stats_listen_sd, addr.len, addr.data, stats_port); return NC_OK; }