libmultipath: change prototypes of hwe_regmatch() and find_hwe()
[multipath-tools/.git] / libdmmp / libdmmp_private.h
1 /*
2  * Copyright (C) 2015 - 2016 Red Hat, Inc.
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
16  *
17  * Author: Gris Ge <fge@redhat.com>
18  *         Todd Gill <tgill@redhat.com>
19  */
20
21 #ifndef _LIB_DMMP_PRIVATE_H_
22 #define _LIB_DMMP_PRIVATE_H_
23
24 /*
25  * Notes:
26  *      Internal/Private functions does not check input argument but using
27  *      assert() to abort if NULL pointer found in argument.
28  */
29
30 #include <stdint.h>
31 #include <string.h>
32 #include <assert.h>
33 #include <json.h>
34
35 #include "libdmmp/libdmmp.h"
36
37 #ifdef __cplusplus
38 extern "C" {
39 #endif
40
41 #define _good(rc, rc_val, out) \
42         do { \
43                 rc_val = rc; \
44                 if (rc_val != DMMP_OK) \
45                         goto out; \
46         } while(0)
47
48 #define _DMMP_PATH_GROUP_ID_UNKNOWN     0
49
50 struct DMMP_DLL_LOCAL _num_str_conv;
51 struct _num_str_conv {
52         const uint32_t value;
53         const char *str;
54 };
55
56 #define _dmmp_str_func_gen(func_name, var_type, var, conv_array) \
57 const char *func_name(var_type var) { \
58         size_t i = 0; \
59         uint32_t tmp_var = var & UINT32_MAX; \
60         /* In the whole libdmmp, we don't have negative value */ \
61         for (; i < sizeof(conv_array)/sizeof(conv_array[0]); ++i) { \
62                 if ((conv_array[i].value) == tmp_var) \
63                         return conv_array[i].str; \
64         } \
65         return "Invalid argument"; \
66 }
67
68 #define _dmmp_str_conv_func_gen(func_name, ctx, var_name, out_type, \
69                                 unknown_value, conv_array) \
70 static out_type func_name(struct dmmp_context *ctx, const char *var_name) { \
71         size_t i = 0; \
72         for (; i < sizeof(conv_array)/sizeof(conv_array[0]); ++i) { \
73                 if (strcmp(conv_array[i].str, var_name) == 0) \
74                         return conv_array[i].value; \
75         } \
76         _warn(ctx, "Got unknown " #var_name ": '%s'", var_name); \
77         return unknown_value; \
78 }
79
80 #define _json_obj_get_value(ctx, j_obj, out_value, key, value_type, \
81                             value_func, rc, out) \
82 do { \
83         json_type j_type = json_type_null; \
84         json_object *j_obj_tmp = NULL; \
85         if (json_object_object_get_ex(j_obj, key, &j_obj_tmp) != TRUE) { \
86                 _error(ctx, "Invalid JSON output from multipathd IPC: " \
87                        "key '%s' not found", key); \
88                 rc = DMMP_ERR_IPC_ERROR; \
89                 goto out; \
90         } \
91         if (j_obj_tmp == NULL) { \
92                 _error(ctx, "BUG: Got NULL j_obj_tmp from " \
93                        "json_object_object_get_ex() while it return TRUE"); \
94                 rc = DMMP_ERR_BUG; \
95                 goto out; \
96         } \
97         j_type = json_object_get_type(j_obj_tmp); \
98         if (j_type != value_type) { \
99                 _error(ctx, "Invalid value type for key'%s' of JSON output " \
100                        "from multipathd IPC. Should be %s(%d), " \
101                        "but got %s(%d)", key, json_type_to_name(value_type), \
102                        value_type, json_type_to_name(j_type), j_type); \
103                 rc = DMMP_ERR_IPC_ERROR; \
104                 goto out; \
105         } \
106         out_value = value_func(j_obj_tmp); \
107 } while(0);
108
109 DMMP_DLL_LOCAL int _dmmp_ipc_exec(struct dmmp_context *ctx, const char *cmd,
110                                   char **output);
111
112 DMMP_DLL_LOCAL struct dmmp_mpath *_dmmp_mpath_new(void);
113 DMMP_DLL_LOCAL struct dmmp_path_group *_dmmp_path_group_new(void);
114 DMMP_DLL_LOCAL struct dmmp_path *_dmmp_path_new(void);
115
116 DMMP_DLL_LOCAL int _dmmp_mpath_update(struct dmmp_context *ctx,
117                                       struct dmmp_mpath *dmmp_mp,
118                                       json_object *j_obj_map);
119 DMMP_DLL_LOCAL int _dmmp_path_group_update(struct dmmp_context *ctx,
120                                            struct dmmp_path_group *dmmp_pg,
121                                            json_object *j_obj_pg);
122 DMMP_DLL_LOCAL int _dmmp_path_update(struct dmmp_context *ctx,
123                                      struct dmmp_path *dmmp_p,
124                                      json_object *j_obj_p);
125
126 DMMP_DLL_LOCAL void _dmmp_mpath_free(struct dmmp_mpath *dmmp_mp);
127 DMMP_DLL_LOCAL void _dmmp_path_group_free(struct dmmp_path_group *dmmp_pg);
128 DMMP_DLL_LOCAL void _dmmp_path_group_array_free
129         (struct dmmp_path_group **dmmp_pgs, uint32_t dmmp_pg_count);
130 DMMP_DLL_LOCAL void _dmmp_path_free(struct dmmp_path *dmmp_p);
131 DMMP_DLL_LOCAL void _dmmp_log(struct dmmp_context *ctx, int priority,
132                               const char *file, int line,
133                               const char *func_name,
134                               const char *format, ...);
135 DMMP_DLL_LOCAL void _dmmp_log_err_str(struct dmmp_context *ctx, int rc);
136
137 DMMP_DLL_LOCAL void _dmmp_log_stderr(struct dmmp_context *ctx, int priority,
138                                      const char *file, int line,
139                                      const char *func_name, const char *format,
140                                      va_list args);
141
142
143 #define _dmmp_log_cond(ctx, prio, arg...) \
144         do { \
145                 if (dmmp_context_log_priority_get(ctx) >= prio) \
146                         _dmmp_log(ctx, prio, __FILE__, __LINE__, __FUNCTION__, \
147                                   ## arg); \
148         } while (0)
149
150 #define _debug(ctx, arg...) \
151         _dmmp_log_cond(ctx, DMMP_LOG_PRIORITY_DEBUG, ## arg)
152 #define _info(ctx, arg...) \
153         _dmmp_log_cond(ctx, DMMP_LOG_PRIORITY_INFO, ## arg)
154 #define _warn(ctx, arg...) \
155         _dmmp_log_cond(ctx, DMMP_LOG_PRIORITY_WARNING, ## arg)
156 #define _error(ctx, arg...) \
157         _dmmp_log_cond(ctx, DMMP_LOG_PRIORITY_ERROR, ## arg)
158
159 /*
160  * Check pointer returned by malloc() or strdup(), if NULL, set
161  * rc as DMMP_ERR_NO_MEMORY, report error and goto goto_out.
162  */
163 #define _dmmp_alloc_null_check(ctx, ptr, rc, goto_out) \
164         do { \
165                 if (ptr == NULL) { \
166                         rc = DMMP_ERR_NO_MEMORY; \
167                         _error(ctx, dmmp_strerror(rc)); \
168                         goto goto_out; \
169                 } \
170         } while(0)
171
172 #define _dmmp_null_or_empty_str_check(ctx, var, rc, goto_out) \
173         do { \
174                 if (var == NULL) { \
175                         rc = DMMP_ERR_BUG; \
176                         _error(ctx, "BUG: Got NULL " #var); \
177                         goto goto_out; \
178                 } \
179                 if (strlen(var) == 0) { \
180                         rc = DMMP_ERR_BUG; \
181                         _error(ctx, "BUG: Got empty " #var); \
182                         goto goto_out; \
183                 } \
184         } while(0)
185
186 #define _dmmp_getter_func_gen(func_name, struct_name, struct_data, \
187                               prop_name, prop_type) \
188         prop_type func_name(struct_name *struct_data) \
189         { \
190                 assert(struct_data != NULL); \
191                 return struct_data->prop_name; \
192         }
193
194 #define _dmmp_array_free_func_gen(func_name, struct_name, struct_free_func) \
195         void func_name(struct_name **ptr_array, uint32_t ptr_count) \
196         { \
197                 uint32_t i = 0; \
198                 if (ptr_array == NULL) \
199                         return; \
200                 for (; i < ptr_count; ++i) \
201                         struct_free_func(ptr_array[i]); \
202                 free(ptr_array); \
203         }
204
205 #ifdef __cplusplus
206 } /* End of extern "C" */
207 #endif
208
209 #endif /* End of _LIB_DMMP_PRIVATE_H_ */