Skip to content
Snippets Groups Projects
kiraserver.cc 28.6 KiB
Newer Older
		    fp[0],fp[1],fp[2],fp[3],
		    fp[4],fp[5],fp[6],fp[7],
		    fp[8],fp[9],fp[10],fp[11],
		    fp[12],fp[13],fp[14],fp[15]);
	}
	else if(curstate.turnrate == 0)
	    fprintf(outf, " (identity transform)");
	fprintf(outf, "\n");
	fprintf(outf, "group %d  type %d\n", curstate.group, curstate.type);
    }
    return sl->nspecks;
}

int serverlisten( int port ) {
    struct sockaddr_in asin;
    static int one = 1;
    int lsock;

    memset(&asin, 0, sizeof(asin));
    asin.sin_family = AF_INET;
    asin.sin_port = htons(port);
    asin.sin_addr.s_addr = INADDR_ANY;

    lsock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
    if(lsock < 0) {
	perror("socket");
	return -1;
    }
    setsockopt(lsock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
    if(bind(lsock, (struct sockaddr *)&asin, sizeof(asin)) < 0) {
	perror("bind");
	return -1;
    }

    if(listen(lsock, 5) < 0) {
	perror("listen");
	return -1;
    }
    return lsock;
}

void serverloop( int lsock ) {
    for(;;) {
	struct sockaddr_in from;
	FILE *inf, *outf;
	char req[1280];
	
#if sgi
	int fromlen = sizeof(from);
#else
	unsigned int fromlen = sizeof(from);
	int s = accept(lsock, (struct sockaddr *)&from, &fromlen);
	if(s < 0) {
	    if(errno == EINTR)
		continue;
	    perror("accept");
	    return;
	}
	inf = fdopen(s, "r");
	if(fgets(req, sizeof(req), inf) == NULL) {
	    perror("fgets");
	} else {
	    outf = fdopen(s, "w");
	    serveonce( req, outf );
	    fclose(outf);
	}
	fclose(inf);
	close(s);
    }
}


main(int argc, char *argv[])
{
    static struct stuff tst;
    curstate.st = &tst;
    int c;
    char opt[8];

    progname = argv[0];

    curstate.colorscale = 100.0;
    curstate.has_T0 = 0;
    curstate.port = 3400;

    while((c = getopt(argc, argv, "T:r:t:y:g:m:c:p:")) != EOF) {
	opt[0] = c;
	opt[1] = '\0';
	if(c == 'y') strcpy(opt, "type");
	scanopt( opt, optarg );
    }
    if(optind != argc-1) {
	fprintf(stderr, "Usage: %s [options] file.kira\n\
Options:\n\
   -t time\n\
   -r <axis><degreespertime>[@time0]  Timed rotation about axis 'x'/'y'/'z'\n\
   -T 16-numbers   outcoords = kira * rotation(time) * tfm\n\
   -y sdbtype\n\
   -g group\n\
   -m mag0         sdb mag = mag0 - log(lum)/(log(100)/5)\n\
   -c colorscale   sdb color = log10(T)*colorscale\n\
   -p portno	   listen for HTTP connections on that TCP port\n\
", progname);
	exit(1);
    }
    msg("Listening on port %d", curstate.port);
    int lsock = serverlisten( curstate.port );
    if(lsock < 0)
	exit(1);

    msg("Reading %s", argv[optind]);
    kira_open( &curstate.st->dyn, curstate.st, argv[optind], 0 );

    msg("Ready.");
    serverloop( lsock );

}