int compareVersion(char* version1, char* version2) {
  int pos1 = 0, pos2 = 0;
  int endflag1 = 0, endflag2 = 0;
  for(; version1[pos1]!='.' && version1[pos1]!=0; ++pos1) ;
  if(version1[pos1] == 0) endflag1 = 1;
  for(; version2[pos2]!='.' && version2[pos2]!=0; ++pos2) ;
  if(version2[pos2] == 0) endflag2 = 1;
  version1[pos1] = 0;
  version2[pos2] = 0;
  int n1 = 0, n2= 0;
  if(pos1 != 0) n1 = atoi(version1);
  if(pos2 != 0) n2 = atoi(version2);
  printf("n1--->%d \n",n1);
  printf("n2--->%d \n",n2);

  if(n1 > n2) return 1;
  if(n1 < n2) return -1;
  if(n1 == n2)
  {
    if(endflag1==0 && endflag2==0) return compareVersion(version1+pos1+1, version2+pos2+1);
    if(endflag1==0 && endflag2==1) return compareVersion(version1+pos1+1, version2 + pos2);
    if(endflag1==1 && endflag2==0) return compareVersion(version1 + pos1, version2+pos2+1);;
    if(endflag1==1 && endflag2==1) return 0;
  }
}
Example #2
0
void CalculateCryptKeys( const std::string& name, TCryptInfo& infoCrypt )
{
  size_t len = name.length();
  if ( ( strnicmp( "none", name.c_str(), len ) == 0 ) ||
       ( strnicmp( "ignition", name.c_str(), len ) == 0 ) ||
       ( strnicmp( "uorice", name.c_str(), len ) == 0 ) )
  {
    infoCrypt.eType = CRYPT_NOCRYPT;
    infoCrypt.uiKey1 = 0;
    infoCrypt.uiKey2 = 0;
  }
  else if ( strnicmp( "2.0.0x", name.c_str(), 6 ) == 0 )
  {
    infoCrypt.eType = CRYPT_BLOWFISH_TWOFISH;
    infoCrypt.uiKey1 = 0x2D13A5FD;
    infoCrypt.uiKey2 = 0xA39D527F;
  }
  else
  {
    try
    {
      size_t dot1 = name.find_first_of( '.', 0 );
      size_t dot2 = name.find_first_of( '.', dot1 + 1 );

      int major = atoi( name.substr( 0, dot1 ).c_str() );
      int minor = atoi( name.substr( dot1 + 1, dot2 - dot1 - 1 ).c_str() );
      int build = atoi( name.substr( dot2 + 1, len - dot2 - 1 ).c_str() );

      int temp = ( ( major << 9 | minor ) << 10 | build ) ^ ( ( build * build ) << 5 );
      infoCrypt.uiKey1 = ( temp << 4 ) ^ ( minor * minor ) ^ ( minor * 0x0B000000 ) ^
                         ( build * 0x380000 ) ^ 0x2C13A5FD;
      temp = ( ( ( major << 9 | build ) << 10 | minor ) * 8 ) ^ ( build * build * 0x0c00 );
      infoCrypt.uiKey2 =
          temp ^ ( minor * minor ) ^ ( minor * 0x6800000 ) ^ ( build * 0x1c0000 ) ^ 0x0A31D527F;

      if ( compareVersion( 1, 25, 35, major, minor, build ) )
        infoCrypt.eType = CRYPT_OLD_BLOWFISH;
      else if ( ( major == 1 ) && ( minor == 25 ) && ( build == 36 ) )
        infoCrypt.eType = CRYPT_1_25_36;
      else if ( compareVersion( 2, 0, 0, major, minor, build ) )
        infoCrypt.eType = CRYPT_BLOWFISH;
      else if ( compareVersion( 2, 0, 3, major, minor, build ) )
        infoCrypt.eType = CRYPT_BLOWFISH_TWOFISH;
      else
        infoCrypt.eType = CRYPT_TWOFISH;
    }
    catch ( ... )
    {
      infoCrypt.eType = CRYPT_NOCRYPT;
      infoCrypt.uiKey1 = 0;
      infoCrypt.uiKey2 = 0;
      POLLOG_ERROR << "Malformed encryption version string: " << name
                   << "using Ignition encryption engine\n";
    }
  }
}
Example #3
0
void *selfUpdate(void *params)
{
    version_t newVer;
    version_t localVer;
    int ret;
    
    memset(&newVer, 0, sizeof(version_t));
    memset(&localVer, 0, sizeof(version_t));
    getLocalVersion(&localVer);
    FiUpdateAssistant::getinstance()->setPlatform(MAS_SRV);
    /*-----------------------------------------------------------------------------
     *  watch patch_version if changed.
     *-----------------------------------------------------------------------------*/
    while (true)
    {
        sleep(1);
        getLocalVersion(&newVer);
        ret = compareVersion(&localVer, &newVer);        
        if (ret == 0 )
        {
            continue;
        }
        else if (ret < 0)
        {
            //update local
            if (!updatePkg(&newVer))
            {
                ut_dbg("update pkg fail patchNo:%s !!!! no pkg valid ?\n", newVer.patchNo);
            }
            memcpy((void *)&FiUpdateAssistant::getinstance()->netVer,
                    (void *)&newVer, sizeof(version_t));
            if (0 != FiUpdateAssistant::getinstance()->installAllPatch(&localVer))
            {
                FiUpdateAssistant::getinstance()->restartAPP("fics");
                goto exit;
            }
            else
            {
                memcpy((void *)&localVer, (void *)&newVer, sizeof(version_t));
                ut_dbg("update down\n");
            }
        }
        else if (ret > 0 && ret != 1000000)
        {
            //rollback
            memcpy((void *)&FiUpdateAssistant::getinstance()->netVer,
                    (void *)&newVer, sizeof(version_t));
            FiUpdateAssistant::getinstance()->RollBack(&newVer);
            FiUpdateAssistant::getinstance()->restartAPP("fics");
            goto exit;
        }
    }
    return NULL;
exit:
    UpdateSrv->shutdown();
    exit(0);
    return NULL;
}
Example #4
0
int main (int argc, char* argv[]){
	char v1[1000];
	char v2[1000];
	printf("enter first version number:\n");
	scanf("%s\n",v1);
	printf("enter second version number:\n");
	scanf("%s\n",v2);
	//printf("%s,%s\n",v1,v2);
	printf("result: %d\n",compareVersion(v1,v2));
	return EXIT_SUCCESS;
}
	int compareVersion(string version1, string version2) {
		int v1,v2;
		int v1pointpos=version1.find(‘.’),v2pointpos=version2.find(‘.’);
		v1=toint(v1pointpos!=version1.npos ? version1.substr(0,v1pointpos-0) : version1);
		v2=toint(v2pointpos!=version2.npos ? version2.substr(0,v2pointpos-0) : version2);
		if(v1==v2&&(v1pointpos!=version1.npos||v2pointpos!=version2.npos)) {  //调用自己进行递归处理
		   version1=v1pointpos!=version1.npos ? version1.substr(v1pointpos+1,version1.size()-1-v1pointpos) : “0″;
		   version2=v2pointpos!=version2.npos ? version2.substr(v2pointpos+1,version2.size()-1-v2pointpos) : “0″;
		   return compareVersion(version1,version2);
		} else
		   return v1>v2 ? 1 : v1<v2 ? -1 : 0;
	}
