示例#1
0
文件: cnode.c 项目: younix/cnode
int
main(int argc, char**argv)
{
	if (argc < 4 || argc > 35)
		usage();

	/* convert ip addresses */
	uint32_t src_ip = ipstr2int(argv[1]);
	uint32_t dst_ip = ipstr2int(argv[2]);

	uint32_t masks[32] = {0};
	int nodes = argc - 3;

	/* convert node masks */
	for (int i = 0; i < nodes; i++)
		masks[i] = strtol(argv[3+i], NULL, 10);

	/* calculate load sharing count */
	uint32_t lscount = masks2lscount(masks);

	/* calculate mask from ip address */
	uint32_t fold = src_ip ^ dst_ip;
	fold %= lscount;
	uint32_t mask = 1 << fold;

	/* match mask with given masks */
	for (int i = 0; i < nodes; ++i)
		if (masks[i] & mask)
			printf("%u\n", masks[i]);

	return EXIT_SUCCESS;
}
示例#2
0
const char * ip_desc_db_lookup(const char * ip)
{
    int i;
    uint32_t ipaddr = htonl(ipstr2int(ip));

    for (i = 0; i < db_len; i++) {
	if (db[i].network == (ipaddr & db[i].netmask)) {
	    return db[i].desc;
	}
    }
    return ip;
}
示例#3
0
int ip_desc_db_reload(const char * cfgfile)
{
    FILE *fp;
    char buf[256];
    char *ip, *mask, *strtok_p;
    db_entry *new_db = NULL;
    int new_db_len = 0, new_db_size = 0;
    int result = 0;

    if ( (fp = fopen(cfgfile, "r")) == NULL)
	return -1;

    while (fgets(buf, sizeof(buf), fp)) {
	//skip empty lines
	if (!buf[0] || buf[0] == '\n')
	    continue;

	ip = strtok_r(buf, " \t\n", &strtok_p);

	if (ip == NULL || *ip == '#' || *ip == '@')
	    continue;

	// expand database if nessecary
	if (new_db_len == new_db_size) {
	    void * ptr;
	    if ( (ptr = realloc(new_db, sizeof(db_entry) *
			    (new_db_size + DB_INCREMENT))) == NULL ) {
		result = 1;
		break;
	    }

	    new_db = ptr;
	    new_db_size += DB_INCREMENT;
	}

	// netmask
	if ( (mask = strchr(ip, '/')) != NULL ) {
	    int shift = 32 - atoi(mask + 1);
	    new_db[new_db_len].netmask = htonl(0xFFFFFFFFu << shift);
	    *mask = '\0';
	}
	else
	    new_db[new_db_len].netmask = 0xFFFFFFFFu;

	// network
	new_db[new_db_len].network = htonl(ipstr2int(ip)) &
	    new_db[new_db_len].netmask;

	// description
	if ( (ip = strtok_r(NULL, " \t\n", &strtok_p)) == NULL ) {
	    strcpy(new_db[new_db_len].desc, "¶³²`¤£ª¾³B");
	}
	else {
	    strlcpy(new_db[new_db_len].desc, ip,
		    sizeof(new_db[new_db_len].desc));
	}

	new_db_len++;
    }

    fclose(fp);

    if (new_db != NULL) {
	free(db);
	db = new_db;
	db_len = new_db_len;
	db_size = new_db_size;
    }

    return result;
}