diff --git a/gnyoserv.c b/gnyoserv.c index 64b6ba7..18ba2c7 100644 --- a/gnyoserv.c +++ b/gnyoserv.c @@ -1,35 +1,319 @@ -#include "gnyoserv.h" -static int sofd, newsofd; +/* + * gnyognyo server + * (c)1994,1995 by HIROSE Yuuji [pcs39334@asciinet.or.jp] + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* ちょっとうまく動かないかも知れないです。直して下さい ^^; */ + +#define error(x) {fprintf(stderr, "gnyoserv: "); perror(x); exit(1);} +#define GNYOPORT 9969 +#define BUFLEN 256 +#define MAXCL 3 + +static int sofd, clisofd[MAXCL+1], clients; +static char *clinames[MAXCL], start=0; + /* $Id$ */ -main(int argc, char *argv[]) +char* savestr(char* str) +{ + char *p; + if (NULL == (p=(char*)malloc(strlen(str)+1))) + error("Virtual memory exhausted."); + strcpy(p, str); + return p; +} + +int mypoint(int me, int score[][MAXCL]) +{ + int i, j, point=0; + for (i=0; ih_name); +#endif + sprintf(buffer, "%s", host->h_name); + clinames[i] = savestr(buffer); + clients++; + } + readable--; + } + for (c=0; readable>0 && c1 && strpbrk(argv[1], "0123456789")) { + port = atoi(argv[1]); + fprintf(stderr, "Port number set to %d\n", port); + } memset((char*)&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = INADDR_ANY; - servaddr.sin_port = htons(GNYOPORT); + servaddr.sin_port = htons(port); memcpy((char*)&servaddr.sin_addr, (char*)host->h_addr, host->h_length); - if (bind(sofd, &servaddr, sizeof(servaddr)) < 0) + if (bind(sofd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) error("Failed to bind"); if (listen(sofd, 5) == -1) error("Failed to listen"); /* connection request */ - while (1) { - int cliaddrlen; - cliaddrlen = sizeof(cliaddr); - if ((newsofd = accept(sofd, &cliaddr, &cliaddrlen)) < 0) - error("Couldn't accept"); - + signal(SIGINT, trap); + + /* begin communication */ + FD_ZERO(&readfds); + FD_SET(sofd, &readfds); + gnyoserv(); + fputs("Session ended\n", stderr); + for (clients=0; clients