//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 */ } }
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; }