diff --git a/src/g_svcmds.c b/src/g_svcmds.c index 4e563c2..4f1dd44 100644 --- a/src/g_svcmds.c +++ b/src/g_svcmds.c @@ -1,300 +1,344 @@ /* -Copyright (C) 1997-2001 Id Software, Inc. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -*/ + * Copyright (C) 1997-2001 Id Software, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * ======================================================================= + * + * Game side of server CMDs. At this time only the ipfilter. + * + * ======================================================================= + */ #include "header/local.h" - -void Svcmd_Test_f (void) +void +Svcmd_Test_f(void) { - gi.cprintf (NULL, PRINT_HIGH, "Svcmd_Test_f()\n"); + gi.cprintf(NULL, PRINT_HIGH, "Svcmd_Test_f()\n"); } /* -============================================================================== - -PACKET FILTERING - - -You can add or remove addresses from the filter list with: - -addip -removeip - -The ip address is specified in dot format, and any unspecified digits will match any value, so you can specify an entire class C network with "addip 192.246.40". - -Removeip will only remove an address specified exactly the same way. You cannot addip a subnet, then removeip a single host. - -listip -Prints the current list of filters. - -writeip -Dumps "addip " commands to listip.cfg so it can be execed at a later date. The filter lists are not saved and restored by default, because I beleive it would cause too much confusion. - -filterban <0 or 1> - -If 1 (the default), then ip addresses matching the current list will be prohibited from entering the game. This is the default setting. - -If 0, then only addresses matching the list will be allowed. This lets you easily set up a private game, or a game that only allows players from your local network. - - -============================================================================== -*/ + * ============================================================================== + * + * PACKET FILTERING + * + * + * You can add or remove addresses from the filter list with: + * + * addip + * removeip + * + * The ip address is specified in dot format, and any unspecified + * digits will match any value, so you can specify an entire class C + * network with "addip 192.246.40". + * + * Removeip will only remove an address specified exactly the same way. + * You cannot addip a subnet, then removeip a single host. + * + * listip + * Prints the current list of filters. + * + * writeip + * Dumps "addip " commands to listip.cfg so it can be execed at a + * later date. The filter lists are not saved and restored by default, + * because I beleive it would cause too much confusion. + * + * filterban <0 or 1> + * + * If 1 (the default), then ip addresses matching the current list will + * be prohibited from entering the game. This is the default setting. + * + * If 0, then only addresses matching the list will be allowed. This lets + * you easily set up a private game, or a game that only allows players + * from your local network. + * + * + * ============================================================================== + */ typedef struct { - unsigned mask; - unsigned compare; + unsigned mask; + unsigned compare; } ipfilter_t; -#define MAX_IPFILTERS 1024 +#define MAX_IPFILTERS 1024 -ipfilter_t ipfilters[MAX_IPFILTERS]; -int numipfilters; +ipfilter_t ipfilters[MAX_IPFILTERS]; +int numipfilters; -/* -================= -StringToFilter -================= -*/ -static qboolean StringToFilter (char *s, ipfilter_t *f) +static qboolean +StringToFilter(char *s, ipfilter_t *f) { - char num[128]; - int i, j; - byte b[4]; - byte m[4]; - - for (i=0 ; i<4 ; i++) + char num[128]; + int i, j; + byte b[4]; + byte m[4]; + + for (i = 0; i < 4; i++) { b[i] = 0; m[i] = 0; } - - for (i=0 ; i<4 ; i++) + + for (i = 0; i < 4; i++) { - if (*s < '0' || *s > '9') + if ((*s < '0') || (*s > '9')) { gi.cprintf(NULL, PRINT_HIGH, "Bad filter address: %s\n", s); return false; } - + j = 0; + while (*s >= '0' && *s <= '9') { num[j++] = *s++; } + num[j] = 0; b[i] = atoi(num); + if (b[i] != 0) + { m[i] = 255; + } if (!*s) + { break; + } + s++; } - + f->mask = *(unsigned *)m; f->compare = *(unsigned *)b; - + return true; } -/* -================= -SV_FilterPacket -================= -*/ -qboolean SV_FilterPacket (char *from) +qboolean +SV_FilterPacket(char *from) { - int i; - unsigned in; + int i; + unsigned in; byte m[4]; char *p; i = 0; p = from; - while (*p && i < 4) { + + while (*p && i < 4) + { m[i] = 0; - while (*p >= '0' && *p <= '9') { - m[i] = m[i]*10 + (*p - '0'); + + while (*p >= '0' && *p <= '9') + { + m[i] = m[i] * 10 + (*p - '0'); p++; } - if (!*p || *p == ':') + + if (!*p || (*p == ':')) + { break; + } + i++, p++; } - + in = *(unsigned *)m; - for (i=0 ; ivalue; + } + } return (int)!filterban->value; } - -/* -================= -SV_AddIP_f -================= -*/ -void SVCmd_AddIP_f (void) +void +SVCmd_AddIP_f(void) { - int i; - - if (gi.argc() < 3) { + int i; + + if (gi.argc() < 3) + { gi.cprintf(NULL, PRINT_HIGH, "Usage: addip \n"); return; } - for (i=0 ; i\n"); return; } - if (!StringToFilter (gi.argv(2), &f)) + if (!StringToFilter(gi.argv(2), &f)) + { return; + } - for (i=0 ; istring) - sprintf (name, "%s/listip.cfg", GAMEVERSION); + { + sprintf(name, "%s/listip.cfg", GAMEVERSION); + } else - sprintf (name, "%s/listip.cfg", game->string); + { + sprintf(name, "%s/listip.cfg", game->string); + } - gi.cprintf (NULL, PRINT_HIGH, "Writing %s.\n", name); + gi.cprintf(NULL, PRINT_HIGH, "Writing %s.\n", name); + + f = fopen(name, "wb"); - f = fopen (name, "wb"); if (!f) { - gi.cprintf (NULL, PRINT_HIGH, "Couldn't open %s\n", name); + gi.cprintf(NULL, PRINT_HIGH, "Couldn't open %s\n", name); return; } - + fprintf(f, "set filterban %d\n", (int)filterban->value); - for (i=0 ; i