Exemple #1
0
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);
}
Exemple #2
0
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);
}
Exemple #3
0
/* 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);
}