⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 versioncheck.c

📁 打魔兽战网的都知道他是什么
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -