xref: /freebsd/lib/libdevdctl/event.h (revision 7a0c41d5d7d4e9770ef6f5d56f893efc8f18ab7c)
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