/[LeafOK_CVS]/pvpgn-1.7.4/src/d2cs/handle_d2gs.c
ViewVC logotype

Annotation of /pvpgn-1.7.4/src/d2cs/handle_d2gs.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (hide annotations)
Tue Jun 6 03:41:38 2006 UTC (19 years, 9 months ago) by sysadm
Branch: MAIN
Branch point for: GNU
Content type: text/x-csrc
Initial revision

1 sysadm 1.1 /*
2     * Copyright (C) 2000,2001 Onlyer (onlyer@263.net)
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. See the
12     * GNU General Public License for more details.
13     *
14     * You should have received a copy of the GNU General Public License
15     * along with this program; if not, write to the Free Software
16     * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17     */
18     #include "common/setup_before.h"
19     #include "setup.h"
20    
21     #ifdef STDC_HEADERS
22     # include <stdlib.h>
23     #else
24     # ifdef HAVE_MALLOC_H
25     # include <malloc.h>
26     # endif
27     #endif
28     #ifdef HAVE_SYS_TYPES_H
29     # include <sys/types.h> /* needed to include netinet/in.h */
30     #endif
31     #ifdef HAVE_SYS_STAT_H
32     # include <sys/stat.h>
33     #endif
34     #ifdef HAVE_UNISTD_H
35     # include <unistd.h>
36     #endif
37     #ifdef HAVE_SYS_SOCKET_H
38     # include <sys/socket.h>
39     #endif
40     #include "compat/socket.h"
41     #ifdef HAVE_NETINET_IN_H
42     # include <netinet/in.h>
43     #endif
44     #include "compat/netinet_in.h"
45     #ifdef HAVE_ARPA_INET_H
46     # include <arpa/inet.h> /* FIXME: probably not needed... do some systems put types in here or something? */
47     #endif
48     #include "compat/psock.h"
49    
50     #include "d2gs.h"
51     #include "handle_d2gs.h"
52     #include "serverqueue.h"
53     #include "game.h"
54     #include "connection.h"
55     #include "prefs.h"
56     #include "d2cs_d2gs_protocol.h"
57     #include "common/trans.h"
58     #include "common/addr.h"
59     #include "common/eventlog.h"
60     #include "common/queue.h"
61     #include "common/bn_type.h"
62     #include "common/packet.h"
63     #include "common/xalloc.h"
64     #include "common/setup_after.h"
65    
66     DECLARE_PACKET_HANDLER(on_d2gs_authreply)
67     DECLARE_PACKET_HANDLER(on_d2gs_setgsinfo)
68     DECLARE_PACKET_HANDLER(on_d2gs_echoreply)
69     DECLARE_PACKET_HANDLER(on_d2gs_creategamereply)
70     DECLARE_PACKET_HANDLER(on_d2gs_joingamereply)
71     DECLARE_PACKET_HANDLER(on_d2gs_updategameinfo)
72     DECLARE_PACKET_HANDLER(on_d2gs_closegame)
73    
74     static t_packet_handle_table d2gs_packet_handle_table[]={
75     /* 0x00 */ { 0, conn_state_none, NULL },
76     /* 0x01 */ { 0, conn_state_none, NULL },
77     /* 0x02 */ { 0, conn_state_none, NULL },
78     /* 0x03 */ { 0, conn_state_none, NULL },
79     /* 0x04 */ { 0, conn_state_none, NULL },
80     /* 0x05 */ { 0, conn_state_none, NULL },
81     /* 0x06 */ { 0, conn_state_none, NULL },
82     /* 0x07 */ { 0, conn_state_none, NULL },
83     /* 0x08 */ { 0, conn_state_none, NULL },
84     /* 0x09 */ { 0, conn_state_none, NULL },
85     /* 0x0a */ { 0, conn_state_none, NULL },
86     /* 0x0b */ { 0, conn_state_none, NULL },
87     /* 0x0c */ { 0, conn_state_none, NULL },
88     /* 0x0d */ { 0, conn_state_none, NULL },
89     /* 0x0e */ { 0, conn_state_none, NULL },
90     /* 0x0f */ { 0, conn_state_none, NULL },
91     /* 0x10 */ { 0, conn_state_none, NULL },
92     /* FIXME: shouldn't these three be at 0x10-0x12? (But I'm pretty sure I preserved the padding) */
93     /* 0x11 */ { sizeof(t_d2gs_d2cs_authreply), conn_state_connected, on_d2gs_authreply },
94     /* 0x12 */ { sizeof(t_d2gs_d2cs_setgsinfo), conn_state_authed, on_d2gs_setgsinfo },
95     /* 0x13 */ { sizeof(t_d2gs_d2cs_echoreply), conn_state_any, on_d2gs_echoreply },
96     /* 0x14 */ { 0, conn_state_none, NULL },
97     /* 0x15 */ { 0, conn_state_none, NULL },
98     /* 0x16 */ { 0, conn_state_none, NULL },
99     /* 0x17 */ { 0, conn_state_none, NULL },
100     /* 0x18 */ { 0, conn_state_none, NULL },
101     /* 0x19 */ { 0, conn_state_none, NULL },
102     /* 0x1a */ { 0, conn_state_none, NULL },
103     /* 0x1b */ { 0, conn_state_none, NULL },
104     /* 0x1c */ { 0, conn_state_none, NULL },
105     /* 0x1d */ { 0, conn_state_none, NULL },
106     /* 0x1e */ { 0, conn_state_none, NULL },
107     /* 0x1f */ { 0, conn_state_none, NULL },
108     /* 0x20 */ { sizeof(t_d2gs_d2cs_creategamereply),conn_state_authed, on_d2gs_creategamereply },
109     /* 0x21 */ { sizeof(t_d2gs_d2cs_joingamereply), conn_state_authed, on_d2gs_joingamereply },
110     /* 0x22 */ { sizeof(t_d2gs_d2cs_updategameinfo), conn_state_authed, on_d2gs_updategameinfo },
111     /* 0x23 */ { sizeof(t_d2gs_d2cs_closegame), conn_state_authed, on_d2gs_closegame },
112     };
113    
114     static void d2gs_send_init_info(t_d2gs * gs, t_connection * c)
115     {
116     t_packet * rpacket;
117    
118     if ((rpacket=packet_create(packet_class_d2gs))) {
119     packet_set_size(rpacket,sizeof(t_d2cs_d2gs_setinitinfo));
120     packet_set_type(rpacket,D2CS_D2GS_SETINITINFO);
121     bn_int_set(&rpacket->u.d2cs_d2gs_setinitinfo.h.seqno,0);
122     bn_int_set(&rpacket->u.d2cs_d2gs_setinitinfo.time, time(NULL));
123     bn_int_set(&rpacket->u.d2cs_d2gs_setinitinfo.gs_id, d2gs_get_id(gs));
124     bn_int_set(&rpacket->u.d2cs_d2gs_setinitinfo.ac_version, 0);
125     // packet_append_string(rpacket,prefs_get_d2gs_ac_checksum());
126     packet_append_string(rpacket,"bogus_ac_checksum");
127     // packet_append_string(rpacket,prefs_get_d2gs_ac_string());
128     packet_append_string(rpacket,"bogus_ac_string");
129     conn_push_outqueue(c,rpacket);
130     packet_del_ref(rpacket);
131     }
132     return;
133     }
134    
135     static void d2gs_send_server_conffile(t_d2gs *gs, t_connection *c)
136     {
137     t_packet *rpacket;
138     FILE *fp;
139     char buff[256];
140     int rno;
141     struct stat sfile;
142    
143     /* open d2gs server config file */
144     fp = fopen(prefs_get_d2gsconffile(), "rb");
145     if (!fp) goto err;
146    
147     /* get file size */
148     if (fstat(fileno(fp),&sfile)) {
149     eventlog(eventlog_level_debug,__FUNCTION__,"failed fstat()");
150     goto err_fp;
151     }
152    
153     rpacket = packet_create(packet_class_d2cs);
154     packet_set_size(rpacket,sizeof(t_d2cs_d2gs_setconffile));
155     packet_set_type(rpacket,D2CS_D2GS_SETCONFFILE);
156     bn_int_set(&rpacket->u.d2cs_d2gs_setconffile.h.seqno,0);
157     bn_int_set(&rpacket->u.d2cs_d2gs_setconffile.size, sfile.st_size);
158     bn_int_set(&rpacket->u.d2cs_d2gs_setconffile.reserved1, time(NULL));
159    
160     while((rno = fread(buff,1,sizeof(buff),fp)) > 0) {
161     if (packet_append_data(rpacket,buff,rno) < 0) { /* file too big */
162     eventlog(eventlog_level_debug,__FUNCTION__,"conffile too big for a single packet");
163     goto err_packet;
164     }
165     }
166    
167     conn_push_outqueue(c,rpacket);
168     packet_del_ref(rpacket);
169     fclose(fp);
170    
171     return;
172    
173     err_packet:
174     packet_del_ref(rpacket);
175    
176     err_fp:
177     fclose(fp);
178    
179     err:
180     return;
181     }
182    
183     static int on_d2gs_authreply(t_connection * c, t_packet * packet)
184     {
185     t_d2gs * gs;
186     t_packet * rpacket;
187     unsigned int reply;
188     unsigned int try_checksum, checksum;
189     unsigned int version, conf_version;
190     unsigned int randnum, signlen;
191     unsigned char *sign;
192    
193     if (!(gs=d2gslist_find_gs(conn_get_d2gs_id(c)))) {
194     eventlog(eventlog_level_error,__FUNCTION__,"game server %d not found",conn_get_d2gs_id(c));
195     return -1;
196     }
197    
198     version=bn_int_get(packet->u.d2gs_d2cs_authreply.version);
199     try_checksum=bn_int_get(packet->u.d2gs_d2cs_authreply.checksum);
200     checksum=d2gs_calc_checksum(c);
201    
202     conf_version = prefs_get_d2gs_version();
203     randnum = bn_int_get(packet->u.d2gs_d2cs_authreply.randnum);
204     signlen = bn_int_get(packet->u.d2gs_d2cs_authreply.signlen);
205     sign = packet->u.d2gs_d2cs_authreply.sign;
206     if (conf_version && conf_version != version) {
207     eventlog(eventlog_level_warn,__FUNCTION__,"game server %d version mismatch 0x%X - 0x%X",conn_get_d2gs_id(c),
208     version,conf_version);
209     }
210     if (conf_version && !MAJOR_VERSION_EQUAL(version, conf_version, D2GS_MAJOR_VERSION_MASK)) {
211     eventlog(eventlog_level_error,__FUNCTION__,"game server %d major version mismatch 0x%X - 0x%X",conn_get_d2gs_id(c),
212     version,conf_version);
213     reply=D2CS_D2GS_AUTHREPLY_BAD_VERSION;
214     } else if (prefs_get_d2gs_checksum() && try_checksum != checksum) {
215     eventlog(eventlog_level_error,__FUNCTION__,"game server %d checksum mismach 0x%X - 0x%X",conn_get_d2gs_id(c),try_checksum,checksum);
216     reply=D2CS_D2GS_AUTHREPLY_BAD_CHECKSUM;
217     // } else if (license_verify_reply(c, randnum, sign, signlen)) {
218     // eventlog(eventlog_level_error,__FUNCTION__,"game server %d signal mismach", conn_get_d2gs_id(c));
219     // reply=D2CS_D2GS_AUTHREPLY_BAD_CHECKSUM;
220     } else {
221     reply=D2CS_D2GS_AUTHREPLY_SUCCEED;
222     }
223    
224     if (reply==D2CS_D2GS_AUTHREPLY_SUCCEED) {
225     eventlog(eventlog_level_info,__FUNCTION__,"game server %s authed",addr_num_to_ip_str(d2cs_conn_get_addr(c)));
226     d2cs_conn_set_state(c,conn_state_authed);
227     d2gs_send_server_conffile(gs, c);
228     d2gs_send_init_info(gs, c);
229     d2gs_active(gs,c);
230     } else {
231     eventlog(eventlog_level_error,__FUNCTION__,"game server %s failed to auth",addr_num_to_ip_str(d2cs_conn_get_addr(c)));
232     /*
233     d2cs_conn_set_state(c,conn_state_destroy);
234     */
235     }
236     if ((rpacket=packet_create(packet_class_d2gs))) {
237     packet_set_size(rpacket,sizeof(t_d2cs_d2gs_authreply));
238     packet_set_type(rpacket,D2CS_D2GS_AUTHREPLY);
239     bn_int_set(&rpacket->u.d2cs_d2gs_authreply.h.seqno,0);
240     bn_int_set(&rpacket->u.d2cs_d2gs_authreply.reply,reply);
241     conn_push_outqueue(c,rpacket);
242     packet_del_ref(rpacket);
243     }
244    
245     return 0;
246     }
247    
248     static int on_d2gs_setgsinfo(t_connection * c, t_packet * packet)
249     {
250     t_d2gs * gs;
251     t_packet * rpacket;
252     unsigned int maxgame, prev_maxgame;
253     unsigned int currgame, gameflag;
254    
255     if (!(gs=d2gslist_find_gs(conn_get_d2gs_id(c)))) {
256     eventlog(eventlog_level_error,__FUNCTION__,"game server %d not found",conn_get_d2gs_id(c));
257     return -1;
258     }
259     maxgame=bn_int_get(packet->u.d2gs_d2cs_setgsinfo.maxgame);
260     gameflag=bn_int_get(packet->u.d2gs_d2cs_setgsinfo.gameflag);
261     prev_maxgame=d2gs_get_maxgame(gs);
262     currgame = d2gs_get_gamenum(gs);
263     eventlog(eventlog_level_info, __FUNCTION__, "change game server %s max game from %d to %d (%d current)",addr_num_to_ip_str(d2cs_conn_get_addr(c)),prev_maxgame, maxgame, currgame);
264     d2gs_set_maxgame(gs,maxgame);
265    
266     if ((rpacket=packet_create(packet_class_d2gs))) {
267     packet_set_size(rpacket,sizeof(t_d2cs_d2gs_setgsinfo));
268     packet_set_type(rpacket,D2CS_D2GS_SETGSINFO);
269     bn_int_set(&rpacket->u.d2cs_d2gs_setgsinfo.h.seqno,0);
270     bn_int_set(&rpacket->u.d2cs_d2gs_setgsinfo.maxgame,maxgame);
271     bn_int_set(&rpacket->u.d2cs_d2gs_setgsinfo.gameflag,gameflag);
272     conn_push_outqueue(c,rpacket);
273     packet_del_ref(rpacket);
274     }
275    
276     gqlist_check_creategame(maxgame - currgame);
277     return 0;
278     }
279    
280     static int on_d2gs_echoreply(t_connection * c, t_packet * packet)
281     {
282     if (!c || !packet)
283     return 0;
284     return 0;
285     }
286    
287     static int on_d2gs_creategamereply(t_connection * c, t_packet * packet)
288     {
289     t_packet * opacket, * rpacket;
290     t_sq * sq;
291     t_connection * client;
292     t_game * game;
293     int result;
294     int reply;
295     int seqno;
296     t_elem * curr;
297    
298     seqno=bn_int_get(packet->u.d2cs_d2gs.h.seqno);
299     if (!(sq=sqlist_find_sq(seqno))) {
300     eventlog(eventlog_level_error,__FUNCTION__,"seqno %d not found",seqno);
301     return 0;
302     }
303     if (!(client=d2cs_connlist_find_connection_by_sessionnum(sq_get_clientid(sq)))) {
304     eventlog(eventlog_level_error,__FUNCTION__,"client %d not found",sq_get_clientid(sq));
305     sq_destroy(sq,&curr);
306     return 0;
307     }
308     if (!(game=gamelist_find_game_by_id(sq_get_gameid(sq)))) {
309     eventlog(eventlog_level_error,__FUNCTION__,"game %d not found",sq_get_gameid(sq));
310     sq_destroy(sq,&curr);
311     return 0;
312     }
313     if (!(opacket=sq_get_packet(sq))) {
314     eventlog(eventlog_level_error,__FUNCTION__,"previous packet not found (seqno: %d)",seqno);
315     sq_destroy(sq,&curr);
316     return 0;
317     }
318    
319     result=bn_int_get(packet->u.d2gs_d2cs_creategamereply.result);
320     if (result==D2GS_D2CS_CREATEGAME_SUCCEED) {
321     game_set_d2gs_gameid(game,bn_int_get(packet->u.d2gs_d2cs_creategamereply.gameid));
322     game_set_created(game,1);
323     eventlog(eventlog_level_info,__FUNCTION__,"game %s created on gs %d",d2cs_game_get_name(game),conn_get_d2gs_id(c));
324     reply=D2CS_CLIENT_CREATEGAMEREPLY_SUCCEED;
325     } else {
326     eventlog(eventlog_level_warn,__FUNCTION__,"failed to create game %s on gs %d",d2cs_game_get_name(game),conn_get_d2gs_id(c));
327     game_destroy(game,&curr);
328     reply=D2CS_CLIENT_CREATEGAMEREPLY_FAILED;
329     }
330    
331     if ((rpacket=packet_create(packet_class_d2cs))) {
332     packet_set_size(rpacket,sizeof(t_d2cs_client_creategamereply));
333     packet_set_type(rpacket,D2CS_CLIENT_CREATEGAMEREPLY);
334     bn_short_set(&rpacket->u.d2cs_client_creategamereply.seqno,
335     bn_short_get(opacket->u.client_d2cs_creategamereq.seqno));
336     bn_short_set(&rpacket->u.d2cs_client_creategamereply.gameid,1);
337     bn_short_set(&rpacket->u.d2cs_client_creategamereply.u1,1);
338     bn_int_set(&rpacket->u.d2cs_client_creategamereply.reply,reply);
339     conn_push_outqueue(client,rpacket);
340     packet_del_ref(rpacket);
341     }
342     sq_destroy(sq,&curr);
343     return 0;
344     }
345    
346     static int on_d2gs_joingamereply(t_connection * c, t_packet * packet)
347     {
348     t_sq * sq;
349     t_d2gs * gs;
350     t_connection * client;
351     t_game * game;
352     t_packet * opacket, * rpacket;
353     int result;
354     int reply;
355     int seqno;
356     unsigned int gsaddr;
357     t_elem * curr;
358     unsigned short gsport;
359    
360    
361     seqno=bn_int_get(packet->u.d2cs_d2gs.h.seqno);
362     if (!(sq=sqlist_find_sq(seqno))) {
363     eventlog(eventlog_level_error,__FUNCTION__,"seqno %d not found",seqno);
364     return 0;
365     }
366     if (!(client=d2cs_connlist_find_connection_by_sessionnum(sq_get_clientid(sq)))) {
367     eventlog(eventlog_level_error,__FUNCTION__,"client %d not found",sq_get_clientid(sq));
368     sq_destroy(sq,&curr);
369     return 0;
370     }
371     if (!(game=gamelist_find_game_by_id(sq_get_gameid(sq)))) {
372     eventlog(eventlog_level_error,__FUNCTION__,"game %d not found",sq_get_gameid(sq));
373     sq_destroy(sq,&curr);
374     return 0;
375     }
376     if (!(gs=game_get_d2gs(game))) {
377     eventlog(eventlog_level_error,__FUNCTION__,"try join game without game server set");
378     sq_destroy(sq,&curr);
379     return 0;
380     }
381     if (!(opacket=sq_get_packet(sq))) {
382     eventlog(eventlog_level_error,__FUNCTION__,"previous packet not found (seqno: %d)",seqno);
383     sq_destroy(sq,&curr);
384     return 0;
385     }
386    
387     result=bn_int_get(packet->u.d2gs_d2cs_joingamereply.result);
388     switch (result) {
389     case D2GS_D2CS_JOINGAME_SUCCEED:
390     eventlog(eventlog_level_info,__FUNCTION__,"added %s to game %s on gs %d",d2cs_conn_get_charname(client),
391     d2cs_game_get_name(game),conn_get_d2gs_id(c));
392     reply=D2CS_CLIENT_JOINGAMEREPLY_SUCCEED;
393     break;
394    
395     case D2GS_D2CS_JOINGAME_GAME_FULL:
396     eventlog(eventlog_level_info,__FUNCTION__,"failed to add %s to game %s on gs %d (game full)",d2cs_conn_get_charname(client),
397     d2cs_game_get_name(game),conn_get_d2gs_id(c));
398     reply=D2CS_CLIENT_JOINGAMEREPLY_GAME_FULL;
399     break;
400     default:
401     eventlog(eventlog_level_info,__FUNCTION__,"failed to add %s to game %s on gs %d",d2cs_conn_get_charname(client),
402     d2cs_game_get_name(game),conn_get_d2gs_id(c));
403     reply=D2CS_CLIENT_JOINGAMEREPLY_FAILED;
404     }
405    
406     if ((rpacket=packet_create(packet_class_d2cs))) {
407     packet_set_size(rpacket,sizeof(t_d2cs_client_joingamereply));
408     packet_set_type(rpacket,D2CS_CLIENT_JOINGAMEREPLY);
409     bn_short_set(&rpacket->u.d2cs_client_joingamereply.seqno,
410     bn_short_get(opacket->u.client_d2cs_joingamereq.seqno));
411     /* specific flag for anti-cheating support */
412     /*
413     bn_short_set(&rpacket->u.d2cs_client_joingamereply.gameid,(unsigned short)game_get_d2gs_gameid(game)|0x8000);
414     */
415     bn_short_set(&rpacket->u.d2cs_client_joingamereply.gameid,(unsigned short)game_get_d2gs_gameid(game));
416    
417     bn_short_set(&rpacket->u.d2cs_client_joingamereply.u1,0);
418     bn_int_set(&rpacket->u.d2cs_client_joingamereply.reply,reply);
419     // if (reply == SERVER_JOINGAMEREPLY2_REPLY_OK) {
420     if (reply == D2CS_CLIENT_JOINGAMEREPLY_SUCCEED) {
421     bn_int_set(&rpacket->u.d2cs_client_joingamereply.token,sq_get_gametoken(sq));
422    
423     gsaddr = d2gs_get_ip(gs);
424     gsport = 4000;
425     trans_net(d2cs_conn_get_addr(client), &gsaddr, &gsport);
426    
427     if(d2gs_get_ip(gs)!=gsaddr)
428     {
429     eventlog(eventlog_level_info,__FUNCTION__,"translated gameserver %s -> %s",addr_num_to_ip_str(d2gs_get_ip(gs)),addr_num_to_ip_str(gsaddr));
430     } else {
431     eventlog(eventlog_level_info,__FUNCTION__,"no translation required for gamserver %s",addr_num_to_ip_str(gsaddr));
432     }
433    
434     bn_int_nset(&rpacket->u.d2cs_client_joingamereply.addr,gsaddr);
435    
436     } else {
437     bn_int_set(&rpacket->u.d2cs_client_joingamereply.token,0);
438     bn_int_set(&rpacket->u.d2cs_client_joingamereply.addr,0);
439     }
440     conn_push_outqueue(client,rpacket);
441     packet_del_ref(rpacket);
442     }
443     sq_destroy(sq,&curr);
444     return 0;
445     }
446    
447     static int on_d2gs_updategameinfo(t_connection * c, t_packet * packet)
448     {
449     unsigned int flag;
450     char const * charname;
451     t_game * game;
452     unsigned int charclass;
453     unsigned int charlevel;
454     unsigned int d2gs_gameid;
455     unsigned int d2gs_id;
456    
457     if (!(charname=packet_get_str_const(packet,sizeof(t_d2gs_d2cs_updategameinfo),MAX_CHARNAME_LEN))) {
458     eventlog(eventlog_level_error,__FUNCTION__,"got bad charname");
459     return 0;
460     }
461     d2gs_id=conn_get_d2gs_id(c);
462     d2gs_gameid=bn_int_get(packet->u.d2gs_d2cs_updategameinfo.gameid);
463     charclass=bn_int_get(packet->u.d2gs_d2cs_updategameinfo.charclass);
464     charlevel=bn_int_get(packet->u.d2gs_d2cs_updategameinfo.charlevel);
465     flag=bn_int_get(packet->u.d2gs_d2cs_updategameinfo.flag);
466     if (!(game=gamelist_find_game_by_d2gs_and_id(d2gs_id,d2gs_gameid))) {
467     eventlog(eventlog_level_error,__FUNCTION__,"game %d not found on gs %d",d2gs_gameid,d2gs_id);
468     return -1;
469     }
470     if (flag==D2GS_D2CS_UPDATEGAMEINFO_FLAG_ENTER) {
471     game_add_character(game,charname,charclass,charlevel);
472     } else if (flag==D2GS_D2CS_UPDATEGAMEINFO_FLAG_LEAVE) {
473     game_del_character(game,charname);
474     } else if (flag==D2GS_D2CS_UPDATEGAMEINFO_FLAG_UPDATE) {
475     game_add_character(game,charname,charclass,charlevel);
476     } else {
477     eventlog(eventlog_level_error,__FUNCTION__,"got bad updategameinfo flag %d",flag);
478     }
479     return 0;
480     }
481    
482     static int on_d2gs_closegame(t_connection * c, t_packet * packet)
483     {
484     t_game * game;
485     t_elem * curr;
486    
487     if (!(game=gamelist_find_game_by_d2gs_and_id(conn_get_d2gs_id(c),
488     bn_int_get(packet->u.d2gs_d2cs_closegame.gameid)))) {
489     return 0;
490     }
491     game_destroy(game, &curr);
492     return 0;
493     }
494    
495     extern int handle_d2gs_packet(t_connection * c, t_packet * packet)
496     {
497     conn_process_packet(c,packet,d2gs_packet_handle_table,NELEMS(d2gs_packet_handle_table));
498     return 0;
499     }
500    
501     extern int handle_d2gs_init(t_connection * c)
502     {
503     t_packet * packet;
504    
505     if ((packet=packet_create(packet_class_d2gs))) {
506     packet_set_size(packet,sizeof(t_d2cs_d2gs_authreq));
507     packet_set_type(packet,D2CS_D2GS_AUTHREQ);
508     bn_int_set(&packet->u.d2cs_d2gs_authreq.h.seqno,0);
509     bn_int_set(&packet->u.d2cs_d2gs_authreq.sessionnum,d2cs_conn_get_sessionnum(c));
510     bn_int_set(&packet->u.d2cs_d2gs_authreq.signlen, 0);
511     packet_append_string(packet,prefs_get_realmname());
512     // packet_append_data(packet, sign, signlen);
513     conn_push_outqueue(c,packet);
514     packet_del_ref(packet);
515     }
516     eventlog(eventlog_level_info,__FUNCTION__,"sent init packet to d2gs %d (sessionnum=%d)",conn_get_d2gs_id(c),d2cs_conn_get_sessionnum(c));
517     return 0;
518     }

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1