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