Example #6
0
int Version::compareVersion(const std::string &one, const std::string &two)
{
    int oneMajor = 0, oneMinor = 0, oneMini = 0, oneBuild = 0;
    int twoMajor = 0, twoMinor = 0, twoMini = 0, twoBuild = 0;

    Version::parseVersion(one, oneMajor, oneMinor, oneMini, oneBuild);
    Version::parseVersion(two, twoMajor, twoMinor, twoMini, twoBuild);

    return compareVersion(oneMajor, twoMajor,
                          oneMinor, twoMinor,
                          oneMini, twoMini,
                          oneBuild, twoBuild);
}
Example #7
0
 INT32 compare( const DPS_LSN &lsn ) const
 {
    INT32 rc = 0 ;
    rc = compareVersion( lsn.version ) ;
    if ( 0 != rc )
    {
       goto done ;
    }
    else
    {
       rc = compareOffset( lsn.offset ) ;
       goto done ;
    }
 done:
    return rc ;
 }
	int compareVersion(string version1, string version2) {
		size_t pos1 = version1.find_first_of("."), pos2 = version2.find_first_of('.');//string.find_first_of返回的是位置,不是iterator
		string::iterator p1 = ((pos1 == string::npos) ? version1.end() : version1.begin() + pos1),
			p2 = ((pos2 == string::npos) ? version2.end() : version2.begin() + pos2);
		int res_1 = convert(version1.begin(), p1), res_2 = convert(version2.begin(), p2);
		p1 = (p1 == version1.end()) ? p1 : p1 + 1;//注意这里:如果已经指向字符串结尾就不能再往后移动了
		p2 = (p2 == version2.end()) ? p2 : p2 + 1;
		if (res_1 == res_2&&p1 == version1.end() && p2 == version2.end())
			return 0;
		else if (res_1 > res_2)
			return 1;
		else if (res_1 < res_2)
			return -1;
		else
			return compareVersion(string(p1, version1.end()), string(p2, version2.end()));
	}
