Version 0.30
This commit is contained in:
parent
4b4a216a31
commit
6f6760f9d8
23
Makefile
23
Makefile
|
@ -1,29 +1,24 @@
|
|||
# Toplevel Makefile
|
||||
|
||||
MASTER_SRC := src/client.c src/daemon.c src/logging.c src/main.c src/plugin.c src/plugin_helper.c src/scanner.c src/serverlist.c
|
||||
PLUGIN_SRC := plugins/quake3.c
|
||||
|
||||
CFLAGS := -Wall -I. -I./include -g -fPIC
|
||||
|
||||
DEPFILES := $(PLUGIN_SRC:%.c=%.d) $(MASTER_SRC:%.c=%.d)
|
||||
PLUGIN_SRC := plugins/hlswproxy.c plugins/quake3.c
|
||||
|
||||
CFLAGS := -Wall -I. -I./include -g
|
||||
# ############################
|
||||
|
||||
all: $(DEPFILES) $(PLUGIN_SRC:%.c=%.so) src/hlswmaster
|
||||
all: $(PLUGIN_SRC:%.c=%.so) src/hlswmaster
|
||||
|
||||
src/hlswmaster: $(MASTER_SRC:%.c=%.o)
|
||||
gcc -ldl -lpthread -rdynamic $^ -o $@
|
||||
|
||||
%.d: %.c
|
||||
@-$(CC) -M -MG $(CFLAGS) $< > $@
|
||||
|
||||
%.o: %.c %.d
|
||||
%.o: %.c
|
||||
$(CC) $(CFLAGS) -o $@ -c $<
|
||||
|
||||
%.so: %.o
|
||||
%_sh.o: %.c
|
||||
$(CC) $(CFLAGS) -fPIC -o $@ -c $<
|
||||
|
||||
%.so: %_sh.o
|
||||
$(LD) -shared -o $@ $<
|
||||
|
||||
clean:
|
||||
rm -rf src/hlswmaster src/*.o plugins/*.so plugins/*.o $(DEPFILES)
|
||||
|
||||
-include $(DEPFILES)
|
||||
rm -rf src/hlswmaster src/*.o plugins/*.so plugins/*.o
|
|
@ -5,16 +5,15 @@
|
|||
#include "netpkt.h"
|
||||
|
||||
struct game_server {
|
||||
/* must be first */
|
||||
struct list_head list;
|
||||
unsigned long modtime;
|
||||
|
||||
u_int16_t gameid;
|
||||
u_int32_t ip;
|
||||
u_int16_t port1;
|
||||
u_int16_t port2;
|
||||
|
||||
unsigned long modtime;
|
||||
};
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* daemon.c */
|
||||
void daemonize(char *pw_name);
|
||||
|
|
|
@ -8,13 +8,11 @@
|
|||
#include "list.h"
|
||||
|
||||
struct net_pkt {
|
||||
/* must be first */
|
||||
struct list_head list;
|
||||
|
||||
struct sockaddr_in addr;
|
||||
unsigned int size;
|
||||
unsigned char buf[0];
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
#include "netpkt.h"
|
||||
#include "list.h"
|
||||
|
||||
extern int server_add(unsigned int gameid, struct in_addr *ip, u_int16_t port1, u_int16_t port2);
|
||||
extern int server_add(u_int16_t gameid, u_int32_t ip, u_int16_t port1, u_int16_t port2);
|
||||
|
||||
struct scan_ports {
|
||||
unsigned short portlo;
|
||||
|
@ -17,9 +17,13 @@ extern int pkt_send_portarr(struct in_addr *dstip, struct scan_ports *portarr, c
|
|||
|
||||
extern int pkt_check_portarr(struct net_pkt *pkt, struct scan_ports *portarr);
|
||||
extern int pkt_memcmp(struct net_pkt *pkt, unsigned int offset, char *search, unsigned int size);
|
||||
extern void * pkt_memmem(struct net_pkt *pkt, unsigned int offset, char *search, unsigned int size);
|
||||
|
||||
extern int server_add_pkt(unsigned int gameid, struct net_pkt *pkt);
|
||||
|
||||
extern char * pkt_ntoa(struct net_pkt *pkt);
|
||||
extern unsigned short pkt_getport(struct net_pkt *pkt);
|
||||
|
||||
struct hlswmaster_plugin {
|
||||
/* must be first */
|
||||
struct list_head list;
|
||||
|
|
|
@ -0,0 +1,64 @@
|
|||
/***************************************************************************
|
||||
* 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 <string.h>
|
||||
#include <stdio.h>
|
||||
#include "plugin.h"
|
||||
|
||||
static char scanmsg[] = "\xff\xff\xff\xffHLSWLANSEARCH";
|
||||
|
||||
struct _entry {
|
||||
u_int16_t gameid;
|
||||
u_int32_t ip;
|
||||
u_int16_t port1;
|
||||
u_int16_t port2;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
int scan(void) {
|
||||
pkt_send(NULL, 7140, scanmsg, sizeof(scanmsg));
|
||||
return 1;
|
||||
}
|
||||
|
||||
int parse(struct net_pkt *pkt) {
|
||||
struct _entry *server;
|
||||
if (pkt_getport(pkt) != 7140)
|
||||
return 0;
|
||||
|
||||
server = (void *)pkt->buf + sizeof(scanmsg);
|
||||
|
||||
while ((void *)server < ((void *)pkt->buf + pkt->size)) {
|
||||
server_add(server->gameid, server->ip, server->port1, server->port2);
|
||||
server++;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static struct hlswmaster_plugin hlswproxy_plugin = {
|
||||
.name = "hlswproxy",
|
||||
.scan = &scan,
|
||||
.parse = &parse,
|
||||
};
|
||||
|
||||
void _init(void) {
|
||||
register_plugin(&hlswproxy_plugin);
|
||||
}
|
||||
|
||||
void _fini(void) {
|
||||
unregister_plugin(&hlswproxy_plugin);
|
||||
}
|
|
@ -21,11 +21,8 @@
|
|||
#include "plugin.h"
|
||||
|
||||
struct scan_ports port_arr[] = {
|
||||
{ 20099, 20110, 13 }, /* Soldier of Fortune 2 */
|
||||
{ 27960, 27963, 6 }, /* Q3, Elite Force, RtCW, ET, CoD */
|
||||
{ 28069, 28080, 12 }, /* Jedi Knight 2 */
|
||||
{ 29069, 29080, 27 }, /* Jedi Knight 3 */
|
||||
{ 29252, 29263, 26 }, /* Elite Force 2 */
|
||||
{ 27960, 27963, 6 }, /* Quake3 (razzor) */
|
||||
{ 28960, 28964, 31 }, /* Call of Duty (ove) */
|
||||
{ 0,0,0 }
|
||||
};
|
||||
|
||||
|
|
35
src/client.c
35
src/client.c
|
@ -33,7 +33,8 @@
|
|||
|
||||
#define HLSW_HEADER "\xFF\xFF\xFF\xFFHLSWLANSEARCH\x00"
|
||||
#define HLSW_HEADER_LEN 0x12
|
||||
#define MAX_PKT_LEN (HLSW_HEADER_LEN + 1400)
|
||||
#define HLSW_ENTRY_LEN 10
|
||||
#define MAX_PKT_LEN (HLSW_HEADER_LEN + HLSW_ENTRY_LEN * 140)
|
||||
|
||||
struct client_pkt {
|
||||
struct list_head list;
|
||||
|
@ -56,7 +57,7 @@ static pthread_mutex_t pkt_list_lock = PTHREAD_MUTEX_INITIALIZER;
|
|||
* @param void *b
|
||||
* @return true wenn das paket noch nicht voll ist
|
||||
*/
|
||||
static inline int pkt_not_full(const struct client_pkt *a, void *b) {
|
||||
static inline int cpkt_not_full(const struct client_pkt *a, void *b) {
|
||||
return (a->size < MAX_PKT_LEN);
|
||||
}
|
||||
|
||||
|
@ -76,8 +77,9 @@ static struct client_pkt * client_pkt_add_real(struct list_head *list) {
|
|||
|
||||
INIT_LIST_HEAD(&new->list);
|
||||
|
||||
new->size = HLSW_HEADER_LEN;
|
||||
/* kopier den hlsw header in das client paket */
|
||||
memcpy(new->buf, HLSW_HEADER, HLSW_HEADER_LEN);
|
||||
new->size = HLSW_HEADER_LEN;
|
||||
|
||||
list_add_tail(&new->list, list);
|
||||
return new;
|
||||
|
@ -90,33 +92,18 @@ static struct client_pkt * client_pkt_add_real(struct list_head *list) {
|
|||
*
|
||||
* @param struct game_server *server
|
||||
* @return false bei fehler (malloc)
|
||||
*
|
||||
* TODO: memcpy() durch pointer ops ersetzen?
|
||||
*/
|
||||
int client_pkt_add(struct game_server *server) {
|
||||
struct client_pkt *pkt;
|
||||
struct client_pkt *cpkt;
|
||||
|
||||
char *src, *dst;
|
||||
|
||||
pkt = LIST_FIND(&client_pkt_prepare, pkt_not_full, struct client_pkt *, NULL);
|
||||
if (!pkt && !(pkt = client_pkt_add_real(&client_pkt_prepare)))
|
||||
cpkt = LIST_FIND(&client_pkt_prepare, cpkt_not_full, struct client_pkt *, NULL);
|
||||
if (!cpkt && !(cpkt = client_pkt_add_real(&client_pkt_prepare)))
|
||||
return 0;
|
||||
|
||||
dst = (char *)&pkt->buf + pkt->size;
|
||||
/* kopiert den server eintrag in das client paket */
|
||||
memcpy((void *)&cpkt->buf + cpkt->size, &server->gameid, HLSW_ENTRY_LEN);
|
||||
cpkt->size += HLSW_ENTRY_LEN;
|
||||
|
||||
src = (char *)&server->gameid;
|
||||
memcpy(dst, src, 2);
|
||||
|
||||
src = (char *)&server->ip;
|
||||
memcpy(dst +2, src, 4);
|
||||
|
||||
src = (char *)&server->port1;
|
||||
memcpy(dst +6, src, 4);
|
||||
|
||||
src = (char *)&server->port2;
|
||||
memcpy(dst +8, src, 4);
|
||||
|
||||
pkt->size += 10;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
12
src/main.c
12
src/main.c
|
@ -79,15 +79,15 @@ int main(int argc, char *argv[]) {
|
|||
|
||||
|
||||
plugin_load("plugins/quake3.so");
|
||||
plugin_load("plugins/hlswproxy.so");
|
||||
|
||||
scan_init();
|
||||
|
||||
scan_transmit();
|
||||
// pthread_create(&thread1, NULL, (void *)&scan_transmit, NULL);
|
||||
// pthread_create(&thread2, NULL, (void *)&scan_receive, NULL);
|
||||
// pthread_create(&thread3, NULL, (void *)&server_collector, NULL);
|
||||
// pthread_create(&thread4, NULL, (void *)&client_handler, NULL);
|
||||
|
||||
// scan_transmit();
|
||||
pthread_create(&thread1, NULL, (void *)&scan_transmit, NULL);
|
||||
pthread_create(&thread2, NULL, (void *)&scan_receive, NULL);
|
||||
pthread_create(&thread3, NULL, (void *)&server_collector, NULL);
|
||||
pthread_create(&thread4, NULL, (void *)&client_handler, NULL);
|
||||
|
||||
sleep(9999);
|
||||
|
||||
|
|
|
@ -111,6 +111,8 @@ int plugins_parse(struct net_pkt *pkt) {
|
|||
*
|
||||
* @param unsigned long timeout
|
||||
* @return true
|
||||
*
|
||||
* TODO: wird noch nicht benutzt
|
||||
*/
|
||||
int plugins_gc(unsigned long timeout) {
|
||||
struct hlswmaster_plugin *plugin;
|
||||
|
@ -133,7 +135,7 @@ int plugins_gc(unsigned long timeout) {
|
|||
void register_plugin(struct hlswmaster_plugin *me) {
|
||||
if (!me->init || (me->init(NULL))) {
|
||||
pthread_mutex_lock(&plugin_lock);
|
||||
list_add((struct list_head *)me, &plugin_list);
|
||||
list_add_tail((struct list_head *)me, &plugin_list);
|
||||
pthread_mutex_unlock(&plugin_lock);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,7 +20,10 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define __USE_GNU
|
||||
#include <string.h>
|
||||
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/ip.h>
|
||||
|
@ -80,7 +83,6 @@ int pkt_send_portarr(struct in_addr *dstip, struct scan_ports *portarr, char *bu
|
|||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* pkt_check_portarr()
|
||||
* prueft ob der src-port des pakets in der portliste vorhanden ist
|
||||
|
@ -119,7 +121,24 @@ int pkt_memcmp(struct net_pkt *pkt, unsigned int offset, char *search, unsigned
|
|||
if (offset + size >= pkt->size)
|
||||
size = pkt->size - offset;
|
||||
|
||||
return memcmp(pkt->buf, search, size);
|
||||
return memcmp(pkt->buf + offset, search, size);
|
||||
}
|
||||
|
||||
/**
|
||||
* pkt_memmem()
|
||||
* sucht einen Speicherbereich in dem Paket
|
||||
*
|
||||
* @param struct net_pkt *pkt
|
||||
* @param unsigned int offset
|
||||
* @param char *search
|
||||
* @param unsigned int size
|
||||
* @return pointer auf den string im Paket
|
||||
*/
|
||||
void * pkt_memmem(struct net_pkt *pkt, unsigned int offset, char *search, unsigned int size) {
|
||||
if (offset >= pkt->size)
|
||||
return NULL;
|
||||
|
||||
return memmem(pkt->buf + offset, pkt->size, search, size);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -131,6 +150,27 @@ int pkt_memcmp(struct net_pkt *pkt, unsigned int offset, char *search, unsigned
|
|||
* @return false bei fehler
|
||||
*/
|
||||
int server_add_pkt(unsigned int gameid, struct net_pkt *pkt) {
|
||||
return server_add(gameid, &pkt->addr.sin_addr, pkt->addr.sin_port, 0);
|
||||
return server_add(gameid, pkt->addr.sin_addr.s_addr, ntohs(pkt->addr.sin_port), 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* pkt_ntoa()
|
||||
* gibt die IP des Pakets als String zurueck
|
||||
*
|
||||
* @param struct net_pkt *pkt
|
||||
* @return pointer auf String
|
||||
*/
|
||||
char * pkt_ntoa(struct net_pkt *pkt) {
|
||||
return inet_ntoa(pkt->addr.sin_addr);
|
||||
}
|
||||
|
||||
/**
|
||||
* pkt_getport()
|
||||
* gibt den Port des Pakets als short zurueck
|
||||
*
|
||||
* @param struct net_pkt *pkt
|
||||
* @return portnr
|
||||
*/
|
||||
unsigned short pkt_getport(struct net_pkt *pkt) {
|
||||
return ntohs(pkt->addr.sin_port);
|
||||
}
|
||||
|
|
|
@ -112,7 +112,7 @@ void scan_receive(void) {
|
|||
* initialisiert den socket fuer den server scan
|
||||
* @return false on error
|
||||
*
|
||||
* TODO: src ip/port als parameter (config-file?)
|
||||
* TODO: src ip als parameter (config-file?)
|
||||
*/
|
||||
int scan_init() {
|
||||
struct sockaddr_in dst;
|
||||
|
|
|
@ -62,13 +62,13 @@ static inline int server_cmp(const struct game_server *a, struct game_server *b)
|
|||
* @param u_int16_t port2
|
||||
* @return false bei fehler
|
||||
*/
|
||||
int server_add(unsigned int gameid, struct in_addr *ip, u_int16_t port1, u_int16_t port2) {
|
||||
int server_add(u_int16_t gameid, u_int32_t ip, u_int16_t port1, u_int16_t port2) {
|
||||
struct game_server server, *nserver;
|
||||
|
||||
server.gameid = gameid;
|
||||
server.ip = ip->s_addr;
|
||||
server.port1 = ntohs(port1);
|
||||
server.port2 = ntohs(port2);
|
||||
server.ip = ip;
|
||||
server.port1 = port1;
|
||||
server.port2 = port2;
|
||||
|
||||
pthread_mutex_lock(&server_list_lock);
|
||||
|
||||
|
@ -117,6 +117,7 @@ void server_collector(void) {
|
|||
client_pkt_add(server);
|
||||
}
|
||||
pthread_mutex_unlock(&server_list_lock);
|
||||
|
||||
client_pkt_commit();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue