in xar/XarHelpers.cpp [40:93]
std::unordered_map<std::string, std::string> read_xar_header(
const char* filename) {
const auto maybe_header = read_file_prefix(filename, kDefaultHeaderSize);
if (!maybe_header) {
XAR_FATAL << "Unable to open or read XAR header from " << filename;
}
const auto header = *maybe_header;
if (header.size() != kDefaultHeaderSize) {
XAR_FATAL << "Short read of header of " << filename << ", " << header.size()
<< " vs expected " << kDefaultHeaderSize;
}
std::unordered_map<std::string, std::string> ret;
auto lines = tools::xar::split('\n', header);
for (const auto& line : lines) {
if (line == "#xar_stop") {
break;
}
if (line.empty() || line[0] == '#') {
continue;
}
auto name_value = tools::xar::split('=', line, 1);
if (name_value.size() != 2) {
XAR_FATAL << "malformed header line: " << line;
}
std::string name = name_value[0];
std::string value = name_value[1];
if (name.empty() || value.size() < 2 || value.front() != '"' ||
value.back() != '"') {
XAR_FATAL << "invalid line in xar header: " << line;
}
// skip quotes around value
ret[name] = value.substr(1, value.size() - 2);
}
if (ret.find(kOffsetName) == ret.end() ||
ret[kOffsetName] != std::to_string(kDefaultHeaderSize)) {
XAR_FATAL << "TODO(chip): support headers other than he default";
}
if (ret.find(kUuidName) == ret.end()) {
XAR_FATAL << "No UUID in XAR header";
}
if (debugging) {
for (const auto& p : ret) {
std::cerr << "header " << p.first << "=" << p.second << std::endl;
}
}
return ret;
}