Example #9
0
Update_Status UpdateChecker::isUpdateAvailable(const Version& currentVersion)
{
	Update_Status updateAvailable = UPDATER_LATEST_STABLE;

	try {
		CInternetSession internet;
		CHttpFile* versionFile = (CHttpFile*) internet.OpenURL(versionFileURL,
															   1,
															   INTERNET_FLAG_TRANSFER_ASCII | INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_RELOAD,
															   NULL,
															   0);

		if (versionFile) {
			CString latestVersionStr;
			char buffer[101];
			UINT br = 0;

			while ((br = versionFile->Read(buffer, 50)) > 0) {
				buffer[br] = '\0';
				latestVersionStr += buffer;
			}

			if (!parseVersion(latestVersionStr)) {
				updateAvailable = UPDATER_ERROR;
			} else {
				int comp = compareVersion(currentVersion, latestVersion);

				if (comp < 0) {
					updateAvailable = UPDATER_UPDATE_AVAILABLE;
				} else if (comp > 0) {
					updateAvailable = UPDATER_NEWER_VERSION;
				}
			}

			delete versionFile;
		} else {
			updateAvailable = UPDATER_ERROR;
		}
	} catch (CInternetException* pEx) {
		updateAvailable = UPDATER_ERROR;
		pEx->Delete();
	}

	return updateAvailable;
}
// -----------------------------------------------------------------------------
//virtual
bool Solution::Test()
{
    bool pass = true;

    pass = pass
        && (compareVersion("1.0", "1.0") == 0)
        && (compareVersion("1.1", "1.0") == 1)
        && (compareVersion("1.0", "1.1") == -1)
        && (compareVersion("10.0", "1.0") == 1)
        && (compareVersion("1.0", "10.0") == -1)
        && (compareVersion("01", "1") == 0)
        && (compareVersion("1.0.0", "1") == 0)
        ;

    return pass;
}
Example #11
0
 int compareVersion(string version1, string version2) {
     int main1 = std::stoi(version1);
     int main2 = std::stoi(version2);
     
     if (main1 > main2) return 1;
     if (main1 < main2) return -1;
     
     int p1 = version1.find('.');
     int p2 = version2.find('.');
     
     if (p1 == -1 && p2 == -1) {
         return 0;
     } else {
         string sub1 = p1 == -1 ? "0" : version1.substr(p1 + 1, version1.size() - p1);
         string sub2 = p2 == -1 ? "0" : version2.substr(p2 + 1, version2.size() - p2);
         return compareVersion(sub1, sub2);
     }
     
     return 0;
 }
