/** * @file locate_images.h * Location of binary images * * @remark Copyright 2002 OProfile authors * @remark Read the file COPYING * * @author Philippe Elie * @author John Levon */ #ifndef LOCATE_IMAGES_H #define LOCATE_IMAGES_H #include <string> #include <map> #include <vector> #include "image_errors.h" /** * A class containing mappings from an image basename, * such as 'floppy.ko', to locations in the paths passed * in to populate(). * * The name may exist multiple times; all locations are recorded * in this container. */ class extra_images { public: extra_images(); /// add all filenames found in the given paths prefixed by the /// archive path or the root path, recursively void populate(std::vector<std::string> const & paths, std::string const & archive_path, std::string const & root_path); /// base class for matcher functors object struct matcher { std::string const & value; public: explicit matcher(std::string const & v) : value(v) {} virtual ~matcher() {} /// default functor allowing trivial match virtual bool operator()(std::string const & str) const { return str == value; } }; /** * return a vector of all directories that match the functor */ std::vector<std::string> const find(matcher const & match) const; /// return a vector of all directories that match the given name std::vector<std::string> const find(std::string const & name) const; /** * @param image_name binary image name * @param error errors are flagged in this passed enum ref * @param fixup if true return the fixed image name else always return * image_name and update error * * Locate a (number of) matching absolute paths to the given image * name. If we fail to find the file we fill in error and return the * original string. */ std::string const find_image_path(std::string const & image_name, image_error & error, bool fixup) const; /// return the archive path used to populate the images name map std::string get_archive_path() const { return archive_path; } /// Given an image name returned by find_image_path() return /// a filename with the archive_path or root_path stripped. std::string strip_path_prefix(std::string const & image) const; /// return the uid for this extra_images, first valid uid is 1 int get_uid() const { return uid; } private: void populate(std::vector<std::string> const & paths, std::string const & prefix_path); std::string const locate_image(std::string const & image_name, image_error & error, bool fixup) const; typedef std::multimap<std::string, std::string> images_t; typedef images_t::value_type value_type; typedef images_t::const_iterator const_iterator; /// map from image basename to owning directory images_t images; /// the archive path passed to populate the images name map. std::string archive_path; /// A prefix added to locate binaries if they can't be found /// through the archive path std::string root_path; /// unique identifier, first valid uid is 1 int uid; /// unique uid generator static int suid; }; #endif /* LOCATE_IMAGES_H */