#include <netinet/in.h>
unsigned short port = 2007;
+
struct in_addr *destinations = NULL;
unsigned num_destinations = 0;
unsigned room_destinations = 0;
+struct in_addr *sources = NULL;
+unsigned num_sources = 0;
+unsigned room_sources = 0;
+
const static struct option longopts[] = {
+ { "source-file", required_argument, NULL, 's' },
{ "destination-file", required_argument, NULL, 'd' },
{ "port", required_argument, NULL, 'p' },
{ NULL, 0, NULL, 0 }
};
-void read_destination_list(char *filename)
+void read_ip_list(char *filename, struct in_addr **addr_list, unsigned *num, unsigned *room)
{
char buf[256];
FILE *in = fopen(filename, "r");
// just pick the first for now
memcpy(&addr.s_addr, he->h_addr_list[0], sizeof(addr.s_addr));
- // FIXME: store here
+ if (*num >= *room) {
+ if (*room == 0) {
+ *room = 16;
+ } else {
+ *room <<= 1;
+ }
+ *addr_list = (struct in_addr *)realloc(*addr_list, *room * sizeof(struct in_addr));
+ }
+
+ (*addr_list)[*num] = addr;
+ ++*num;
}
fclose(in);
int option_index = 0;
for ( ;; ) {
- int c = getopt_long(argc, argv, "d:p:", longopts, &option_index);
+ int c = getopt_long(argc, argv, "s:d:p:", longopts, &option_index);
switch (c) {
+ case 's':
+ read_ip_list(optarg, &sources, &num_sources, &room_sources);
+ break;
case 'd':
- read_destination_list(optarg);
+ read_ip_list(optarg, &destinations, &num_destinations, &room_destinations);
break;
case 'p':
port = atoi(optarg);
int server_sock;
parse_options(argc, argv);
+
+ if (destinations == NULL || sources == NULL) {
+ fprintf(stderr, "Missing or empty source or destination host list. Aborting.\n");
+ }
+
server_sock = get_server_socket(port);
// FIXME: fire off sender workers here