int main(){

    char a[] = "01";
    char b[] = "1";
    char c[] = "1.2";
    char d[] = "13.37";
    char e[] = "1";
    char f[] = "2";
    char g[] = "1";
    char h[] = "1.1";
    printf("%d \n",compareVersion(a,b));
    printf("%d \n",compareVersion(b,c));
    printf("%d \n",compareVersion(c,d));
    printf("%d \n",compareVersion(c,c));
    printf("%d \n",compareVersion(e,f));
    printf("%d \n",compareVersion(g,h));

    return 0;
}
Example #13
0
void ResourceManager::displayExtensions()
      {
      DownloadUtils js(this);
      js.setTarget(baseAddr() + "extensions/details.json");
      js.download();
      QByteArray json = js.returnData();

      // parse the json file
      QJsonParseError err;
      QJsonDocument result = QJsonDocument::fromJson(json, &err);
      if (err.error != QJsonParseError::NoError || !result.isObject()) {
            qDebug("An error occurred during parsing");
            return;
            }
      int rowCount = result.object().keys().size();
      rowCount -= 2; //version and type
      extensionsTable->setRowCount(rowCount);

      int row = 0;
      int col = 0;
      QPushButton* buttonInstall;
      QPushButton* buttonUninstall;
      extensionsTable->verticalHeader()->show();

      QStringList exts = result.object().keys();
      for (QString key : exts) {
            if (!result.object().value(key).isObject())
                  continue;
            QJsonObject value = result.object().value(key).toObject();
            col = 0;
            QString test = value.value("file_name").toString();
            if (test.length() == 0)
                  continue;

            QString filename = value.value("file_name").toString();
            QString name = value.value("name").toString();
            int fileSize = value.value("file_size").toInt();
            QString hashValue = value.value("hash").toString();
            QString version = value.value("version").toString();

            extensionsTable->setItem(row, col++, new QTableWidgetItem(name));
            extensionsTable->setItem(row, col++, new QTableWidgetItem(version));
            extensionsTable->setItem(row, col++, new QTableWidgetItem(stringutils::convertFileSizeToHumanReadable(fileSize)));
            buttonInstall = new QPushButton(tr("Install"));
            buttonUninstall = new QPushButton(tr("Uninstall"));

            connect(buttonInstall, SIGNAL(clicked()), this, SLOT(downloadExtension()));
            connect(buttonUninstall, SIGNAL(clicked()), this, SLOT(uninstallExtension()));
            buttonInstall->setProperty("path", "extensions/" + filename);
            buttonInstall->setProperty("hash", hashValue);
            buttonInstall->setProperty("rowId", row);
            buttonUninstall->setProperty("extensionId", key);
            buttonUninstall->setProperty("rowId", row);

            // get the installed version of the extension if any
            if (Extension::isInstalled(key)) {
                  buttonUninstall->setDisabled(false);
                  QString installedVersion = Extension::getLatestVersion(key);
                  if (compareVersion(installedVersion, version)) {
                        buttonInstall->setText(tr("Update"));
                        }
                  else {
                        buttonInstall->setText(tr("Updated"));
                        buttonInstall->setDisabled(true);
                        }
                  }
            else {
                  buttonUninstall->setDisabled(true);
                  }
            extensionsTable->setIndexWidget(extensionsTable->model()->index(row, col++), buttonInstall);
            extensionsTable->setIndexWidget(extensionsTable->model()->index(row, col++), buttonUninstall);
            row++;
            }
      }
