bnstat.c
上传用户:tany51
上传日期:2013-06-12
资源大小:1397k
文件大小:38k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*
  2.  * Copyright (C) 1998,1999,2000  Ross Combs (rocombs@cs.nmsu.edu)
  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 <stdio.h>
  20. #ifdef HAVE_STDDEF_H
  21. # include <stddef.h>
  22. #else
  23. # ifndef NULL
  24. #  define NULL ((void *)0)
  25. # endif
  26. #endif
  27. #ifdef STDC_HEADERS
  28. # include <stdlib.h>
  29. #endif
  30. #include "compat/exitstatus.h"
  31. #ifdef HAVE_STRING_H
  32. # include <string.h>
  33. #else
  34. # ifdef HAVE_STRINGS_H
  35. #  include <strings.h>
  36. # endif
  37. #endif
  38. #ifdef HAVE_MEMORY_H
  39. # include <memory.h>
  40. #endif
  41. #include "compat/memset.h"
  42. #include "compat/memcpy.h"
  43. #include <ctype.h>
  44. #include <errno.h>
  45. #include "compat/strerror.h"
  46. #ifdef TIME_WITH_SYS_TIME
  47. # include <sys/time.h>
  48. # include <time.h>
  49. #else
  50. # ifdef HAVE_SYS_TIME_H
  51. #  include <sys/time.h>
  52. # else
  53. #  include <time.h>
  54. # endif
  55. #endif
  56. #include "compat/strftime.h"
  57. #ifdef HAVE_UNISTD_H
  58. # include <unistd.h>
  59. #endif
  60. #ifdef HAVE_TERMIOS_H
  61. # include <termios.h>
  62. #endif
  63. #include "compat/termios.h"
  64. #ifdef HAVE_SYS_TYPES_H
  65. # include <sys/types.h>
  66. #endif
  67. #ifdef HAVE_SYS_SOCKET_H
  68. # include <sys/socket.h>
  69. #endif
  70. #include "compat/socket.h"
  71. #include "compat/recv.h"
  72. #include "compat/send.h"
  73. #ifdef HAVE_SYS_PARAM_H
  74. # include <sys/param.h>
  75. #endif
  76. #ifdef HAVE_NETINET_IN_H
  77. # include <netinet/in.h>
  78. #endif
  79. #include "compat/netinet_in.h"
  80. #ifdef HAVE_ARPA_INET_H
  81. # include <arpa/inet.h>
  82. #endif
  83. #include "compat/inet_ntoa.h"
  84. #include "compat/psock.h"
  85. #include "common/packet.h"
  86. #include "common/init_protocol.h"
  87. #include "common/udp_protocol.h"
  88. #include "common/bnet_protocol.h"
  89. #include "common/tag.h"
  90. #include "common/bn_type.h"
  91. #include "common/field_sizes.h"
  92. #include "common/network.h"
  93. #include "common/version.h"
  94. #include "common/util.h"
  95. #ifdef CLIENTDEBUG
  96. # include "common/eventlog.h"
  97. #endif
  98. #include "common/bnettime.h"
  99. #include "client.h"
  100. #include "udptest.h"
  101. #include "client_connect.h"
  102. #include "common/setup_after.h"
  103. #ifdef CLIENTDEBUG
  104. # define dprintf printf
  105. #else
  106. # define dprintf if (0) printf
  107. #endif
  108. static char const * bnclass_get_str(unsigned int class); /* FIXME: this is also in command.c */
  109. static void usage(char const * progname);
  110. static char const * bnclass_get_str(unsigned int class)
  111. {
  112.     switch (class)
  113.     {
  114.     case PLAYERINFO_DRTL_CLASS_WARRIOR:
  115. return "warrior";
  116.     case PLAYERINFO_DRTL_CLASS_ROGUE:
  117. return "rogue";
  118.     case PLAYERINFO_DRTL_CLASS_SORCERER:
  119. return "sorcerer";
  120.     default:
  121. return "unknown";
  122.     }
  123. }
  124. static void usage(char const * progname)
  125. {
  126.     fprintf(stderr,"usage: %s [<options>] [<servername> [<TCP portnumber>]]n",progname);
  127.     fprintf(stderr,
  128.     "    -b, --client=SEXP           report client as Brood Warsn"
  129.             "    -d, --client=DRTL           report client as Diablo Retailn"
  130.             "    --client=DSHR               report client as Diablo Sharewaren"
  131.             "    -s, --client=STAR           report client as Starcraft (default)n");
  132.     fprintf(stderr,
  133.             "    --client=SSHR               report client as Starcraft Sharewaren"
  134.     "    -w, --client=W2BN           report client as Warcraft II BNEn"
  135.             "    --client=D2DV               report client as Diablo IIn"
  136.             "    --client=D2XP               report client as Diablo II: LoDn"
  137.             "    --client=WAR3               report client as Warcraft IIIn");
  138.     fprintf(stderr,
  139.     "    -o NAME, --owner=NAME       report CD owner as NAMEn"
  140.     "    -k KEY, --cdkey=KEY         report CD key as KEYn"
  141.     "    -p PLR, --player=PLR        print stats for player PLRn"
  142.     "    --bnetd                     also print BNETD-specific statsn"
  143.     "    --fsgs                      also print FSGS-specific statsn"
  144.             "    -h, --help, --usage         show this information and exitn"
  145.             "    -v, --version               print version number and exitn");
  146.     exit(STATUS_FAILURE);
  147. }
  148. extern int main(int argc, char * argv[])
  149. {
  150.     int                a;
  151.     int                sd;
  152.     int                gotplayer=0;
  153.     struct sockaddr_in saddr;
  154.     t_packet *         packet;
  155.     t_packet *         rpacket;
  156.     char const *       cdowner=NULL;
  157.     char const *       cdkey=NULL;
  158.     char const *       clienttag=NULL;
  159.     char const *       servname=NULL;
  160.     unsigned short     servport=0;
  161.     char               text[MAX_MESSAGE_LEN]="";
  162.     unsigned int       commpos;
  163.     struct termios     in_attr_old;
  164.     struct termios     in_attr_new;
  165.     int                changed_in;
  166.     unsigned int       count;
  167.     unsigned int       sessionkey;
  168.     unsigned int       sessionnum;
  169.     unsigned int       val;
  170.     int                fd_stdin=0;
  171.     int                use_bnetd=0;
  172.     int                use_fsgs=0;
  173.     unsigned int       screen_width,screen_height;
  174.     int                munged=0;
  175.     
  176.     if (argc<1 || !argv || !argv[0])
  177.     {
  178. fprintf(stderr,"bad argumentsn");
  179. return STATUS_FAILURE;
  180.     }
  181.     
  182.     for (a=1; a<argc; a++)
  183. if (servname && isdigit((int)argv[a][0]) && a+1>=argc)
  184. {
  185.             if (str_to_ushort(argv[a],&servport)<0)
  186.             {
  187.                 fprintf(stderr,"%s: "%s" should be a positive integern",argv[0],argv[a]);
  188.                 usage(argv[0]);
  189.             }
  190. }
  191. else if (!servname && argv[a][0]!='-' && a+2>=argc)
  192.     servname = argv[a];
  193.         else if (strcmp(argv[a],"-b")==0 || strcmp(argv[a],"--client=SEXP")==0)
  194. {
  195.     if (clienttag)
  196.     {
  197. fprintf(stderr,"%s: client type was already specified as "%s"n",argv[0],clienttag);
  198. usage(argv[0]);
  199.     }
  200.     clienttag = CLIENTTAG_BROODWARS;
  201. }
  202.         else if (strcmp(argv[a],"-d")==0 || strcmp(argv[a],"--client=DRTL")==0)
  203. {
  204.     if (clienttag)
  205.     {
  206. fprintf(stderr,"%s: client type was already specified as "%s"n",argv[0],clienttag);
  207. usage(argv[0]);
  208.     }
  209.     clienttag = CLIENTTAG_DIABLORTL;
  210. }
  211.         else if (strcmp(argv[a],"--client=DSHR")==0)
  212. {
  213.     if (clienttag)
  214.     {
  215. fprintf(stderr,"%s: client type was already specified as "%s"n",argv[0],clienttag);
  216. usage(argv[0]);
  217.     }
  218.     clienttag = CLIENTTAG_DIABLOSHR;
  219. }
  220.         else if (strcmp(argv[a],"-s")==0 || strcmp(argv[a],"--client=STAR")==0)
  221. {
  222.     if (clienttag)
  223.     {
  224. fprintf(stderr,"%s: client type was already specified as "%s"n",argv[0],clienttag);
  225. usage(argv[0]);
  226.     }
  227.     clienttag = CLIENTTAG_STARCRAFT;
  228. }
  229.         else if (strcmp(argv[a],"--client=SSHR")==0)
  230. {
  231.     if (clienttag)
  232.     {
  233. fprintf(stderr,"%s: client type was already specified as "%s"n",argv[0],clienttag);
  234. usage(argv[0]);
  235.     }
  236.     clienttag = CLIENTTAG_SHAREWARE;
  237. }
  238. else if (strcmp(argv[a],"-w")==0 || strcmp(argv[a],"--client=W2BN")==0)
  239. {
  240.             if (clienttag)
  241.             {
  242.                 fprintf(stderr,"%s: client type was already specified as "%s"n",argv[0],clienttag);
  243.                 usage(argv[0]);
  244.             }
  245.             clienttag = CLIENTTAG_WARCIIBNE;
  246. }
  247.         else if (strcmp(argv[a],"--client=D2DV")==0)
  248.         {
  249.             if (clienttag)
  250.             {
  251.                 fprintf(stderr,"%s: client type was already specified as "%s"n",argv[0],clienttag
  252. );
  253.                 usage(argv[0]);
  254.             }
  255.             clienttag = CLIENTTAG_DIABLO2DV;
  256.         }
  257.         else if (strcmp(argv[a],"--client=D2XP")==0)
  258.         {
  259.             if (clienttag)
  260.             {
  261.                 fprintf(stderr,"%s: client type was already specified as "%s"n",argv[0],clienttag
  262. );
  263.                 usage(argv[0]);
  264.             }
  265.             clienttag = CLIENTTAG_DIABLO2XP;
  266.         }
  267.         else if (strcmp(argv[a],"--client=WAR3")==0)
  268.         {
  269.             if (clienttag)
  270.             {
  271.                 fprintf(stderr,"%s: client type was already specified as "%s"n",argv[0],clienttag
  272. );
  273.                 usage(argv[0]);
  274.             }
  275.             clienttag = CLIENTTAG_WARCRAFT3;
  276.         }
  277. else if (strncmp(argv[a],"--client=",9)==0)
  278. {
  279.     fprintf(stderr,"%s: unknown client tag "%s"n",argv[0],&argv[a][9]);
  280.     usage(argv[0]);
  281. }
  282.         else if (strcmp(argv[a],"-o")==0)
  283.         {
  284.             if (a+1>=argc)
  285.             {
  286.                 fprintf(stderr,"%s: option "%s" requires an argumentn",argv[0],argv[a]);
  287.                 usage(argv[0]);
  288.             }
  289.             if (cdowner)
  290.             {
  291.                 fprintf(stderr,"%s: CD owner was already specified as "%s"n",argv[0],cdowner);
  292.                 usage(argv[0]);
  293.             }
  294.             cdowner = argv[++a];
  295.         }
  296.         else if (strncmp(argv[a],"--owner=",8)==0)
  297.         {
  298.             if (cdowner)
  299.             {
  300.                 fprintf(stderr,"%s: CD owner was already specified as "%s"n",argv[0],cdowner);
  301.                 usage(argv[0]);
  302.             }
  303.             cdowner = &argv[a][8];
  304.         }
  305. else if (strcmp(argv[a],"-k")==0)
  306. {
  307.     if (a+1>=argc)
  308.             {
  309.                 fprintf(stderr,"%s: option "%s" requires an argumentn",argv[0],argv[a]);
  310.                 usage(argv[0]);
  311.             }
  312.     if (cdkey)
  313.     {
  314. fprintf(stderr,"%s: CD key was already specified as "%s"n",argv[0],cdkey);
  315. usage(argv[0]);
  316.     }
  317.     cdkey = argv[++a];
  318. }
  319. else if (strncmp(argv[a],"--cdkey=",8)==0)
  320. {
  321.     if (cdkey)
  322.     {
  323. fprintf(stderr,"%s: CD key was already specified as "%s"n",argv[0],cdkey);
  324. usage(argv[0]);
  325.     }
  326.     cdkey = &argv[a][8];
  327. }
  328. else if (strcmp(argv[a],"-p")==0)
  329. {
  330.     if (a+1>=argc)
  331.             {
  332.                 fprintf(stderr,"%s: option "%s" requires an argumentn",argv[0],argv[a]);
  333.                 usage(argv[0]);
  334.             }
  335.     if (gotplayer)
  336.     {
  337. fprintf(stderr,"%s: player was already specified as "%s"n",argv[0],text);
  338. usage(argv[0]);
  339.     }
  340.     a++;
  341.     if (argv[a][0]=='')
  342.     {
  343. fprintf(stderr,"%s: player name can not be emptyn",argv[0]);
  344. usage(argv[0]);
  345.     }
  346.     strncpy(text,argv[a],sizeof(text));
  347.     text[sizeof(text)-1] = '';
  348.     gotplayer = 1;
  349. }
  350. else if (strncmp(argv[a],"--player=",9)==0)
  351. {
  352.     if (gotplayer)
  353.     {
  354. fprintf(stderr,"%s: player was already specified as "%s"n",argv[0],text);
  355. usage(argv[0]);
  356.     }
  357.     if (argv[a][9]=='')
  358.     {
  359. fprintf(stderr,"%s: player name can not be emptyn",argv[0]);
  360. usage(argv[0]);
  361.     }
  362.     strncpy(text,&argv[a][9],sizeof(text));
  363.     text[sizeof(text)-1] = '';
  364.     gotplayer = 1;
  365. }
  366.         else if (strcmp(argv[a],"--bnetd")==0)
  367.     use_bnetd = 1;
  368.         else if (strcmp(argv[a],"--fsgs")==0)
  369.     use_fsgs = 1;
  370. else if (strcmp(argv[a],"-h")==0 || strcmp(argv[a],"--help")==0 || strcmp(argv[a],"--usage")
  371. ==0)
  372.             usage(argv[0]);
  373. else if (strcmp(argv[a],"-v")==0 || strcmp(argv[a],"--version")==0)
  374. {
  375.             printf("version "PVPGN_VERSION"n");
  376.             return STATUS_SUCCESS;
  377. }
  378.         else if (strcmp(argv[a],"--client")==0 || strcmp(argv[a],"--owner")==0 ||
  379.  strcmp(argv[a],"--cdkey")==0 || strcmp(argv[a],"--player")==0)
  380. {
  381.     fprintf(stderr,"%s: option "%s" requires an argumentn",argv[0],argv[a]);
  382.     usage(argv[0]);
  383. }
  384. else
  385. {
  386.     fprintf(stderr,"%s: unknown option "%s"n",argv[0],argv[a]);
  387.     usage(argv[0]);
  388. }
  389.     
  390.     if (servport==0)
  391. servport = BNETD_SERV_PORT;
  392.     if (!cdowner)
  393. cdowner = BNETD_DEFAULT_OWNER;
  394.     if (!cdkey)
  395. cdkey = BNETD_DEFAULT_KEY;
  396.     if (!clienttag)
  397. clienttag = CLIENTTAG_STARCRAFT;
  398.     if (!servname)
  399. servname = BNETD_DEFAULT_HOST;
  400.     
  401.     if (gotplayer)
  402. changed_in = 0; /* no need to change terminal attributes */
  403.     else
  404.     {
  405. fd_stdin = fileno(stdin);
  406. if (tcgetattr(fd_stdin,&in_attr_old)>=0)
  407. {
  408.     in_attr_new = in_attr_old;
  409.     in_attr_new.c_lflag &= ~(ECHO | ICANON); /* turn off ECHO and ICANON */
  410.     in_attr_new.c_cc[VMIN]  = 1; /* require reads to return at least one byte */
  411.     in_attr_new.c_cc[VTIME] = 0; /* no timeout */
  412.     tcsetattr(fd_stdin,TCSANOW,&in_attr_new);
  413.     changed_in = 1;
  414. }
  415. else
  416. {
  417.     fprintf(stderr,"%s: could not set terminal attributes for stdinn",argv[0]);
  418.     changed_in = 0;
  419. }
  420. if (client_get_termsize(fd_stdin,&screen_width,&screen_height)<0)
  421. {
  422.     fprintf(stderr,"%s: could not determine screen size, assuming 80x24n",argv[0]);
  423.     screen_width  = 80;
  424.     screen_height = 24;
  425. }
  426.     }
  427.     
  428.     if ((sd = client_connect(argv[0],servname,servport,cdowner,cdkey,clienttag,&saddr,&sessionkey,&sessionnum,ARCHTAG_WINX86))<0)
  429.     {
  430. fprintf(stderr,"%s: fatal error during handshaken",argv[0]);
  431. if (changed_in)
  432.     tcsetattr(fd_stdin,TCSAFLUSH,&in_attr_old);
  433. return STATUS_FAILURE;
  434.     }
  435.     
  436.     /* reuse this same packet over and over */
  437.     if (!(rpacket = packet_create(packet_class_bnet)))
  438.     {
  439. fprintf(stderr,"%s: could not create packetn",argv[0]);
  440. psock_close(sd);
  441. if (changed_in)
  442.     tcsetattr(fd_stdin,TCSAFLUSH,&in_attr_old);
  443. return STATUS_FAILURE;
  444.     }
  445.     
  446.     if (!(packet = packet_create(packet_class_bnet)))
  447.     {
  448. fprintf(stderr,"%s: could not create packetn",argv[0]);
  449. psock_close(sd);
  450. if (changed_in)
  451.     tcsetattr(fd_stdin,TCSAFLUSH,&in_attr_old);
  452. return STATUS_FAILURE;
  453.     }
  454.     packet_set_size(packet,sizeof(t_client_fileinforeq));
  455.     packet_set_type(packet,CLIENT_FILEINFOREQ);
  456.     bn_int_set(&packet->u.client_fileinforeq.type,CLIENT_FILEINFOREQ_TYPE_TOS);
  457.     bn_int_set(&packet->u.client_fileinforeq.unknown2,CLIENT_FILEINFOREQ_UNKNOWN2);
  458.     packet_append_string(packet,CLIENT_FILEINFOREQ_FILE_TOSUSA);
  459.     client_blocksend_packet(sd,packet);
  460.     packet_del_ref(packet);
  461.     do
  462.         if (client_blockrecv_packet(sd,rpacket)<0)
  463. {
  464.     fprintf(stderr,"%s: server closed connectionn",argv[0]);
  465.     psock_close(sd);
  466.     if (changed_in)
  467. tcsetattr(fd_stdin,TCSAFLUSH,&in_attr_old);
  468.     return STATUS_FAILURE;
  469. }
  470.     while (packet_get_type(rpacket)!=SERVER_FILEINFOREPLY);
  471.     dprintf("Got FILEINFOREPLYn");
  472.     
  473.     if (!gotplayer)
  474.     {
  475. munged = 1;
  476. commpos = 0;
  477. text[0] = '';
  478.     }
  479.     
  480.     for (;;)
  481.     {
  482. unsigned int i;
  483. if (!gotplayer)
  484. {
  485.     switch (client_get_comm("player: ",text,sizeof(text),&commpos,1,munged,screen_width))
  486.     {
  487.     case -1: /* cancel or error */
  488.                 break;
  489.     case 0: /* timeout */
  490. munged = 0;
  491.                 continue;
  492.     case 1:
  493. munged = 0;
  494.                 if (text[0]=='')
  495.                  continue;
  496.     }
  497.     
  498.     if (text[0]=='')
  499.         break;
  500.             printf("r");
  501.             for (i=0; i<strlen(text) && i<screen_width; i++)
  502.                 printf(" ");
  503.     printf("r");
  504. }
  505. if (!(packet = packet_create(packet_class_bnet)))
  506. {
  507.     fprintf(stderr,"%s: could not create packetn",argv[0]);
  508.     psock_close(sd);
  509.     if (changed_in)
  510. tcsetattr(fd_stdin,TCSAFLUSH,&in_attr_old);
  511.     return STATUS_FAILURE;
  512. }
  513. packet_set_size(packet,sizeof(t_client_statsreq));
  514. packet_set_type(packet,CLIENT_STATSREQ);
  515. bn_int_set(&packet->u.client_statsreq.name_count,1);
  516. bn_int_set(&packet->u.client_statsreq.requestid,0);
  517. packet_append_string(packet,text);
  518. count = 0;
  519. if (use_bnetd)
  520. {
  521.     packet_append_string(packet,"BNET\acct\username");
  522.     packet_append_string(packet,"BNET\acct\userid");
  523.     packet_append_string(packet,"BNET\acct\lastlogin_clienttag");
  524.     packet_append_string(packet,"BNET\acct\lastlogin_connection");
  525.     packet_append_string(packet,"BNET\acct\lastlogin_time");
  526.     packet_append_string(packet,"BNET\acct\firstlogin_clienttag");
  527.     packet_append_string(packet,"BNET\acct\firstlogin_connection");
  528.     packet_append_string(packet,"BNET\acct\firstlogin_time");
  529.     count += 8;
  530. }
  531. if (use_fsgs)
  532. {
  533.     packet_append_string(packet,"FSGS\Created");
  534.     count += 1;
  535. }
  536. packet_append_string(packet,"profile\sex");
  537. packet_append_string(packet,"profile\age");
  538. packet_append_string(packet,"profile\location");
  539. packet_append_string(packet,"profile\description");
  540. count += 4;
  541. if (strcmp(clienttag,"STAR")==0)
  542. {
  543.     packet_append_string(packet,"Record\STAR\0\last game");
  544.     packet_append_string(packet,"Record\STAR\0\last game result");
  545.     packet_append_string(packet,"Record\STAR\0\wins");
  546.     packet_append_string(packet,"Record\STAR\0\losses");
  547.     packet_append_string(packet,"Record\STAR\0\disconnects");
  548.     packet_append_string(packet,"Record\STAR\0\draws");
  549.     count += 6;
  550.     
  551.     packet_append_string(packet,"Record\STAR\1\last game");
  552.     packet_append_string(packet,"Record\STAR\1\last game result");
  553.     packet_append_string(packet,"Record\STAR\1\rating");
  554.     packet_append_string(packet,"Record\STAR\1\active rating");
  555.     packet_append_string(packet,"Record\STAR\1\high rating");
  556.     packet_append_string(packet,"Record\STAR\1\rank");
  557.     packet_append_string(packet,"Record\STAR\1\active rank");
  558.     packet_append_string(packet,"Record\STAR\1\high rank");
  559.     packet_append_string(packet,"Record\STAR\1\wins");
  560.     packet_append_string(packet,"Record\STAR\1\losses");
  561.     packet_append_string(packet,"Record\STAR\1\disconnects");
  562.     packet_append_string(packet,"Record\STAR\1\draws");
  563.     count += 12;
  564. }
  565. else if (strcmp(clienttag,"SEXP")==0)
  566. {
  567.     packet_append_string(packet,"Record\SEXP\0\last game");
  568.     packet_append_string(packet,"Record\SEXP\0\last game result");
  569.     packet_append_string(packet,"Record\SEXP\0\wins");
  570.     packet_append_string(packet,"Record\SEXP\0\losses");
  571.     packet_append_string(packet,"Record\SEXP\0\disconnects");
  572.     packet_append_string(packet,"Record\SEXP\0\draws");
  573.     count += 6;
  574.     
  575.     packet_append_string(packet,"Record\SEXP\1\last game");
  576.     packet_append_string(packet,"Record\SEXP\1\last game result");
  577.     packet_append_string(packet,"Record\SEXP\1\rating");
  578.     packet_append_string(packet,"Record\SEXP\1\active rating");
  579.     packet_append_string(packet,"Record\SEXP\1\high rating");
  580.     packet_append_string(packet,"Record\SEXP\1\rank");
  581.     packet_append_string(packet,"Record\SEXP\1\active rank");
  582.     packet_append_string(packet,"Record\SEXP\1\high rank");
  583.     packet_append_string(packet,"Record\SEXP\1\wins");
  584.     packet_append_string(packet,"Record\SEXP\1\losses");
  585.     packet_append_string(packet,"Record\SEXP\1\disconnects");
  586.     packet_append_string(packet,"Record\SEXP\1\draws");
  587.     count += 12;
  588. }
  589. else if (strcmp(clienttag,"SSHR")==0)
  590. {
  591.     packet_append_string(packet,"Record\SSHR\0\last game");
  592.     packet_append_string(packet,"Record\SSHR\0\last game result");
  593.     packet_append_string(packet,"Record\SSHR\0\wins");
  594.     packet_append_string(packet,"Record\SSHR\0\losses");
  595.     packet_append_string(packet,"Record\SSHR\0\disconnects");
  596.     packet_append_string(packet,"Record\SSHR\0\draws");
  597.     count += 6;
  598. }
  599. else if (strcmp(clienttag,"DSHR")==0 ||
  600.  strcmp(clienttag,"DRTL")==0)
  601. {
  602.     if (use_bnetd)
  603.     {
  604. packet_append_string(packet,"BNET\Record\DRTL\0\level");
  605. packet_append_string(packet,"BNET\Record\DRTL\0\class");
  606. packet_append_string(packet,"BNET\Record\DRTL\0\strength");
  607. packet_append_string(packet,"BNET\Record\DRTL\0\magic");
  608. packet_append_string(packet,"BNET\Record\DRTL\0\dexterity");
  609. packet_append_string(packet,"BNET\Record\DRTL\0\vitality");
  610. packet_append_string(packet,"BNET\Record\DRTL\0\gold");
  611. packet_append_string(packet,"BNET\Record\DRTL\0\diablo kills");
  612. count += 8;
  613.     }
  614. }
  615. else if (strcmp(clienttag,"W2BN")==0)
  616. {
  617.     packet_append_string(packet,"Record\W2BN\0\last game");
  618.     packet_append_string(packet,"Record\W2BN\0\last game result");
  619.     packet_append_string(packet,"Record\W2BN\0\wins");
  620.     packet_append_string(packet,"Record\W2BN\0\losses");
  621.     packet_append_string(packet,"Record\W2BN\0\disconnects");
  622.     packet_append_string(packet,"Record\W2BN\0\draws");
  623.     count += 6;
  624.     
  625.     packet_append_string(packet,"Record\W2BN\1\last game");
  626.     packet_append_string(packet,"Record\W2BN\1\last game result");
  627.     packet_append_string(packet,"Record\W2BN\1\rating");
  628.     packet_append_string(packet,"Record\W2BN\1\active rating");
  629.     packet_append_string(packet,"Record\W2BN\1\high rating");
  630.     packet_append_string(packet,"Record\W2BN\1\rank");
  631.     packet_append_string(packet,"Record\W2BN\1\active rank");
  632.     packet_append_string(packet,"Record\W2BN\1\high rank");
  633.     packet_append_string(packet,"Record\W2BN\1\wins");
  634.     packet_append_string(packet,"Record\W2BN\1\losses");
  635.     packet_append_string(packet,"Record\W2BN\1\disconnects");
  636.     packet_append_string(packet,"Record\W2BN\1\draws");
  637.     count += 12;
  638.     
  639.     packet_append_string(packet,"Record\W2BN\3\last game");
  640.     packet_append_string(packet,"Record\W2BN\3\last game result");
  641.     packet_append_string(packet,"Record\W2BN\3\rating");
  642.     packet_append_string(packet,"Record\W2BN\3\active rating");
  643.     packet_append_string(packet,"Record\W2BN\3\high rating");
  644.     packet_append_string(packet,"Record\W2BN\3\rank");
  645.     packet_append_string(packet,"Record\W2BN\3\active rank");
  646.     packet_append_string(packet,"Record\W2BN\3\high rank");
  647.     packet_append_string(packet,"Record\W2BN\3\wins");
  648.     packet_append_string(packet,"Record\W2BN\3\losses");
  649.     packet_append_string(packet,"Record\W2BN\3\disconnects");
  650.     packet_append_string(packet,"Record\W2BN\3\draws");
  651.     count += 12;
  652. }
  653. bn_int_set(&packet->u.client_statsreq.key_count,count);
  654. client_blocksend_packet(sd,packet);
  655. packet_del_ref(packet);
  656. do
  657.     if (client_blockrecv_packet(sd,rpacket)<0)
  658.     {
  659. fprintf(stderr,"%s: server closed connectionn",argv[0]);
  660. if (changed_in)
  661.     tcsetattr(fd_stdin,TCSAFLUSH,&in_attr_old);
  662. return STATUS_FAILURE;
  663.     }
  664. while (packet_get_type(rpacket)!=SERVER_STATSREPLY);
  665. dprintf("Got STATSREPLYn");
  666. {
  667.     unsigned int   names,keys;
  668.     unsigned int   j;
  669.     unsigned int   strpos;
  670.     char const *   temp;
  671.     unsigned int   uid;
  672.     struct in_addr laddr;
  673.     time_t         tm;
  674.     char           timestr[STAT_TIME_MAXLEN];
  675.     
  676.     names = bn_int_get(rpacket->u.server_statsreply.name_count);
  677.     keys = bn_int_get(rpacket->u.server_statsreply.key_count);
  678.     
  679.     printf("----n");
  680.     
  681.     strpos = sizeof(t_server_statsreply);
  682.     for (i=0; i<names; i++)
  683.     {
  684. j = 0;
  685. if (use_bnetd)
  686. {
  687.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  688. strpos += strlen(temp)+1;
  689.     else
  690. temp = "";
  691.     j++;
  692.     if (temp[0]=='')
  693. printf("                        Username: UNKNOWNn");
  694.     else
  695. printf("                        Username: %sn",temp);
  696.     
  697.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  698. strpos += strlen(temp)+1;
  699.     else
  700. temp = "";
  701.     j++;
  702.     if (str_to_uint(temp,&uid)<0 || uid<1)
  703. printf("                         Account: UNKNOWNn");
  704.     else
  705. printf("                         Account: "UID_FORMAT"n",uid);
  706.     
  707.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  708. strpos += strlen(temp)+1;
  709.     else
  710. temp = "";
  711.     j++;
  712.     printf("               Last login client: %sn",temp);
  713.     
  714.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  715. strpos += strlen(temp)+1;
  716.     else
  717. temp = "";
  718.     j++;
  719.     if (str_to_uint(temp,&val)<0)
  720. printf("                 Last login host: UNKNOWNn");
  721.     else
  722.     {
  723. laddr.s_addr = htonl(val);
  724. printf("                 Last login host: %sn",inet_ntoa(laddr));
  725.     }
  726.     
  727.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  728. strpos += strlen(temp)+1;
  729.     else
  730. temp = "";
  731.     j++;
  732.     if (str_to_uint(temp,&val)<0 || val==0)
  733. printf("                 Last login time: NEVERn");
  734.     else
  735.     {
  736. tm = (time_t)val;
  737. strftime(timestr,STAT_TIME_MAXLEN,STAT_TIME_FORMAT,localtime(&tm));
  738. printf("                 Last login time: %sn",timestr);
  739.     }
  740.     
  741.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  742. strpos += strlen(temp)+1;
  743.     else
  744. temp = "";
  745.     j++;
  746.     printf("              First login client: %sn",temp);
  747.     
  748.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  749. strpos += strlen(temp)+1;
  750.     else
  751. temp = "";
  752.     j++;
  753.     if (str_to_uint(temp,&val)<0)
  754. printf("                First login host: UNKNOWNn");
  755.     else
  756.     {
  757. laddr.s_addr = htonl(val);
  758. printf("                First login host: %sn",inet_ntoa(laddr));
  759.     }
  760.     
  761.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  762. strpos += strlen(temp)+1;
  763.     else
  764. temp = "";
  765.     j++;
  766.     if (str_to_uint(temp,&val)<0 || val==0)
  767. printf("                First login time: NEVERn");
  768.     else
  769.     {
  770. tm = (time_t)val;
  771. strftime(timestr,STAT_TIME_MAXLEN,STAT_TIME_FORMAT,localtime(&tm));
  772. printf("                First login time: %sn",timestr);
  773.     }
  774. }
  775. else
  776.     printf("                        Username: %sn",text);
  777. if (use_fsgs)
  778. {
  779.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  780. strpos += strlen(temp)+1;
  781.     else
  782. temp = "";
  783.     j++;
  784.     if (str_to_uint(temp,&val)<0 || val==0)
  785. printf("                   Creation time: NEVERn");
  786.     else
  787.     {
  788. tm = (time_t)val;
  789. strftime(timestr,STAT_TIME_MAXLEN,STAT_TIME_FORMAT,localtime(&tm));
  790. printf("                   Creation time: %sn",timestr);
  791.     }
  792. }
  793. if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  794.     strpos += strlen(temp)+1;
  795. else
  796.     temp = "";
  797. j++;
  798.      printf("                             Sex: %sn",temp);
  799. if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  800.     strpos += strlen(temp)+1;
  801. else
  802.     temp = "";
  803. j++;
  804.      printf("                             Age: %sn",temp);
  805. if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  806.     strpos += strlen(temp)+1;
  807. else
  808.     temp = "";
  809. j++;
  810.      printf("                        Location: %sn",temp);
  811. if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  812.     strpos += strlen(temp)+1;
  813. else
  814.     temp = "";
  815. j++;
  816.      printf("                     Description: %sn",temp);
  817. if (strcmp(clienttag,"STAR")==0 ||
  818.     strcmp(clienttag,"SSHR")==0 ||
  819.     strcmp(clienttag,"SEXP")==0 ||
  820.     strcmp(clienttag,"W2BN")==0)
  821. {
  822.     t_bnettime   bntime;
  823.     unsigned int wins,losses,disconnects,draws;
  824.     
  825.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  826. strpos += strlen(temp)+1;
  827.     else
  828. temp = "";
  829.     j++;
  830.     if (bnettime_set_str(&bntime,temp)<0)
  831. strcpy(timestr,"NEVER");
  832.     else
  833.     {
  834. tm = bnettime_to_time(bntime);
  835. strftime(timestr,STAT_TIME_MAXLEN,STAT_TIME_FORMAT,localtime(&tm));
  836.     }
  837.          printf("                  Last game time: %sn",timestr);
  838.     
  839.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  840. strpos += strlen(temp)+1;
  841.     else
  842. temp = "";
  843.     j++;
  844.          printf("                Last game result: %sn",temp);
  845.     
  846.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  847. strpos += strlen(temp)+1;
  848.     else
  849. temp = "";
  850.     j++;
  851.     if (str_to_uint(temp,&wins)<0)
  852. wins = 0;
  853.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  854. strpos += strlen(temp)+1;
  855.     else
  856. temp = "";
  857.     j++;
  858.     if (str_to_uint(temp,&losses)<0)
  859. losses = 0;
  860.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  861. strpos += strlen(temp)+1;
  862.     else
  863. temp = "";
  864.     j++;
  865.     if (str_to_uint(temp,&disconnects)<0)
  866. disconnects = 0;
  867.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  868. strpos += strlen(temp)+1;
  869.     else
  870. temp = "";
  871.     j++;
  872.     if (str_to_uint(temp,&draws)<0)
  873. draws = 0;
  874.             printf("                          Record: (%u/%u/%u) %u drawsn",wins,losses,disconnects,draws);
  875. }
  876.     
  877. if (strcmp(clienttag,"STAR")==0 ||
  878.     strcmp(clienttag,"SEXP")==0 ||
  879.     strcmp(clienttag,"W2BN")==0)
  880. {
  881.     t_bnettime   bntime;
  882.     unsigned int wins,losses,disconnects,draws;
  883.     unsigned int rating,rank;
  884.     unsigned int active_rating,active_rank;
  885.     unsigned int high_rating,high_rank;
  886.     
  887.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  888. strpos += strlen(temp)+1;
  889.     else
  890. temp = "";
  891.     j++;
  892.     if (bnettime_set_str(&bntime,temp)<0)
  893. strcpy(timestr,"NEVER");
  894.     else
  895.     {
  896. tm = bnettime_to_time(bntime);
  897. strftime(timestr,STAT_TIME_MAXLEN,STAT_TIME_FORMAT,localtime(&tm));
  898.     }
  899.          printf("  Last standard ladder game time: %sn",timestr);
  900.     
  901.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  902. strpos += strlen(temp)+1;
  903.     else
  904. temp = "";
  905.     j++;
  906.          printf("Last standard ladder game result: %sn",temp);
  907.     
  908.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  909. strpos += strlen(temp)+1;
  910.     else
  911. temp = "";
  912.     j++;
  913.     if (str_to_uint(temp,&rating)<0)
  914. rating = 0;
  915.     if (rating)
  916.      printf("  Current standard ladder rating: %un",rating);
  917.     else
  918.      printf("  Current standard ladder rating: UNRATEDn");
  919.     
  920.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  921. strpos += strlen(temp)+1;
  922.     else
  923. temp = "";
  924.     j++;
  925.     if (str_to_uint(temp,&active_rating)<0)
  926. active_rating = 0;
  927.     if (active_rating)
  928.      printf("   Active standard ladder rating: %un",active_rating);
  929.     else
  930.      printf("   Active standard ladder rating: UNRATEDn");
  931.     
  932.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  933. strpos += strlen(temp)+1;
  934.     else
  935. temp = "";
  936.     j++;
  937.     if (str_to_uint(temp,&high_rating)<0)
  938. high_rating = 0;
  939.     if (high_rating)
  940.      printf("     High standard ladder rating: %un",high_rating);
  941.     else
  942.      printf("     High standard ladder rating: UNRATEDn");
  943.     
  944.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  945. strpos += strlen(temp)+1;
  946.     else
  947. temp = "";
  948.     j++;
  949.     if (str_to_uint(temp,&rank)<0)
  950. rank = 0;
  951.     if (rank)
  952.    printf("    Current standard ladder rank: #%un",rank);
  953.     else
  954. printf("    Current standard ladder rank: UNRANKEDn");
  955.     
  956.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  957. strpos += strlen(temp)+1;
  958.     else
  959. temp = "";
  960.     j++;
  961.     if (str_to_uint(temp,&active_rank)<0)
  962. active_rank = 0;
  963.     if (active_rank)
  964.      printf("     Active standard ladder rank: #%un",active_rank);
  965.     else
  966. printf("     Active standard ladder rank: UNRANKEDn");
  967.     
  968.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  969. strpos += strlen(temp)+1;
  970.     else
  971. temp = "";
  972.     j++;
  973.     if (str_to_uint(temp,&high_rank)<0)
  974. high_rank = 0;
  975.     if (high_rank)
  976.      printf("       High standard ladder rank: #%un",high_rank);
  977.     else
  978. printf("       High standard ladder rank: UNRANKEDn");
  979.     
  980.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  981. strpos += strlen(temp)+1;
  982.     else
  983. temp = "";
  984.     j++;
  985.     if (str_to_uint(temp,&wins)<0)
  986. wins = 0;
  987.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  988. strpos += strlen(temp)+1;
  989.     else
  990. temp = "";
  991.     j++;
  992.     if (str_to_uint(temp,&losses)<0)
  993. losses = 0;
  994.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  995. strpos += strlen(temp)+1;
  996.     else
  997. temp = "";
  998.     j++;
  999.     if (str_to_uint(temp,&disconnects)<0)
  1000. disconnects = 0;
  1001.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  1002. strpos += strlen(temp)+1;
  1003.     else
  1004. temp = "";
  1005.     j++;
  1006.     if (str_to_uint(temp,&draws)<0)
  1007. draws = 0;
  1008.             printf("          Standard ladder record: (%u/%u/%u) %u drawsn",wins,losses,disconnects,draws);
  1009. }
  1010. if (strcmp(clienttag,"W2BN")==0)
  1011. {
  1012.     t_bnettime   bntime;
  1013.     unsigned int wins,losses,disconnects,draws;
  1014.     unsigned int rating,rank;
  1015.     unsigned int active_rating,active_rank;
  1016.     unsigned int high_rating,high_rank;
  1017.     
  1018.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  1019. strpos += strlen(temp)+1;
  1020.     else
  1021. temp = "";
  1022.     j++;
  1023.     if (bnettime_set_str(&bntime,temp)<0)
  1024. strcpy(timestr,"NEVER");
  1025.     else
  1026.     {
  1027. tm = bnettime_to_time(bntime);
  1028. strftime(timestr,STAT_TIME_MAXLEN,STAT_TIME_FORMAT,localtime(&tm));
  1029.     }
  1030.          printf("   Last Ironman ladder game time: %sn",timestr);
  1031.     
  1032.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  1033. strpos += strlen(temp)+1;
  1034.     else
  1035. temp = "";
  1036.     j++;
  1037.          printf(" Last Ironman ladder game result: %sn",temp);
  1038.     
  1039.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  1040. strpos += strlen(temp)+1;
  1041.     else
  1042. temp = "";
  1043.     j++;
  1044.     if (str_to_uint(temp,&rating)<0)
  1045. rating = 0;
  1046.     if (rating)
  1047.      printf("   Current Ironman ladder rating: %un",rating);
  1048.     else
  1049.      printf("   Current Ironman ladder rating: UNRATEDn");
  1050.     
  1051.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  1052. strpos += strlen(temp)+1;
  1053.     else
  1054. temp = "";
  1055.     j++;
  1056.     if (str_to_uint(temp,&active_rating)<0)
  1057. active_rating = 0;
  1058.     if (active_rating)
  1059.      printf("    Active Ironman ladder rating: %un",active_rating);
  1060.     else
  1061.      printf("    Active Ironman ladder rating: UNRATEDn");
  1062.     
  1063.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  1064. strpos += strlen(temp)+1;
  1065.     else
  1066. temp = "";
  1067.     j++;
  1068.     if (str_to_uint(temp,&high_rating)<0)
  1069. high_rating = 0;
  1070.     if (high_rating)
  1071.      printf("      High Ironman ladder rating: %un",high_rating);
  1072.     else
  1073.      printf("      High Ironman ladder rating: UNRATEDn");
  1074.     
  1075.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  1076. strpos += strlen(temp)+1;
  1077.     else
  1078. temp = "";
  1079.     j++;
  1080.     if (str_to_uint(temp,&rank)<0)
  1081. rank = 0;
  1082.     if (rank)
  1083.    printf("     Current Ironman ladder rank: #%un",rank);
  1084.     else
  1085. printf("     Current Ironman ladder rank: UNRANKEDn");
  1086.     
  1087.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  1088. strpos += strlen(temp)+1;
  1089.     else
  1090. temp = "";
  1091.     j++;
  1092.     if (str_to_uint(temp,&active_rank)<0)
  1093. active_rank = 0;
  1094.     if (active_rank)
  1095.      printf("      Active Ironman ladder rank: #%un",active_rank);
  1096.     else
  1097. printf("      Active Ironman ladder rank: UNRANKEDn");
  1098.     
  1099.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  1100. strpos += strlen(temp)+1;
  1101.     else
  1102. temp = "";
  1103.     j++;
  1104.     if (str_to_uint(temp,&high_rank)<0)
  1105. high_rank = 0;
  1106.     if (high_rank)
  1107.      printf("        High Ironman ladder rank: #%un",high_rank);
  1108.     else
  1109. printf("        High Ironman ladder rank: UNRANKEDn");
  1110.     
  1111.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  1112. strpos += strlen(temp)+1;
  1113.     else
  1114. temp = "";
  1115.     j++;
  1116.     if (str_to_uint(temp,&wins)<0)
  1117. wins = 0;
  1118.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  1119. strpos += strlen(temp)+1;
  1120.     else
  1121. temp = "";
  1122.     j++;
  1123.     if (str_to_uint(temp,&losses)<0)
  1124. losses = 0;
  1125.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  1126. strpos += strlen(temp)+1;
  1127.     else
  1128. temp = "";
  1129.     j++;
  1130.     if (str_to_uint(temp,&disconnects)<0)
  1131. disconnects = 0;
  1132.     if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  1133. strpos += strlen(temp)+1;
  1134.     else
  1135. temp = "";
  1136.     j++;
  1137.     if (str_to_uint(temp,&draws)<0)
  1138. draws = 0;
  1139.             printf("           Ironman ladder record: (%u/%u/%u) %u drawsn",wins,losses,disconnects,draws);
  1140. }
  1141. if (strcmp(clienttag,"DSHR")==0 ||
  1142.     strcmp(clienttag,"DRTL")==0)
  1143. {
  1144.     unsigned int level;
  1145.     unsigned int class;
  1146.     unsigned int diablo_kills;
  1147.     unsigned int strength;
  1148.     unsigned int magic;
  1149.     unsigned int dexterity;
  1150.     unsigned int vitality;
  1151.     unsigned int gold;
  1152.     
  1153.     if (use_bnetd)
  1154.     {
  1155. if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  1156.     strpos += strlen(temp)+1;
  1157. else
  1158.     temp = "";
  1159. j++;
  1160. if (str_to_uint(temp,&level)<0)
  1161.     level = 0;
  1162. if (level>0)
  1163.     printf("                           Level: %un",level);
  1164. else
  1165.     printf("                           Level: NONEn");
  1166. if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  1167.     strpos += strlen(temp)+1;
  1168. else
  1169.     temp = "";
  1170. j++;
  1171. if (str_to_uint(temp,&class)<0)
  1172.     class = 99;
  1173. printf("                           Class: %sn",bnclass_get_str(class));
  1174. if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  1175.     strpos += strlen(temp)+1;
  1176. else
  1177.     temp = "";
  1178. j++;
  1179. if (str_to_uint(temp,&strength)<0)
  1180.     strength = 0;
  1181. if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  1182.     strpos += strlen(temp)+1;
  1183. else
  1184.     temp = "";
  1185. j++;
  1186. if (str_to_uint(temp,&magic)<0)
  1187.     magic = 0;
  1188. if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  1189.     strpos += strlen(temp)+1;
  1190. else
  1191.     temp = "";
  1192. j++;
  1193. if (str_to_uint(temp,&dexterity)<0)
  1194.     dexterity = 0;
  1195. if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  1196.     strpos += strlen(temp)+1;
  1197. else
  1198.     temp = "";
  1199. j++;
  1200. if (str_to_uint(temp,&vitality)<0)
  1201.     vitality = 0;
  1202. if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  1203.     strpos += strlen(temp)+1;
  1204. else
  1205.     temp = "";
  1206. j++;
  1207. if (str_to_uint(temp,&gold)<0)
  1208.     gold = 0;
  1209. printf("                           Stats: %u str  %u mag  %u dex  %u vit  %u gldn",
  1210.        strength,
  1211.        magic,
  1212.        dexterity,
  1213.        vitality,
  1214.        gold);
  1215. if (j<keys && (temp = packet_get_str_const(rpacket,strpos,256)))
  1216.     strpos += strlen(temp)+1;
  1217. else
  1218.     temp = "";
  1219. j++;
  1220. if (str_to_uint(temp,&diablo_kills)<0)
  1221.     diablo_kills = 0;
  1222. printf("                    Diablo Kills: %un",diablo_kills);
  1223.     }
  1224. }
  1225.     }
  1226.     printf("----n");
  1227. }
  1228. if (gotplayer)
  1229.     break;
  1230. commpos = 0;
  1231. text[0] = '';
  1232.     }
  1233.     
  1234.     psock_close(sd);
  1235.     if (changed_in)
  1236. tcsetattr(fd_stdin,TCSAFLUSH,&in_attr_old);
  1237.     return STATUS_SUCCESS;
  1238. }