コード例 #1
0
ファイル: versioncheck.cpp プロジェクト: AleXoundOS/pvpgn
		//static int versioncheck_compare_exeinfo(char const * pattern, char const * match)
		static int versioncheck_compare_exeinfo(t_parsed_exeinfo * pattern, t_parsed_exeinfo * match)
		{
			assert(pattern);
			assert(match);

			if (!strcasecmp(prefs_get_version_exeinfo_match(), "none"))
				return 0;	/* ignore exeinfo */

			if (std::strlen(pattern->exe) != std::strlen(match->exe))
				return 1; /* neq */

			if (std::strcmp(prefs_get_version_exeinfo_match(), "exact") == 0) {
				return strcasecmp(pattern->exe, match->exe);
			}
			else if (std::strcmp(prefs_get_version_exeinfo_match(), "exactcase") == 0) {
				return std::strcmp(pattern->exe, match->exe);
			}
			else if (std::strcmp(prefs_get_version_exeinfo_match(), "wildcard") == 0) {
				unsigned int i;

				for (i = 0; i < std::strlen(pattern->exe); i++)
				if ((pattern->exe[i] != '?') && /* out "don't care" sign */
					(safe_toupper(pattern->exe[i]) != safe_toupper(match->exe[i])))
					return 1; /* neq */
				return 0; /* ok */
			}
			else if (std::strcmp(prefs_get_version_exeinfo_match(), "parse") == 0) {

				if (strcasecmp(pattern->exe, match->exe) != 0)
				{
					eventlog(eventlog_level_trace, __FUNCTION__, "filename differs");
					return 1; /* neq */
				}
				if (pattern->size != match->size)
				{
					eventlog(eventlog_level_trace, __FUNCTION__, "size differs");
					return 1; /* neq */
				}
				if ((pattern->time != -1) && prefs_get_version_exeinfo_maxdiff() && (abs(pattern->time - match->time) > (signed)prefs_get_version_exeinfo_maxdiff()))
				{
					eventlog(eventlog_level_trace, __FUNCTION__, "time differs by %i", abs(pattern->time - match->time));
					return 1;
				}
				return 0; /* ok */
			}
			else {
				eventlog(eventlog_level_error, __FUNCTION__, "unknown version exeinfo match method \"%s\"", prefs_get_version_exeinfo_match());
				return -1; /* neq/fail */
			}
		}
コード例 #2
0
t_parsed_exeinfo * parse_exeinfo(char const * _exeinfo)
{
  t_parsed_exeinfo * parsed_exeinfo;

    if (!_exeinfo) {
	return NULL;
    }

    parsed_exeinfo = (t_parsed_exeinfo*)xmalloc(sizeof(t_parsed_exeinfo));
    parsed_exeinfo->exe = xstrdup(_exeinfo);
    parsed_exeinfo->time = 0;
    parsed_exeinfo->size = 0;
    
    if (strcmp(prefs_get_version_exeinfo_match(),"parse")==0) 
    {
#ifdef HAVE_MKTIME
	struct tm t1;
	char *exe;
	char mask[MAX_EXEINFO_STR+1];
	char * marker;
	int size;
        char time_invalid = 0;

	if ((parsed_exeinfo->exe[0]=='\0') ||	   //happens when using war3-noCD and having deleted war3.org
	    (strcmp(parsed_exeinfo->exe,"badexe")==0)) //happens when AUTHREQ had no owner/exeinfo entry
	{
          xfree((void *)parsed_exeinfo->exe);
          xfree((void *)parsed_exeinfo);
          eventlog(eventlog_level_error,__FUNCTION__,"found empty exeinfo");
          return NULL;
	}

        memset(&t1,0,sizeof(t1));
        t1.tm_isdst = -1;

		char *exeinfo = xstrdup(_exeinfo);

        exeinfo    = strreverse((char *)exeinfo);
        if (!(marker     = strchr(exeinfo,' ')))
        {
	  xfree((void *)parsed_exeinfo->exe);
	  xfree((void *)parsed_exeinfo);
	  xfree((void*)exeinfo);
	  return NULL;
        }
	for (; marker[0]==' ';marker++); 

        if (!(marker     = strchr(marker,' ')))
        {
	  xfree((void *)parsed_exeinfo->exe);
	  xfree((void *)parsed_exeinfo);
	  xfree((void*)exeinfo);
	  return NULL;
	} 
	for (; marker[0]==' ';marker++);

        if (!(marker     = strchr(marker,' ')))
        {
	  xfree((void *)parsed_exeinfo->exe);
	  xfree((void *)parsed_exeinfo);
	  xfree((void*)exeinfo);
	  return NULL;
	}
        for (; marker[0]==' ';marker++);
        marker--;
        marker[0]  = '\0';
        marker++; 
        
        exe = xstrdup(marker);
		xfree((void*)exeinfo);
        xfree((void *)parsed_exeinfo->exe);
        parsed_exeinfo->exe = strreverse((char *)exe);

        exeinfo    = strreverse((char *)exeinfo);

	sprintf(mask,"%%02u/%%02u/%%u %%02u:%%02u:%%02u %%u");

	if (sscanf(exeinfo,mask,&t1.tm_mon,&t1.tm_mday,&t1.tm_year,&t1.tm_hour,&t1.tm_min,&t1.tm_sec,&size)!=7) {
            if (sscanf(exeinfo,"%*s %*s %u",&size) != 1)
            {

	      eventlog(eventlog_level_warn,__FUNCTION__,"parser error while parsing pattern \"%s\"",exeinfo);
	      xfree((void *)parsed_exeinfo->exe);
	      xfree((void *)parsed_exeinfo);
	      return NULL; /* neq */
            }
            time_invalid=1;
	}

       /* Now we have a Y2K problem :)  Thanks for using a 2 digit decimal years, Blizzard. */ 
       /* 00-79 -> 2000-2079 
	*             * 80-99 -> 1980-1999 
	*             * 100+ unchanged */ 
       if (t1.tm_year<80) 
	 t1.tm_year = t1.tm_year + 100; 

       if (time_invalid)
         parsed_exeinfo->time = -1;
       else 
         parsed_exeinfo->time = mktime(&t1);
       parsed_exeinfo->size = size;

#else
	eventlog(eventlog_level_error,__FUNCTION__,"Your system does not support mktime(). Please select another exeinfo matching method.");
	return NULL;
#endif
  }

  return parsed_exeinfo;
}