]>
Commit | Line | Data |
---|---|---|
61b844bf TL |
1 | /* support.c |
2 | ||
3 | Subroutines providing general support for objects. */ | |
4 | ||
5 | /* | |
edad9be5 | 6 | * Copyright (c) 2009,2012,2014 by Internet Systems Consortium, Inc. ("ISC") |
0f750c4f | 7 | * Copyright (c) 2004-2007 by Internet Systems Consortium, Inc. ("ISC") |
98311e4b | 8 | * Copyright (c) 1999-2003 by Internet Software Consortium |
61b844bf | 9 | * |
98311e4b DH |
10 | * Permission to use, copy, modify, and distribute this software for any |
11 | * purpose with or without fee is hereby granted, provided that the above | |
12 | * copyright notice and this permission notice appear in all copies. | |
61b844bf | 13 | * |
98311e4b DH |
14 | * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES |
15 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
16 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR | |
17 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
18 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
19 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT | |
20 | * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
61b844bf | 21 | * |
98311e4b DH |
22 | * Internet Systems Consortium, Inc. |
23 | * 950 Charter Street | |
24 | * Redwood City, CA 94063 | |
25 | * <info@isc.org> | |
2c85ac9b | 26 | * https://www.isc.org/ |
49733f31 | 27 | * |
61b844bf TL |
28 | */ |
29 | ||
fe5b0fdd DH |
30 | #include "dhcpd.h" |
31 | ||
6a4c4be8 | 32 | #include <omapip/omapip_p.h> |
61b844bf TL |
33 | |
34 | omapi_object_type_t *omapi_type_connection; | |
35 | omapi_object_type_t *omapi_type_listener; | |
36 | omapi_object_type_t *omapi_type_io_object; | |
37 | omapi_object_type_t *omapi_type_datagram; | |
38 | omapi_object_type_t *omapi_type_generic; | |
39 | omapi_object_type_t *omapi_type_protocol; | |
40 | omapi_object_type_t *omapi_type_protocol_listener; | |
41 | omapi_object_type_t *omapi_type_waiter; | |
42 | omapi_object_type_t *omapi_type_remote; | |
43 | omapi_object_type_t *omapi_type_message; | |
49146f3c | 44 | omapi_object_type_t *omapi_type_auth_key; |
61b844bf TL |
45 | |
46 | omapi_object_type_t *omapi_object_types; | |
47 | int omapi_object_type_count; | |
61b844bf | 48 | |
d758ad8c TL |
49 | #if defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT) |
50 | void omapi_type_relinquish () | |
51 | { | |
52 | omapi_object_type_t *t, *n; | |
53 | ||
54 | for (t = omapi_object_types; t; t = n) { | |
55 | n = t -> next; | |
56 | dfree (t, MDL); | |
57 | } | |
58 | omapi_object_types = (omapi_object_type_t *)0; | |
59 | } | |
60 | #endif | |
61 | ||
61b844bf TL |
62 | isc_result_t omapi_init (void) |
63 | { | |
64 | isc_result_t status; | |
65 | ||
66 | /* Register all the standard object types... */ | |
67 | status = omapi_object_type_register (&omapi_type_connection, | |
68 | "connection", | |
69 | omapi_connection_set_value, | |
70 | omapi_connection_get_value, | |
71 | omapi_connection_destroy, | |
72 | omapi_connection_signal_handler, | |
581e37e4 | 73 | omapi_connection_stuff_values, |
0b1e395f | 74 | 0, 0, 0, 0, 0, 0, |
20916cae | 75 | sizeof |
98311e4b DH |
76 | (omapi_connection_object_t), 0, |
77 | RC_MISC); | |
61b844bf TL |
78 | if (status != ISC_R_SUCCESS) |
79 | return status; | |
80 | ||
81 | status = omapi_object_type_register (&omapi_type_listener, | |
82 | "listener", | |
83 | omapi_listener_set_value, | |
84 | omapi_listener_get_value, | |
85 | omapi_listener_destroy, | |
86 | omapi_listener_signal_handler, | |
581e37e4 | 87 | omapi_listener_stuff_values, |
0b1e395f | 88 | 0, 0, 0, 0, 0, 0, |
c4403423 | 89 | sizeof (omapi_listener_object_t), |
98311e4b | 90 | 0, RC_MISC); |
61b844bf TL |
91 | if (status != ISC_R_SUCCESS) |
92 | return status; | |
93 | ||
94 | status = omapi_object_type_register (&omapi_type_io_object, | |
95 | "io", | |
96 | omapi_io_set_value, | |
97 | omapi_io_get_value, | |
98 | omapi_io_destroy, | |
99 | omapi_io_signal_handler, | |
581e37e4 | 100 | omapi_io_stuff_values, |
0b1e395f | 101 | 0, 0, 0, 0, 0, 0, |
98311e4b DH |
102 | sizeof (omapi_io_object_t), |
103 | 0, RC_MISC); | |
61b844bf TL |
104 | if (status != ISC_R_SUCCESS) |
105 | return status; | |
106 | ||
107 | status = omapi_object_type_register (&omapi_type_generic, | |
108 | "generic", | |
109 | omapi_generic_set_value, | |
110 | omapi_generic_get_value, | |
111 | omapi_generic_destroy, | |
112 | omapi_generic_signal_handler, | |
581e37e4 | 113 | omapi_generic_stuff_values, |
0b1e395f | 114 | 0, 0, 0, 0, 0, 0, |
c4403423 | 115 | sizeof (omapi_generic_object_t), |
98311e4b | 116 | 0, RC_MISC); |
61b844bf TL |
117 | if (status != ISC_R_SUCCESS) |
118 | return status; | |
119 | ||
120 | status = omapi_object_type_register (&omapi_type_protocol, | |
121 | "protocol", | |
122 | omapi_protocol_set_value, | |
123 | omapi_protocol_get_value, | |
124 | omapi_protocol_destroy, | |
125 | omapi_protocol_signal_handler, | |
581e37e4 | 126 | omapi_protocol_stuff_values, |
0b1e395f | 127 | 0, 0, 0, 0, 0, 0, |
c4403423 | 128 | sizeof (omapi_protocol_object_t), |
98311e4b | 129 | 0, RC_MISC); |
61b844bf TL |
130 | if (status != ISC_R_SUCCESS) |
131 | return status; | |
132 | ||
20916cae TL |
133 | status = (omapi_object_type_register |
134 | (&omapi_type_protocol_listener, "protocol-listener", | |
135 | omapi_protocol_listener_set_value, | |
136 | omapi_protocol_listener_get_value, | |
137 | omapi_protocol_listener_destroy, | |
138 | omapi_protocol_listener_signal, | |
139 | omapi_protocol_listener_stuff, | |
0b1e395f | 140 | 0, 0, 0, 0, 0, 0, |
98311e4b | 141 | sizeof (omapi_protocol_listener_object_t), 0, RC_MISC)); |
61b844bf TL |
142 | if (status != ISC_R_SUCCESS) |
143 | return status; | |
144 | ||
145 | status = omapi_object_type_register (&omapi_type_message, | |
146 | "message", | |
147 | omapi_message_set_value, | |
148 | omapi_message_get_value, | |
149 | omapi_message_destroy, | |
150 | omapi_message_signal_handler, | |
581e37e4 | 151 | omapi_message_stuff_values, |
0b1e395f | 152 | 0, 0, 0, 0, 0, 0, |
c4403423 | 153 | sizeof (omapi_message_object_t), |
98311e4b | 154 | 0, RC_MISC); |
61b844bf TL |
155 | if (status != ISC_R_SUCCESS) |
156 | return status; | |
157 | ||
158 | status = omapi_object_type_register (&omapi_type_waiter, | |
159 | "waiter", | |
160 | 0, | |
161 | 0, | |
162 | 0, | |
581e37e4 | 163 | omapi_waiter_signal_handler, 0, |
0b1e395f | 164 | 0, 0, 0, 0, 0, 0, |
c4403423 | 165 | sizeof (omapi_waiter_object_t), |
98311e4b | 166 | 0, RC_MISC); |
61b844bf TL |
167 | if (status != ISC_R_SUCCESS) |
168 | return status; | |
169 | ||
49146f3c DN |
170 | status = omapi_object_type_register (&omapi_type_auth_key, |
171 | "authenticator", | |
172 | 0, | |
173 | omapi_auth_key_get_value, | |
174 | omapi_auth_key_destroy, | |
175 | 0, | |
176 | omapi_auth_key_stuff_values, | |
177 | omapi_auth_key_lookup, | |
178 | 0, 0, 0, 0, 0, | |
98311e4b DH |
179 | sizeof (omapi_auth_key_t), 0, |
180 | RC_MISC); | |
49146f3c DN |
181 | if (status != ISC_R_SUCCESS) |
182 | return status; | |
183 | ||
3ce5a420 TL |
184 | #if defined (TRACING) |
185 | omapi_listener_trace_setup (); | |
bc43c813 TL |
186 | omapi_connection_trace_setup (); |
187 | omapi_buffer_trace_setup (); | |
3ce5a420 TL |
188 | #endif |
189 | ||
61b844bf TL |
190 | /* This seems silly, but leave it. */ |
191 | return ISC_R_SUCCESS; | |
192 | } | |
193 | ||
194 | isc_result_t omapi_object_type_register (omapi_object_type_t **type, | |
b1b7b521 | 195 | const char *name, |
61b844bf TL |
196 | isc_result_t (*set_value) |
197 | (omapi_object_t *, | |
198 | omapi_object_t *, | |
199 | omapi_data_string_t *, | |
200 | omapi_typed_data_t *), | |
201 | isc_result_t (*get_value) | |
202 | (omapi_object_t *, | |
203 | omapi_object_t *, | |
204 | omapi_data_string_t *, | |
205 | omapi_value_t **), | |
206 | isc_result_t (*destroy) | |
b1b7b521 | 207 | (omapi_object_t *, |
4bd8800e | 208 | const char *, int), |
61b844bf TL |
209 | isc_result_t (*signal_handler) |
210 | (omapi_object_t *, | |
b1b7b521 | 211 | const char *, va_list), |
61b844bf TL |
212 | isc_result_t (*stuff_values) |
213 | (omapi_object_t *, | |
214 | omapi_object_t *, | |
581e37e4 TL |
215 | omapi_object_t *), |
216 | isc_result_t (*lookup) | |
217 | (omapi_object_t **, | |
218 | omapi_object_t *, | |
219 | omapi_object_t *), | |
220 | isc_result_t (*create) | |
221 | (omapi_object_t **, | |
34a04392 | 222 | omapi_object_t *), |
ccce1cc6 | 223 | isc_result_t (*remove) |
34a04392 | 224 | (omapi_object_t *, |
20916cae TL |
225 | omapi_object_t *), |
226 | isc_result_t (*freer) | |
227 | (omapi_object_t *, | |
228 | const char *, int), | |
0b1e395f TL |
229 | isc_result_t (*allocator) |
230 | (omapi_object_t **, | |
231 | const char *, int), | |
20916cae | 232 | isc_result_t (*sizer) (size_t), |
c4403423 TL |
233 | size_t size, |
234 | isc_result_t (*initialize) | |
235 | (omapi_object_t *, | |
98311e4b DH |
236 | const char *, int), |
237 | int rc_flag) | |
61b844bf TL |
238 | { |
239 | omapi_object_type_t *t; | |
240 | ||
4bd8800e | 241 | t = dmalloc (sizeof *t, MDL); |
2fbdfd65 TL |
242 | if (!t) |
243 | return ISC_R_NOMEMORY; | |
244 | memset (t, 0, sizeof *t); | |
245 | ||
246 | t -> name = name; | |
247 | t -> set_value = set_value; | |
248 | t -> get_value = get_value; | |
249 | t -> destroy = destroy; | |
250 | t -> signal_handler = signal_handler; | |
251 | t -> stuff_values = stuff_values; | |
252 | t -> lookup = lookup; | |
253 | t -> create = create; | |
ccce1cc6 | 254 | t -> remove = remove; |
2fbdfd65 | 255 | t -> next = omapi_object_types; |
20916cae TL |
256 | t -> sizer = sizer; |
257 | t -> size = size; | |
258 | t -> freer = freer; | |
0b1e395f | 259 | t -> allocator = allocator; |
c4403423 | 260 | t -> initialize = initialize; |
98311e4b | 261 | t -> rc_flag = rc_flag; |
2fbdfd65 | 262 | omapi_object_types = t; |
61b844bf | 263 | if (type) |
2fbdfd65 | 264 | *type = t; |
61b844bf TL |
265 | return ISC_R_SUCCESS; |
266 | } | |
267 | ||
b1b7b521 | 268 | isc_result_t omapi_signal (omapi_object_t *handle, const char *name, ...) |
61b844bf TL |
269 | { |
270 | va_list ap; | |
271 | omapi_object_t *outer; | |
272 | isc_result_t status; | |
273 | ||
274 | va_start (ap, name); | |
275 | for (outer = handle; outer -> outer; outer = outer -> outer) | |
276 | ; | |
277 | if (outer -> type -> signal_handler) | |
278 | status = (*(outer -> type -> signal_handler)) (outer, | |
279 | name, ap); | |
280 | else | |
281 | status = ISC_R_NOTFOUND; | |
282 | va_end (ap); | |
283 | return status; | |
284 | } | |
285 | ||
b1b7b521 | 286 | isc_result_t omapi_signal_in (omapi_object_t *handle, const char *name, ...) |
61b844bf TL |
287 | { |
288 | va_list ap; | |
61b844bf TL |
289 | isc_result_t status; |
290 | ||
291 | if (!handle) | |
292 | return ISC_R_NOTFOUND; | |
293 | va_start (ap, name); | |
294 | ||
295 | if (handle -> type -> signal_handler) | |
296 | status = (*(handle -> type -> signal_handler)) (handle, | |
297 | name, ap); | |
298 | else | |
299 | status = ISC_R_NOTFOUND; | |
300 | va_end (ap); | |
301 | return status; | |
302 | } | |
303 | ||
304 | isc_result_t omapi_set_value (omapi_object_t *h, | |
305 | omapi_object_t *id, | |
306 | omapi_data_string_t *name, | |
307 | omapi_typed_data_t *value) | |
308 | { | |
309 | omapi_object_t *outer; | |
eadee396 TL |
310 | isc_result_t status; |
311 | ||
6bbd4fd6 | 312 | #if defined (DEBUG) |
eadee396 TL |
313 | if (!value) { |
314 | log_info ("omapi_set_value (%.*s, NULL)", | |
315 | (int)name -> len, name -> value); | |
316 | } else if (value -> type == omapi_datatype_int) { | |
317 | log_info ("omapi_set_value (%.*s, %ld)", | |
318 | (int)name -> len, name -> value, | |
319 | (long)value -> u.integer); | |
320 | } else if (value -> type == omapi_datatype_string) { | |
321 | log_info ("omapi_set_value (%.*s, %.*s)", | |
322 | (int)name -> len, name -> value, | |
323 | (int)value -> u.buffer.len, value -> u.buffer.value); | |
324 | } else if (value -> type == omapi_datatype_data) { | |
325 | log_info ("omapi_set_value (%.*s, %ld %lx)", | |
326 | (int)name -> len, name -> value, | |
327 | (long)value -> u.buffer.len, | |
328 | (unsigned long)value -> u.buffer.value); | |
329 | } else if (value -> type == omapi_datatype_object) { | |
330 | log_info ("omapi_set_value (%.*s, %s)", | |
331 | (int)name -> len, name -> value, | |
332 | value -> u.object | |
333 | ? (value -> u.object -> type | |
334 | ? value -> u.object -> type -> name | |
335 | : "(unknown object)") | |
336 | : "(unknown object)"); | |
337 | } | |
6bbd4fd6 | 338 | #endif |
61b844bf TL |
339 | |
340 | for (outer = h; outer -> outer; outer = outer -> outer) | |
341 | ; | |
342 | if (outer -> type -> set_value) | |
eadee396 TL |
343 | status = (*(outer -> type -> set_value)) (outer, |
344 | id, name, value); | |
345 | else | |
346 | status = ISC_R_NOTFOUND; | |
6bbd4fd6 | 347 | #if defined (DEBUG) |
eadee396 | 348 | log_info (" ==> %s", isc_result_totext (status)); |
6bbd4fd6 | 349 | #endif |
eadee396 | 350 | return status; |
61b844bf TL |
351 | } |
352 | ||
2fbdfd65 TL |
353 | isc_result_t omapi_set_value_str (omapi_object_t *h, |
354 | omapi_object_t *id, | |
b1b7b521 | 355 | const char *name, |
2fbdfd65 TL |
356 | omapi_typed_data_t *value) |
357 | { | |
2fbdfd65 TL |
358 | omapi_data_string_t *nds; |
359 | isc_result_t status; | |
360 | ||
361 | nds = (omapi_data_string_t *)0; | |
4bd8800e | 362 | status = omapi_data_string_new (&nds, strlen (name), MDL); |
2fbdfd65 TL |
363 | if (status != ISC_R_SUCCESS) |
364 | return status; | |
365 | memcpy (nds -> value, name, strlen (name)); | |
366 | ||
31bbee78 TL |
367 | status = omapi_set_value (h, id, nds, value); |
368 | omapi_data_string_dereference (&nds, MDL); | |
369 | return status; | |
2fbdfd65 TL |
370 | } |
371 | ||
581e37e4 | 372 | isc_result_t omapi_set_boolean_value (omapi_object_t *h, omapi_object_t *id, |
b1b7b521 | 373 | const char *name, int value) |
581e37e4 TL |
374 | { |
375 | isc_result_t status; | |
376 | omapi_typed_data_t *tv = (omapi_typed_data_t *)0; | |
377 | omapi_data_string_t *n = (omapi_data_string_t *)0; | |
581e37e4 | 378 | |
4bd8800e | 379 | status = omapi_data_string_new (&n, strlen (name), MDL); |
581e37e4 TL |
380 | if (status != ISC_R_SUCCESS) |
381 | return status; | |
382 | memcpy (n -> value, name, strlen (name)); | |
383 | ||
4bd8800e | 384 | status = omapi_typed_data_new (MDL, &tv, omapi_datatype_int, value); |
581e37e4 | 385 | if (status != ISC_R_SUCCESS) { |
4bd8800e | 386 | omapi_data_string_dereference (&n, MDL); |
581e37e4 TL |
387 | return status; |
388 | } | |
389 | ||
390 | status = omapi_set_value (h, id, n, tv); | |
4bd8800e TL |
391 | omapi_data_string_dereference (&n, MDL); |
392 | omapi_typed_data_dereference (&tv, MDL); | |
581e37e4 TL |
393 | return status; |
394 | } | |
395 | ||
396 | isc_result_t omapi_set_int_value (omapi_object_t *h, omapi_object_t *id, | |
b1b7b521 | 397 | const char *name, int value) |
581e37e4 TL |
398 | { |
399 | isc_result_t status; | |
400 | omapi_typed_data_t *tv = (omapi_typed_data_t *)0; | |
401 | omapi_data_string_t *n = (omapi_data_string_t *)0; | |
581e37e4 | 402 | |
4bd8800e | 403 | status = omapi_data_string_new (&n, strlen (name), MDL); |
581e37e4 TL |
404 | if (status != ISC_R_SUCCESS) |
405 | return status; | |
406 | memcpy (n -> value, name, strlen (name)); | |
407 | ||
4bd8800e | 408 | status = omapi_typed_data_new (MDL, &tv, omapi_datatype_int, value); |
581e37e4 | 409 | if (status != ISC_R_SUCCESS) { |
4bd8800e | 410 | omapi_data_string_dereference (&n, MDL); |
581e37e4 TL |
411 | return status; |
412 | } | |
413 | ||
414 | status = omapi_set_value (h, id, n, tv); | |
4bd8800e TL |
415 | omapi_data_string_dereference (&n, MDL); |
416 | omapi_typed_data_dereference (&tv, MDL); | |
581e37e4 TL |
417 | return status; |
418 | } | |
419 | ||
420 | isc_result_t omapi_set_object_value (omapi_object_t *h, omapi_object_t *id, | |
b1b7b521 | 421 | const char *name, omapi_object_t *value) |
581e37e4 TL |
422 | { |
423 | isc_result_t status; | |
424 | omapi_typed_data_t *tv = (omapi_typed_data_t *)0; | |
425 | omapi_data_string_t *n = (omapi_data_string_t *)0; | |
581e37e4 | 426 | |
4bd8800e | 427 | status = omapi_data_string_new (&n, strlen (name), MDL); |
581e37e4 TL |
428 | if (status != ISC_R_SUCCESS) |
429 | return status; | |
430 | memcpy (n -> value, name, strlen (name)); | |
431 | ||
4bd8800e | 432 | status = omapi_typed_data_new (MDL, &tv, omapi_datatype_object, value); |
581e37e4 | 433 | if (status != ISC_R_SUCCESS) { |
4bd8800e | 434 | omapi_data_string_dereference (&n, MDL); |
581e37e4 TL |
435 | return status; |
436 | } | |
437 | ||
438 | status = omapi_set_value (h, id, n, tv); | |
4bd8800e TL |
439 | omapi_data_string_dereference (&n, MDL); |
440 | omapi_typed_data_dereference (&tv, MDL); | |
581e37e4 TL |
441 | return status; |
442 | } | |
443 | ||
2fbdfd65 | 444 | isc_result_t omapi_set_string_value (omapi_object_t *h, omapi_object_t *id, |
b1b7b521 | 445 | const char *name, const char *value) |
2fbdfd65 TL |
446 | { |
447 | isc_result_t status; | |
448 | omapi_typed_data_t *tv = (omapi_typed_data_t *)0; | |
449 | omapi_data_string_t *n = (omapi_data_string_t *)0; | |
2fbdfd65 | 450 | |
4bd8800e | 451 | status = omapi_data_string_new (&n, strlen (name), MDL); |
2fbdfd65 TL |
452 | if (status != ISC_R_SUCCESS) |
453 | return status; | |
454 | memcpy (n -> value, name, strlen (name)); | |
455 | ||
4bd8800e | 456 | status = omapi_typed_data_new (MDL, &tv, omapi_datatype_string, value); |
2fbdfd65 | 457 | if (status != ISC_R_SUCCESS) { |
4bd8800e | 458 | omapi_data_string_dereference (&n, MDL); |
2fbdfd65 TL |
459 | return status; |
460 | } | |
461 | ||
462 | status = omapi_set_value (h, id, n, tv); | |
4bd8800e TL |
463 | omapi_data_string_dereference (&n, MDL); |
464 | omapi_typed_data_dereference (&tv, MDL); | |
2fbdfd65 TL |
465 | return status; |
466 | } | |
467 | ||
61b844bf TL |
468 | isc_result_t omapi_get_value (omapi_object_t *h, |
469 | omapi_object_t *id, | |
470 | omapi_data_string_t *name, | |
471 | omapi_value_t **value) | |
472 | { | |
473 | omapi_object_t *outer; | |
474 | ||
475 | for (outer = h; outer -> outer; outer = outer -> outer) | |
476 | ; | |
477 | if (outer -> type -> get_value) | |
478 | return (*(outer -> type -> get_value)) (outer, | |
479 | id, name, value); | |
480 | return ISC_R_NOTFOUND; | |
481 | } | |
482 | ||
581e37e4 TL |
483 | isc_result_t omapi_get_value_str (omapi_object_t *h, |
484 | omapi_object_t *id, | |
b1b7b521 | 485 | const char *name, |
581e37e4 TL |
486 | omapi_value_t **value) |
487 | { | |
488 | omapi_object_t *outer; | |
489 | omapi_data_string_t *nds; | |
490 | isc_result_t status; | |
491 | ||
2fbdfd65 | 492 | nds = (omapi_data_string_t *)0; |
4bd8800e | 493 | status = omapi_data_string_new (&nds, strlen (name), MDL); |
581e37e4 TL |
494 | if (status != ISC_R_SUCCESS) |
495 | return status; | |
496 | memcpy (nds -> value, name, strlen (name)); | |
497 | ||
498 | for (outer = h; outer -> outer; outer = outer -> outer) | |
499 | ; | |
500 | if (outer -> type -> get_value) | |
31bbee78 TL |
501 | status = (*(outer -> type -> get_value)) (outer, |
502 | id, nds, value); | |
503 | else | |
504 | status = ISC_R_NOTFOUND; | |
505 | omapi_data_string_dereference (&nds, MDL); | |
506 | return status; | |
581e37e4 TL |
507 | } |
508 | ||
61b844bf TL |
509 | isc_result_t omapi_stuff_values (omapi_object_t *c, |
510 | omapi_object_t *id, | |
511 | omapi_object_t *o) | |
512 | { | |
513 | omapi_object_t *outer; | |
514 | ||
515 | for (outer = o; outer -> outer; outer = outer -> outer) | |
516 | ; | |
517 | if (outer -> type -> stuff_values) | |
518 | return (*(outer -> type -> stuff_values)) (c, id, outer); | |
519 | return ISC_R_NOTFOUND; | |
520 | } | |
521 | ||
2fbdfd65 TL |
522 | isc_result_t omapi_object_create (omapi_object_t **obj, omapi_object_t *id, |
523 | omapi_object_type_t *type) | |
524 | { | |
525 | if (!type -> create) | |
526 | return ISC_R_NOTIMPLEMENTED; | |
527 | return (*(type -> create)) (obj, id); | |
528 | } | |
529 | ||
530 | isc_result_t omapi_object_update (omapi_object_t *obj, omapi_object_t *id, | |
34a04392 | 531 | omapi_object_t *src, omapi_handle_t handle) |
2fbdfd65 TL |
532 | { |
533 | omapi_generic_object_t *gsrc; | |
534 | isc_result_t status; | |
535 | int i; | |
536 | ||
537 | if (!src) | |
98bf1607 | 538 | return DHCP_R_INVALIDARG; |
2fbdfd65 TL |
539 | if (src -> type != omapi_type_generic) |
540 | return ISC_R_NOTIMPLEMENTED; | |
541 | gsrc = (omapi_generic_object_t *)src; | |
542 | for (i = 0; i < gsrc -> nvalues; i++) { | |
543 | status = omapi_set_value (obj, id, | |
544 | gsrc -> values [i] -> name, | |
545 | gsrc -> values [i] -> value); | |
98bf1607 | 546 | if (status != ISC_R_SUCCESS && status != DHCP_R_UNCHANGED) |
2fbdfd65 TL |
547 | return status; |
548 | } | |
0f750c4f SR |
549 | |
550 | /* | |
551 | * For now ignore the return value. I'm not sure if we want to | |
552 | * generate an error if we can't set the handle value. If we | |
553 | * do add a check we probably should allow unchanged and notfound | |
554 | */ | |
34a04392 | 555 | if (handle) |
0f750c4f | 556 | (void) omapi_set_int_value (obj, id, "remote-handle", (int)handle); |
8119f739 TL |
557 | status = omapi_signal (obj, "updated"); |
558 | if (status != ISC_R_NOTFOUND) | |
559 | return status; | |
2fbdfd65 TL |
560 | return ISC_R_SUCCESS; |
561 | } | |
562 | ||
61b844bf TL |
563 | int omapi_data_string_cmp (omapi_data_string_t *s1, omapi_data_string_t *s2) |
564 | { | |
b1b7b521 | 565 | unsigned len; |
61b844bf TL |
566 | int rv; |
567 | ||
568 | if (s1 -> len > s2 -> len) | |
569 | len = s2 -> len; | |
570 | else | |
571 | len = s1 -> len; | |
572 | rv = memcmp (s1 -> value, s2 -> value, len); | |
573 | if (rv) | |
574 | return rv; | |
575 | if (s1 -> len > s2 -> len) | |
576 | return 1; | |
577 | else if (s1 -> len < s2 -> len) | |
578 | return -1; | |
579 | return 0; | |
580 | } | |
581 | ||
b1b7b521 | 582 | int omapi_ds_strcmp (omapi_data_string_t *s1, const char *s2) |
61b844bf | 583 | { |
b1b7b521 | 584 | unsigned len, slen; |
61b844bf TL |
585 | int rv; |
586 | ||
587 | slen = strlen (s2); | |
588 | if (slen > s1 -> len) | |
589 | len = s1 -> len; | |
590 | else | |
591 | len = slen; | |
592 | rv = memcmp (s1 -> value, s2, len); | |
593 | if (rv) | |
594 | return rv; | |
595 | if (s1 -> len > slen) | |
596 | return 1; | |
597 | else if (s1 -> len < slen) | |
598 | return -1; | |
599 | return 0; | |
600 | } | |
601 | ||
b1b7b521 | 602 | int omapi_td_strcmp (omapi_typed_data_t *s1, const char *s2) |
581e37e4 | 603 | { |
b1b7b521 | 604 | unsigned len, slen; |
581e37e4 TL |
605 | int rv; |
606 | ||
607 | /* If the data type is not compatible, never equal. */ | |
608 | if (s1 -> type != omapi_datatype_data && | |
609 | s1 -> type != omapi_datatype_string) | |
610 | return -1; | |
611 | ||
612 | slen = strlen (s2); | |
613 | if (slen > s1 -> u.buffer.len) | |
614 | len = s1 -> u.buffer.len; | |
615 | else | |
616 | len = slen; | |
617 | rv = memcmp (s1 -> u.buffer.value, s2, len); | |
618 | if (rv) | |
619 | return rv; | |
620 | if (s1 -> u.buffer.len > slen) | |
621 | return 1; | |
622 | else if (s1 -> u.buffer.len < slen) | |
623 | return -1; | |
624 | return 0; | |
625 | } | |
626 | ||
085b9445 TL |
627 | int omapi_td_strcasecmp (omapi_typed_data_t *s1, const char *s2) |
628 | { | |
629 | unsigned len, slen; | |
630 | int rv; | |
631 | ||
632 | /* If the data type is not compatible, never equal. */ | |
633 | if (s1 -> type != omapi_datatype_data && | |
634 | s1 -> type != omapi_datatype_string) | |
635 | return -1; | |
636 | ||
637 | slen = strlen (s2); | |
638 | if (slen > s1 -> u.buffer.len) | |
639 | len = s1 -> u.buffer.len; | |
640 | else | |
641 | len = slen; | |
642 | rv = casecmp (s1 -> u.buffer.value, s2, len); | |
643 | if (rv) | |
644 | return rv; | |
645 | if (s1 -> u.buffer.len > slen) | |
646 | return 1; | |
647 | else if (s1 -> u.buffer.len < slen) | |
648 | return -1; | |
649 | return 0; | |
650 | } | |
651 | ||
4bd8800e TL |
652 | isc_result_t omapi_make_value (omapi_value_t **vp, |
653 | omapi_data_string_t *name, | |
654 | omapi_typed_data_t *value, | |
655 | const char *file, int line) | |
61b844bf TL |
656 | { |
657 | isc_result_t status; | |
658 | ||
4bd8800e | 659 | status = omapi_value_new (vp, file, line); |
61b844bf TL |
660 | if (status != ISC_R_SUCCESS) |
661 | return status; | |
662 | ||
4bd8800e TL |
663 | status = omapi_data_string_reference (&(*vp) -> name, |
664 | name, file, line); | |
61b844bf | 665 | if (status != ISC_R_SUCCESS) { |
4bd8800e | 666 | omapi_value_dereference (vp, file, line); |
61b844bf TL |
667 | return status; |
668 | } | |
669 | if (value) { | |
670 | status = omapi_typed_data_reference (&(*vp) -> value, | |
4bd8800e | 671 | value, file, line); |
61b844bf | 672 | if (status != ISC_R_SUCCESS) { |
4bd8800e | 673 | omapi_value_dereference (vp, file, line); |
61b844bf TL |
674 | return status; |
675 | } | |
676 | } | |
677 | return ISC_R_SUCCESS; | |
678 | } | |
679 | ||
680 | isc_result_t omapi_make_const_value (omapi_value_t **vp, | |
681 | omapi_data_string_t *name, | |
a804d24e | 682 | const unsigned char *value, |
4bd8800e TL |
683 | unsigned len, |
684 | const char *file, int line) | |
61b844bf TL |
685 | { |
686 | isc_result_t status; | |
687 | ||
4bd8800e | 688 | status = omapi_value_new (vp, file, line); |
61b844bf TL |
689 | if (status != ISC_R_SUCCESS) |
690 | return status; | |
691 | ||
4bd8800e TL |
692 | status = omapi_data_string_reference (&(*vp) -> name, |
693 | name, file, line); | |
61b844bf | 694 | if (status != ISC_R_SUCCESS) { |
4bd8800e | 695 | omapi_value_dereference (vp, file, line); |
61b844bf TL |
696 | return status; |
697 | } | |
698 | if (value) { | |
4bd8800e | 699 | status = omapi_typed_data_new (file, line, &(*vp) -> value, |
61b844bf TL |
700 | omapi_datatype_data, len); |
701 | if (status != ISC_R_SUCCESS) { | |
4bd8800e | 702 | omapi_value_dereference (vp, file, line); |
61b844bf TL |
703 | return status; |
704 | } | |
705 | memcpy ((*vp) -> value -> u.buffer.value, value, len); | |
706 | } | |
707 | return ISC_R_SUCCESS; | |
708 | } | |
709 | ||
710 | isc_result_t omapi_make_int_value (omapi_value_t **vp, | |
711 | omapi_data_string_t *name, | |
4bd8800e | 712 | int value, const char *file, int line) |
61b844bf TL |
713 | { |
714 | isc_result_t status; | |
715 | ||
4bd8800e | 716 | status = omapi_value_new (vp, file, line); |
61b844bf TL |
717 | if (status != ISC_R_SUCCESS) |
718 | return status; | |
719 | ||
4bd8800e TL |
720 | status = omapi_data_string_reference (&(*vp) -> name, |
721 | name, file, line); | |
61b844bf | 722 | if (status != ISC_R_SUCCESS) { |
4bd8800e | 723 | omapi_value_dereference (vp, file, line); |
61b844bf TL |
724 | return status; |
725 | } | |
e598929f | 726 | status = omapi_typed_data_new (file, line, &(*vp) -> value, |
49146f3c | 727 | omapi_datatype_int, value); |
e598929f TL |
728 | if (status != ISC_R_SUCCESS) { |
729 | omapi_value_dereference (vp, file, line); | |
730 | return status; | |
61b844bf TL |
731 | } |
732 | return ISC_R_SUCCESS; | |
733 | } | |
734 | ||
e598929f TL |
735 | isc_result_t omapi_make_uint_value (omapi_value_t **vp, |
736 | omapi_data_string_t *name, | |
737 | unsigned int value, | |
738 | const char *file, int line) | |
739 | { | |
740 | return omapi_make_int_value (vp, name, (int)value, file, line); | |
741 | } | |
742 | ||
49146f3c DN |
743 | isc_result_t omapi_make_object_value (omapi_value_t **vp, |
744 | omapi_data_string_t *name, | |
745 | omapi_object_t *value, | |
746 | const char *file, int line) | |
747 | { | |
748 | isc_result_t status; | |
749 | ||
750 | status = omapi_value_new (vp, file, line); | |
751 | if (status != ISC_R_SUCCESS) | |
752 | return status; | |
753 | ||
754 | status = omapi_data_string_reference (&(*vp) -> name, | |
755 | name, file, line); | |
756 | if (status != ISC_R_SUCCESS) { | |
757 | omapi_value_dereference (vp, file, line); | |
758 | return status; | |
759 | } | |
760 | ||
761 | if (value) { | |
762 | status = omapi_typed_data_new (file, line, &(*vp) -> value, | |
763 | omapi_datatype_object, value); | |
764 | if (status != ISC_R_SUCCESS) { | |
765 | omapi_value_dereference (vp, file, line); | |
766 | return status; | |
767 | } | |
768 | } | |
769 | ||
770 | return ISC_R_SUCCESS; | |
771 | } | |
772 | ||
581e37e4 TL |
773 | isc_result_t omapi_make_handle_value (omapi_value_t **vp, |
774 | omapi_data_string_t *name, | |
b1b7b521 | 775 | omapi_object_t *value, |
4bd8800e | 776 | const char *file, int line) |
581e37e4 TL |
777 | { |
778 | isc_result_t status; | |
779 | ||
4bd8800e | 780 | status = omapi_value_new (vp, file, line); |
581e37e4 TL |
781 | if (status != ISC_R_SUCCESS) |
782 | return status; | |
783 | ||
4bd8800e TL |
784 | status = omapi_data_string_reference (&(*vp) -> name, |
785 | name, file, line); | |
581e37e4 | 786 | if (status != ISC_R_SUCCESS) { |
4bd8800e | 787 | omapi_value_dereference (vp, file, line); |
581e37e4 TL |
788 | return status; |
789 | } | |
790 | if (value) { | |
4bd8800e | 791 | status = omapi_typed_data_new (file, line, &(*vp) -> value, |
581e37e4 TL |
792 | omapi_datatype_int); |
793 | if (status != ISC_R_SUCCESS) { | |
4bd8800e | 794 | omapi_value_dereference (vp, file, line); |
581e37e4 TL |
795 | return status; |
796 | } | |
797 | status = (omapi_object_handle | |
798 | ((omapi_handle_t *)&(*vp) -> value -> u.integer, | |
799 | value)); | |
800 | if (status != ISC_R_SUCCESS) { | |
4bd8800e | 801 | omapi_value_dereference (vp, file, line); |
581e37e4 TL |
802 | return status; |
803 | } | |
804 | } | |
805 | return ISC_R_SUCCESS; | |
806 | } | |
807 | ||
808 | isc_result_t omapi_make_string_value (omapi_value_t **vp, | |
809 | omapi_data_string_t *name, | |
4bd8800e TL |
810 | const char *value, |
811 | const char *file, int line) | |
581e37e4 TL |
812 | { |
813 | isc_result_t status; | |
814 | ||
4bd8800e | 815 | status = omapi_value_new (vp, file, line); |
581e37e4 TL |
816 | if (status != ISC_R_SUCCESS) |
817 | return status; | |
818 | ||
4bd8800e TL |
819 | status = omapi_data_string_reference (&(*vp) -> name, |
820 | name, file, line); | |
581e37e4 | 821 | if (status != ISC_R_SUCCESS) { |
4bd8800e | 822 | omapi_value_dereference (vp, file, line); |
581e37e4 TL |
823 | return status; |
824 | } | |
825 | if (value) { | |
4bd8800e | 826 | status = omapi_typed_data_new (file, line, &(*vp) -> value, |
581e37e4 TL |
827 | omapi_datatype_string, value); |
828 | if (status != ISC_R_SUCCESS) { | |
4bd8800e | 829 | omapi_value_dereference (vp, file, line); |
581e37e4 TL |
830 | return status; |
831 | } | |
832 | } | |
833 | return ISC_R_SUCCESS; | |
834 | } | |
835 | ||
a804d24e | 836 | isc_result_t omapi_get_int_value (unsigned long *v, omapi_typed_data_t *t) |
581e37e4 TL |
837 | { |
838 | u_int32_t rv; | |
839 | ||
840 | if (t -> type == omapi_datatype_int) { | |
841 | *v = t -> u.integer; | |
842 | return ISC_R_SUCCESS; | |
843 | } else if (t -> type == omapi_datatype_string || | |
2fbdfd65 | 844 | t -> type == omapi_datatype_data) { |
581e37e4 | 845 | if (t -> u.buffer.len != sizeof (rv)) |
98bf1607 | 846 | return DHCP_R_INVALIDARG; |
581e37e4 TL |
847 | memcpy (&rv, t -> u.buffer.value, sizeof rv); |
848 | *v = ntohl (rv); | |
849 | return ISC_R_SUCCESS; | |
850 | } | |
98bf1607 | 851 | return DHCP_R_INVALIDARG; |
581e37e4 | 852 | } |