int main(int argc, char *argv[]) { if (argc != 3) fail("usage: cospkg cos.pkg dir"); get_files(argv[2]); build_hdr(); write_pkg(argv[1]); return 0; }
static bool db_store(DB *db, const string& filename) { bool mkgzip = ends_with_gz(filename); uniq<SerialOut> sout(SerialOut::Open(db, filename, mkgzip)); if (mkgzip) db->config_.Log(Message, "writing compressed database\n"); else db->config_.Log(Message, "writing database\n"); SerialOut &out(*sout); if (!sout || !out.out_) { db->config_.Log(Error, "failed to open file %s for writing\n", filename.c_str()); return false; } Header hdr; memset(&hdr, 0, sizeof(hdr)); memcpy(hdr.magic, depdb_magic, sizeof(hdr.magic)); hdr.version = 1; // flags: if (db->ignore_file_rules_.size()) hdr.flags |= DBFlags::IgnoreRules; if (db->package_library_path_.size()) hdr.flags |= DBFlags::PackageLDPath; if (db->base_packages_.size()) hdr.flags |= DBFlags::BasePackages; if (db->strict_linking_) hdr.flags |= DBFlags::StrictLinking; if (db->assume_found_rules_.size()) hdr.flags |= DBFlags::AssumeFound; if (db->contains_filelists_) hdr.flags |= DBFlags::FileLists; // Figure out which database format version this will be if (db->contains_pkgbase_) hdr.version = 13; else if (db->contains_check_depends_) hdr.version = 12; else if (db->contains_make_depends_) hdr.version = 10; else if (db->contains_package_depends_) hdr.version = 10; // used to be 4 else if (hdr.flags & DBFlags::FileLists) hdr.version = 7; else if (hdr.flags & DBFlags::AssumeFound) hdr.version = 6; else if (db->contains_groups_) hdr.version = 5; else if (hdr.flags) hdr.version = 2; // okay // ver8 introduces faster refs... if (hdr.version < 8) hdr.version = 8; // ver9 contains interpreter data if (hdr.version < 9) hdr.version = 9; out.version_ = hdr.version; out <= hdr; out <= db->name_; if (!write_stringlist(out, db->library_path_)) return false; out <= (uint32_t)db->packages_.size(); for (auto &pkg : db->packages_) { if (!write_pkg(out, pkg, hdr.version, hdr.flags)) return false; } uint32_t cnt_found = 0, cnt_missing = 0; { out <= (uint32_t)db->objects_.size(); for (auto &obj : db->objects_) { if (!write_obj(out, obj)) return false; if (!obj->req_found_.empty()) ++cnt_found; if (!obj->req_missing_.empty()) ++cnt_missing; } } out <= cnt_found; for (Elf *obj : db->objects_) { if (obj->req_found_.empty()) continue; if (!write_obj(out, obj)) return false; if (!write_objset(out, obj->req_found_)) return false; } out <= cnt_missing; for (Elf *obj : db->objects_) { if (obj->req_missing_.empty()) continue; if (!write_obj(out, obj)) return false; if (!write_stringset(out, obj->req_missing_)) return false; } if (hdr.flags & DBFlags::IgnoreRules) { if (!write_stringset(out, db->ignore_file_rules_)) return false; } if (hdr.flags & DBFlags::AssumeFound) { if (!write_stringset(out, db->assume_found_rules_)) return false; } if (hdr.flags & DBFlags::PackageLDPath) { out <= (uint32_t)db->package_library_path_.size(); for (auto iter : db->package_library_path_) { out <= iter.first; if (!write_stringlist(out, iter.second)) return false; } } if (hdr.flags & DBFlags::BasePackages) { if (!write_stringset(out, db->base_packages_)) return false; } return out.out_; }