From 1b82bd045caa968b30a8f7335013f6a5f9d4532a Mon Sep 17 00:00:00 2001 From: jdh8d <jdh8d@git.zephyr-software.com> Date: Thu, 11 Feb 2016 15:52:35 +0000 Subject: [PATCH] Former-commit-id: cf0bb3bcd16382677f4126ee4b7fe236a6ef01ae --- .gitattributes | 1 + libIRDB/include/core/baseobj.hpp | 2 +- libIRDB/include/core/file.hpp | 10 +++- libIRDB/include/core/fileir.hpp | 2 + libIRDB/include/core/scoop.hpp | 81 ++++++++++++++++++++++++++++++++ libIRDB/include/libIRDB-core.hpp | 1 + libIRDB/src/core/file.cpp | 14 ++++-- libIRDB/src/core/fileir.cpp | 1 + libIRDB/src/core/variantid.cpp | 27 +++++++++-- 9 files changed, 127 insertions(+), 12 deletions(-) create mode 100644 libIRDB/include/core/scoop.hpp diff --git a/.gitattributes b/.gitattributes index dbc76b78d..4108f9dcb 100644 --- a/.gitattributes +++ b/.gitattributes @@ -215,6 +215,7 @@ libIRDB/include/core/icfs.hpp -text libIRDB/include/core/instruction.hpp -text libIRDB/include/core/pqxxdb.hpp -text libIRDB/include/core/reloc.hpp -text +libIRDB/include/core/scoop.hpp -text libIRDB/include/core/type.hpp -text libIRDB/include/core/variantid.hpp -text libIRDB/include/libIRDB-cfg.hpp -text diff --git a/libIRDB/include/core/baseobj.hpp b/libIRDB/include/core/baseobj.hpp index 06a2feb94..23b495823 100644 --- a/libIRDB/include/core/baseobj.hpp +++ b/libIRDB/include/core/baseobj.hpp @@ -41,7 +41,7 @@ class BaseObj_t void SetDoipID(doip_t *dp) { doip=dp; } void SetBaseID(db_id_t id) {base_id=id; } - static const db_id_t NOT_IN_DATABASE; + static const db_id_t NOT_IN_DATABASE; protected: static DBinterface_t *dbintr; diff --git a/libIRDB/include/core/file.hpp b/libIRDB/include/core/file.hpp index f6c860aa9..aefafef8b 100644 --- a/libIRDB/include/core/file.hpp +++ b/libIRDB/include/core/file.hpp @@ -23,8 +23,12 @@ class File_t : public BaseObj_t { public: // create new item. - File_t(db_id_t file_id, db_id_t orig_fid, std::string url, std::string hash, std::string arch, int elfoid, - std::string atn, std::string ftn, std::string itn, std::string icfs, std::string icfs_map, std::string rtn, std::string typ, db_id_t doipid); + File_t( const db_id_t &file_id, const db_id_t &orig_fid, const std::string &url, + const std::string &hash, const std::string &arch, const int &elfoid, + const std::string &atn, const std::string &ftn, const std::string &itn, + const std::string &icfs, const std::string &icfs_map, + const std::string &rtn, const std::string &typ, const std::string &scoop, + const db_id_t &doipid); File_t(db_id_t file_id) : BaseObj_t(NULL) { assert(0);} // read from DB void WriteToDB() { assert(0); } // writes to DB ID is not -1. @@ -37,6 +41,7 @@ class File_t : public BaseObj_t std::string GetICFSMapTableName() { return icfs_map_table_name; } std::string GetRelocationsTableName() { return relocs_table_name; } std::string GetTypesTableName() { return types_table_name; } + std::string GetScoopTableName() { return scoop_table_name; } std::string GetURL() { return url; } void CreateTables(); @@ -69,5 +74,6 @@ class File_t : public BaseObj_t std::string icfs_map_table_name; std::string relocs_table_name; std::string types_table_name; + std::string scoop_table_name; int elfoid; }; diff --git a/libIRDB/include/core/fileir.hpp b/libIRDB/include/core/fileir.hpp index 0aa9a60b9..017173d03 100644 --- a/libIRDB/include/core/fileir.hpp +++ b/libIRDB/include/core/fileir.hpp @@ -42,6 +42,7 @@ class FileIR_t : public BaseObj_t InstructionSet_t& GetInstructions() { return insns; } AddressSet_t& GetAddresses() { return addrs; } RelocationSet_t& GetRelocations() { return relocs; } + DataScoopSet_t& GetDataScoops() { return scoops; } ICFSSet_t& GetAllICFS() { return icfs_set; } // generate the spri rules into the output file, fout. @@ -93,6 +94,7 @@ class FileIR_t : public BaseObj_t AddressSet_t addrs; RelocationSet_t relocs; TypeSet_t types; + DataScoopSet_t scoops; VariantID_t progid; ICFSSet_t icfs_set; File_t* fileptr; diff --git a/libIRDB/include/core/scoop.hpp b/libIRDB/include/core/scoop.hpp new file mode 100644 index 000000000..98d74c2d2 --- /dev/null +++ b/libIRDB/include/core/scoop.hpp @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2016 - Zephyr Software LLC + * + * This file may be used and modified for non-commercial purposes as long as + * all copyright, permission, and nonwarranty notices are preserved. + * Redistribution is prohibited without prior written consent from Zephyr + * Software. + * + * Please contact the authors for restrictions applying to commercial use. + * + * THIS SOURCE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF + * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * Author: Zephyr Software + * e-mail: jwd@zephyr-software.com + * URL : http://www.zephyr-software.com/ + * + */ + +#ifndef libirdb_data_scoop_hpp +#define libirdb_data_scoop_hpp + +class DataScoop_t : public BaseObj_t +{ + + public: + DataScoop_t( libIRDB::db_id_t id, + std::string p_name, + libIRDB::AddressID_t* p_start, + libIRDB::AddressID_t* p_end, + libIRDB::Type_t* p_type, + int p_permissions) + : + BaseObj_t(NULL), + name(p_name), + start(p_start), + end(p_end), + type(p_type), + permissions(p_permissions) + { + SetBaseID(id); + } + + std::string GetName() const { return name; } + libIRDB::AddressID_t* GetStart() const { return start; } + libIRDB::AddressID_t* GetEnd() const { return end; } + libIRDB::Type_t* GetType() const { return type; } + bool isReadable() const { return (permissions & permissions_r) == permissions_r; } + bool isWriteable() const { return (permissions & permissions_w) == permissions_w; }; + bool isExecuteable() const { return (permissions & permissions_x) == permissions_x; }; + + void SetName(const std::string &n) { name=n; } + void SetStart( libIRDB::AddressID_t* addr) { start=addr; } + void SetEnd( libIRDB::AddressID_t* addr ) { end=addr; } + void SetType( libIRDB::Type_t* t) { type=t; } + + void SetReadable() { permissions |= permissions_r; } + void SetWriteable() { permissions |= permissions_w; } + void SetExecuteable() { permissions |= permissions_x; } + + void ClearReadable() { permissions &= ~permissions_r; } + void ClearWriteable() { permissions &= ~permissions_w; } + void ClearExecuteable() { permissions &= ~permissions_x; } + + private: + const int permissions_r=4; + const int permissions_w=2; + const int permissions_x=1; + + std::string name; + libIRDB::AddressID_t* start; + libIRDB::AddressID_t* end; + libIRDB::Type_t* type; + int permissions; + +}; + +typedef std::set<DataScoop_t*> DataScoopSet_t; + +#endif diff --git a/libIRDB/include/libIRDB-core.hpp b/libIRDB/include/libIRDB-core.hpp index 85b7addd2..1cb8bae45 100644 --- a/libIRDB/include/libIRDB-core.hpp +++ b/libIRDB/include/libIRDB-core.hpp @@ -50,6 +50,7 @@ class Instruction_t; // forward decl for many classes #include <core/variantid.hpp> #include <core/archdesc.hpp> #include <core/type.hpp> +#include <core/scoop.hpp> #include <core/fileir.hpp> #include <core/pqxxdb.hpp> diff --git a/libIRDB/src/core/file.cpp b/libIRDB/src/core/file.cpp index bbaae5778..37438cbb7 100644 --- a/libIRDB/src/core/file.cpp +++ b/libIRDB/src/core/file.cpp @@ -31,11 +31,16 @@ using namespace std; -File_t::File_t(db_id_t myfile_id, db_id_t my_orig_fid, std::string myurl, std::string myhash, std::string myarch, int myoid, - std::string atn, std::string ftn, std::string itn, std::string icfs, std::string icfs_map, std::string rtn, std::string typ, db_id_t mydoipid) : +File_t::File_t(const db_id_t &myfile_id, const db_id_t &my_orig_fid, const std::string &myurl, + const std::string &myhash, const std::string &myarch, const int &myoid, + const std::string &atn, const std::string &ftn, const std::string &itn, const std::string &icfs, + const std::string &icfs_map, const std::string &rtn, const std::string &typ, const std::string &scoop, + const db_id_t &mydoipid) + : BaseObj_t(NULL), url(myurl), hash(myhash), arch(myarch), elfoid(myoid), - address_table_name(atn), function_table_name(ftn), instruction_table_name(itn), icfs_table_name(icfs), icfs_map_table_name(icfs_map), - relocs_table_name(rtn), types_table_name(typ), orig_fid(my_orig_fid) + address_table_name(atn), function_table_name(ftn), instruction_table_name(itn), + icfs_table_name(icfs), icfs_map_table_name(icfs_map), relocs_table_name(rtn), + types_table_name(typ), scoop_table_name(scoop), orig_fid(my_orig_fid) { SetBaseID(myfile_id); } @@ -57,6 +62,7 @@ void File_t::CreateTables() icfs_map_table_name+" "+ relocs_table_name+" "+ types_table_name+" "+ + scoop_table_name+" "+ tmpfile; system(command.c_str()); diff --git a/libIRDB/src/core/fileir.cpp b/libIRDB/src/core/fileir.cpp index 528abf233..af2bbcc89 100644 --- a/libIRDB/src/core/fileir.cpp +++ b/libIRDB/src/core/fileir.cpp @@ -497,6 +497,7 @@ void FileIR_t::WriteToDB() dbintr->IssueQuery(string("TRUNCATE TABLE ")+ fileptr->address_table_name + string(" cascade;")); dbintr->IssueQuery(string("TRUNCATE TABLE ")+ fileptr->relocs_table_name + string(" cascade;")); dbintr->IssueQuery(string("TRUNCATE TABLE ")+ fileptr->types_table_name + string(" cascade;")); + dbintr->IssueQuery(string("TRUNCATE TABLE ")+ fileptr->scoop_table_name + string(" cascade;")); /* and now that everything has an ID, let's write to the DB */ diff --git a/libIRDB/src/core/variantid.cpp b/libIRDB/src/core/variantid.cpp index dea26ea95..0492d3af2 100644 --- a/libIRDB/src/core/variantid.cpp +++ b/libIRDB/src/core/variantid.cpp @@ -188,6 +188,7 @@ File_t* VariantID_t::CloneFile(File_t* fptr) std::string icfs="icfsfid"+to_string(newfid); std::string icfsmap="icfsmapfid"+to_string(newfid); std::string rtn="rtnfid"+to_string(newfid); + std::string dtn="dtnfid"+to_string(newfid); std::string typ="typfid"+to_string(newfid); q ="update file_info set address_table_name='"; @@ -204,13 +205,15 @@ File_t* VariantID_t::CloneFile(File_t* fptr) q+=rtn; q+="', types_table_name='"; q+=typ; + q+="', scoop_table_name='"; + q+=dtn; q+="' where file_id='"; q+=to_string(newfid); q+="' ; "; dbintr->IssueQuery(q); - File_t* newfile=new File_t(newfid, fptr->orig_fid, fptr->url, fptr->hash, fptr->arch, fptr->elfoid, atn, ftn, itn, icfs, icfsmap, rtn, typ, fptr->GetDoipID()); + File_t* newfile=new File_t(newfid, fptr->orig_fid, fptr->url, fptr->hash, fptr->arch, fptr->elfoid, atn, ftn, itn, icfs, icfsmap, rtn, typ, dtn, fptr->GetDoipID()); newfile->CreateTables(); @@ -250,6 +253,11 @@ File_t* VariantID_t::CloneFile(File_t* fptr) q+=" ; "; dbintr->IssueQuery(q); + q="drop table "; + q+=dtn; + q+=" ; "; + dbintr->IssueQuery(q); + // next issue SQL to clone each table q="select * into "; q+=atn; @@ -300,7 +308,13 @@ File_t* VariantID_t::CloneFile(File_t* fptr) q+=" ;"; dbintr->IssueQuery(q); - // update the variant dependency table to represent the deep clone + q="select * into "; + q+=dtn; + q+=" from "; + q+=fptr->scoop_table_name; + q+=" ;"; + dbintr->IssueQuery(q); + // update the variant dependency table to represent the deep clone q = "update variant_dependency set file_id='" + @@ -381,8 +395,10 @@ File_t* VariantID_t::GetMainFile() const void VariantID_t::ReadFilesFromDB() { - std::string q= "select file_info.orig_file_id, file_info.address_table_name, file_info.instruction_table_name, file_info.icfs_table_name,file_info.icfs_map_table_name," - " file_info.function_table_name, file_info.relocs_table_name, file_info.types_table_name, file_info.file_id, file_info.url, file_info.hash," + std::string q= "select file_info.orig_file_id, file_info.address_table_name, " + " file_info.instruction_table_name, file_info.icfs_table_name,file_info.icfs_map_table_name, " + " file_info.function_table_name, file_info.relocs_table_name, file_info.types_table_name, " + " file_info.scoop_table_name, file_info.file_id, file_info.url, file_info.hash," " file_info.arch, file_info.type, file_info.elfoid, file_info.doip_id " " from file_info,variant_dependency " " where variant_dependency.variant_id = '" + to_string(GetBaseID()) + "' AND " @@ -404,13 +420,14 @@ void VariantID_t::ReadFilesFromDB() std::string atn=(BaseObj_t::dbintr->GetResultColumn("address_table_name")); std::string ftn=(BaseObj_t::dbintr->GetResultColumn("function_table_name")); std::string itn=(BaseObj_t::dbintr->GetResultColumn("instruction_table_name")); + std::string dtn=(BaseObj_t::dbintr->GetResultColumn("scoop_table_name")); std::string icfs=(BaseObj_t::dbintr->GetResultColumn("icfs_table_name")); std::string icfs_map=(BaseObj_t::dbintr->GetResultColumn("icfs_map_table_name")); std::string rtn=(BaseObj_t::dbintr->GetResultColumn("relocs_table_name")); std::string typ=(BaseObj_t::dbintr->GetResultColumn("types_table_name")); - File_t *newfile=new File_t(file_id,orig_fid,url,hash,type,oid,atn,ftn,itn,icfs,icfs_map,rtn,typ,doipid); + File_t *newfile=new File_t(file_id,orig_fid,url,hash,type,oid,atn,ftn,itn,icfs,icfs_map,rtn,typ,dtn,doipid); std::cout<<"Found file "<<file_id<<"."<<std::endl; std::cout<<" atn: " << atn << " ftn: " << ftn << " rtn: " << rtn << " typ: " << typ << std::endl; -- GitLab