int main(int argc, char **argv) { Dwarf_Debug dbg = 0; int fd = -1; const char *filepath = "<stdin>"; int res = DW_DLV_ERROR; Dwarf_Error error; Dwarf_Handler errhand = 0; Dwarf_Ptr errarg = 0; if(argc < 2) { fd = 0; /* stdin */ } else { int i = 0; for(i = 1; i < (argc-1) ; ++i) { if(strcmp(argv[i],"--names") == 0) { namesoptionon=1; } else { printf("Unknown argument \"%s\" ignored\n",argv[i]); } } filepath = argv[i]; fd = open(filepath,O_RDONLY); } if(argc > 2) { } if(fd < 0) { printf("Failure attempting to open \"%s\"\n",filepath); } res = dwarf_init(fd,DW_DLC_READ,errhand,errarg, &dbg,&error); if(res != DW_DLV_OK) { printf("Giving up, cannot do DWARF processing\n"); exit(1); } read_cu_list(dbg); res = dwarf_finish(dbg,&error); if(res != DW_DLV_OK) { printf("dwarf_finish failed!\n"); } close(fd); scan_db(); return 0; }
void FileStatsWorker::get_stats(bool need_all_files, bool split_by_owner_dialog_id, Promise<FileStats> promise) { if (!G()->parameters().use_chat_info_db) { split_by_owner_dialog_id = false; } if (!split_by_owner_dialog_id) { FileStats file_stats; file_stats.need_all_files = need_all_files; auto start = Time::now(); scan_fs([&](FsFileInfo &fs_info) { FullFileInfo info; info.file_type = fs_info.file_type; info.path = std::move(fs_info.path); info.size = fs_info.size; info.atime_nsec = fs_info.atime_nsec; info.mtime_nsec = fs_info.mtime_nsec; file_stats.add(std::move(info)); }); auto passed = Time::now() - start; LOG_IF(INFO, passed > 0.5) << "Get file stats took: " << format::as_time(passed); promise.set_value(std::move(file_stats)); } else { auto start = Time::now(); std::vector<FullFileInfo> full_infos; scan_fs([&](FsFileInfo &fs_info) { FullFileInfo info; info.file_type = fs_info.file_type; info.path = std::move(fs_info.path); info.size = fs_info.size; info.atime_nsec = fs_info.atime_nsec; info.mtime_nsec = fs_info.mtime_nsec; // LOG(INFO) << "Found file of size " << info.size << " at " << info.path; full_infos.push_back(std::move(info)); }); std::unordered_map<size_t, size_t> hash_to_pos; size_t pos = 0; for (auto &full_info : full_infos) { hash_to_pos[std::hash<std::string>()(full_info.path)] = pos; pos++; } scan_db([&](DbFileInfo &db_info) { auto it = hash_to_pos.find(std::hash<std::string>()(db_info.path)); if (it == hash_to_pos.end()) { return; } // LOG(INFO) << "Match! " << db_info.path << " from " << db_info.owner_dialog_id; full_infos[it->second].owner_dialog_id = db_info.owner_dialog_id; }); FileStats file_stats; file_stats.need_all_files = need_all_files; file_stats.split_by_owner_dialog_id = split_by_owner_dialog_id; for (auto &full_info : full_infos) { file_stats.add(std::move(full_info)); } auto passed = Time::now() - start; LOG_IF(INFO, passed > 0.5) << "Get file stats took: " << format::as_time(passed); promise.set_value(std::move(file_stats)); } }