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

MySQL数据库

开发平台:

Visual C++

  1. /*
  2.  * Copyright (C) 2000 Rob Crittenden (rcrit@greyoak.com)
  3.  * Copyright (C) 2002 Gianluigi Tiesi (sherpya@netfarm.it)
  4.  *
  5.  * This program is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU General Public License
  7.  * as published by the Free Software Foundation; either version 2
  8.  * of the License, or (at your option) any later version.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18.  */
  19. #define AUTOUPDATE_INTERNAL_ACCESS
  20. #include "common/setup_before.h"
  21. #include <stdio.h>
  22. #ifdef HAVE_STDDEF_H
  23. # include <stddef.h>
  24. #else
  25. # ifndef NULL
  26. #  define NULL ((void *)0)
  27. # endif
  28. #endif
  29. #ifdef STDC_HEADERS
  30. # include <stdlib.h>
  31. #else
  32. # ifdef HAVE_MALLOC_H
  33. #  include <malloc.h>
  34. # endif
  35. #endif
  36. #include "compat/strtoul.h"
  37. #ifdef HAVE_STRING_H
  38. # include <string.h>
  39. #else
  40. # ifdef HAVE_STRINGS_H
  41. #  include <strings.h>
  42. # endif
  43. #endif
  44. #include "compat/strchr.h"
  45. #include "compat/strdup.h"
  46. #include <errno.h>
  47. #include "compat/strerror.h"
  48. #include "common/eventlog.h"
  49. #include "common/list.h"
  50. #include "common/util.h"
  51. #include "common/proginfo.h"
  52. #include "autoupdate.h"
  53. #include "common/setup_after.h"
  54. static t_list * autoupdate_head=NULL;
  55. static FILE * fp = NULL;
  56. /*
  57.  * Open the autoupdate configuration file, create a linked list of the
  58.  * clienttag and the update file for it.  The format of the file is:
  59.  * archtag<tab>clienttag<tab>versiontag<tab>update file
  60.  *
  61.  * Comments begin with # and are ignored.
  62.  *
  63.  * The server assumes that the update file is in the "files" directory
  64.  * so do not include "/" in the filename - it won't be sent
  65.  * (because it is a security risk).
  66.  */
  67. extern int autoupdate_load(char const * filename)
  68. {
  69.     unsigned int   line;
  70.     unsigned int   pos;
  71.     char *         buff;
  72.     char *         temp;
  73.     char const *   archtag;
  74.     char const *   clienttag;
  75.     char const *   mpqfile;
  76.     char const *   versiontag;
  77.     t_autoupdate * entry;
  78.     
  79.     if (!filename) {
  80. eventlog(eventlog_level_error,"autoupdate_load","got NULL filename");
  81. return -1;
  82.     }
  83.     
  84.     if (!(autoupdate_head = list_create())) {
  85. eventlog(eventlog_level_error,"autoupdate_load","could create list");
  86. return -1;
  87.     }
  88.     
  89.     if (!(fp = fopen(filename,"r"))) {
  90. eventlog(eventlog_level_error,"autoupdate_load","could not open file "%s" for reading (fopen: %s)",filename,strerror(errno));
  91. list_destroy(autoupdate_head);
  92. autoupdate_head = NULL;
  93. return -1;
  94.     }
  95.     
  96.     for (line=1; (buff = file_get_line(fp)); line++) {
  97. for (pos=0; buff[pos]=='t' || buff[pos]==' '; pos++);
  98. if (buff[pos]=='' || buff[pos]=='#') {
  99.     free(buff);
  100.     continue;
  101. }
  102. if ((temp = strrchr(buff,'#'))) {
  103.     unsigned int len;
  104.     unsigned int endpos;
  105.     
  106.     *temp = '';
  107.     len = strlen(buff)+1;
  108.     for (endpos=len-1;  buff[endpos]=='t' || buff[endpos]==' '; endpos--);
  109.     buff[endpos+1] = '';
  110. }
  111. /* FIXME: use next_token instead of strtok */
  112. if (!(archtag = strtok(buff, " t"))) { /* strtok modifies the string it is passed */
  113.     eventlog(eventlog_level_error,"autoupdate_load","missing archtag on line %u of file "%s"",line,filename);
  114.     free(buff);
  115.     continue;
  116. }
  117. if (!(clienttag = strtok(NULL," t"))) {
  118.     eventlog(eventlog_level_error,"autoupdate_load","missing clienttag on line %u of file "%s"",line,filename);
  119.     free(buff);
  120.     continue;
  121. }
  122.         if (!(versiontag = strtok(NULL, " t"))) {
  123.     eventlog(eventlog_level_error,"autoupdate_load","missing versiontag on line %u of file "%s"",line,filename);
  124.     free(buff);
  125.     continue;
  126. }
  127. if (!(mpqfile = strtok(NULL," t"))) {
  128.     eventlog(eventlog_level_error,"autoupdate_load","missing mpqfile on line %u of file "%s"",line,filename);
  129.     free(buff);
  130.     continue;
  131. }
  132. if (!(entry = malloc(sizeof(t_autoupdate)))) {
  133.     eventlog(eventlog_level_error,"autoupdate_load","could not allocate memory for entry");
  134.     free(buff);
  135.     continue;
  136. }
  137. if (!(entry->archtag = strdup(archtag))) {
  138.     eventlog(eventlog_level_error,"autoupdate_load","could not allocate memory for archtag");
  139.     free(entry);
  140.     free(buff);
  141.     continue;
  142. }
  143. if (!(entry->clienttag = strdup(clienttag))) {
  144.     eventlog(eventlog_level_error,"autoupdate_load","could not allocate memory for clienttag");
  145.     free((void *)entry->archtag);
  146.     free(entry);
  147.     free(buff);
  148.     continue;
  149. }
  150. if ((!(entry->versiontag = strdup(versiontag)))) {
  151.     eventlog(eventlog_level_error,"autoupdate_load","could not allocate memory for versiontag");
  152.     free((void *)entry->clienttag);
  153.     free((void *)entry->archtag);
  154.     free(entry);
  155.     free(buff);
  156.     continue;
  157. }
  158. if (!(entry->mpqfile = strdup(mpqfile))) {
  159.     eventlog(eventlog_level_error,"autoupdate_load","could not allocate memory for mpqfile");
  160.     free((void *)entry->versiontag);
  161.     free((void *)entry->clienttag);
  162.     free((void *)entry->archtag);
  163.     free(entry);
  164.     free(buff);
  165.     continue;
  166. }
  167. eventlog(eventlog_level_debug,"autoupdate_load","update '%s' version '%s' with file %s",clienttag,versiontag,mpqfile);
  168. free(buff);
  169. if (list_append_data(autoupdate_head,entry)<0) {
  170.     eventlog(eventlog_level_error,"autoupdate_load","could not append item");
  171.     free((void *)entry->versiontag);
  172.     free((void *)entry->clienttag);
  173.     free((void *)entry->archtag);
  174.     free((void *)entry->mpqfile);
  175.     free(entry);
  176.     continue;
  177. }
  178.     }
  179.     fclose(fp);
  180.     return 0;
  181. }
  182. /*
  183.  * Free up all of the elements in the linked list
  184.  */
  185. extern int autoupdate_unload(void)
  186. {
  187.     if (autoupdate_head) {
  188. t_elem *       curr;
  189. t_autoupdate * entry;
  190. LIST_TRAVERSE(autoupdate_head,curr)
  191. {
  192.     if (!(entry = elem_get_data(curr)))
  193. eventlog(eventlog_level_error,"autoupdate_unload","found NULL entry in list");
  194.     else {
  195. free((void *)entry->versiontag); /* avoid warning */
  196. free((void *)entry->mpqfile); /* avoid warning */
  197. free((void *)entry->clienttag); /* avoid warning */
  198. free((void *)entry->archtag); /* avoid warning */
  199. free(entry);
  200.     }
  201.     list_remove_elem(autoupdate_head,curr);
  202. }
  203. if (list_destroy(autoupdate_head)<0) return -1;
  204. autoupdate_head = NULL;
  205.     }
  206.     return 0;
  207. }
  208. /*
  209.  *  Check to see if an update exists for the clients version
  210.  *  return file name if there is one
  211.  *  retrun NULL if no update exists
  212.  */
  213. extern char * autoupdate_check(char const * archtag, char const * clienttag, unsigned int gamelang, char const * versiontag)
  214. {
  215.     if (autoupdate_head) {
  216. t_elem const * curr;
  217. t_autoupdate * entry;
  218. char * temp;
  219. LIST_TRAVERSE_CONST(autoupdate_head,curr)
  220. {
  221.     if (!(entry = elem_get_data(curr))) {
  222. eventlog(eventlog_level_error,"autoupdate_file","found NULL entry in list");
  223. continue;
  224.     }
  225.     
  226.     if (strcmp(entry->archtag, archtag) != 0)
  227. continue;
  228.     if (strcmp(entry->clienttag, clienttag) != 0)
  229. continue;
  230.     if (strcmp(entry->versiontag, versiontag) != 0)
  231. continue;
  232.     
  233.     /* if we have a gamelang then add to mpq file, unless enUS */
  234.     if (gamelang) {
  235. char gltag[5];
  236. gltag[0] = ((unsigned char)(gamelang>>24)     );
  237. gltag[1] = ((unsigned char)(gamelang>>16)&0xff);
  238. gltag[2] = ((unsigned char)(gamelang>> 8)&0xff);
  239. gltag[3] = ((unsigned char)(gamelang    )&0xff);
  240. gltag[4] = '';
  241. if (strcmp(gltag, "enUS") != 0) {
  242.     char * tempmpq;
  243.     char * extention;
  244.     
  245.     tempmpq = strdup(entry->mpqfile);
  246.     if (!(temp = malloc(strlen(tempmpq)+6))) {
  247.          eventlog(eventlog_level_error,"autoupdate_load","could not allocate memory for mpq file name");
  248. return NULL;
  249.     }
  250.     extention = strrchr(tempmpq,'.');
  251.     *extention = '';
  252.     extention++;
  253.     
  254.     sprintf(temp, "%s_%s.%s", tempmpq, gltag, extention);
  255.     
  256.     free((void *)tempmpq);
  257.     return temp;
  258. }
  259.     }
  260.     temp = strdup(entry->mpqfile);
  261.     return temp;
  262. }
  263.     }
  264.     return NULL;
  265. }