/**
* @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 */