1 /*
2  * Copyright (c) 2008, 2009, 2012, 2013 by Farsight Security, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *    http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 /* Import. */
18 
19 #include "private.h"
20 
21 /* Export. */
22 
23 nmsg_msgmod_t
nmsg_msgmod_lookup(unsigned vid,unsigned msgtype)24 nmsg_msgmod_lookup(unsigned vid, unsigned msgtype) {
25 	struct nmsg_msgmodset *ms = _nmsg_global_msgmodset;
26 	struct nmsg_msgmod *mod;
27 	struct nmsg_msgvendor *msgv;
28 
29 	assert(ms != NULL);
30 
31 	if (vid <= ms->nv) {
32 		msgv = ms->vendors[vid];
33 		if (msgv != NULL && msgtype <= msgv->nm) {
34 			mod = msgv->msgtypes[msgtype];
35 			return (mod);
36 		}
37 	}
38 
39 	return (NULL);
40 }
41 
42 nmsg_msgmod_t
nmsg_msgmod_lookup_byname(const char * vname,const char * mname)43 nmsg_msgmod_lookup_byname(const char *vname, const char *mname) {
44 	unsigned vid = 0;
45 	unsigned msgtype = 0;
46 
47 	vid = nmsg_msgmod_vname_to_vid(vname);
48 	msgtype = nmsg_msgmod_mname_to_msgtype(vid, mname);
49 
50 	if (vid == 0 || msgtype == 0)
51 		return (NULL);
52 
53 	return (nmsg_msgmod_lookup(vid, msgtype));
54 }
55 
56 unsigned
nmsg_msgmod_vname_to_vid(const char * vname)57 nmsg_msgmod_vname_to_vid(const char *vname) {
58 	struct nmsg_msgmodset *ms = _nmsg_global_msgmodset;
59 	unsigned i, j;
60 
61 	assert(ms != NULL);
62 
63 	if (strcasecmp(vname, "ISC") == 0)
64 		vname = "base";
65 
66 	for (i = 0; i <= ms->nv; i++) {
67 		struct nmsg_msgvendor *msgv;
68 		msgv = ms->vendors[i];
69 
70 		if (msgv != NULL) {
71 			for (j = 0; j <= msgv->nm; j++) {
72 				struct nmsg_msgmod *mod;
73 				mod = msgv->msgtypes[j];
74 
75 				if (mod != NULL &&
76 				    strcasecmp(mod->plugin->vendor.name, vname) == 0)
77 					return (mod->plugin->vendor.id);
78 			}
79 		}
80 	}
81 	return (0);
82 }
83 
84 unsigned
nmsg_msgmod_mname_to_msgtype(unsigned vid,const char * mname)85 nmsg_msgmod_mname_to_msgtype(unsigned vid, const char *mname) {
86 	struct nmsg_msgmodset *ms = _nmsg_global_msgmodset;
87 	unsigned i;
88 
89 	assert(ms != NULL);
90 
91 	if (vid <= ms->nv) {
92 		struct nmsg_msgvendor *msgv;
93 
94 		msgv = ms->vendors[vid];
95 		if (msgv == NULL)
96 			return (0);
97 		for (i = 0; i <= msgv->nm; i++) {
98 			struct nmsg_msgmod *mod;
99 
100 			mod = msgv->msgtypes[i];
101 			if (mod != NULL) {
102 				if (strcasecmp(mod->plugin->msgtype.name, mname) == 0)
103 					return (mod->plugin->msgtype.id);
104 			}
105 		}
106 	}
107 
108 	return (0);
109 }
110 
111 const char *
nmsg_msgmod_vid_to_vname(unsigned vid)112 nmsg_msgmod_vid_to_vname(unsigned vid) {
113 	struct nmsg_msgmodset *ms = _nmsg_global_msgmodset;
114 	struct nmsg_msgvendor *msgv;
115 	unsigned i;
116 
117 	assert(ms != NULL);
118 
119 	if (vid > ms->nv)
120 		return (NULL);
121 	msgv = ms->vendors[vid];
122 	if (msgv == NULL)
123 		return (NULL);
124 	for (i = 0; i <= msgv->nm; i++) {
125 		struct nmsg_msgmod *mod;
126 
127 		mod = msgv->msgtypes[i];
128 		if (mod != NULL && mod->plugin->vendor.id == vid)
129 			return (mod->plugin->vendor.name);
130 	}
131 	return (NULL);
132 }
133 
134 const char *
nmsg_msgmod_msgtype_to_mname(unsigned vid,unsigned msgtype)135 nmsg_msgmod_msgtype_to_mname(unsigned vid, unsigned msgtype) {
136 	struct nmsg_msgmodset *ms = _nmsg_global_msgmodset;
137 	struct nmsg_msgvendor *msgv;
138 	unsigned i;
139 
140 	assert(ms != NULL);
141 
142 	if (vid > ms->nv)
143 		return (NULL);
144 	msgv = ms->vendors[vid];
145 	if (msgv == NULL)
146 		return (NULL);
147 	for (i = 0; i <= msgv->nm; i++) {
148 		struct nmsg_msgmod *mod;
149 
150 		mod = msgv->msgtypes[i];
151 		if (mod != NULL && mod->plugin->vendor.id == vid) {
152 			if (mod->plugin->msgtype.id == msgtype)
153 				return (mod->plugin->msgtype.name);
154 		}
155 	}
156 	return (NULL);
157 }
158 
159 unsigned
nmsg_msgmod_get_max_vid(void)160 nmsg_msgmod_get_max_vid(void) {
161 	struct nmsg_msgmodset *ms = _nmsg_global_msgmodset;
162 	assert(ms != NULL);
163 	return (ms->nv);
164 }
165 
166 unsigned
nmsg_msgmod_get_max_msgtype(unsigned vid)167 nmsg_msgmod_get_max_msgtype(unsigned vid) {
168 	struct nmsg_msgmodset *ms = _nmsg_global_msgmodset;
169 	struct nmsg_msgvendor *msgv;
170 
171 	assert(ms != NULL);
172 	if (vid > ms->nv)
173 		return (0);
174 	msgv = ms->vendors[vid];
175 	if (msgv == NULL)
176 		return (0);
177 	return (msgv->nm);
178 }
179