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