render_node.c
changeset 8 4d38ccbeb93e
parent 6 4252c27f2b72
child 11 082bfaf38cf0
--- a/render_node.c	Thu Jun 05 23:04:28 2008 +0300
+++ b/render_node.c	Fri Jun 06 03:24:22 2008 +0300
@@ -5,6 +5,7 @@
 #include <stdlib.h>
 #include <signal.h>
 #include <string.h>
+#include <unistd.h>
 
 #include "render.h"
 #include "render_remote.h"
@@ -115,19 +116,41 @@
     int ssock, sock;
     struct sockaddr_in addr;
     socklen_t addr_len;
+    
+    // parse arguments
+    int opt;
+    const char *port_name = NULL;
 
+    while ((opt = getopt(argc, argv, "l:")) != -1) {
+        switch (opt) {
+            case 'l':
+                if (port_name)
+                    err_exit("only specify -l once");
+
+                port_name = optarg;
+                break;
+
+            default:
+                err_exit("Usage: %s [-l port]", argv[0]);
+        }
+    }
+
+    if (!port_name)
+        port_name = RENDER_PORT_NAME;
+
+    unsigned short port = atoi(port_name);
+
+    if (!port)
+        err_exit("invalid port: %s", port_name);
 
     // create the socket
     if ((ssock = socket(PF_INET, SOCK_STREAM, 0)) == -1)
         perr_exit("socket");
 
     addr.sin_family = AF_INET;
-    addr.sin_port = htons(RENDER_PORT);
+    addr.sin_port = htons(port);
     addr.sin_addr.s_addr = INADDR_ANY;
 
-    if (argc > 1)
-        addr.sin_port = htons(atoi(argv[1]));
-    
     if (bind(ssock, (struct sockaddr *) &addr, sizeof(struct sockaddr_in)) == -1)
         perr_exit("bind");