summaryrefslogtreecommitdiff
path: root/lib/libdevdctl/exception.h
blob: 9f4403c598d4b2cbced923ad42adf66c6521c14d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
/*-
 * Copyright (c) 2011, 2012, 2013 Spectra Logic Corporation
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions, and the following disclaimer,
 *    without modification.
 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
 *    substantially similar to the "NO WARRANTY" disclaimer below
 *    ("Disclaimer") and any redistribution must be conditioned upon
 *    including a substantially similar Disclaimer requirement for further
 *    binary redistribution.
 *
 * NO WARRANTY
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGES.
 *
 * Authors: Justin T. Gibbs     (Spectra Logic Corporation)
 *
 * $FreeBSD$
 */

/**
 * \file zfsd_exception.h
 *
 * Definition of the ZfsdException class hierarchy.  All exceptions
 * explicitly thrown by Zfsd are defined here.
 */
#ifndef	_DEVDCTL_EXCEPTION_H_
#define	_DEVDCTL_EXCEPTION_H_

/*============================ Namespace Control =============================*/
namespace DevdCtl
{

/*============================= Class Definitions ============================*/

/*--------------------------------- Exception --------------------------------*/
/**
 * \brief Class allowing unified reporting/logging of exceptional events.
 */
class Exception
{
public:
	/**
	 * \brief Exception constructor allowing arbitrary string
	 *        data to be reported.
	 *
	 * \param fmt  Printf-like string format specifier.
	 */
	Exception(const char *fmt, ...);

	/**
	 * \brief Augment/Modify a Exception's string data.
	 */
	std::string& GetString();

	/**
	 * \brief Emit exception data to syslog(3).
	 */
	virtual void Log() const;

protected:
	Exception();

	/**
	 * \brief Convert exception string format and arguments provided
	 *        in event constructors into a linear string.
	 */
	void FormatLog(const char *fmt, va_list ap);

	std::string   m_log;
};

inline std::string &
Exception::GetString()
{
	return (m_log);
}

/*------------------------------ ParseException ------------------------------*/
/**
 * Exception thrown when an event string is not converted to an actionable
 * Event object.
 */
class ParseException : public Exception
{
public:
	enum Type
	{
		/** Improperly formatted event string encountered. */
		INVALID_FORMAT,

		/** No handlers for this event type. */
		DISCARDED_EVENT_TYPE,

		/** Unhandled event type. */
		UNKNOWN_EVENT_TYPE
	};

	/**
	 * Constructor
	 *
	 * \param type          The type of this exception.
	 * \param parsedBuffer  The parsing buffer active at the time of
	 *                      the exception.
	 * \param offset        The location in the parse buffer where this
	 *                      exception occurred.
	 */
	ParseException(Type type, const std::string &parsedBuffer,
		       size_t offset = 0);

	/**
	 * Accessor
	 *
	 * \return  The classification for this exception.
	 */
	Type        GetType()   const;

	/**
	 * Accessor
	 *
	 * \return  The offset into the event string where this exception
	 *          occurred.
	 */
	size_t      GetOffset() const;

private:
	/** The type of this exception. */
	Type              m_type;

	/** The parsing buffer that was active at the time of the exception. */
	const std::string m_parsedBuffer;

	/**
	 * The offset into the event string buffer from where this
	 * exception was triggered.
	 */
	size_t            m_offset;
};

//- ParseException Inline Const Public Methods ---------------------------------
inline ParseException::Type
ParseException::GetType() const
{
	return (m_type);
}

inline size_t
ParseException::GetOffset() const
{
	return (m_offset);
}

} // namespace DevdCtl
#endif /* _DEVDCTL_EXCEPTION_H_ */