📄 versioncheck.c
字号:
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 */ }}void free_parsed_exeinfo(t_parsed_exeinfo * parsed_exeinfo){ if (parsed_exeinfo) { if (parsed_exeinfo->exe) xfree((void *)parsed_exeinfo->exe); xfree((void *)parsed_exeinfo); }}extern int versioncheck_validate(t_versioncheck * vc, t_tag archtag, t_tag clienttag, char const * exeinfo, unsigned long versionid, unsigned long gameversion, unsigned long checksum){ t_elem const * curr; t_versioninfo * vi; int badexe,badcs; t_parsed_exeinfo * parsed_exeinfo; if (!vc) { eventlog(eventlog_level_error,__FUNCTION__,"got NULL vc"); return -1; } badexe=badcs = 0; parsed_exeinfo = parse_exeinfo(exeinfo); LIST_TRAVERSE_CONST(versioninfo_head,curr) { if (!(vi = elem_get_data(curr))) /* should not happen */ { eventlog(eventlog_level_error,__FUNCTION__,"version list contains NULL item"); continue; } if (vi->archtag != archtag) continue; if (vi->clienttag != clienttag) continue; if (strcmp(vi->eqn,vc->eqn)!=0) continue; if (strcmp(vi->mpqfile,vc->mpqfile)!=0) continue; if (vi->versionid && vi->versionid != versionid) continue; if (vi->gameversion && vi->gameversion != gameversion) continue; if ((!(parsed_exeinfo)) || (vi->parsed_exeinfo && (versioncheck_compare_exeinfo(vi->parsed_exeinfo,parsed_exeinfo) != 0))) { /* * Found an entry matching but the exeinfo doesn't match. * We need to rember this because if no other matching versions are found * we will return badversion. */ badexe = 1; } else badexe = 0; if (vi->checksum && vi->checksum != checksum) { /* * Found an entry matching but the checksum doesn't match. * We need to rember this because if no other matching versions are found * we will return badversion. */ badcs = 1; } else badcs = 0; if (vc->versiontag) xfree((void *)vc->versiontag); vc->versiontag = xstrdup(vi->versiontag); if (badexe || badcs) continue; /* Ok, version and checksum matches or exeinfo/checksum are disabled * anyway we have found a complete match */ eventlog(eventlog_level_info,__FUNCTION__,"got a matching entry: %s",vc->versiontag); free_parsed_exeinfo(parsed_exeinfo); return 1; } if (badcs) /* A match was found but the checksum was different */ { eventlog(eventlog_level_info,__FUNCTION__,"bad checksum, closest match is: %s",vc->versiontag); free_parsed_exeinfo(parsed_exeinfo); return -1; } if (badexe) /* A match was found but the exeinfo string was different */ { eventlog(eventlog_level_info,__FUNCTION__,"bad exeinfo, closest match is: %s",vc->versiontag); free_parsed_exeinfo(parsed_exeinfo); return -1; } /* No match in list */ eventlog(eventlog_level_info,__FUNCTION__,"no match in list, setting to: %s",vc->versiontag); free_parsed_exeinfo(parsed_exeinfo); return 0;}extern int versioncheck_load(char const * filename){ FILE * fp; unsigned int line; unsigned int pos; char * buff; char * temp; char const * eqn; char const * mpqfile; char const * archtag; char const * clienttag; char const * exeinfo; char const * versionid; char const * gameversion; char const * checksum; char const * versiontag; t_versioninfo * vi; if (!filename) { eventlog(eventlog_level_error,__FUNCTION__,"got NULL filename"); return -1; } if (!(versioninfo_head = list_create())) { eventlog(eventlog_level_error,__FUNCTION__,"could create list"); return -1; } if (!(fp = fopen(filename,"r"))) { eventlog(eventlog_level_error,__FUNCTION__,"could not open file \"%s\" for reading (fopen: %s)",filename,pstrerror(errno)); list_destroy(versioninfo_head); versioninfo_head = NULL; return -1; } line = 1; for (; (buff = file_get_line(fp)); line++) { for (pos=0; buff[pos]=='\t' || buff[pos]==' '; pos++); if (buff[pos]=='\0' || buff[pos]=='#') { continue; } if ((temp = strrchr(buff,'#'))) { unsigned int len; unsigned int endpos; *temp = '\0'; len = strlen(buff)+1; for (endpos=len-1; buff[endpos]=='\t' || buff[endpos]==' '; endpos--); buff[endpos+1] = '\0'; } if (!(eqn = next_token(buff,&pos))) { eventlog(eventlog_level_error,__FUNCTION__,"missing eqn near line %u of file \"%s\"",line,filename); continue; } line++; if (!(mpqfile = next_token(buff,&pos))) { eventlog(eventlog_level_error,__FUNCTION__,"missing mpqfile near line %u of file \"%s\"",line,filename); continue; } line++; if (!(archtag = next_token(buff,&pos))) { eventlog(eventlog_level_error,__FUNCTION__,"missing archtag near line %u of file \"%s\"",line,filename); continue; } line++; if (!(clienttag = next_token(buff,&pos))) { eventlog(eventlog_level_error,__FUNCTION__,"missing clienttag near line %u of file \"%s\"",line,filename); continue; } line++; if (!(exeinfo = next_token(buff,&pos))) { eventlog(eventlog_level_error,__FUNCTION__,"missing exeinfo near line %u of file \"%s\"",line,filename); continue; } line++; if (!(versionid = next_token(buff,&pos))) { eventlog(eventlog_level_error,__FUNCTION__,"missing versionid near line %u of file \"%s\"",line,filename); continue; } line++; if (!(gameversion = next_token(buff,&pos))) { eventlog(eventlog_level_error,__FUNCTION__,"missing gameversion near line %u of file \"%s\"",line,filename); continue; } line++; if (!(checksum = next_token(buff,&pos))) { eventlog(eventlog_level_error,__FUNCTION__,"missing checksum near line %u of file \"%s\"",line,filename); continue; } line++; if (!(versiontag = next_token(buff,&pos))) { versiontag = NULL; } vi = xmalloc(sizeof(t_versioninfo)); vi->eqn = xstrdup(eqn); vi->mpqfile = xstrdup(mpqfile); if (strlen(archtag)!=4) { eventlog(eventlog_level_error,__FUNCTION__,"invalid arch tag on line %u of file \"%s\"",line,filename); xfree((void *)vi->mpqfile); /* avoid warning */ xfree((void *)vi->eqn); /* avoid warning */ xfree(vi); continue; } if (!tag_check_arch((vi->archtag = tag_str_to_uint(archtag)))) { eventlog(eventlog_level_error,__FUNCTION__,"got unknown archtag \"%s\"",archtag); xfree((void *)vi->mpqfile); /* avoid warning */ xfree((void *)vi->eqn); /* avoid warning */ xfree(vi); continue; } if (strlen(clienttag)!=4) { eventlog(eventlog_level_error,__FUNCTION__,"invalid client tag on line %u of file \"%s\"",line,filename); xfree((void *)vi->mpqfile); /* avoid warning */ xfree((void *)vi->eqn); /* avoid warning */ xfree(vi); continue; } if (!tag_check_client((vi->clienttag = tag_str_to_uint(clienttag)))) { eventlog(eventlog_level_error,__FUNCTION__,"got unknown clienttag\"%s\"",clienttag); xfree((void *)vi->mpqfile); /* avoid warning */ xfree((void *)vi->eqn); /* avoid warning */ xfree(vi); continue; } if (strcmp(exeinfo, "NULL") == 0) vi->parsed_exeinfo = NULL; else { if (!(vi->parsed_exeinfo = parse_exeinfo(exeinfo))) { eventlog(eventlog_level_error,__FUNCTION__,"encountered an error while parsing exeinfo"); xfree((void *)vi->mpqfile); /* avoid warning */ xfree((void *)vi->eqn); /* avoid warning */ xfree(vi); continue; } } vi->versionid = strtoul(versionid,NULL,0); if (verstr_to_vernum(gameversion,&vi->gameversion)<0) { eventlog(eventlog_level_error,__FUNCTION__,"malformed version on line %u of file \"%s\"",line,filename); xfree((void *)vi->parsed_exeinfo); /* avoid warning */ xfree((void *)vi->mpqfile); /* avoid warning */ xfree((void *)vi->eqn); /* avoid warning */ xfree(vi); continue; } vi->checksum = strtoul(checksum,NULL,0); if (versiontag) vi->versiontag = xstrdup(versiontag); else vi->versiontag = NULL; list_append_data(versioninfo_head,vi); } file_get_line(NULL); // clear file_get_line buffer if (fclose(fp)<0) eventlog(eventlog_level_error,__FUNCTION__,"could not close versioncheck file \"%s\" after reading (fclose: %s)",filename,pstrerror(errno)); return 0;}extern int versioncheck_unload(void){ t_elem * curr; t_versioninfo * vi; if (versioninfo_head) { LIST_TRAVERSE(versioninfo_head,curr) { if (!(vi = elem_get_data(curr))) /* should not happen */ { eventlog(eventlog_level_error,__FUNCTION__,"version list contains NULL item"); continue; } if (list_remove_elem(versioninfo_head,&curr)<0) eventlog(eventlog_level_error,__FUNCTION__,"could not remove item from list"); if (vi->parsed_exeinfo) { if (vi->parsed_exeinfo->exe) xfree((void *)vi->parsed_exeinfo->exe); xfree((void *)vi->parsed_exeinfo); /* avoid warning */ } xfree((void *)vi->mpqfile); /* avoid warning */ xfree((void *)vi->eqn); /* avoid warning */ if (vi->versiontag) xfree((void *)vi->versiontag); /* avoid warning */ xfree(vi); } if (list_destroy(versioninfo_head)<0) return -1; versioninfo_head = NULL; } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -