Annotation of quake2/game/g_svcmds.c, revision 1.1.1.3

1.1.1.3 ! root        1: /*
        !             2: Copyright (C) 1997-2001 Id Software, Inc.
        !             3: 
        !             4: This program is free software; you can redistribute it and/or
        !             5: modify it under the terms of the GNU General Public License
        !             6: as published by the Free Software Foundation; either version 2
        !             7: of the License, or (at your option) any later version.
        !             8: 
        !             9: This program is distributed in the hope that it will be useful,
        !            10: but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            11: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
        !            12: 
        !            13: See the GNU General Public License for more details.
        !            14: 
        !            15: You should have received a copy of the GNU General Public License
        !            16: along with this program; if not, write to the Free Software
        !            17: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
        !            18: 
        !            19: */
1.1       root       20: 
                     21: #include "g_local.h"
                     22: 
                     23: 
                     24: void   Svcmd_Test_f (void)
                     25: {
                     26:        gi.cprintf (NULL, PRINT_HIGH, "Svcmd_Test_f()\n");
                     27: }
                     28: 
                     29: /*
1.1.1.2   root       30: ==============================================================================
                     31: 
                     32: PACKET FILTERING
                     33:  
                     34: 
                     35: You can add or remove addresses from the filter list with:
                     36: 
                     37: addip <ip>
                     38: removeip <ip>
                     39: 
                     40: 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".
                     41: 
                     42: Removeip will only remove an address specified exactly the same way.  You cannot addip a subnet, then removeip a single host.
                     43: 
                     44: listip
                     45: Prints the current list of filters.
                     46: 
                     47: writeip
                     48: Dumps "addip <ip>" 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.
                     49: 
                     50: filterban <0 or 1>
                     51: 
                     52: If 1 (the default), then ip addresses matching the current list will be prohibited from entering the game.  This is the default setting.
                     53: 
                     54: 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.
                     55: 
                     56: 
                     57: ==============================================================================
                     58: */
                     59: 
                     60: typedef struct
                     61: {
                     62:        unsigned        mask;
                     63:        unsigned        compare;
                     64: } ipfilter_t;
                     65: 
                     66: #define        MAX_IPFILTERS   1024
                     67: 
                     68: ipfilter_t     ipfilters[MAX_IPFILTERS];
                     69: int                    numipfilters;
                     70: 
                     71: /*
                     72: =================
                     73: StringToFilter
                     74: =================
                     75: */
                     76: static qboolean StringToFilter (char *s, ipfilter_t *f)
                     77: {
                     78:        char    num[128];
                     79:        int             i, j;
                     80:        byte    b[4];
                     81:        byte    m[4];
                     82:        
                     83:        for (i=0 ; i<4 ; i++)
                     84:        {
                     85:                b[i] = 0;
                     86:                m[i] = 0;
                     87:        }
                     88:        
                     89:        for (i=0 ; i<4 ; i++)
                     90:        {
                     91:                if (*s < '0' || *s > '9')
                     92:                {
                     93:                        gi.cprintf(NULL, PRINT_HIGH, "Bad filter address: %s\n", s);
                     94:                        return false;
                     95:                }
                     96:                
                     97:                j = 0;
                     98:                while (*s >= '0' && *s <= '9')
                     99:                {
                    100:                        num[j++] = *s++;
                    101:                }
                    102:                num[j] = 0;
                    103:                b[i] = atoi(num);
                    104:                if (b[i] != 0)
                    105:                        m[i] = 255;
                    106: 
                    107:                if (!*s)
                    108:                        break;
                    109:                s++;
                    110:        }
                    111:        
                    112:        f->mask = *(unsigned *)m;
                    113:        f->compare = *(unsigned *)b;
                    114:        
                    115:        return true;
                    116: }
                    117: 
                    118: /*
                    119: =================
                    120: SV_FilterPacket
                    121: =================
                    122: */
                    123: qboolean SV_FilterPacket (char *from)
                    124: {
                    125:        int             i;
                    126:        unsigned        in;
                    127:        byte m[4];
                    128:        char *p;
                    129: 
                    130:        i = 0;
                    131:        p = from;
                    132:        while (*p && i < 4) {
                    133:                m[i] = 0;
                    134:                while (*p >= '0' && *p <= '9') {
                    135:                        m[i] = m[i]*10 + (*p - '0');
                    136:                        p++;
                    137:                }
                    138:                if (!*p || *p == ':')
                    139:                        break;
                    140:                i++, p++;
                    141:        }
                    142:        
                    143:        in = *(unsigned *)m;
                    144: 
                    145:        for (i=0 ; i<numipfilters ; i++)
                    146:                if ( (in & ipfilters[i].mask) == ipfilters[i].compare)
                    147:                        return (int)filterban->value;
                    148: 
                    149:        return (int)!filterban->value;
                    150: }
                    151: 
                    152: 
                    153: /*
                    154: =================
                    155: SV_AddIP_f
                    156: =================
                    157: */
                    158: void SVCmd_AddIP_f (void)
                    159: {
                    160:        int             i;
                    161:        
                    162:        if (gi.argc() < 3) {
                    163:                gi.cprintf(NULL, PRINT_HIGH, "Usage:  addip <ip-mask>\n");
                    164:                return;
                    165:        }
                    166: 
                    167:        for (i=0 ; i<numipfilters ; i++)
                    168:                if (ipfilters[i].compare == 0xffffffff)
                    169:                        break;          // free spot
                    170:        if (i == numipfilters)
                    171:        {
                    172:                if (numipfilters == MAX_IPFILTERS)
                    173:                {
                    174:                        gi.cprintf (NULL, PRINT_HIGH, "IP filter list is full\n");
                    175:                        return;
                    176:                }
                    177:                numipfilters++;
                    178:        }
                    179:        
                    180:        if (!StringToFilter (gi.argv(2), &ipfilters[i]))
                    181:                ipfilters[i].compare = 0xffffffff;
                    182: }
                    183: 
                    184: /*
                    185: =================
                    186: SV_RemoveIP_f
                    187: =================
                    188: */
                    189: void SVCmd_RemoveIP_f (void)
                    190: {
                    191:        ipfilter_t      f;
                    192:        int                     i, j;
                    193: 
                    194:        if (gi.argc() < 3) {
                    195:                gi.cprintf(NULL, PRINT_HIGH, "Usage:  sv removeip <ip-mask>\n");
                    196:                return;
                    197:        }
                    198: 
                    199:        if (!StringToFilter (gi.argv(2), &f))
                    200:                return;
                    201: 
                    202:        for (i=0 ; i<numipfilters ; i++)
                    203:                if (ipfilters[i].mask == f.mask
                    204:                && ipfilters[i].compare == f.compare)
                    205:                {
                    206:                        for (j=i+1 ; j<numipfilters ; j++)
                    207:                                ipfilters[j-1] = ipfilters[j];
                    208:                        numipfilters--;
                    209:                        gi.cprintf (NULL, PRINT_HIGH, "Removed.\n");
                    210:                        return;
                    211:                }
                    212:        gi.cprintf (NULL, PRINT_HIGH, "Didn't find %s.\n", gi.argv(2));
                    213: }
                    214: 
                    215: /*
                    216: =================
                    217: SV_ListIP_f
                    218: =================
                    219: */
                    220: void SVCmd_ListIP_f (void)
                    221: {
                    222:        int             i;
                    223:        byte    b[4];
                    224: 
                    225:        gi.cprintf (NULL, PRINT_HIGH, "Filter list:\n");
                    226:        for (i=0 ; i<numipfilters ; i++)
                    227:        {
                    228:                *(unsigned *)b = ipfilters[i].compare;
                    229:                gi.cprintf (NULL, PRINT_HIGH, "%3i.%3i.%3i.%3i\n", b[0], b[1], b[2], b[3]);
                    230:        }
                    231: }
                    232: 
                    233: /*
                    234: =================
                    235: SV_WriteIP_f
                    236: =================
                    237: */
                    238: void SVCmd_WriteIP_f (void)
                    239: {
                    240:        FILE    *f;
                    241:        char    name[MAX_OSPATH];
                    242:        byte    b[4];
                    243:        int             i;
                    244:        cvar_t  *game;
                    245: 
                    246:        game = gi.cvar("game", "", 0);
                    247: 
                    248:        if (!*game->string)
                    249:                sprintf (name, "%s/listip.cfg", GAMEVERSION);
                    250:        else
                    251:                sprintf (name, "%s/listip.cfg", game->string);
                    252: 
                    253:        gi.cprintf (NULL, PRINT_HIGH, "Writing %s.\n", name);
                    254: 
                    255:        f = fopen (name, "wb");
                    256:        if (!f)
                    257:        {
                    258:                gi.cprintf (NULL, PRINT_HIGH, "Couldn't open %s\n", name);
                    259:                return;
                    260:        }
                    261:        
                    262:        fprintf(f, "set filterban %d\n", (int)filterban->value);
                    263: 
                    264:        for (i=0 ; i<numipfilters ; i++)
                    265:        {
                    266:                *(unsigned *)b = ipfilters[i].compare;
                    267:                fprintf (f, "sv addip %i.%i.%i.%i\n", b[0], b[1], b[2], b[3]);
                    268:        }
                    269:        
                    270:        fclose (f);
                    271: }
                    272: 
                    273: /*
1.1       root      274: =================
                    275: ServerCommand
                    276: 
                    277: ServerCommand will be called when an "sv" command is issued.
                    278: The game can issue gi.argc() / gi.argv() commands to get the rest
                    279: of the parameters
                    280: =================
                    281: */
                    282: void   ServerCommand (void)
                    283: {
                    284:        char    *cmd;
                    285: 
                    286:        cmd = gi.argv(1);
                    287:        if (Q_stricmp (cmd, "test") == 0)
                    288:                Svcmd_Test_f ();
1.1.1.2   root      289:        else if (Q_stricmp (cmd, "addip") == 0)
                    290:                SVCmd_AddIP_f ();
                    291:        else if (Q_stricmp (cmd, "removeip") == 0)
                    292:                SVCmd_RemoveIP_f ();
                    293:        else if (Q_stricmp (cmd, "listip") == 0)
                    294:                SVCmd_ListIP_f ();
                    295:        else if (Q_stricmp (cmd, "writeip") == 0)
                    296:                SVCmd_WriteIP_f ();
1.1       root      297:        else
                    298:                gi.cprintf (NULL, PRINT_HIGH, "Unknown server command \"%s\"\n", cmd);
                    299: }
                    300: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.