Annotation of quake2/rogue/g_svcmds.c, revision 1.1

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

unix.superglobalmegacorp.com

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