Exemplo n.º 1
0
static void check_resolve(void)
{
	int err;
	struct sockaddr_in addr;

	printf("Checking host resolution\n");
	err = strtoaddr("localhost", "50000",
			(struct sockaddr *) &addr, sizeof(struct sockaddr_in));

	if (err == 0) {
		errno = EINVAL;
		printf("Host resolution should not be enabled\n");
		exit(EXIT_FAILURE);
	}

	printf("Checking port resolution\n");
	err = strtoaddr("127.0.0.1", "ssh",
			(struct sockaddr *) &addr, sizeof(struct sockaddr_in));

	if (err == 0) {
		errno = EINVAL;
		printf("Port resolution should not be enabled\n");
		exit(EXIT_FAILURE);
	}
}
Exemplo n.º 2
0
static int knet_vty_init_listener(const char *ip_addr, const char *port)
{
    int sockfd = -1, sockopt = 1;
    int socktype = SOCK_STREAM;
    int err = 0;
    struct sockaddr_storage ss;

    memset(&ss, 0, sizeof(struct sockaddr_storage));

    if (strtoaddr(ip_addr, port, (struct sockaddr *)&ss, sizeof(struct sockaddr_storage)) != 0)
        return -1;

    pthread_mutex_lock(&knet_vty_mutex);

    /* handle sigpipe if we decide to use KEEPALIVE */

    sockfd = socket(ss.ss_family, socktype, 0);
    if (sockfd < 0) {
        err = sockfd;
        goto out_clean;
    }

    if (ss.ss_family == AF_INET6) {
        err = setsockopt(sockfd, IPPROTO_IPV6, IPV6_V6ONLY,
                         (void *)&sockopt, sizeof(sockopt));
        if (err)
            goto out_clean;
    }

    err = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR,
                     (void *)&sockopt, sizeof(sockopt));
    if (err)
        goto out_clean;

    if (_fdset_cloexec(sockfd)) {
        err = -1;
        goto out_clean;
    }

    err = bind(sockfd, (struct sockaddr *)&ss, sizeof(struct sockaddr_storage));
    if (err)
        goto out_clean;

    err = listen(sockfd, 0);
    if (err)
        goto out_clean;

    pthread_mutex_unlock(&knet_vty_mutex);

    return sockfd;

out_clean:
    if (sockfd >= 0)
        close(sockfd);

    pthread_mutex_unlock(&knet_vty_mutex);

    return err;
}
Exemplo n.º 3
0
static void check_ipv6(void)
{
	int err;
	char *buf[2];
	struct sockaddr_in6 addr, addrck;

	memset(&addr, 0, sizeof(struct sockaddr_in6));
	memset(&addrck, 0, sizeof(struct sockaddr_in6));

	printf("Checking strtoaddr on [fd00::1]:50000\n");

	addrck.sin6_family = AF_INET6;
	addrck.sin6_addr.s6_addr16[0] = htons(0xfd00); /* fd00::1 */
	addrck.sin6_addr.s6_addr16[7] = htons(0x0001);
	addrck.sin6_port = htons(50000);

	err = strtoaddr("fd00::1", "50000",
			(struct sockaddr *) &addr, sizeof(struct sockaddr_in6));

	if (err != 0) {
		printf("Unable to convert [fd00::1]:50000\n");
		exit(EXIT_FAILURE);
	}

	if (memcmp(&addr, &addrck, sizeof(struct sockaddr_in6)) != 0) {
		errno = EINVAL;
		printf("Check on 192.168.0.1:50000 failed\n");
		exit(EXIT_FAILURE);
	}

	printf("Checking addrtostr on [fd00::1]:50000\n");

	err = addrtostr((struct sockaddr *) &addrck,
					sizeof(struct sockaddr_in6), buf);

	if (err != 0) {
		printf("Unable to convert 192.168.0.1:50000\n");
		exit(EXIT_FAILURE);
	}

	if (strcmp(buf[0], "fd00::1") != 0) {
		errno = EINVAL;
		printf("Wrong address conversion: %s\n", buf[0]);
		exit(EXIT_FAILURE);
	}

	if (strcmp(buf[1], "50000") != 0) {
		errno = EINVAL;
		printf("Wrong port conversion: %s\n", buf[1]);
		exit(EXIT_FAILURE);
	}

	addrtostr_free(buf);
}
Exemplo n.º 4
0
int main(int argc, char *argv[])
{
	int err;
	char *buf[2];
	struct sockaddr_storage address;

	if (argc == 1) { /* automated tests */
		check_ipv4();
		check_ipv6();
		check_resolve();
		exit(EXIT_SUCCESS);
	} else if (argc != 3) {
		printf("usage: %s [host] [port]\n", argv[0]);
		exit(EXIT_SUCCESS);
	}

	err = strtoaddr(argv[1], argv[2], (struct sockaddr *) &address,
					sizeof(struct sockaddr_storage));

	if (err != 0) {
		printf("Unable to convert strings to sockaddr\n");
		exit(EXIT_FAILURE);
	}

	err = addrtostr((struct sockaddr *) &address,
			sizeof(struct sockaddr_storage), buf);

	if (err != 0) {
		printf("Unable to convert sockaddr to strings\n");
		exit(EXIT_FAILURE);
	}

	printf("host: %s port: %s\n", buf[0], buf[1]);
	addrtostr_free(buf);

	return 0;
}
Exemplo n.º 5
0
/*
 *
 * special form: file /name
 * causes us to go read from this file instead.
 *
 */
