1279219Sken/*-
2279219Sken * Copyright (c) 2013, 2014 Spectra Logic Corporation
3279219Sken * All rights reserved.
4279219Sken *
5279219Sken * Redistribution and use in source and binary forms, with or without
6279219Sken * modification, are permitted provided that the following conditions
7279219Sken * are met:
8279219Sken * 1. Redistributions of source code must retain the above copyright
9279219Sken *    notice, this list of conditions, and the following disclaimer,
10279219Sken *    without modification.
11279219Sken * 2. Redistributions in binary form must reproduce at minimum a disclaimer
12279219Sken *    substantially similar to the "NO WARRANTY" disclaimer below
13279219Sken *    ("Disclaimer") and any redistribution must be conditioned upon
14279219Sken *    including a substantially similar Disclaimer requirement for further
15279219Sken *    binary redistribution.
16279219Sken *
17279219Sken * NO WARRANTY
18279219Sken * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19279219Sken * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20279219Sken * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
21279219Sken * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22279219Sken * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23279219Sken * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24279219Sken * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25279219Sken * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26279219Sken * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
27279219Sken * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28279219Sken * POSSIBILITY OF SUCH DAMAGES.
29279219Sken *
30279219Sken * Authors: Ken Merry           (Spectra Logic Corporation)
31279219Sken *
32279219Sken * $FreeBSD: releng/10.3/lib/libmt/mtlib.h 279219 2015-02-23 21:59:30Z ken $
33279219Sken */
34279219Sken
35279219Sken#ifndef	_MTLIB_H
36279219Sken#define	_MTLIB_H
37279219Sken
38279219Skentypedef enum {
39279219Sken	MT_TYPE_NONE,
40279219Sken	MT_TYPE_STRING,
41279219Sken	MT_TYPE_INT,
42279219Sken	MT_TYPE_UINT,
43279219Sken	MT_TYPE_NODE
44279219Sken} mt_variable_type;
45279219Sken
46279219Skenstruct mt_status_nv {
47279219Sken	char *name;
48279219Sken	char *value;
49279219Sken	STAILQ_ENTRY(mt_status_nv) links;
50279219Sken};
51279219Sken
52279219Skenstruct mt_status_entry {
53279219Sken	char *entry_name;
54279219Sken	char *value;
55279219Sken	uint64_t value_unsigned;
56279219Sken	int64_t value_signed;
57279219Sken	char *fmt;
58279219Sken	char *desc;
59279219Sken	size_t size;
60279219Sken	mt_variable_type var_type;
61279219Sken	struct mt_status_entry *parent;
62279219Sken	STAILQ_HEAD(, mt_status_nv) nv_list;
63279219Sken	STAILQ_HEAD(, mt_status_entry) child_entries;
64279219Sken	STAILQ_ENTRY(mt_status_entry) links;
65279219Sken};
66279219Sken
67279219Skenstruct mt_status_data {
68279219Sken	int level;
69279219Sken	struct sbuf *cur_sb[32];
70279219Sken	struct mt_status_entry *cur_entry[32];
71279219Sken	int error;
72279219Sken	char error_str[128];
73279219Sken	STAILQ_HEAD(, mt_status_entry) entries;
74279219Sken};
75279219Sken
76279219Skentypedef enum {
77279219Sken	MT_PF_NONE		= 0x00,
78279219Sken	MT_PF_VERBOSE		= 0x01,
79279219Sken	MT_PF_FULL_PATH		= 0x02,
80279219Sken	MT_PF_INCLUDE_ROOT	= 0x04
81279219Sken} mt_print_flags;
82279219Sken
83279219Skenstruct mt_print_params {
84279219Sken	mt_print_flags flags;
85279219Sken	char root_name[64];
86279219Sken};
87279219Sken
88279219Sken__BEGIN_DECLS
89279219Skenvoid mt_start_element(void *user_data, const char *name, const char **attr);
90279219Skenvoid mt_end_element(void *user_data, const char *name);
91279219Skenvoid mt_char_handler(void *user_data, const XML_Char *str, int len);
92279219Skenvoid mt_status_tree_sbuf(struct sbuf *sb, struct mt_status_entry *entry,
93279219Sken			 int indent, void (*sbuf_func)(struct sbuf *sb,
94279219Sken			 struct mt_status_entry *entry, void *arg), void *arg);
95279219Skenvoid mt_status_tree_print(struct mt_status_entry *entry, int indent,
96279219Sken			  void (*print_func)(struct mt_status_entry *entry,
97279219Sken			  void *arg), void *arg);
98279219Skenstruct mt_status_entry *mt_entry_find(struct mt_status_entry *entry,
99279219Sken				      char *name);
100279219Skenstruct mt_status_entry *mt_status_entry_find(struct mt_status_data *status_data,
101279219Sken					     char *name);
102279219Skenvoid mt_status_entry_free(struct mt_status_entry *entry);
103279219Skenvoid mt_status_free(struct mt_status_data *status_data);
104279219Skenvoid mt_entry_sbuf(struct sbuf *sb, struct mt_status_entry *entry, char *fmt);
105279219Skenvoid mt_param_parent_print(struct mt_status_entry *entry,
106279219Sken			   struct mt_print_params *print_params);
107279219Skenvoid mt_param_parent_sbuf(struct sbuf *sb, struct mt_status_entry *entry,
108279219Sken			  struct mt_print_params *print_params);
109279219Skenvoid mt_param_entry_sbuf(struct sbuf *sb, struct mt_status_entry *entry,
110279219Sken			 void *arg);
111279219Skenvoid mt_param_entry_print(struct mt_status_entry *entry, void *arg);
112279219Skenint mt_protect_print(struct mt_status_data *status_data, int verbose);
113279219Skenint mt_param_list(struct mt_status_data *status_data, char *param_name,
114279219Sken		  int quiet);
115279219Skenconst char *mt_density_name(int density_num);
116279219Skenint mt_density_bp(int density_num, int bpi);
117279219Skenint mt_density_num(const char *density_name);
118279219Skenint mt_get_xml_str(int mtfd, unsigned long cmd, char **xml_str);
119279219Skenint mt_get_status(char *xml_str, struct mt_status_data *status_data);
120279219Sken__END_DECLS
121279219Sken
122279219Sken#endif /* _MTLIB_H */
123