]> git.sesse.net Git - jam/blobdiff - jam.c
Add an option for setting the number of senders.
[jam] / jam.c
diff --git a/jam.c b/jam.c
index 5047d286cfc417c4b2fd9bb62a6ef9d3f4d3a311..3b38d0217587f00d08e319eee7a1f5191f190599 100644 (file)
--- a/jam.c
+++ b/jam.c
@@ -18,9 +18,12 @@ struct in_addr *sources = NULL;
 unsigned num_sources = 0;
 unsigned room_sources = 0;
 
+unsigned num_senders = 128;
+
 const static struct option longopts[] = {
-       { "source-file", required_argument, NULL, 's' },
-       { "destination-file", required_argument, NULL, 'd' },
+       { "source-list", required_argument, NULL, 's' },
+       { "destination-list", required_argument, NULL, 'd' },
+       { "num-senders", required_argument, NULL, 'n' },
        { "port", required_argument, NULL, 'p' },
        { NULL, 0, NULL, 0 }
 };
@@ -85,7 +88,7 @@ void parse_options(int argc, char **argv)
        int option_index = 0;
 
        for ( ;; ) {
-               int c = getopt_long(argc, argv, "s:d:p:", longopts, &option_index); 
+               int c = getopt_long(argc, argv, "s:d:n:p:", longopts, &option_index); 
                switch (c) {
                case 's':
                        read_ip_list(optarg, &sources, &num_sources, &room_sources);
@@ -93,6 +96,9 @@ void parse_options(int argc, char **argv)
                case 'd':
                        read_ip_list(optarg, &destinations, &num_destinations, &room_destinations);
                        break;
+               case 'n':
+                       num_senders = atoi(optarg);
+                       break;
                case 'p':
                        port = atoi(optarg);
                        break;
@@ -105,6 +111,12 @@ void parse_options(int argc, char **argv)
        }
 }
 
+void *sender_worker(void *arg)
+{
+       printf("Dummy sender worker\n");
+       pthread_exit(0);
+}
+
 void *receiver_worker(void *arg)
 {
        int sock = (int)arg;
@@ -167,11 +179,40 @@ int get_server_socket(unsigned short port)
 int main(int argc, char **argv)
 {
        int server_sock;
+       unsigned i;
+       pthread_attr_t attr;
 
        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);
+       
+       printf("Sending data on port %u from %u sources to %u destinations.\n\n",
+               port, num_sources, num_destinations);
+               
+       // FIXME: these do not really set errno
+       if (pthread_attr_init(&attr) != 0) {
+               perror("pthread_attr_init()");
+               exit(1);
+       }
+
+       if (pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN + 65536 + 0x4000) != 0) {
+               perror("pthread_attr_setstacksize");
+               exit(1);
+       }
 
-       // FIXME: fire off sender workers here
+       // Fire off sender workers.
+       for (i = 0; i < num_senders; ++i) {
+               pthread_t thread;
+               
+               if (pthread_create(&thread, &attr, sender_worker, NULL) != 0) {
+                       perror("pthread_create()");
+                       exit(1);
+               }
+       }
 
        /*
         * Listen for incoming connections, spawning off one receiver
@@ -182,7 +223,6 @@ int main(int argc, char **argv)
                struct sockaddr_in addr;
                socklen_t addr_len = sizeof(addr);
                pthread_t thread;
-               pthread_attr_t attr;
 
                int sock = accept(server_sock, (struct sockaddr *)&addr, &addr_len);
                if (sock == -1) {
@@ -190,17 +230,6 @@ int main(int argc, char **argv)
                        exit(1);
                }
 
-               // FIXME: these do not really set errno
-               if (pthread_attr_init(&attr) != 0) {
-                       perror("pthread_attr_init()");
-                       exit(1);
-               }
-
-               if (pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN + 65536 + 0x4000) != 0) {
-                       perror("pthread_attr_setstacksize");
-                       exit(1);
-               }
-
                if (pthread_create(&thread, &attr, receiver_worker, (void *)sock) != 0) {
                        perror("pthread_create()");
                        exit(1);