#include <netdb.h>
#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 is_daemon = 0;
-static int level = 5;
+static int levelnr = 5;
static int mode = -1;
static int paused = 0;
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;
}
{
struct user *v, *w;
- if (verbose)
+ if (options.verbose)
printf("RND_SERVER: dropping client %d (%s)\n", u->number, u->nick);
if (u == user0)
if (onceonly && clients == bots)
{
- if (verbose)
+ if (options.verbose)
{
printf("RND_SERVER: no clients left\n");
printf("RND_SERVER: aborting\n");
if (clients == 0)
{
mode = -1;
- level = 5;
+ levelnr = 5;
timetoplay = 0;
}
}
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;
}
u->number = nxn;
- if (verbose)
+ if (options.verbose)
printf("RND_SERVER: client %d connecting from %s\n", nxn, inet_ntoa(saddr.sin_addr));
clients++;
{
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;
}
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]);
}
}
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);
}
}
- if (verbose)
+ if (options.verbose)
{
if (nr_is_free)
printf("RND_SERVER: client %d (%s) switches to # %d\n",
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)
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);
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)
{
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],
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;
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;
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);
}
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)
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; i<last_client_nr; i++)
+ buf[6 + i] = 0;
/* broadcast actions of all players to all players */
for (v=user0; v; v=v->next)
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);
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)
open("/dev/null", O_WRONLY);
}
- if (verbose)
+ if (options.verbose)
{
printf("rocksndiamonds network server: started up, listening on port %d\n",
port);
{
buf[0] = 0;
do_play();
- if (verbose)
+ if (options.verbose)
printf("RND_SERVER: everyone lost... restarting game\n");
timetoplay = 0;
}
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);
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;
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);
}
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);
{
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);
}
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);
}
}
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;
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;
{
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);
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;
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;
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);
}
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;
}
}
}
- 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);
}
}