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