+ debug("Task %d terminated\n", tasknum);
+}
+
+void open_filedescriptors()
+{
+ struct sockaddr_in sa;
+
+ bzero((char *) &sa, sizeof(sa));
+ sa.sin_family = AF_INET;
+ sa.sin_addr.s_addr = INADDR_ANY;
+ sa.sin_port = htons(port);
+
+ if((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
+ pdie("socket");
+ if(bind(sock_fd, (struct sockaddr*)&sa, sizeof(sa)) == -1)
+ pdie("bind\n");
+ if(listen(sock_fd, 10) == -1)
+ pdie("bind\n");
+
+ printf("Listening on %d\n", port);
+ fflush(stdout);
+ if((fd = accept(sock_fd, (struct sockaddr*)NULL, NULL)) == -1)
+ pdie("accept");
+}
+
+void usage(FILE *o, char *arg0){
+ fprintf(o,
+ "Usage: %s [opts]\n"
+ "\n"
+ "Options\n"
+ "-p PORT Custom port number, default: 8123\n"
+ , arg0);
+}
+
+int main(int argc, char *argv[])
+{
+ int ct;
+
+ //Register signal handler
+ if(signal(SIGINT, killHandler) == SIG_ERR){
+ die("Couldn't register signal handler...\n");
+ }
+ if(signal(SIGTERM, killHandler) == SIG_ERR){
+ die("Couldn't register signal handler...\n");
+ }
+
+ //Command line arguments
+ int opt;
+ while((opt = getopt(argc, argv, "hp:")) != -1){
+ switch(opt){
+ case 'p':
+ port = atoi(optarg);
+ if(port < 1)
+ die("Port numbers are > 1\n");
+ break;
+ case 'h':
+ usage(stdout, argv[0]);
+ exit(EXIT_SUCCESS);
+ default:
+ usage(stderr, argv[0]);
+ exit(EXIT_FAILURE);
+ }
+
+ }
+
+ open_filedescriptors();
+
+ while(true){
+ //Check for new tasks
+ if(input_available(fd))
+ read_message(fd, fd);
+ //Run tasks
+ for(ct = 0; ct<MAXTASKS; ct++){
+ if(!tasks[ct].used){
+ debug("Task %d not implemented\n", ct);
+ continue;
+ }
+#ifdef DEBUG
+ printf("Current task to run: %d\n", ct);
+ printf("Enter to continue, s to step\n");
+ switch(getchar()){
+ case 'd':
+ die("Killed\n");
+ case 's':
+ printf("step\n");
+ break;
+ default:
+ break;
+ }
+#endif
+ run_task(ct);
+ }
+ usleep(10);
+ }