/*************************************************************************** * Copyright (C) 03/2005 by Olaf Rempel * * razzor@kopf-tisch.de * * * * 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. * ***************************************************************************/ #include #include "plugin_helper.h" /** * scan() * wird periodisch aufgerufen um server querys loszuschicken. * * @return false bei fehler */ static int scan(void) { char myscan[] = "hallo" /* sendet an 255.255.255.255:8888 'hallo' */ pkt_send(NULL, 8888, myscan, strlen(myscan)); /* sendet an 255.255.255.255:8888 'hallo\x00' */ pkt_send(NULL, 8888, myscan, sizeof(myscan)); /* sendet an 192.168.1.100:8888 'hallo' */ struct in_addr tmp; inet_aton("192.168.1.100", &tmp) pkt_send(&tmp, 8888, myscan, strlen(myscan)); /* an portrange(s) senden */ struct scan_ports port_arr[] = { { 27960, 27963, 0 }, /* von 27960-27963 scannen */ { 28960, 28963, 0 }, /* und von 28960-28963 */ { 0,0,0 } }; pkt_send_portarr(NULL, &port_arr, myscan, strlen(myscan)); return 1; } /** * parse() * wird beim Empfang von Paketen aufgerufen um die Antworten zu parsen. * Wenn das Paket fuer diesen Plugin einen Sinn ergibt, * wird true zurueckgegeben. * * @param *pkt empfangenes Paket * @return true wenn das Plugin das Paket parsen konnte */ static int parse(struct net_pkt *pkt) { /* checken ob das paket vom richtigen port kommt: */ if (pkt_getport(pkt) != 27910) return 0; /* bei einem port_arr checken ob es von einem der angefragten ports kommt */ int gameid; if (!(gameid = pkt_check_portarr(pkt, port_arr))) return 0; /* gameid enthaelt nun den dritten wert einer passenden port_arr zeile */ /* paketinhalt checken (packet = "good morning dave\x00") */ char mycmp1[] = "good"; if (pkt_memcmp(pkt, 0, mycmp1, strlen(mycmp1))) return 0; /* paketinhalt mit offset */ char mycmp2[] = "morning"; if (pkt_memcmp(pkt, 5, mycmp2, strlen(mycmp2))) return 0; /* suchen ob paketinhalt vorhanden ist (packet = "blablablablabla\hostport\7777\blablabla") */ char mymem[] = "\\hostport\\"; void *p p = pkt_memmem(pkt, 0, mymem, strlen(mymem)); if (!p) return 0; /* ints aus paket parsen: */ p += strlen(mymem); port2 = pkt_atoi(pkt, p); /* src ip des pakets */ printf("server found: %s\n", pkt_ntoa(pkt)); /* server zu interner liste hinzufuegen: (port1 = port, port2 = 0)*/ server_add_pkt(gameid, pkt); /* server mit zwei ports zur liste hinzufuegen: */ server_add(gameid, pkt->addr.sin_addr.s_addr, port1, port2); } /** * init() * wird direkt nach dem Ladem des Plugins aufgerufen um evtl. * Speicher, Files/Sockets zu initialisieren * Als Parameter wird der Pointer auf eine Liste von Optionen * im Configfile uebergeben, die in der Configsection des Plugins * stehen ([Section] == Pluginname) * * @param *section config section * @return false bei fehler */ static int init(struct conf_section *section) { /* config optionen holen (myfile in section [myplugin] */ char *myfile = config_get_parameter(section, "myfile"); mybigmem = malloc(1024 * 1024); } /** * init() * wird direkt vor dem Entfernen des Plugins aufgerufen um * Speicher, Files/Sockets zu schliessen * * @return false bei fehler */ static int fini() { free(mybigmem); } /** * gc() * wird periodisch aufgerufen um Plugin interne Daten aufzufrischen * als Parameter wird der plugin_timeout Wert uebergeben * * @param timeout timeout in sekunden * @return false bei fehler */ static int gc(int timeout) { } /** * plugin * Struktur mit Pointern auf die Funktionen. * MUSS "plugin" heissen, damit es von dlsym() gefunden wird! * der .name sollte dem Dateinamen entsprechen um Verwechslungen zu vermeiden */ struct hlswmaster_plugin plugin = { .name = "myplugin", .init = &init, .fini = &fini, .scan = &scan, .parse = &parse, .gc = &gc, };