X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fnetserv.c;h=6ff6e52e089049eea9c1fd8955bcbe540fc1c2dc;hb=40a487dcc5d3028343ff9123a72b8b3839a42861;hp=221c8ff9df0d388d633a9d81696356fa519e4cd8;hpb=3d236f777bca55fef0f6b23122b6affd0f424249;p=rocksndiamonds.git diff --git a/src/netserv.c b/src/netserv.c index 221c8ff9..6ff6e52e 100644 --- a/src/netserv.c +++ b/src/netserv.c @@ -27,22 +27,14 @@ #include #include "netserv.h" - - - -extern int verbose; - -extern void copydown(char *, char *, int); -extern void fatal(char *); - - +#include "misc.h" static int clients = 0; static int bots = 0; static int onceonly = 0; static int timetoplay = 0; -static int daemon = 0; -static int level = 5; +static int is_daemon = 0; +static int levelnr = 5; static int mode = -1; static int paused = 0; @@ -83,7 +75,7 @@ static fd_set fds; static void syserr(char *s) { - if (!daemon) + if (!is_daemon) fprintf(stderr, "fatal: %s failed.\n", s); exit(1); } @@ -91,7 +83,8 @@ static void syserr(char *s) static void addtobuffer(struct user *u, unsigned char *b, int len) { if (u->nwrite + len >= MAX_BUFFER_SIZE) - fatal("Internal error: send buffer overflow"); + Error(ERR_EXIT, "internal error: network send buffer overflow"); + memcpy(u->writbuf + u->nwrite, b, len); u->nwrite += len; } @@ -127,7 +120,7 @@ static void dropuser(struct user *u) { struct user *v, *w; - if (verbose) + if (options.verbose) printf("RND_SERVER: dropping client %d (%s)\n", u->number, u->nick); if (u == user0) @@ -177,7 +170,7 @@ static void dropuser(struct user *u) if (onceonly && clients == bots) { - if (verbose) + if (options.verbose) { printf("RND_SERVER: no clients left\n"); printf("RND_SERVER: aborting\n"); @@ -188,7 +181,7 @@ static void dropuser(struct user *u) if (clients == 0) { mode = -1; - level = 5; + levelnr = 5; timetoplay = 0; } } @@ -198,9 +191,8 @@ static void new_connect(int fd) struct user *u, *v; unsigned char nxn; - u = malloc(sizeof (struct user)); - if (!u) - fatal("Out of memory"); + u = checked_malloc(sizeof (struct user)); + u->fd = fd; u->nick[0] = 0; u->next = user0; @@ -232,7 +224,7 @@ static void new_connect(int fd) } u->number = nxn; - if (verbose) + if (options.verbose) printf("RND_SERVER: client %d connecting from %s\n", nxn, inet_ntoa(saddr.sin_addr)); clients++; @@ -246,7 +238,7 @@ static void Handle_OP_PROTOCOL_VERSION(struct user *u, unsigned int len) { if (len != 5 || buf[2] != PROT_VERS_1 || buf[3] != PROT_VERS_2) { - if (verbose) + if (options.verbose) printf("RND_SERVER: client %d (%s) has wrong protocol version %d.%d.%d\n", u->number, u->nick, buf[2], buf[3], buf[4]); buf[0] = 0; @@ -262,7 +254,7 @@ static void Handle_OP_PROTOCOL_VERSION(struct user *u, unsigned int len) } else { - if (verbose) + if (options.verbose) printf("RND_SERVER: client %d (%s) uses protocol version %d.%d.%d\n", u->number, u->nick, buf[2], buf[3], buf[4]); } } @@ -270,10 +262,11 @@ static void Handle_OP_PROTOCOL_VERSION(struct user *u, unsigned int len) static void Handle_OP_NUMBER_WANTED(struct user *u) { struct user *v; + int client_nr = u->number; int nr_wanted = buf[2]; int nr_is_free = 1; - if (verbose) + if (options.verbose) printf("RND_SERVER: client %d (%s) wants to switch to # %d\n", u->number, u->nick, nr_wanted); @@ -286,7 +279,7 @@ static void Handle_OP_NUMBER_WANTED(struct user *u) } } - if (verbose) + if (options.verbose) { if (nr_is_free) printf("RND_SERVER: client %d (%s) switches to # %d\n", @@ -302,11 +295,16 @@ static void Handle_OP_NUMBER_WANTED(struct user *u) if (nr_is_free) u->number = nr_wanted; - buf[0] = 0; + buf[0] = client_nr; buf[1] = OP_NUMBER_WANTED; buf[2] = nr_wanted; buf[3] = u->number; + + /* sendtoone(u, 4); + */ + + broadcast(NULL, 4, 0); } static void Handle_OP_NICKNAME(struct user *u, unsigned int len) @@ -335,7 +333,7 @@ static void Handle_OP_NICKNAME(struct user *u, unsigned int len) broadcast(u, 2, 0); } - if (verbose) + if (options.verbose) printf("RND_SERVER: client %d calls itself \"%s\"\n", u->number, u->nick); buf[1] = OP_NICKNAME; broadcast(u, len, 0); @@ -356,11 +354,11 @@ static void Handle_OP_NICKNAME(struct user *u, unsigned int len) sendtoone(u, 2+strlen(v->nick)); } } - if (level != 5) + if (levelnr != 5) { buf[0] = 0; buf[1] = OP_LEVEL; - buf[2] = level; + buf[2] = levelnr; sendtoone(u, 3); } if (mode >= 0) @@ -378,7 +376,7 @@ static void Handle_OP_START_PLAYING(struct user *u) { struct user *v, *w; - if (verbose) + if (options.verbose) printf("RND_SERVER: client %d (%s) starts game [level %d from levedir %d (%s)]\n", u->number, u->nick, (buf[2] << 8) + buf[3], @@ -431,7 +429,7 @@ static void Handle_OP_START_PLAYING(struct user *u) static void Handle_OP_PAUSE_PLAYING(struct user *u) { - if (verbose) + if (options.verbose) printf("RND_SERVER: client %d (%s) pauses game\n", u->number, u->nick); broadcast(NULL, 2, 0); paused = 1; @@ -439,7 +437,7 @@ static void Handle_OP_PAUSE_PLAYING(struct user *u) static void Handle_OP_CONTINUE_PLAYING(struct user *u) { - if (verbose) + if (options.verbose) printf("RND_SERVER: client %d (%s) continues game\n", u->number, u->nick); broadcast(NULL, 2, 0); paused = 0; @@ -447,7 +445,7 @@ static void Handle_OP_CONTINUE_PLAYING(struct user *u) static void Handle_OP_STOP_PLAYING(struct user *u) { - if (verbose) + if (options.verbose) printf("RND_SERVER: client %d (%s) stops game\n", u->number, u->nick); broadcast(NULL, 2, 0); } @@ -455,8 +453,8 @@ static void Handle_OP_STOP_PLAYING(struct user *u) static void Handle_OP_MOVE_FIGURE(struct user *u) { struct user *v; - int actions_complete = 1; int last_client_nr = 0; + int i; /* store player action */ for (v=user0; v; v=v->next) @@ -472,14 +470,15 @@ static void Handle_OP_MOVE_FIGURE(struct user *u) for (v=user0; v; v=v->next) { if (!v->action_received) - { - actions_complete = 0; - break; - } + return; + + if (v->number > last_client_nr) + last_client_nr = v->number; } - if (!actions_complete) - return; + /* initialize all player actions to zero */ + for (i=0; inext) @@ -487,9 +486,6 @@ static void Handle_OP_MOVE_FIGURE(struct user *u) buf[6 + v->number-1] = v->action; v->action = 0; v->action_received = 0; - - if (v->number > last_client_nr) - last_client_nr = v->number; } buf[2] = (unsigned char)((frame_counter >> 24) & 0xff); @@ -518,7 +514,7 @@ void NetworkServer(int port, int serveronly) unsigned int len; struct protoent *tcpproto; struct timeval tv; - int daemon = 0; + int is_daemon = 0; #ifndef NeXT struct sigaction sact; @@ -558,10 +554,10 @@ void NetworkServer(int port, int serveronly) listen(lfd, 5); - if (daemon) + if (is_daemon) { /* become a daemon, breaking all ties with the controlling terminal */ - verbose = 0; + options.verbose = 0; for (i=0; i<255; i++) { if (i != lfd) @@ -581,7 +577,7 @@ void NetworkServer(int port, int serveronly) open("/dev/null", O_WRONLY); } - if (verbose) + if (options.verbose) { printf("rocksndiamonds network server: started up, listening on port %d\n", port); @@ -598,7 +594,7 @@ void NetworkServer(int port, int serveronly) { buf[0] = 0; do_play(); - if (verbose) + if (options.verbose) printf("RND_SERVER: everyone lost... restarting game\n"); timetoplay = 0; } @@ -621,16 +617,19 @@ void NetworkServer(int port, int serveronly) tv.tv_sec = 0; tv.tv_usec = 500000; if ((sl = select(mfd + 1, &fds, NULL, NULL, &tv)) < 0) + { if (errno != EINTR) syserr("select"); - else continue; - + else + continue; + } + if (sl < 0) continue; if (clients > 0 && clients == bots) { - if (verbose) + if (options.verbose) printf("RND_SERVER: only bots left... dropping all bots\n"); while (user0) dropuser(user0); @@ -672,7 +671,7 @@ void NetworkServer(int port, int serveronly) r = read(u->fd, u->readbuf + u->nread, MAX_BUFFER_SIZE - u->nread); if (r <= 0) { - if (verbose) + if (options.verbose) printf("RND_SERVER: EOF from client %d (%s)\n", u->number, u->nick); dropuser(u); interrupt = 1; @@ -684,7 +683,7 @@ void NetworkServer(int port, int serveronly) len = u->readbuf[3]; if (u->readbuf[0] || u->readbuf[1] || u->readbuf[2]) { - if (verbose) + if (options.verbose) printf("RND_SERVER: crap from client %d (%s)\n", u->number, u->nick); write(u->fd, "\033]50;kanji24\007\033#8\033(0", 19); dropuser(u); @@ -693,12 +692,12 @@ void NetworkServer(int port, int serveronly) } memcpy(buf, &u->readbuf[4], len); u->nread -= 4 + len; - copydown(u->readbuf, u->readbuf + 4 + len, u->nread); + memmove(u->readbuf, u->readbuf + 4 + len, u->nread); buf[0] = u->number; if (!u->introduced && buf[1] != OP_NICKNAME) { - if (verbose) + if (options.verbose) printf("RND_SERVER: !(client %d)->introduced && buf[1]==%d (expected OP_NICKNAME)\n", buf[0], buf[1]); dropuser(u); @@ -750,7 +749,7 @@ void NetworkServer(int port, int serveronly) { if (v->isbot) { - if (verbose) + if (options.verbose) printf("RND_SERVER: client %d (%s) kills bot %d (%s)\n", u->number, u->nick, v->number, v->nick); dropuser(v); @@ -759,7 +758,7 @@ void NetworkServer(int port, int serveronly) } else { - if (verbose) + if (options.verbose) printf("RND_SERVER: client %d (%s) attempting to kill non-bot %d (%s)\n", u->number, u->nick, v->number, v->nick); } } @@ -767,7 +766,7 @@ void NetworkServer(int port, int serveronly) case OP_MODE: mode = buf[2]; - if (verbose) + if (options.verbose) printf("RND_SERVER: client %d (%s) sets mode %d (%s)\n", u->number, u->nick, buf[2], buf[2] == 0 ? "normal" : (buf[2] == 1 ? "fun" : "unknown")); broadcast(NULL, 3, 0); break; @@ -776,13 +775,13 @@ void NetworkServer(int port, int serveronly) if (!u->isbot) bots++; u->isbot = 1; - if (verbose) + if (options.verbose) printf("RND_SERVER: client %d (%s) declares itself to be a bot\n", u->number, u->nick); break; case OP_LEVEL: - level = buf[2]; - if (verbose) + levelnr = buf[2]; + if (options.verbose) printf("RND_SERVER: client %d (%s) sets level %d\n", u->number, u->nick, buf[2]); broadcast(NULL, 3, 0); break; @@ -791,7 +790,7 @@ void NetworkServer(int port, int serveronly) { struct user *won = NULL; - if (verbose) + if (options.verbose) printf("RND_SERVER: client %d (%s) has lost\n", u->number, u->nick); u->playing = 0; broadcast(u, 2, 1); @@ -841,7 +840,7 @@ void NetworkServer(int port, int serveronly) case OP_ZERO: broadcast(NULL, 2, 0); - if (verbose) + if (options.verbose) printf("RND_SERVER: client %d (%s) resets the game counters\n", u->number, u->nick); for (v=user0; v; v=v->next) v->games = 0; @@ -854,7 +853,7 @@ void NetworkServer(int port, int serveronly) case OP_MSG: buf[len] = '\0'; - if (verbose) + if (options.verbose) printf("RND_SERVER: client %d (%s) sends message: %s\n", u->number, u->nick, &buf[2]); broadcast(u, len, 0); break; @@ -862,7 +861,7 @@ void NetworkServer(int port, int serveronly) case OP_LINES: if (len != 3) { - if (verbose) + if (options.verbose) printf("RND_SERVER: client %d (%s) sends crap for an OP_LINES\n", u->number, u->nick); dropuser(u); @@ -871,7 +870,7 @@ void NetworkServer(int port, int serveronly) } if (u->nextvictim) { - if (verbose) + if (options.verbose) printf("RND_SERVER: client %d (%s) sends %d %s to client %d (%s)\n", u->number, u->nick, (int)buf[2], buf[2] == 1 ? "line" : "lines", u->nextvictim->number, u->nextvictim->nick); sendtoone(u->nextvictim, 3); buf[3] = u->nextvictim->number; @@ -886,12 +885,12 @@ void NetworkServer(int port, int serveronly) } } } - else if (verbose) + else if (options.verbose) printf("RND_SERVER: client %d (%s) makes %d %s but has no victim\n", u->number, u->nick, (int)buf[2], buf[2] == 1 ? "line" : "lines"); break; default: - if (verbose) + if (options.verbose) printf("RND_SERVER: opcode %d from client %d (%s) not understood\n", buf[0], u->number, u->nick); } }