static void esp_print_decode_onesecret(netdissect_options *ndo, char *line,
                                       const char *file, int lineno)
{
    struct sa_list sa1;
    int sa_def;

    char *spikey;
    char *decode;

    spikey = strsep(&line, " \t");
    sa_def = 0;
    memset(&sa1, 0, sizeof(struct sa_list));

    /* if there is only one token, then it is an algo:key token */
    if (line == NULL) {
        decode = spikey;
        spikey = NULL;
        /* sa1.daddr.version = 0; */
        /* memset(&sa1.daddr, 0, sizeof(sa1.daddr)); */
        /* sa1.spi = 0; */
        sa_def    = 1;
    } else
        decode = line;

    if (spikey && ascii_strcasecmp(spikey, "file") == 0) {
        /* open file and read it */
        FILE *secretfile;
        char  fileline[1024];
        int   subfile_lineno=0;
        char  *nl;
        char *filename = line;

        secretfile = fopen(filename, FOPEN_READ_TXT);
        if (secretfile == NULL) {
            perror(filename);
            exit(3);
        }

        while (fgets(fileline, sizeof(fileline)-1, secretfile) != NULL) {
            subfile_lineno++;
            /* remove newline from the line */
            nl = strchr(fileline, '\n');
            if (nl)
                *nl = '\0';
            if (fileline[0] == '#') continue;
            if (fileline[0] == '\0') continue;

            esp_print_decode_onesecret(ndo, fileline, filename, subfile_lineno);
        }
        fclose(secretfile);

        return;
    }

    if (spikey && ascii_strcasecmp(spikey, "ikev2") == 0) {
        esp_print_decode_ikeline(ndo, line, file, lineno);
        return;
    }

    if (spikey) {

        char *spistr, *foo;
        uint32_t spino;

        spistr = strsep(&spikey, "@");

        spino = strtoul(spistr, &foo, 0);
        if (spistr == foo || !spikey) {
            (*ndo->ndo_warning)(ndo, "print_esp: failed to decode spi# %s\n", foo);
            return;
        }

        sa1.spi = spino;

        if (strtoaddr6(spikey, &sa1.daddr.in6) == 1) {
            sa1.daddr_version = 6;
        } else if (strtoaddr(spikey, &sa1.daddr.in4) == 1) {
            sa1.daddr_version = 4;
        } else {
            (*ndo->ndo_warning)(ndo, "print_esp: can not decode IP# %s\n", spikey);
            return;
        }
    }

    if (decode) {
        /* skip any blank spaces */
        while (isspace((unsigned char)*decode))
            decode++;

        if(!espprint_decode_encalgo(ndo, decode, &sa1)) {
            return;
        }
    }

    esp_print_addsa(ndo, &sa1, sa_def);
}
Exemplo n.º 6
0
static void test(void)
{
	knet_handle_t knet_h;
	int logfds[2];
	struct sockaddr_storage src, dst;

	memset(&src, 0, sizeof(struct sockaddr_storage));

	if (strtoaddr("127.0.0.1", "50000", (struct sockaddr *)&src, sizeof(struct sockaddr_storage)) < 0) {
		printf("Unable to convert src to sockaddr: %s\n", strerror(errno));
		exit(FAIL);
	}

	memset(&dst, 0, sizeof(struct sockaddr_storage));

	if (strtoaddr("127.0.0.1", "50001", (struct sockaddr *)&dst, sizeof(struct sockaddr_storage)) < 0) {
		printf("Unable to convert dst to sockaddr: %s\n", strerror(errno));
		exit(FAIL);
	}

	printf("Test knet_link_set_pong_count incorrect knet_h\n");

	if ((!knet_link_set_pong_count(NULL, 1, 0, 2)) || (errno != EINVAL)) {
		printf("knet_link_set_pong_count accepted invalid knet_h or returned incorrect error: %s\n", strerror(errno));
		exit(FAIL);
	}

	setup_logpipes(logfds);

	knet_h = knet_handle_new(1, logfds[1], KNET_LOG_DEBUG);

	if (!knet_h) {
		printf("knet_handle_new failed: %s\n", strerror(errno));
		flush_logs(logfds[0], stdout);
		close_logpipes(logfds);
		exit(FAIL);
	}

	printf("Test knet_link_set_pong_count with unconfigured host_id\n");

	if ((!knet_link_set_pong_count(knet_h, 1, 0, 2)) || (errno != EINVAL)) {
		printf("knet_link_set_pong_count accepted invalid host_id or returned incorrect error: %s\n", strerror(errno));
		knet_handle_free(knet_h);
		flush_logs(logfds[0], stdout);
		close_logpipes(logfds);
		exit(FAIL);
	}

	flush_logs(logfds[0], stdout);

	printf("Test knet_link_set_pong_count with incorrect linkid\n");

	if (knet_host_add(knet_h, 1) < 0) {
		printf("Unable to add host_id 1: %s\n", strerror(errno));
		knet_handle_free(knet_h);
		flush_logs(logfds[0], stdout);
		close_logpipes(logfds);
		exit(FAIL);
	}

	if ((!knet_link_set_pong_count(knet_h, 1, KNET_MAX_LINK, 2)) || (errno != EINVAL)) {
		printf("knet_link_set_pong_count accepted invalid linkid or returned incorrect error: %s\n", strerror(errno));
		knet_host_remove(knet_h, 1);
		knet_handle_free(knet_h);
		flush_logs(logfds[0], stdout);
		close_logpipes(logfds);
		exit(FAIL);
	}

	flush_logs(logfds[0], stdout);

	printf("Test knet_link_set_pong_count with incorrect pong count\n");

	if ((!knet_link_set_pong_count(knet_h, 1, 0, 0)) || (errno != EINVAL)) {
		printf("knet_link_set_pong_count accepted invalid pong count or returned incorrect error: %s\n", strerror(errno));
		knet_host_remove(knet_h, 1);
		knet_handle_free(knet_h);
		flush_logs(logfds[0], stdout);
		close_logpipes(logfds);
		exit(FAIL);
	}

	flush_logs(logfds[0], stdout);

	printf("Test knet_link_set_pong_count with unconfigured link\n");

	if ((!knet_link_set_pong_count(knet_h, 1, 0, 2)) || (errno != EINVAL)) {
		printf("knet_link_set_pong_count accepted unconfigured link or returned incorrect error: %s\n", strerror(errno));
		knet_host_remove(knet_h, 1);
		knet_handle_free(knet_h);
		flush_logs(logfds[0], stdout);
		close_logpipes(logfds);
		exit(FAIL);
	}

	flush_logs(logfds[0], stdout);

	printf("Test knet_link_set_pong_count with correct values\n");

	if (knet_link_set_config(knet_h, 1, 0, KNET_TRANSPORT_UDP, &src, &dst) < 0) {
		printf("Unable to configure link: %s\n", strerror(errno));
		knet_host_remove(knet_h, 1);
		knet_handle_free(knet_h);
		flush_logs(logfds[0], stdout);
		close_logpipes(logfds);
		exit(FAIL);
	}

	if (knet_link_set_pong_count(knet_h, 1, 0, 3) < 0) {
		printf("knet_link_set_pong_count failed: %s\n", strerror(errno));
		knet_host_remove(knet_h, 1);
		knet_handle_free(knet_h);
		flush_logs(logfds[0], stdout);
		close_logpipes(logfds);
		exit(FAIL);
	}

	if (knet_h->host_index[1]->link[0].pong_count != 3) {
		printf("knet_link_set_pong_count failed to set correct values\n");
		knet_host_remove(knet_h, 1);
		knet_handle_free(knet_h);
		flush_logs(logfds[0], stdout);
		close_logpipes(logfds);
		exit(FAIL);
	}

	knet_host_remove(knet_h, 1);
	knet_handle_free(knet_h);
	flush_logs(logfds[0], stdout);
	close_logpipes(logfds);
}
Exemplo n.º 7
0
static void test(void)
{
	knet_handle_t knet_h;
	int logfds[2];
	struct sockaddr_storage src, dst;
	time_t interval = 0, timeout = 0;
	unsigned int precision = 0;

	memset(&src, 0, sizeof(struct sockaddr_storage));

	if (strtoaddr("127.0.0.1", "50000", (struct sockaddr *)&src, sizeof(struct sockaddr_storage)) < 0) {
		printf("Unable to convert src to sockaddr: %s\n", strerror(errno));
		exit(FAIL);
	}

	memset(&dst, 0, sizeof(struct sockaddr_storage));

	if (strtoaddr("127.0.0.1", "50001", (struct sockaddr *)&dst, sizeof(struct sockaddr_storage)) < 0) {
		printf("Unable to convert dst to sockaddr: %s\n", strerror(errno));
		exit(FAIL);
	}

	printf("Test knet_link_get_ping_timers incorrect knet_h\n");

	if ((!knet_link_get_ping_timers(NULL, 1, 0, &interval, &timeout, &precision)) || (errno != EINVAL)) {
		printf("knet_link_get_ping_timers accepted invalid knet_h or returned incorrect error: %s\n", strerror(errno));
		exit(FAIL);
	}

	setup_logpipes(logfds);

	knet_h = knet_handle_new(1, logfds[1], KNET_LOG_DEBUG);

	if (!knet_h) {
		printf("knet_handle_new failed: %s\n", strerror(errno));
		flush_logs(logfds[0], stdout);
		close_logpipes(logfds);
		exit(FAIL);
	}

	printf("Test knet_link_get_ping_timers with unconfigured host_id\n");

	if ((!knet_link_get_ping_timers(knet_h, 1, 0, &interval, &timeout, &precision)) || (errno != EINVAL)) {
		printf("knet_link_get_ping_timers accepted invalid host_id or returned incorrect error: %s\n", strerror(errno));
		knet_handle_free(knet_h);
		flush_logs(logfds[0], stdout);
		close_logpipes(logfds);
		exit(FAIL);
	}

	flush_logs(logfds[0], stdout);

	printf("Test knet_link_get_ping_timers with incorrect linkid\n");

	if (knet_host_add(knet_h, 1) < 0) {
		printf("Unable to add host_id 1: %s\n", strerror(errno));
		knet_handle_free(knet_h);
		flush_logs(logfds[0], stdout);
		close_logpipes(logfds);
		exit(FAIL);
	}

	if ((!knet_link_get_ping_timers(knet_h, 1, KNET_MAX_LINK, &interval, &timeout, &precision)) || (errno != EINVAL)) {
		printf("knet_link_get_ping_timers accepted invalid linkid or returned incorrect error: %s\n", strerror(errno));
		knet_host_remove(knet_h, 1);
		knet_handle_free(knet_h);
		flush_logs(logfds[0], stdout);
		close_logpipes(logfds);
		exit(FAIL);
	}

	flush_logs(logfds[0], stdout);

	printf("Test knet_link_get_ping_timers with incorrect interval\n");

	if ((!knet_link_get_ping_timers(knet_h, 1, 0, NULL, &timeout, &precision)) || (errno != EINVAL)) {
		printf("knet_link_get_ping_timers accepted invalid interval or returned incorrect error: %s\n", strerror(errno));
		knet_host_remove(knet_h, 1);
		knet_handle_free(knet_h);
		flush_logs(logfds[0], stdout);
		close_logpipes(logfds);
		exit(FAIL);
	}

	flush_logs(logfds[0], stdout);

	printf("Test knet_link_get_ping_timers with incorrect timeout\n");

	if ((!knet_link_get_ping_timers(knet_h, 1, 0, &interval, NULL, &precision)) || (errno != EINVAL)) {
		printf("knet_link_get_ping_timers accepted invalid timeout or returned incorrect error: %s\n", strerror(errno));
		knet_host_remove(knet_h, 1);
		knet_handle_free(knet_h);
		flush_logs(logfds[0], stdout);
		close_logpipes(logfds);
		exit(FAIL);
	}

	flush_logs(logfds[0], stdout);

	printf("Test knet_link_get_ping_timers with incorrect interval\n");

	if ((!knet_link_get_ping_timers(knet_h, 1, 0, &interval, &timeout, NULL)) || (errno != EINVAL)) {
		printf("knet_link_get_ping_timers accepted invalid interval or returned incorrect error: %s\n", strerror(errno));
		knet_host_remove(knet_h, 1);
		knet_handle_free(knet_h);
		flush_logs(logfds[0], stdout);
		close_logpipes(logfds);
		exit(FAIL);
	}

	flush_logs(logfds[0], stdout);

	printf("Test knet_link_get_ping_timers with unconfigured link\n");

	if ((!knet_link_get_ping_timers(knet_h, 1, 0, &interval, &timeout, &precision)) || (errno != EINVAL)) {
		printf("knet_link_get_ping_timers accepted unconfigured link or returned incorrect error: %s\n", strerror(errno));
		knet_host_remove(knet_h, 1);
		knet_handle_free(knet_h);
		flush_logs(logfds[0], stdout);
		close_logpipes(logfds);
		exit(FAIL);
	}

	flush_logs(logfds[0], stdout);

	printf("Test knet_link_get_ping_timers with correct values\n");

	if (knet_link_set_config(knet_h, 1, 0, KNET_TRANSPORT_UDP, &src, &dst) < 0) {
		printf("Unable to configure link: %s\n", strerror(errno));
		knet_host_remove(knet_h, 1);
		knet_handle_free(knet_h);
		flush_logs(logfds[0], stdout);
		close_logpipes(logfds);
		exit(FAIL);
	}

	if (knet_link_get_ping_timers(knet_h, 1, 0, &interval, &timeout, &precision) < 0) {
		printf("knet_link_get_ping_timers failed: %s\n", strerror(errno));
		knet_host_remove(knet_h, 1);
		knet_handle_free(knet_h);
		flush_logs(logfds[0], stdout);
		close_logpipes(logfds);
		exit(FAIL);
	}

	printf("DEFAULT: int: %zu timeout: %zu prec: %u\n", interval, timeout, precision);

	if ((interval != KNET_LINK_DEFAULT_PING_INTERVAL) ||
	    (timeout != KNET_LINK_DEFAULT_PING_TIMEOUT) ||
	    (precision != KNET_LINK_DEFAULT_PING_PRECISION)) {
		printf("knet_link_get_ping_timers failed to set values\n");
		knet_host_remove(knet_h, 1);
		knet_handle_free(knet_h);
		flush_logs(logfds[0], stdout);
		close_logpipes(logfds);
		exit(FAIL);
	}

	flush_logs(logfds[0], stdout);

	knet_host_remove(knet_h, 1);
	knet_handle_free(knet_h);
	flush_logs(logfds[0], stdout);
	close_logpipes(logfds);
}