1*7a0c41d5SAlan Somers /*- 2*7a0c41d5SAlan Somers * Copyright (c) 2011, 2012, 2013, 2016 Spectra Logic Corporation 3*7a0c41d5SAlan Somers * All rights reserved. 4*7a0c41d5SAlan Somers * 5*7a0c41d5SAlan Somers * Redistribution and use in source and binary forms, with or without 6*7a0c41d5SAlan Somers * modification, are permitted provided that the following conditions 7*7a0c41d5SAlan Somers * are met: 8*7a0c41d5SAlan Somers * 1. Redistributions of source code must retain the above copyright 9*7a0c41d5SAlan Somers * notice, this list of conditions, and the following disclaimer, 10*7a0c41d5SAlan Somers * without modification. 11*7a0c41d5SAlan Somers * 2. Redistributions in binary form must reproduce at minimum a disclaimer 12*7a0c41d5SAlan Somers * substantially similar to the "NO WARRANTY" disclaimer below 13*7a0c41d5SAlan Somers * ("Disclaimer") and any redistribution must be conditioned upon 14*7a0c41d5SAlan Somers * including a substantially similar Disclaimer requirement for further 15*7a0c41d5SAlan Somers * binary redistribution. 16*7a0c41d5SAlan Somers * 17*7a0c41d5SAlan Somers * NO WARRANTY 18*7a0c41d5SAlan Somers * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19*7a0c41d5SAlan Somers * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20*7a0c41d5SAlan Somers * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 21*7a0c41d5SAlan Somers * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22*7a0c41d5SAlan Somers * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23*7a0c41d5SAlan Somers * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24*7a0c41d5SAlan Somers * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25*7a0c41d5SAlan Somers * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 26*7a0c41d5SAlan Somers * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 27*7a0c41d5SAlan Somers * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28*7a0c41d5SAlan Somers * POSSIBILITY OF SUCH DAMAGES. 29*7a0c41d5SAlan Somers * 30*7a0c41d5SAlan Somers * Authors: Justin T. Gibbs (Spectra Logic Corporation) 31*7a0c41d5SAlan Somers * 32*7a0c41d5SAlan Somers * $FreeBSD$ 33*7a0c41d5SAlan Somers */ 34*7a0c41d5SAlan Somers 35*7a0c41d5SAlan Somers /** 36*7a0c41d5SAlan Somers * \file devdctl_event.h 37*7a0c41d5SAlan Somers * 38*7a0c41d5SAlan Somers * \brief Class hierarchy used to express events received via 39*7a0c41d5SAlan Somers * the devdctl API. 40*7a0c41d5SAlan Somers */ 41*7a0c41d5SAlan Somers 42*7a0c41d5SAlan Somers #ifndef _DEVDCTL_EVENT_H_ 43*7a0c41d5SAlan Somers #define _DEVDCTL_EVENT_H_ 44*7a0c41d5SAlan Somers 45*7a0c41d5SAlan Somers /*============================ Namespace Control =============================*/ 46*7a0c41d5SAlan Somers namespace DevdCtl 47*7a0c41d5SAlan Somers { 48*7a0c41d5SAlan Somers 49*7a0c41d5SAlan Somers /*=========================== Forward Declarations ===========================*/ 50*7a0c41d5SAlan Somers class EventFactory; 51*7a0c41d5SAlan Somers 52*7a0c41d5SAlan Somers /*============================= Class Definitions ============================*/ 53*7a0c41d5SAlan Somers /*-------------------------------- NVPairMap ---------------------------------*/ 54*7a0c41d5SAlan Somers /** 55*7a0c41d5SAlan Somers * NVPairMap is a specialization of the standard map STL container. 56*7a0c41d5SAlan Somers */ 57*7a0c41d5SAlan Somers typedef std::map<std::string, std::string> NVPairMap; 58*7a0c41d5SAlan Somers 59*7a0c41d5SAlan Somers /*----------------------------------- Event ----------------------------------*/ 60*7a0c41d5SAlan Somers /** 61*7a0c41d5SAlan Somers * \brief Container for the name => value pairs that comprise the content of 62*7a0c41d5SAlan Somers * a device control event. 63*7a0c41d5SAlan Somers * 64*7a0c41d5SAlan Somers * All name => value data for events can be accessed via the Contains() 65*7a0c41d5SAlan Somers * and Value() methods. name => value pairs for data not explicitly 66*7a0c41d5SAlan Somers * received as a name => value pair are synthesized during parsing. For 67*7a0c41d5SAlan Somers * example, ATTACH and DETACH events have "device-name" and "parent" 68*7a0c41d5SAlan Somers * name => value pairs added. 69*7a0c41d5SAlan Somers */ 70*7a0c41d5SAlan Somers class Event 71*7a0c41d5SAlan Somers { 72*7a0c41d5SAlan Somers friend class EventFactory; 73*7a0c41d5SAlan Somers 74*7a0c41d5SAlan Somers public: 75*7a0c41d5SAlan Somers /** Event type */ 76*7a0c41d5SAlan Somers enum Type { 77*7a0c41d5SAlan Somers /** Generic event notification. */ 78*7a0c41d5SAlan Somers NOTIFY = '!', 79*7a0c41d5SAlan Somers 80*7a0c41d5SAlan Somers /** A driver was not found for this device. */ 81*7a0c41d5SAlan Somers NOMATCH = '?', 82*7a0c41d5SAlan Somers 83*7a0c41d5SAlan Somers /** A bus device instance has been added. */ 84*7a0c41d5SAlan Somers ATTACH = '+', 85*7a0c41d5SAlan Somers 86*7a0c41d5SAlan Somers /** A bus device instance has been removed. */ 87*7a0c41d5SAlan Somers DETACH = '-' 88*7a0c41d5SAlan Somers }; 89*7a0c41d5SAlan Somers 90*7a0c41d5SAlan Somers /** 91*7a0c41d5SAlan Somers * Factory method type to construct an Event given 92*7a0c41d5SAlan Somers * the type of event and an NVPairMap populated from 93*7a0c41d5SAlan Somers * the event string received from devd. 94*7a0c41d5SAlan Somers */ 95*7a0c41d5SAlan Somers typedef Event* (BuildMethod)(Type, NVPairMap &, const std::string &); 96*7a0c41d5SAlan Somers 97*7a0c41d5SAlan Somers /** Generic Event object factory. */ 98*7a0c41d5SAlan Somers static BuildMethod Builder; 99*7a0c41d5SAlan Somers 100*7a0c41d5SAlan Somers static Event *CreateEvent(const EventFactory &factory, 101*7a0c41d5SAlan Somers const std::string &eventString); 102*7a0c41d5SAlan Somers 103*7a0c41d5SAlan Somers /** 104*7a0c41d5SAlan Somers * Returns the devname, if any, associated with the event 105*7a0c41d5SAlan Somers * 106*7a0c41d5SAlan Somers * \param name Devname, returned by reference 107*7a0c41d5SAlan Somers * \return True iff the event contained a devname 108*7a0c41d5SAlan Somers */ 109*7a0c41d5SAlan Somers virtual bool DevName(std::string &name) const; 110*7a0c41d5SAlan Somers 111*7a0c41d5SAlan Somers /** 112*7a0c41d5SAlan Somers * Returns the absolute pathname of the device associated with this 113*7a0c41d5SAlan Somers * event. 114*7a0c41d5SAlan Somers * 115*7a0c41d5SAlan Somers * \param name Devname, returned by reference 116*7a0c41d5SAlan Somers * \return True iff the event contained a devname 117*7a0c41d5SAlan Somers */ 118*7a0c41d5SAlan Somers bool DevPath(std::string &path) const; 119*7a0c41d5SAlan Somers 120*7a0c41d5SAlan Somers /** 121*7a0c41d5SAlan Somers * Returns true iff this event refers to a disk device 122*7a0c41d5SAlan Somers */ 123*7a0c41d5SAlan Somers bool IsDiskDev() const; 124*7a0c41d5SAlan Somers 125*7a0c41d5SAlan Somers /** Returns the physical path of the device, if any 126*7a0c41d5SAlan Somers * 127*7a0c41d5SAlan Somers * \param path Physical path, returned by reference 128*7a0c41d5SAlan Somers * \return True iff the event contains a device with a physical 129*7a0c41d5SAlan Somers * path 130*7a0c41d5SAlan Somers */ 131*7a0c41d5SAlan Somers bool PhysicalPath(std::string &path) const; 132*7a0c41d5SAlan Somers 133*7a0c41d5SAlan Somers /** 134*7a0c41d5SAlan Somers * Provide a user friendly string representation of an 135*7a0c41d5SAlan Somers * event type. 136*7a0c41d5SAlan Somers * 137*7a0c41d5SAlan Somers * \param type The type of event to map to a string. 138*7a0c41d5SAlan Somers * 139*7a0c41d5SAlan Somers * \return A user friendly string representing the input type. 140*7a0c41d5SAlan Somers */ 141*7a0c41d5SAlan Somers static const char *TypeToString(Type type); 142*7a0c41d5SAlan Somers 143*7a0c41d5SAlan Somers /** 144*7a0c41d5SAlan Somers * Determine the availability of a name => value pair by name. 145*7a0c41d5SAlan Somers * 146*7a0c41d5SAlan Somers * \param name The key name to search for in this event instance. 147*7a0c41d5SAlan Somers * 148*7a0c41d5SAlan Somers * \return true if the specified key is available in this 149*7a0c41d5SAlan Somers * event, otherwise false. 150*7a0c41d5SAlan Somers */ 151*7a0c41d5SAlan Somers bool Contains(const std::string &name) const; 152*7a0c41d5SAlan Somers 153*7a0c41d5SAlan Somers /** 154*7a0c41d5SAlan Somers * \param key The name of the key for which to retrieve its 155*7a0c41d5SAlan Somers * associated value. 156*7a0c41d5SAlan Somers * 157*7a0c41d5SAlan Somers * \return A const reference to the string representing the 158*7a0c41d5SAlan Somers * value associated with key. 159*7a0c41d5SAlan Somers * 160*7a0c41d5SAlan Somers * \note For key's with no registered value, the empty string 161*7a0c41d5SAlan Somers * is returned. 162*7a0c41d5SAlan Somers */ 163*7a0c41d5SAlan Somers const std::string &Value(const std::string &key) const; 164*7a0c41d5SAlan Somers 165*7a0c41d5SAlan Somers /** 166*7a0c41d5SAlan Somers * Get the type of this event instance. 167*7a0c41d5SAlan Somers * 168*7a0c41d5SAlan Somers * \return The type of this event instance. 169*7a0c41d5SAlan Somers */ 170*7a0c41d5SAlan Somers Type GetType() const; 171*7a0c41d5SAlan Somers 172*7a0c41d5SAlan Somers /** 173*7a0c41d5SAlan Somers * Get the orginal DevdCtl event string for this event. 174*7a0c41d5SAlan Somers * 175*7a0c41d5SAlan Somers * \return The DevdCtl event string. 176*7a0c41d5SAlan Somers */ 177*7a0c41d5SAlan Somers const std::string &GetEventString() const; 178*7a0c41d5SAlan Somers 179*7a0c41d5SAlan Somers /** 180*7a0c41d5SAlan Somers * Convert the event instance into a string suitable for 181*7a0c41d5SAlan Somers * printing to the console or emitting to syslog. 182*7a0c41d5SAlan Somers * 183*7a0c41d5SAlan Somers * \return A string of formatted event data. 184*7a0c41d5SAlan Somers */ 185*7a0c41d5SAlan Somers std::string ToString() const; 186*7a0c41d5SAlan Somers 187*7a0c41d5SAlan Somers /** 188*7a0c41d5SAlan Somers * Pretty-print this event instance to cout. 189*7a0c41d5SAlan Somers */ 190*7a0c41d5SAlan Somers void Print() const; 191*7a0c41d5SAlan Somers 192*7a0c41d5SAlan Somers /** 193*7a0c41d5SAlan Somers * Pretty-print this event instance to syslog. 194*7a0c41d5SAlan Somers * 195*7a0c41d5SAlan Somers * \param priority The logging priority/facility. 196*7a0c41d5SAlan Somers * See syslog(3). 197*7a0c41d5SAlan Somers */ 198*7a0c41d5SAlan Somers void Log(int priority) const; 199*7a0c41d5SAlan Somers 200*7a0c41d5SAlan Somers /** 201*7a0c41d5SAlan Somers * Create and return a fully independent clone 202*7a0c41d5SAlan Somers * of this event. 203*7a0c41d5SAlan Somers */ 204*7a0c41d5SAlan Somers virtual Event *DeepCopy() const; 205*7a0c41d5SAlan Somers 206*7a0c41d5SAlan Somers /** Destructor */ 207*7a0c41d5SAlan Somers virtual ~Event(); 208*7a0c41d5SAlan Somers 209*7a0c41d5SAlan Somers /** 210*7a0c41d5SAlan Somers * Interpret and perform any actions necessary to 211*7a0c41d5SAlan Somers * consume the event. 212*7a0c41d5SAlan Somers * 213*7a0c41d5SAlan Somers * \return True if this event should be queued for later reevaluation 214*7a0c41d5SAlan Somers */ 215*7a0c41d5SAlan Somers virtual bool Process() const; 216*7a0c41d5SAlan Somers 217*7a0c41d5SAlan Somers /** 218*7a0c41d5SAlan Somers * Get the time that the event was created 219*7a0c41d5SAlan Somers */ 220*7a0c41d5SAlan Somers timeval GetTimestamp() const; 221*7a0c41d5SAlan Somers 222*7a0c41d5SAlan Somers /** 223*7a0c41d5SAlan Somers * Add a timestamp to the event string, if one does not already exist 224*7a0c41d5SAlan Somers * TODO: make this an instance method that operates on the std::map 225*7a0c41d5SAlan Somers * instead of the string. We must fix zfsd's CaseFile serialization 226*7a0c41d5SAlan Somers * routines first, so that they don't need the raw event string. 227*7a0c41d5SAlan Somers * 228*7a0c41d5SAlan Somers * \param[in,out] eventString The devd event string to modify 229*7a0c41d5SAlan Somers */ 230*7a0c41d5SAlan Somers static void TimestampEventString(std::string &eventString); 231*7a0c41d5SAlan Somers 232*7a0c41d5SAlan Somers /** 233*7a0c41d5SAlan Somers * Access all parsed key => value pairs. 234*7a0c41d5SAlan Somers */ 235*7a0c41d5SAlan Somers const NVPairMap &GetMap() const; 236*7a0c41d5SAlan Somers 237*7a0c41d5SAlan Somers protected: 238*7a0c41d5SAlan Somers /** Table entries used to map a type to a user friendly string. */ 239*7a0c41d5SAlan Somers struct EventTypeRecord 240*7a0c41d5SAlan Somers { 241*7a0c41d5SAlan Somers Type m_type; 242*7a0c41d5SAlan Somers const char *m_typeName; 243*7a0c41d5SAlan Somers }; 244*7a0c41d5SAlan Somers 245*7a0c41d5SAlan Somers /** 246*7a0c41d5SAlan Somers * Constructor 247*7a0c41d5SAlan Somers * 248*7a0c41d5SAlan Somers * \param type The type of event to create. 249*7a0c41d5SAlan Somers */ 250*7a0c41d5SAlan Somers Event(Type type, NVPairMap &map, const std::string &eventString); 251*7a0c41d5SAlan Somers 252*7a0c41d5SAlan Somers /** Deep copy constructor. */ 253*7a0c41d5SAlan Somers Event(const Event &src); 254*7a0c41d5SAlan Somers 255*7a0c41d5SAlan Somers /** Always empty string returned when NVPairMap lookups fail. */ 256*7a0c41d5SAlan Somers static const std::string s_theEmptyString; 257*7a0c41d5SAlan Somers 258*7a0c41d5SAlan Somers /** Unsorted table of event types. */ 259*7a0c41d5SAlan Somers static EventTypeRecord s_typeTable[]; 260*7a0c41d5SAlan Somers 261*7a0c41d5SAlan Somers /** The type of this event. */ 262*7a0c41d5SAlan Somers const Type m_type; 263*7a0c41d5SAlan Somers 264*7a0c41d5SAlan Somers /** 265*7a0c41d5SAlan Somers * Event attribute storage. 266*7a0c41d5SAlan Somers * 267*7a0c41d5SAlan Somers * \note Although stored by reference (since m_nvPairs can 268*7a0c41d5SAlan Somers * never be NULL), the NVPairMap referenced by this field 269*7a0c41d5SAlan Somers * is dynamically allocated and owned by this event object. 270*7a0c41d5SAlan Somers * m_nvPairs must be deleted at event desctruction. 271*7a0c41d5SAlan Somers */ 272*7a0c41d5SAlan Somers NVPairMap &m_nvPairs; 273*7a0c41d5SAlan Somers 274*7a0c41d5SAlan Somers /** 275*7a0c41d5SAlan Somers * The unaltered event string, as received from devd, used to 276*7a0c41d5SAlan Somers * create this event object. 277*7a0c41d5SAlan Somers */ 278*7a0c41d5SAlan Somers std::string m_eventString; 279*7a0c41d5SAlan Somers 280*7a0c41d5SAlan Somers private: 281*7a0c41d5SAlan Somers /** 282*7a0c41d5SAlan Somers * Ingest event data from the supplied string. 283*7a0c41d5SAlan Somers * 284*7a0c41d5SAlan Somers * \param[in] eventString The string of devd event data to parse. 285*7a0c41d5SAlan Somers * \param[out] nvpairs Returns the parsed data 286*7a0c41d5SAlan Somers */ 287*7a0c41d5SAlan Somers static void ParseEventString(Type type, const std::string &eventString, 288*7a0c41d5SAlan Somers NVPairMap &nvpairs); 289*7a0c41d5SAlan Somers }; 290*7a0c41d5SAlan Somers 291*7a0c41d5SAlan Somers inline Event::Type 292*7a0c41d5SAlan Somers Event::GetType() const 293*7a0c41d5SAlan Somers { 294*7a0c41d5SAlan Somers return (m_type); 295*7a0c41d5SAlan Somers } 296*7a0c41d5SAlan Somers 297*7a0c41d5SAlan Somers inline const std::string & 298*7a0c41d5SAlan Somers Event::GetEventString() const 299*7a0c41d5SAlan Somers { 300*7a0c41d5SAlan Somers return (m_eventString); 301*7a0c41d5SAlan Somers } 302*7a0c41d5SAlan Somers 303*7a0c41d5SAlan Somers inline const NVPairMap & 304*7a0c41d5SAlan Somers Event::GetMap() const 305*7a0c41d5SAlan Somers { 306*7a0c41d5SAlan Somers return (m_nvPairs); 307*7a0c41d5SAlan Somers } 308*7a0c41d5SAlan Somers 309*7a0c41d5SAlan Somers /*--------------------------------- EventList --------------------------------*/ 310*7a0c41d5SAlan Somers /** 311*7a0c41d5SAlan Somers * EventList is a specialization of the standard list STL container. 312*7a0c41d5SAlan Somers */ 313*7a0c41d5SAlan Somers typedef std::list<Event *> EventList; 314*7a0c41d5SAlan Somers 315*7a0c41d5SAlan Somers /*-------------------------------- DevfsEvent --------------------------------*/ 316*7a0c41d5SAlan Somers class DevfsEvent : public Event 317*7a0c41d5SAlan Somers { 318*7a0c41d5SAlan Somers public: 319*7a0c41d5SAlan Somers /** Specialized Event object factory for Devfs events. */ 320*7a0c41d5SAlan Somers static BuildMethod Builder; 321*7a0c41d5SAlan Somers 322*7a0c41d5SAlan Somers virtual Event *DeepCopy() const; 323*7a0c41d5SAlan Somers 324*7a0c41d5SAlan Somers /** 325*7a0c41d5SAlan Somers * Interpret and perform any actions necessary to 326*7a0c41d5SAlan Somers * consume the event. 327*7a0c41d5SAlan Somers * \return True if this event should be queued for later reevaluation 328*7a0c41d5SAlan Somers */ 329*7a0c41d5SAlan Somers virtual bool Process() const; 330*7a0c41d5SAlan Somers 331*7a0c41d5SAlan Somers bool IsWholeDev() const; 332*7a0c41d5SAlan Somers virtual bool DevName(std::string &name) const; 333*7a0c41d5SAlan Somers 334*7a0c41d5SAlan Somers protected: 335*7a0c41d5SAlan Somers /** 336*7a0c41d5SAlan Somers * Given the device name of a disk, determine if the device 337*7a0c41d5SAlan Somers * represents the whole device, not just a partition. 338*7a0c41d5SAlan Somers * 339*7a0c41d5SAlan Somers * \param devName Device name of disk device to test. 340*7a0c41d5SAlan Somers * 341*7a0c41d5SAlan Somers * \return True if the device name represents the whole device. 342*7a0c41d5SAlan Somers * Otherwise false. 343*7a0c41d5SAlan Somers */ 344*7a0c41d5SAlan Somers static bool IsWholeDev(const std::string &devName); 345*7a0c41d5SAlan Somers 346*7a0c41d5SAlan Somers /** DeepCopy Constructor. */ 347*7a0c41d5SAlan Somers DevfsEvent(const DevfsEvent &src); 348*7a0c41d5SAlan Somers 349*7a0c41d5SAlan Somers /** Constructor */ 350*7a0c41d5SAlan Somers DevfsEvent(Type, NVPairMap &, const std::string &); 351*7a0c41d5SAlan Somers }; 352*7a0c41d5SAlan Somers 353*7a0c41d5SAlan Somers /*--------------------------------- GeomEvent --------------------------------*/ 354*7a0c41d5SAlan Somers class GeomEvent : public Event 355*7a0c41d5SAlan Somers { 356*7a0c41d5SAlan Somers public: 357*7a0c41d5SAlan Somers /** Specialized Event object factory for GEOM events. */ 358*7a0c41d5SAlan Somers static BuildMethod Builder; 359*7a0c41d5SAlan Somers 360*7a0c41d5SAlan Somers virtual Event *DeepCopy() const; 361*7a0c41d5SAlan Somers 362*7a0c41d5SAlan Somers virtual bool DevName(std::string &name) const; 363*7a0c41d5SAlan Somers 364*7a0c41d5SAlan Somers const std::string &DeviceName() const; 365*7a0c41d5SAlan Somers 366*7a0c41d5SAlan Somers protected: 367*7a0c41d5SAlan Somers /** Constructor */ 368*7a0c41d5SAlan Somers GeomEvent(Type, NVPairMap &, const std::string &); 369*7a0c41d5SAlan Somers 370*7a0c41d5SAlan Somers /** Deep copy constructor. */ 371*7a0c41d5SAlan Somers GeomEvent(const GeomEvent &src); 372*7a0c41d5SAlan Somers 373*7a0c41d5SAlan Somers std::string m_devname; 374*7a0c41d5SAlan Somers }; 375*7a0c41d5SAlan Somers 376*7a0c41d5SAlan Somers /*--------------------------------- ZfsEvent ---------------------------------*/ 377*7a0c41d5SAlan Somers class ZfsEvent : public Event 378*7a0c41d5SAlan Somers { 379*7a0c41d5SAlan Somers public: 380*7a0c41d5SAlan Somers /** Specialized Event object factory for ZFS events. */ 381*7a0c41d5SAlan Somers static BuildMethod Builder; 382*7a0c41d5SAlan Somers 383*7a0c41d5SAlan Somers virtual Event *DeepCopy() const; 384*7a0c41d5SAlan Somers 385*7a0c41d5SAlan Somers virtual bool DevName(std::string &name) const; 386*7a0c41d5SAlan Somers 387*7a0c41d5SAlan Somers const std::string &PoolName() const; 388*7a0c41d5SAlan Somers Guid PoolGUID() const; 389*7a0c41d5SAlan Somers Guid VdevGUID() const; 390*7a0c41d5SAlan Somers 391*7a0c41d5SAlan Somers protected: 392*7a0c41d5SAlan Somers /** Constructor */ 393*7a0c41d5SAlan Somers ZfsEvent(Type, NVPairMap &, const std::string &); 394*7a0c41d5SAlan Somers 395*7a0c41d5SAlan Somers /** Deep copy constructor. */ 396*7a0c41d5SAlan Somers ZfsEvent(const ZfsEvent &src); 397*7a0c41d5SAlan Somers 398*7a0c41d5SAlan Somers Guid m_poolGUID; 399*7a0c41d5SAlan Somers Guid m_vdevGUID; 400*7a0c41d5SAlan Somers }; 401*7a0c41d5SAlan Somers 402*7a0c41d5SAlan Somers //- ZfsEvent Inline Public Methods -------------------------------------------- 403*7a0c41d5SAlan Somers inline const std::string& 404*7a0c41d5SAlan Somers ZfsEvent::PoolName() const 405*7a0c41d5SAlan Somers { 406*7a0c41d5SAlan Somers /* The pool name is reported as the subsystem of ZFS events. */ 407*7a0c41d5SAlan Somers return (Value("subsystem")); 408*7a0c41d5SAlan Somers } 409*7a0c41d5SAlan Somers 410*7a0c41d5SAlan Somers inline Guid 411*7a0c41d5SAlan Somers ZfsEvent::PoolGUID() const 412*7a0c41d5SAlan Somers { 413*7a0c41d5SAlan Somers return (m_poolGUID); 414*7a0c41d5SAlan Somers } 415*7a0c41d5SAlan Somers 416*7a0c41d5SAlan Somers inline Guid 417*7a0c41d5SAlan Somers ZfsEvent::VdevGUID() const 418*7a0c41d5SAlan Somers { 419*7a0c41d5SAlan Somers return (m_vdevGUID); 420*7a0c41d5SAlan Somers } 421*7a0c41d5SAlan Somers 422*7a0c41d5SAlan Somers } // namespace DevdCtl 423*7a0c41d5SAlan Somers #endif /*_DEVDCTL_EVENT_H_ */ 424