::CORBA::Long FiUpdateMgrImpl::QueryCurVersion(const char* inversion, const char* indate, 
											   const char* inpatchno, ::CORBA::String_out version,
											   ::CORBA::String_out date, ::CORBA::String_out patchno,
											   ::CORBA::String_out hash
											   )
{
    int ret = 0;
    version_t localVer, cliVer;
	version = CORBA::string_dup("");
	date = CORBA::string_dup("");
	patchno = CORBA::string_dup("");
    hash  = CORBA::string_dup("");
 
    memset(&localVer, 0, sizeof (version_t));
    memset(&cliVer, 0, sizeof (version_t));

    strcpy(cliVer.version, inversion);
    strcpy(cliVer.date, indate);
    strcpy(cliVer.patchNo, inpatchno);
    
	ut_dbg("the client version:%s date:%s  patch:%s\n",inversion,indate,inpatchno);
	fflush(stdout);


	std::string strpatchver("");
	std::string strpatchdate("");
	std::string strpatchno("");
    getLocalVersion(&localVer);
	version = CORBA::string_dup(localVer.version);
	date    =  CORBA::string_dup(localVer.date);
	patchno =  CORBA::string_dup(localVer.patchNo);
    hash    =  CORBA::string_dup(localVer.reserved.hash);
	bool rollbackflag=false;
	bool updateflag = false;
    
	ret = compareVersion(&localVer, &cliVer);
    if (ret > 0 && ret != 1000000)
    {
        //update localVer > cliVer
        updateflag = true;
    }
    else if (ret < 0)
    {
        //roll
        //rollbackflag = true;
        updateflag = true;
        ut_dbg("roolback to version:%s date:%s,patch:%s\n",strpatchver.c_str(),strpatchdate.c_str(),strpatchno.c_str());
		fflush(stdout);        
    }
	if (rollbackflag)
	{
		version = CORBA::string_dup(strpatchver.c_str());
		date =  CORBA::string_dup(strpatchdate.c_str());
		patchno =  CORBA::string_dup(strpatchno.c_str());
		ut_dbg("roolback to version:%s date:%s,patch:%s\n",strpatchver.c_str(),strpatchdate.c_str(),strpatchno.c_str());
		fflush(stdout);
        return 1;
	}
	if (updateflag)
	{
		std::string folder;

		std::string patchprix("fics_");
        patchprix += localVer.version;
        patchprix += "_";
        patchprix += localVer.date;
        if (strlen(localVer.patchNo) > 0)
        {
            patchprix += "_";
            patchprix += localVer.patchNo;
        }

#if defined WIN32|| defined WIN64
		char szFind[MAX_PATH];
		char buff1[200];
		int ret = FiGetCurDir(200,buff1);
		WIN32_FIND_DATA FindFileData;
		strcpy(szFind,buff1);
		strcat(szFind,"\\*.*");

		HANDLE hFind=::FindFirstFile(szFind,&FindFileData);
		if(INVALID_HANDLE_VALUE == hFind)
		{
			version = CORBA::string_dup("");
			date = CORBA::string_dup("");
			patchno = CORBA::string_dup("");
			printf("no package is available!****!! line:%d\n",__LINE__);
			fflush(stdout);
			return -3;
		}

		while(TRUE)
		{
			if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
			{
				if(FindFileData.cFileName[0]!='.')
				{
					if (strcmp(FindFileData.cFileName,patchprix.c_str())>0)
					{
						if (folder.length()>0)
						{
							if (strcmp(folder.c_str(),FindFileData.cFileName)>0)
							{
								folder = FindFileData.cFileName;
							}

						}
						else
						{
							folder = FindFileData.cFileName;
						}

					}
				}
			}

			if(!FindNextFile(hFind,&FindFileData))
				break;
		}
		FindClose(hFind);
#else
		DIR *dp;
		struct dirent *entry;
		
		char buff1[200];
		int ret = getPkgDlDir(200,buff1);
		if((dp = opendir(buff1)) == NULL)
		{
			version = CORBA::string_dup("");
			date = CORBA::string_dup("");
			patchno = CORBA::string_dup("");
			ut_dbg("no package is available!****!!\n");
			fflush(stdout);
			return -5;
		}
		while((entry = readdir(dp)) != NULL)
		{  
			struct stat statbuf;
			std::string fullname=buff1;
			fullname+=entry->d_name;
			lstat(fullname.c_str(), &statbuf);
			if(S_ISDIR(statbuf.st_mode))
			{  
				if (strcmp(".", entry->d_name) == 0 || strcmp("..", entry->d_name) == 0)  
					continue;
				if (strcmp(entry->d_name, patchprix.c_str()) == 0)//本地版本较 客户端版本 ==
				{
                    folder =entry->d_name;
                    break;
#if 0
					if (folder.length()>0)
					{
						if (strcmp(folder.c_str(),entry->d_name)<0)//sean >0 --> <0
						{
							folder = entry->d_name;
						}

					}
					else
					{
						folder =entry->d_name;
					}
#endif
				}
			}  

		}  

		closedir(dp);                  
#endif
        if (folder.empty())return 1;
		//assert(!folder.empty());
		
		std::string selectversion ;
		std::string selectdate;
        char *posTmp = NULL;
        char *sdate  = NULL ;
        char *sversion = NULL;
        char *spatchNo = NULL;

        char strBuf[100] = {0};

        strcpy(strBuf, folder.c_str());
        posTmp = strchr(strBuf, '_');//_v1.0.0
        sversion = posTmp+1;
        posTmp = strchr(posTmp+1, '_');//_2015
        *posTmp = '\0';
        sdate = posTmp+1;
        posTmp = strchr(posTmp+1, '_');//_4005
        *posTmp = '\0';
        spatchNo = posTmp+1;
        //pos = strchr(pos+1, '_');//_4005
        selectversion = sversion;
        selectdate = sdate;
        strpatchno = spatchNo;
		version = CORBA::string_dup(selectversion.c_str());
		date =  CORBA::string_dup(selectdate.c_str());
		patchno =  CORBA::string_dup(strpatchno.c_str());
		ut_dbg("client ip[11.11.11.11]port[1111] update to version:%s date:%s, patchno:%s\n",selectversion.c_str(),selectdate.c_str(),strpatchno.c_str());
		fflush(stdout);
		return 1;
	}
	
	return 1;
}
int main(){
    char *ver1 = "1.1";
    char *ver2 = "1.2";
    compareVersion(ver1, ver2);
    return 0;
}
int main(int argc, const char * argv[])
{
    printf("%d\n", compareVersion("01", "1"));
    
    return 0;
}
Example #17
0
/**
 * @brief 接收master/其他server 的心跳包,更新download下的当前zip全版本安装包。master只发心跳包,不接收(master是所有的源)。
 *
 * @param params
 *
 * @return 
 */
