Exemplo n.º 1
0
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;
}
Exemplo n.º 2
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_;
}