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 = dn_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 = DN_OK; break; default: NOT_REACHED(); status = DN_ERROR; } return status; }
static rstatus_t stats_listen(struct stats *st) { rstatus_t status; struct sockinfo si; status = dn_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 DN_ERROR; } status = dn_set_reuseaddr(st->sd); if (status < 0) { log_error("set reuseaddr on m %d failed: %s", st->sd, strerror(errno)); return DN_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 DN_ERROR; } status = listen(st->sd, SOMAXCONN); if (status < 0) { log_error("listen on m %d failed: %s", st->sd, strerror(errno)); return DN_ERROR; } log_debug(LOG_NOTICE, "m %d listening on '%.*s:%u'", st->sd, st->addr.len, st->addr.data, st->port); return DN_OK; }