libcros 0.5.2

A Rust library that provides easy-to-use functions for interacting with a Chrome device
Documentation
// Copyright 2023 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// NOTE: this libflashrom wrapper is not recommended for wide use. ChromeOS
// firmware updaters intend to funnel flash programming through futility
// eventually.
//
// NOTE: we currently rely on (lib)flashrom to acquire a system lock to broker
// concurrent flash readers/writers. This is not an upstream flashrom feature,
// and shouldn't be relied on forever. However, an alternative doesn't yet
// exist.

#ifndef FLASHROM_H_
#define FLASHROM_H_

extern "C" {
#include <libflashrom.h>
}  // extern "C"
#include <stdint.h>

#include <optional>
#include <string>
#include <vector>

#include "vpd/export.h"
#include "vpd/types.h"

namespace vpd {

class EXPORT Flashrom {
 public:
  Flashrom() : Flashrom("internal", "") {}
  Flashrom(std::string programmer, std::string params)
      : programmer_name_(programmer), programmer_params_(params) {}
  ~Flashrom();
  bool GetPartitionDimensions(VpdRegion region,
                              uint32_t* offset,
                              uint32_t* len);
  bool Write(VpdRegion region, const std::vector<uint8_t>& blob);
  std::optional<std::vector<uint8_t>> Read(VpdRegion region);

 private:
  bool Init();

  bool initialized_ = false;
  std::string programmer_name_;
  std::string programmer_params_;
  struct flashrom_programmer* programmer_ = nullptr;
  struct flashrom_flashctx* flashctx_ = nullptr;
  struct flashrom_layout* layout_ = nullptr;
};

}  // namespace vpd

#endif  // FLASHROM_H_