38 _nmsg_msgmodset_init(
const char *plugin_path) {
41 struct dirent *de = NULL;
45 assert(plugin_path != NULL);
47 _nmsg_dprintf(2,
"%s: loading modules from %s\n", __func__, plugin_path);
49 fname = ubuf_init(128);
50 msgmodset = calloc(1,
sizeof(*msgmodset));
51 assert(msgmodset != NULL);
52 msgmodset->vendors = calloc(1,
sizeof(
void *));
53 assert(msgmodset->vendors != NULL);
55 dir = opendir(plugin_path);
57 _nmsg_dprintf(1,
"%s: unable to opendir %s: %s\n",
58 __func__, plugin_path, strerror(errno));
61 while ((de = readdir(dir)) != NULL) {
70 ubuf_add_fmt(fname,
"%s/%s", plugin_path, de->d_name);
72 if (stat(ubuf_cstr(fname), &statbuf) == -1)
74 if (!S_ISREG(statbuf.st_mode))
79 !(fn[fnlen - 3] ==
'.' &&
80 fn[fnlen - 2] ==
's' &&
81 fn[fnlen - 1] ==
'o'))
88 if (strstr(fn, NMSG_MSG_MODULE_PREFIX
"_isc.") == fn) {
93 if (strstr(fn, NMSG_MSG_MODULE_PREFIX
"_") == fn) {
94 _nmsg_dprintf(4,
"%s: trying %s\n", __func__, ubuf_cstr(fname));
95 dlmod = _nmsg_dlmod_init(ubuf_cstr(fname));
98 _nmsg_dprintf(4,
"%s: loading nmsg message module %s\n",
99 __func__, ubuf_cstr(fname));
102 dlsym(dlmod->handle,
"nmsg_msgmod_ctx");
107 dlsym(dlmod->handle,
"nmsg_msgmod_ctx_array");
108 if (plugin_array == NULL)
111 if (plugin == NULL && plugin_array == NULL) {
112 _nmsg_dprintf(1,
"%s: WARNING: no modules found,"
113 " not loading %s\n", __func__, ubuf_cstr(fname));
114 _nmsg_dlmod_destroy(&dlmod);
118 dlmod->type = nmsg_modtype_msgmod;
119 ISC_LIST_APPEND(msgmodset->dlmods, dlmod, link);
121 if (plugin != NULL) {
122 res = msgmodset_load_module(msgmodset, plugin, fn);
127 if (plugin_array != NULL) {
130 for (i = 0, plugin = plugin_array[i];
132 i++, plugin = plugin_array[i])
134 res = msgmodset_load_module(msgmodset,
145 ubuf_destroy(&fname);
147 _nmsg_msgmodset_destroy(&msgmodset);
149 (void) closedir(dir);
159 unsigned vid, msgtype;
165 dlmod = ISC_LIST_HEAD(ms->dlmods);
166 while (dlmod != NULL) {
167 dlmod_next = ISC_LIST_NEXT(dlmod, link);
168 _nmsg_dlmod_destroy(&dlmod);
171 for (vid = 0; vid <= ms->nv; vid++) {
172 msgv = ms->vendors[vid];
176 for (msgtype = 0; msgtype <= msgv->nm; msgtype++) {
177 mod = msgv->msgtypes[msgtype];
179 _nmsg_msgmod_stop(&mod);
181 free(msgv->msgtypes);
197 if (plugin->
msgver != NMSG_MSGMOD_VERSION) {
198 _nmsg_dprintf(1,
"%s: WARNING: version mismatch, not loading %s\n",
203 if (plugin->
type == nmsg_msgmod_type_transparent) {
221 uint32_t nmsg_protobuf_c_major =
222 PROTOBUF_C_VERSION_NUMBER / 1000000;
223 uint32_t plugin_protobuf_c_major =
226 if (nmsg_protobuf_c_major != plugin_protobuf_c_major) {
227 _nmsg_dprintf(1,
"%s: WARNING: protobuf-c major version mismatch "
228 "(%u != %u), not loading %s\n",
230 nmsg_protobuf_c_major,
231 plugin_protobuf_c_major,
237 msgmod = _nmsg_msgmod_start(plugin);
238 if (msgmod == NULL) {
239 _nmsg_dprintf(1,
"%s: unable to load message type %s/%s from %s\n",
244 msgmodset_insert_module(ms, msgmod);
245 if (_nmsg_global_debug >= 3) {
246 _nmsg_dprintf(3,
"%s: loaded message schema %s/%s from %s "
250 }
else if (_nmsg_global_debug == 2) {
251 _nmsg_dprintf(2,
"%s: loaded message schema %s/%s\n",
261 unsigned i, vid, max_msgtype;
268 size_t vsz =
sizeof(
void *) * (vid + 1);
269 ms->vendors = realloc(ms->vendors, vsz);
270 assert(ms->vendors != NULL);
271 for (i = ms->nv + 1; i <= vid; i++)
272 ms->vendors[i] = NULL;
275 if (ms->vendors[vid] == NULL) {
278 assert(ms->vendors[vid] != NULL);
279 ms->vendors[vid]->msgtypes = calloc(1,
sizeof(
void *));
280 assert(ms->vendors[vid]->msgtypes != NULL);
282 msgv = ms->vendors[vid];
283 if (msgv->nm < max_msgtype) {
285 size_t msz =
sizeof(
void *) * (max_msgtype + 1);
286 msgv->msgtypes = realloc(msgv->msgtypes, msz);
287 assert(msgv->msgtypes != NULL);
288 for (i = msgv->nm + 1; i <= max_msgtype; i++)
289 msgv->msgtypes[i] = NULL;
290 msgv->nm = max_msgtype;
292 if (msgv->msgtypes[mod->plugin->
msgtype.
id] != NULL)
293 _nmsg_dprintf(1,
"%s: WARNING: already loaded module for "
294 "vendor id %u, message type %u\n", __func__,
296 msgv->msgtypes[mod->plugin->
msgtype.
id] = mod;
Structure exported by message modules to implement a new message type.
const char * name
Human readable name.
an nmsg_message MUST always have a non-NULL ->np member.
nmsg_msgmod_type type
Module type.
uint32_t protobuf_c_version_number
protobuf-c version number.
struct nmsg_idname msgtype
Message type and name.
struct nmsg_idname vendor
Vendor ID and name.
int msgver
Module interface version.