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; } }
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"; } } }
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; }
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; }
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); }
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())); }
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; }
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; }
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; }
/** * @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; }