Commit | Line | Data |
---|---|---|
fb2dcc52 JG |
1 | /* |
2 | * plugin.c | |
3 | * | |
4 | * Babeltrace Plugin | |
5 | * | |
3310b217 | 6 | * Copyright 2016 Jérémie Galarneau <jeremie.galarneau@efficios.com> |
fb2dcc52 JG |
7 | * |
8 | * Author: Jérémie Galarneau <jeremie.galarneau@efficios.com> | |
9 | * | |
10 | * Permission is hereby granted, free of charge, to any person obtaining a copy | |
11 | * of this software and associated documentation files (the "Software"), to deal | |
12 | * in the Software without restriction, including without limitation the rights | |
13 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
14 | * copies of the Software, and to permit persons to whom the Software is | |
15 | * furnished to do so, subject to the following conditions: | |
16 | * | |
17 | * The above copyright notice and this permission notice shall be included in | |
18 | * all copies or substantial portions of the Software. | |
19 | * | |
20 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
21 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
22 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
23 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
24 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
25 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |
26 | * SOFTWARE. | |
27 | */ | |
28 | ||
29 | #include <babeltrace/compiler.h> | |
b8a06801 | 30 | #include <babeltrace/ref.h> |
fb2dcc52 | 31 | #include <babeltrace/plugin/plugin-internal.h> |
cba174d5 | 32 | #include <babeltrace/plugin/component-factory-internal.h> |
fb2dcc52 JG |
33 | #include <glib.h> |
34 | ||
7c7c0433 JG |
35 | #define PLUGIN_SYMBOL_NAME "__bt_plugin_name" |
36 | #define PLUGIN_SYMBOL_AUTHOR "__bt_plugin_author" | |
37 | #define PLUGIN_SYMBOL_LICENSE "__bt_plugin_license" | |
cba174d5 | 38 | #define PLUGIN_SYMBOL_REGISTER "__bt_plugin_register" |
7c7c0433 | 39 | #define PLUGIN_SYMBOL_DESCRIPTION "__bt_plugin_description" |
50335272 | 40 | |
cba174d5 JG |
41 | DECLARE_PLUG_IN_SECTIONS; |
42 | ||
fb2dcc52 | 43 | static |
b8a06801 | 44 | void bt_plugin_destroy(struct bt_object *obj) |
fb2dcc52 JG |
45 | { |
46 | struct bt_plugin *plugin; | |
47 | ||
b8a06801 JG |
48 | assert(obj); |
49 | plugin = container_of(obj, struct bt_plugin, base); | |
50 | ||
fb2dcc52 JG |
51 | if (plugin->module) { |
52 | if (!g_module_close(plugin->module)) { | |
cba174d5 | 53 | printf_error("Module close error: %s\n", |
2e339de1 | 54 | g_module_error()); |
fb2dcc52 JG |
55 | } |
56 | } | |
7c7c0433 | 57 | |
cba174d5 JG |
58 | if (plugin->path) { |
59 | g_string_free(plugin->path, TRUE); | |
60 | } | |
fb2dcc52 JG |
61 | g_free(plugin); |
62 | } | |
63 | ||
64 | BT_HIDDEN | |
cba174d5 JG |
65 | struct bt_plugin *bt_plugin_create_from_module(GModule *module, |
66 | const char *path) | |
fb2dcc52 | 67 | { |
50335272 | 68 | struct bt_plugin *plugin = NULL; |
2e339de1 | 69 | gpointer symbol = NULL; |
50335272 | 70 | |
7c7c0433 | 71 | if (!module || !path) { |
50335272 JG |
72 | goto error; |
73 | } | |
fb2dcc52 JG |
74 | |
75 | plugin = g_new0(struct bt_plugin, 1); | |
76 | if (!plugin) { | |
50335272 | 77 | goto error; |
fb2dcc52 JG |
78 | } |
79 | ||
b8a06801 | 80 | bt_object_init(plugin, bt_plugin_destroy); |
7c7c0433 JG |
81 | plugin->path = g_string_new(path); |
82 | if (!plugin->path) { | |
83 | goto error; | |
84 | } | |
85 | ||
50335272 | 86 | if (!g_module_symbol(module, PLUGIN_SYMBOL_NAME, |
2e339de1 | 87 | (gpointer *) &plugin->name)) { |
5e86a071 | 88 | printf_verbose("Unable to resolve plugin symbol %s from %s\n", |
2e339de1 | 89 | PLUGIN_SYMBOL_NAME, g_module_name(module)); |
50335272 JG |
90 | goto error; |
91 | } | |
4647b93a | 92 | |
50335272 | 93 | if (!g_module_symbol(module, PLUGIN_SYMBOL_LICENSE, |
2e339de1 | 94 | (gpointer *) &plugin->license)) { |
5e86a071 | 95 | printf_verbose("Unable to resolve plugin symbol %s from %s\n", |
2e339de1 | 96 | PLUGIN_SYMBOL_LICENSE, g_module_name(module)); |
50335272 JG |
97 | goto error; |
98 | } | |
cba174d5 JG |
99 | if (!g_module_symbol(module, PLUGIN_SYMBOL_AUTHOR, |
100 | (gpointer *) &plugin->author)) { | |
101 | printf_verbose("Unable to resolve plugin symbol %s from %s\n", | |
102 | PLUGIN_SYMBOL_AUTHOR, g_module_name(module)); | |
103 | goto error; | |
104 | } | |
105 | if (!g_module_symbol(module, PLUGIN_SYMBOL_DESCRIPTION, | |
106 | (gpointer *) &plugin->description)) { | |
107 | printf_verbose("Unable to resolve plugin symbol %s from %s\n", | |
108 | PLUGIN_SYMBOL_DESCRIPTION, | |
109 | g_module_name(module)); | |
110 | goto error; | |
111 | } | |
112 | if (!g_module_symbol(module, PLUGIN_SYMBOL_REGISTER, &symbol)) { | |
113 | printf_verbose("Unable to resolve plugin symbol %s from %s\n", | |
114 | PLUGIN_SYMBOL_REGISTER, g_module_name(module)); | |
50335272 | 115 | goto error; |
2e339de1 | 116 | } else { |
cba174d5 JG |
117 | plugin->_register = *((bt_plugin_register_func *) symbol); |
118 | if (!plugin->_register) { | |
119 | printf_verbose("NULL %s symbol target\n", | |
120 | PLUGIN_SYMBOL_REGISTER); | |
2e339de1 JG |
121 | goto error; |
122 | } | |
50335272 JG |
123 | } |
124 | ||
cba174d5 JG |
125 | return plugin; |
126 | error: | |
127 | BT_PUT(plugin); | |
128 | return plugin; | |
129 | } | |
130 | ||
131 | BT_HIDDEN | |
132 | struct bt_plugin *bt_plugin_create_from_static(size_t i) | |
133 | { | |
134 | struct bt_plugin *plugin = NULL; | |
135 | ||
136 | plugin = g_new0(struct bt_plugin, 1); | |
137 | if (!plugin) { | |
138 | goto error; | |
2e339de1 | 139 | } |
50335272 | 140 | |
cba174d5 JG |
141 | bt_object_init(plugin, bt_plugin_destroy); |
142 | plugin->_register = (SECTION_BEGIN(__plugin_register_funcs))[i]; | |
143 | if (!plugin->_register) { | |
144 | goto error; | |
145 | } | |
146 | plugin->name = (SECTION_BEGIN(__plugin_names))[i]; | |
147 | plugin->author = (SECTION_BEGIN(__plugin_authors))[i]; | |
148 | plugin->license = (SECTION_BEGIN(__plugin_licenses))[i]; | |
149 | plugin->description = (SECTION_BEGIN(__plugin_descriptions))[i]; | |
fb2dcc52 | 150 | return plugin; |
50335272 | 151 | error: |
cba174d5 | 152 | BT_PUT(plugin); |
b8a06801 | 153 | return plugin; |
fb2dcc52 JG |
154 | } |
155 | ||
156 | BT_HIDDEN | |
157 | enum bt_component_status bt_plugin_register_component_classes( | |
158 | struct bt_plugin *plugin, struct bt_component_factory *factory) | |
159 | { | |
160 | assert(plugin && factory); | |
cba174d5 | 161 | return plugin->_register(factory); |
fb2dcc52 | 162 | } |
38b48196 JG |
163 | |
164 | const char *bt_plugin_get_name(struct bt_plugin *plugin) | |
165 | { | |
166 | return plugin ? plugin->name : NULL; | |
167 | } | |
168 | ||
169 | const char *bt_plugin_get_author(struct bt_plugin *plugin) | |
170 | { | |
171 | return plugin ? plugin->author : NULL; | |
172 | } | |
173 | ||
174 | const char *bt_plugin_get_license(struct bt_plugin *plugin) | |
175 | { | |
176 | return plugin ? plugin->license : NULL; | |
177 | } | |
7c7c0433 JG |
178 | |
179 | const char *bt_plugin_get_path(struct bt_plugin *plugin) | |
180 | { | |
cba174d5 | 181 | return (plugin && plugin->path) ? plugin->path->str : NULL; |
7c7c0433 JG |
182 | } |
183 | ||
184 | const char *bt_plugin_get_description(struct bt_plugin *plugin) | |
185 | { | |
186 | return plugin ? plugin->description : NULL; | |
187 | } |