18cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
28cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @file locate_images.h
38cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Location of binary images
48cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
58cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Copyright 2002 OProfile authors
68cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Read the file COPYING
78cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
88cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @author Philippe Elie
98cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @author John Levon
108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#ifndef LOCATE_IMAGES_H
138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define LOCATE_IMAGES_H
148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <string>
168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <map>
178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <vector>
188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "image_errors.h"
208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * A class containing mappings from an image basename,
238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * such as 'floppy.ko', to locations in the paths passed
248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * in to populate().
258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * The name may exist multiple times; all locations are recorded
278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * in this container.
288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddclass extra_images {
308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddpublic:
318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	extra_images();
328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// add all filenames found in the given paths prefixed by the
348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// archive path or the root path, recursively
358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void populate(std::vector<std::string> const & paths,
368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		      std::string const & archive_path,
378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		      std::string const & root_path);
388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// base class for matcher functors object
408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	struct matcher {
418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		std::string const & value;
428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	public:
438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		explicit matcher(std::string const & v) : value(v) {}
448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		virtual ~matcher() {}
458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		/// default functor allowing trivial match
468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		virtual bool operator()(std::string const & str) const {
478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			return str == value;
488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	};
508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/**
528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * return a vector of all directories that match the functor
538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 */
548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	std::vector<std::string> const find(matcher const & match) const;
558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// return a vector of all directories that match the given name
578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	std::vector<std::string> const find(std::string const & name) const;
588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/**
608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * @param image_name binary image name
618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * @param error errors are flagged in this passed enum ref
628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * @param fixup if true return the fixed image name else always return
638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 *  image_name and update error
648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 *
658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * Locate a (number of) matching absolute paths to the given image
668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * name. If we fail to find the file we fill in error and return the
678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * original string.
688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 */
698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	std::string const find_image_path(std::string const & image_name,
708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				image_error & error, bool fixup) const;
718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// return the archive path used to populate the images name map
738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	std::string get_archive_path() const { return archive_path; }
748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// Given an image name returned by find_image_path() return
768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// a filename with the archive_path or root_path stripped.
778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	std::string strip_path_prefix(std::string const & image) const;
788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// return the uid for this extra_images, first valid uid is 1
808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	int get_uid() const { return uid; }
818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddprivate:
838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void populate(std::vector<std::string> const & paths,
848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		      std::string const & prefix_path);
858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	std::string const locate_image(std::string const & image_name,
878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				image_error & error, bool fixup) const;
888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	typedef std::multimap<std::string, std::string> images_t;
908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	typedef images_t::value_type value_type;
918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	typedef images_t::const_iterator const_iterator;
928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// map from image basename to owning directory
948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	images_t images;
958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// the archive path passed to populate the images name map.
968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	std::string archive_path;
978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// A prefix added to locate binaries if they can't be found
988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// through the archive path
998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	std::string root_path;
1008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// unique identifier, first valid uid is 1
1028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	int uid;
1038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// unique uid generator
1048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	static int suid;
1058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd};
1068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#endif /* LOCATE_IMAGES_H */
108