static int printaddr(struct sockaddr_storage *ss) { struct sockaddr_un *sun; char addrstr[NI_MAXHOST] = { '\0', '\0' }; int error, off, port = 0; switch (ss->ss_family) { case AF_INET: if (inet_lnaof(sstosin(ss)->sin_addr) == INADDR_ANY) addrstr[0] = '*'; port = ntohs(sstosin(ss)->sin_port); break; case AF_INET6: if (IN6_IS_ADDR_UNSPECIFIED(&sstosin6(ss)->sin6_addr)) addrstr[0] = '*'; port = ntohs(sstosin6(ss)->sin6_port); break; case AF_UNIX: sun = sstosun(ss); off = (int)((char *)&sun->sun_path - (char *)sun); return (xprintf("%.*s", sun->sun_len - off, sun->sun_path)); } if (addrstr[0] == '\0') { error = getnameinfo(sstosa(ss), ss->ss_len, addrstr, sizeof(addrstr), NULL, 0, NI_NUMERICHOST); if (error) errx(1, "getnameinfo()"); } if (port == 0) return xprintf("%s:*", addrstr); else return xprintf("%s:%d", addrstr, port); }
static int controlfd_init_ifsun(struct cfg *cf, struct rtpp_ctrl_sock *csp) { int controlfd; struct sockaddr_un *ifsun; unlink(csp->cmd_sock); ifsun = sstosun(&csp->bindaddr); memset(ifsun, '\0', sizeof(struct sockaddr_un)); #if defined(HAVE_SOCKADDR_SUN_LEN) ifsun->sun_len = strlen(csp->cmd_sock); #endif ifsun->sun_family = AF_LOCAL; strcpy(ifsun->sun_path, csp->cmd_sock); controlfd = socket(AF_LOCAL, SOCK_STREAM, 0); if (controlfd == -1) err(1, "can't create socket"); setsockopt(controlfd, SOL_SOCKET, SO_REUSEADDR, &controlfd, sizeof controlfd); if (bind(controlfd, sstosa(ifsun), sizeof(struct sockaddr_un)) < 0) err(1, "can't bind to a socket: %s", csp->cmd_sock); if ((cf->stable->run_uname != NULL || cf->stable->run_gname != NULL) && chown(csp->cmd_sock, cf->stable->run_uid, cf->stable->run_gid) == -1) err(1, "can't set owner of the socket: %s", csp->cmd_sock); if ((cf->stable->run_gname != NULL) && cf->stable->sock_mode != 0 && (chmod(csp->cmd_sock, cf->stable->sock_mode) == -1)) err(1, "can't allow rw acces to group"); if (listen(controlfd, 32) != 0) err(1, "can't listen on a socket: %s", csp->cmd_sock); return (controlfd); }
/* Returns 0 for a specific target, 1 for wildcard, -1 for an error */ static int parse_timeout_sock(const char *sock_name, union rtpp_tnotify_entry *rtep, const char **e) { char host[512], port[10]; char *new_sn, **snp; int n, rval; const char *sprefix, *usock_name; struct sockaddr_un *ifsun; struct sockaddr *ifsa; snp = &rtep->rtt.socket_name; rval = 0; sprefix = NULL; if (strncmp("unix:", sock_name, 5) == 0) { usock_name = sock_name + 5; rtep->rtt.socket_type = AF_LOCAL; } else if (strncmp("tcp:", sock_name, 4) == 0) { if (parse_hostport(sock_name + 4, host, sizeof(host), port, sizeof(port), 0, e) != 0) { return (-1); } rtep->rtt.socket_type = AF_INET; } else { sprefix = "unix:"; usock_name = sock_name; rtep->rtt.socket_type = AF_LOCAL; } if (rtep->rtt.socket_type == AF_UNIX) { if (strlen(usock_name) == 0) { *e = "Timeout notification socket name too short"; return (-1); } ifsun = sstosun(&rtep->rtt.remote); ifsun->sun_family = AF_LOCAL; strncpy(ifsun->sun_path, usock_name, sizeof(ifsun->sun_path) - 1); #if defined(HAVE_SOCKADDR_SUN_LEN) ifsun->sun_len = strlen(ifsun->sun_path); #endif rtep->rtt.remote_len = sizeof(struct sockaddr_un); } else if (rtep->rtt.socket_type == AF_INET && strcmp(host, CC_SELF_STR) == 0) { rtep->rtw.socket_type = AF_INET; rtep->rtw.port = atoi(port); snp = &rtep->rtt.socket_name; rval = 1; } else { ifsa = sstosa(&rtep->rtt.remote); n = resolve(ifsa, AF_INET, host, port, AI_PASSIVE); if (n != 0) { *e = gai_strerror(n); return (-1); } rtep->rtt.remote_len = SA_LEN(ifsa); } if (sprefix == NULL) { new_sn = strdup(sock_name); } else { asprintf(&new_sn, "%s%s", sprefix, usock_name); } if (new_sn == NULL) { *e = strerror(errno); return (-1); } *snp = new_sn; return (rval); }