void* recvHelloHandler(void *params)
{
    int s;                                       
    struct sockaddr_in local_addr; 
    version_t localVer;
    int err = -1;

    memset(&localVer, 0, sizeof(localVer));
    s = socket(AF_INET, SOCK_DGRAM, 0);     
    if (s == -1)
    {
        perror("socket()");
        return (void *)-1;
    }   

    memset(&local_addr, 0, sizeof(local_addr));
    local_addr.sin_family = AF_INET;
    local_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    local_addr.sin_port = htons(MCAST_PORT);

    /*绑定socket*/
    err = bind(s,(struct sockaddr*)&local_addr, sizeof(local_addr)) ;
    if(err < 0)
    {
        ut_err("bind()fail errno[%d]\n", errno);
        return (void *)-2;
    }

    /*设置回环许可*/
    int loop = 0;//禁止
    err = setsockopt(s,IPPROTO_IP, IP_MULTICAST_LOOP,&loop, sizeof(loop));
    if(err < 0)
    {
        ut_err("setsockopt():IP_MULTICAST_LOOP\n");
        return (void *)-3;
    }

    struct ip_mreq mreq;                                     /*加入广播组*/
    mreq.imr_multiaddr.s_addr = inet_addr(MCAST_ADDR);   /*广播地址*/
    mreq.imr_interface.s_addr = htonl(INADDR_ANY);   /*网络接口为默认*/
    /*将本机加入广播组*/
    err = setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP,&mreq, sizeof
            (mreq));
    if (err < 0)
    {
        ut_err("setsockopt():IP_ADD_MEMBERSHIP\n");
        return (void *)-4;
    }

    int addr_len = 0;
    helloType_t buff;
    int n = 0;
    while (1)
    {
        addr_len = sizeof(local_addr);
        memset(&buff, 0, sizeof(buff));                  /*清空接收缓冲区*/
        /*接收数据*/
        n = recvfrom(s, &buff, sizeof(buff), 0,(struct sockaddr*)&local_addr,
                &addr_len);
        if( n == -1)
        {
            ut_err("recvfrom()\n");
        }
        if (strcmp(buff.action, "action:hello") != 0 || buff.endPoint.type != LEADER)
        {
            continue;
        }
        /*打印信息*/
        ut_dbg("Recv hello message from server:%s\n", buff.version);
        getLocalVersion(&localVer);
        version_t net;
        int ret;
        memset(&net, 0, sizeof(net));
        char *version = strstr(buff.version, "_v");//version:fics_v2.1.0_2015.09.04
        if (version)version++;
        char *date = strchr(version, '_');
        if (date)*date++='\0';
        char *patchNo = strchr(date, '_');
        if (patchNo)patchNo++;
        if (version)strcpy(net.version, version);
        if (date)strcpy(net.date, date);
        if (patchNo)strcpy(net.patchNo, patchNo);
        ret = compareVersion(&localVer, &net);
        if ( ret!= 0 && ret!=1000000)
        {
            char *ip = strstr(buff.endPoint.ip, "ip:");
            ip = ip+strlen("ip:");
            char srcFile[256]={0};
            char cmdBuf[250]={0};
            sprintf(srcFile, "/sobey/fics/download/fics_%s_%s", net.version, net.date);
            if (patchNo)sprintf(srcFile+strlen(srcFile), "_%s", patchNo);
            strcat(srcFile, ".zip");
            //down file
            ret = FiUpdateAssistant::getinstance()->downloadFile(ip, srcFile, srcFile);
            if (ret == 0)
            {
                ut_dbg("download file success\n");
                //modify local patch_version
                char patchVerBuf[200];

                sprintf(cmdBuf, "unzip %s -d %s", srcFile, _PATH_PKG_DL);
                system(cmdBuf);//unzip pkg
                writeLocalVer(&net);
                //overwrite patch_version
            }
            else
            {
                ut_err("download file fail\n");
                sprintf(cmdBuf, "rm %s -rf", srcFile);
                system(cmdBuf);
            }
        }
        sleep(MCAST_INTERVAL);
    }

    /*退出广播组*/
    err = setsockopt(s, IPPROTO_IP, IP_DROP_MEMBERSHIP,&mreq, sizeof
            (mreq));

    close(s);
    return NULL;
}