ISC DHCP 4.4.3-P1
A reference DHCPv4 and DHCPv6 implementation
 
Loading...
Searching...
No Matches
comapi.c
Go to the documentation of this file.
1/* omapi.c
2
3 OMAPI object interfaces for the DHCP server. */
4
5/*
6 * Copyright (C) 2004-2022 Internet Systems Consortium, Inc. ("ISC")
7 * Copyright (c) 1999-2003 by Internet Software Consortium
8 *
9 * This Source Code Form is subject to the terms of the Mozilla Public
10 * License, v. 2.0. If a copy of the MPL was not distributed with this
11 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
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 * PO Box 360
23 * Newmarket, NH 03857 USA
24 * <info@isc.org>
25 * https://www.isc.org/
26 *
27 */
28
29/* Many, many thanks to Brian Murrell and BCtel for this code - BCtel
30 provided the funding that resulted in this code and the entire
31 OMAPI support library being written, and Brian helped brainstorm
32 and refine the requirements. To the extent that this code is
33 useful, you have Brian and BCtel to thank. Any limitations in the
34 code are a result of mistakes on my part. -- Ted Lemon */
35
36#include "dhcpd.h"
37#include <omapip/omapip_p.h>
38
44
50
52{
53 isc_result_t status;
54
56 "control",
64 dhcp_control_remove, 0, 0, 0,
65 sizeof (dhcp_control_object_t),
66 0, RC_MISC);
67 if (status != ISC_R_SUCCESS)
68 log_fatal ("Can't register control object type: %s",
69 isc_result_totext (status));
70 status = dhcp_control_allocate (&dhcp_control_object, MDL);
71 if (status != ISC_R_SUCCESS)
72 log_fatal ("Can't make initial control object: %s",
73 isc_result_totext (status));
75
77 "group",
85 dhcp_group_remove, 0, 0, 0,
86 sizeof (struct group_object), 0,
87 RC_MISC);
88 if (status != ISC_R_SUCCESS)
89 log_fatal ("Can't register group object type: %s",
90 isc_result_totext (status));
91
93 "subnet",
101 dhcp_subnet_remove, 0, 0, 0,
102 sizeof (struct subnet), 0,
103 RC_MISC);
104 if (status != ISC_R_SUCCESS)
105 log_fatal ("Can't register subnet object type: %s",
106 isc_result_totext (status));
107
110 "shared-network",
119 sizeof (struct shared_network), 0, RC_MISC);
120 if (status != ISC_R_SUCCESS)
121 log_fatal ("Can't register shared network object type: %s",
122 isc_result_totext (status));
123
125}
126
128 omapi_object_t *id,
131{
132 struct group_object *group;
133 isc_result_t status;
134
135 if (h -> type != dhcp_type_group)
136 return DHCP_R_INVALIDARG;
137 group = (struct group_object *)h;
138
139 /* XXX For now, we can only set these values on new group objects.
140 XXX Soon, we need to be able to update group objects. */
141 if (!omapi_ds_strcmp (name, "name")) {
142 if (group -> name)
143 return ISC_R_EXISTS;
144 if (value -> type == omapi_datatype_data ||
145 value -> type == omapi_datatype_string) {
146 group -> name = dmalloc (value -> u.buffer.len + 1,
147 MDL);
148 if (!group -> name)
149 return ISC_R_NOMEMORY;
150 memcpy (group -> name,
151 value -> u.buffer.value,
152 value -> u.buffer.len);
153 group -> name [value -> u.buffer.len] = 0;
154 } else
155 return DHCP_R_INVALIDARG;
156 return ISC_R_SUCCESS;
157 }
158
159 if (!omapi_ds_strcmp (name, "statements")) {
160 if (group -> group && group -> group -> statements)
161 return ISC_R_EXISTS;
162 if (!group -> group) {
163 if (!clone_group (&group -> group, root_group, MDL))
164 return ISC_R_NOMEMORY;
165 }
166 if (value -> type == omapi_datatype_data ||
167 value -> type == omapi_datatype_string) {
168 struct parse *parse;
169 int lose = 0;
170 parse = NULL;
171 status = new_parse(&parse, -1,
172 (char *) value->u.buffer.value,
173 value->u.buffer.len,
174 "network client", 0);
175 if (status != ISC_R_SUCCESS || parse == NULL)
176 return status;
178 (&group -> group -> statements, parse, &lose,
179 context_any))) {
180 end_parse (&parse);
181 return DHCP_R_BADPARSE;
182 }
183 end_parse (&parse);
184 return ISC_R_SUCCESS;
185 } else
186 return DHCP_R_INVALIDARG;
187 }
188
189 /* Try to find some inner object that can take the value. */
190 if (h -> inner && h -> inner -> type -> set_value) {
191 status = ((*(h -> inner -> type -> set_value))
192 (h -> inner, id, name, value));
193 if (status == ISC_R_SUCCESS || status == DHCP_R_UNCHANGED)
194 return status;
195 }
196
197 return ISC_R_NOTFOUND;
198}
199
200
204{
205 struct group_object *group;
206 isc_result_t status;
207
208 if (h -> type != dhcp_type_group)
209 return DHCP_R_INVALIDARG;
210 group = (struct group_object *)h;
211
212 if (!omapi_ds_strcmp (name, "name"))
214 name, group -> name, MDL);
215
216 /* Try to find some inner object that can take the value. */
217 if (h -> inner && h -> inner -> type -> get_value) {
218 status = ((*(h -> inner -> type -> get_value))
219 (h -> inner, id, name, value));
220 if (status == ISC_R_SUCCESS)
221 return status;
222 }
223 return ISC_R_NOTFOUND;
224}
225
226isc_result_t dhcp_group_destroy (omapi_object_t *h, const char *file, int line)
227{
228 struct group_object *group, *t;
229
230 if (h -> type != dhcp_type_group)
231 return DHCP_R_INVALIDARG;
232 group = (struct group_object *)h;
233
234 if (group -> name) {
235 if (group_name_hash) {
236 t = (struct group_object *)0;
237 if (group_hash_lookup (&t, group_name_hash,
238 group -> name,
239 strlen (group -> name), MDL)) {
240 group_hash_delete (group_name_hash,
241 group -> name,
242 strlen (group -> name),
243 MDL);
244 group_object_dereference (&t, MDL);
245 }
246 }
247 dfree (group -> name, file, line);
248 group -> name = (char *)0;
249 }
250 if (group -> group)
252
253 return ISC_R_SUCCESS;
254}
255
257 const char *name, va_list ap)
258{
259 struct group_object *group;
260 isc_result_t status;
261 int updatep = 0;
262
263 if (h -> type != dhcp_type_group)
264 return DHCP_R_INVALIDARG;
265 group = (struct group_object *)h;
266
267 if (!strcmp (name, "updated")) {
268 /* A group object isn't valid if a subgroup hasn't yet been
269 associated with it. */
270 if (!group -> group)
271 return DHCP_R_INVALIDARG;
272
273 /* Group objects always have to have names. */
274 if (!group -> name) {
275 char hnbuf [64];
276 sprintf (hnbuf, "ng%08lx%08lx",
277 (unsigned long)cur_time,
278 (unsigned long)group);
279 group -> name = dmalloc (strlen (hnbuf) + 1, MDL);
280 if (!group -> name)
281 return ISC_R_NOMEMORY;
282 strcpy (group -> name, hnbuf);
283 }
284
286 updatep = 1;
287 }
288
289 /* Try to find some inner object that can take the value. */
290 if (h -> inner && h -> inner -> type -> get_value) {
291 status = ((*(h -> inner -> type -> signal_handler))
292 (h -> inner, name, ap));
293 if (status == ISC_R_SUCCESS)
294 return status;
295 }
296 if (updatep)
297 return ISC_R_SUCCESS;
298 return ISC_R_NOTFOUND;
299}
300
302 omapi_object_t *id,
304{
305 struct group_object *group;
306 isc_result_t status;
307
308 if (h -> type != dhcp_type_group)
309 return DHCP_R_INVALIDARG;
310 group = (struct group_object *)h;
311
312 /* Write out all the values. */
313 if (group -> name) {
314 status = omapi_connection_put_name (c, "name");
315 if (status != ISC_R_SUCCESS)
316 return status;
317 status = omapi_connection_put_string (c, group -> name);
318 if (status != ISC_R_SUCCESS)
319 return status;
320 }
321
322 /* Write out the inner object, if any. */
323 if (h -> inner && h -> inner -> type -> stuff_values) {
324 status = ((*(h -> inner -> type -> stuff_values))
325 (c, id, h -> inner));
326 if (status == ISC_R_SUCCESS)
327 return status;
328 }
329
330 return ISC_R_SUCCESS;
331}
332
335{
336 omapi_value_t *tv = (omapi_value_t *)0;
337 isc_result_t status;
338 struct group_object *group;
339
340 if (!ref)
341 return DHCP_R_NOKEYS;
342
343 /* First see if we were sent a handle. */
344 status = omapi_get_value_str (ref, id, "handle", &tv);
345 if (status == ISC_R_SUCCESS) {
346 status = omapi_handle_td_lookup (lp, tv -> value);
347
349 if (status != ISC_R_SUCCESS)
350 return status;
351
352 /* Don't return the object if the type is wrong. */
353 if ((*lp) -> type != dhcp_type_group) {
355 return DHCP_R_INVALIDARG;
356 }
357 }
358
359 /* Now look for a name. */
360 status = omapi_get_value_str (ref, id, "name", &tv);
361 if (status == ISC_R_SUCCESS) {
362 group = (struct group_object *)0;
363 if (group_name_hash &&
364 group_hash_lookup (&group, group_name_hash,
365 (const char *)
366 tv -> value -> u.buffer.value,
367 tv -> value -> u.buffer.len, MDL)) {
369
370 if (*lp && *lp != (omapi_object_t *)group) {
371 group_object_dereference (&group, MDL);
373 return DHCP_R_KEYCONFLICT;
374 } else if (!*lp) {
375 /* XXX fix so that hash lookup itself creates
376 XXX the reference. */
379 MDL);
380 group_object_dereference (&group, MDL);
381 }
382 } else if (!*lp)
383 return ISC_R_NOTFOUND;
384 }
385
386 /* If we get to here without finding a group, no valid key was
387 specified. */
388 if (!*lp)
389 return DHCP_R_NOKEYS;
390
391 if (((struct group_object *)(*lp)) -> flags & GROUP_OBJECT_DELETED) {
393 return ISC_R_NOTFOUND;
394 }
395 return ISC_R_SUCCESS;
396}
397
399 omapi_object_t *id)
400{
401 struct group_object *group;
402 isc_result_t status;
403 group = (struct group_object *)0;
404
405 status = group_object_allocate (&group, MDL);
406 if (status != ISC_R_SUCCESS)
407 return status;
410 group_object_dereference (&group, MDL);
411 return status;
412}
413
415 omapi_object_t *id)
416{
417 struct group_object *group;
418 isc_result_t status;
419 if (lp -> type != dhcp_type_group)
420 return DHCP_R_INVALIDARG;
421 group = (struct group_object *)lp;
422
424 if (group_write_hook) {
425 if (!(*group_write_hook) (group))
426 return ISC_R_IOERROR;
427 }
428
430
431 return status;
432}
433
435 omapi_object_t *id,
438{
439 dhcp_control_object_t *control;
440 isc_result_t status;
441 unsigned long newstate;
442
443 if (h -> type != dhcp_type_control)
444 return DHCP_R_INVALIDARG;
445 control = (dhcp_control_object_t *)h;
446
447 if (!omapi_ds_strcmp (name, "state")) {
448 status = omapi_get_int_value (&newstate, value);
449 if (status != ISC_R_SUCCESS)
450 return status;
451 status = dhcp_set_control_state (control -> state, newstate);
452 if (status == ISC_R_SUCCESS)
453 control -> state = value -> u.integer;
454 return status;
455 }
456
457 /* Try to find some inner object that can take the value. */
458 if (h -> inner && h -> inner -> type -> set_value) {
459 status = ((*(h -> inner -> type -> set_value))
460 (h -> inner, id, name, value));
461 if (status == ISC_R_SUCCESS || status == DHCP_R_UNCHANGED)
462 return status;
463 }
464
465 return ISC_R_NOTFOUND;
466}
467
468
472{
473 dhcp_control_object_t *control;
474 isc_result_t status;
475
476 if (h -> type != dhcp_type_control)
477 return DHCP_R_INVALIDARG;
478 control = (dhcp_control_object_t *)h;
479
480 if (!omapi_ds_strcmp (name, "state"))
482 name, (int)control -> state, MDL);
483
484 /* Try to find some inner object that can take the value. */
485 if (h -> inner && h -> inner -> type -> get_value) {
486 status = ((*(h -> inner -> type -> get_value))
487 (h -> inner, id, name, value));
488 if (status == ISC_R_SUCCESS)
489 return status;
490 }
491 return ISC_R_NOTFOUND;
492}
493
495 const char *file, int line)
496{
497 if (h -> type != dhcp_type_control)
498 return DHCP_R_INVALIDARG;
499
500 /* Can't destroy the control object. */
501 return ISC_R_NOPERM;
502}
503
505 const char *name, va_list ap)
506{
507 /* In this function h should be a (dhcp_control_object_t *) */
508
509 isc_result_t status;
510
511 if (h -> type != dhcp_type_control)
512 return DHCP_R_INVALIDARG;
513
514 /* Try to find some inner object that can take the value. */
515 if (h -> inner && h -> inner -> type -> get_value) {
516 status = ((*(h -> inner -> type -> signal_handler))
517 (h -> inner, name, ap));
518 if (status == ISC_R_SUCCESS)
519 return status;
520 }
521 return ISC_R_NOTFOUND;
522}
523
525 omapi_object_t *id,
527{
528 dhcp_control_object_t *control;
529 isc_result_t status;
530
531 if (h -> type != dhcp_type_control)
532 return DHCP_R_INVALIDARG;
533 control = (dhcp_control_object_t *)h;
534
535 /* Write out all the values. */
536 status = omapi_connection_put_name (c, "state");
537 if (status != ISC_R_SUCCESS)
538 return status;
539 status = omapi_connection_put_uint32 (c, sizeof (u_int32_t));
540 if (status != ISC_R_SUCCESS)
541 return status;
542 status = omapi_connection_put_uint32 (c, control -> state);
543 if (status != ISC_R_SUCCESS)
544 return status;
545
546 /* Write out the inner object, if any. */
547 if (h -> inner && h -> inner -> type -> stuff_values) {
548 status = ((*(h -> inner -> type -> stuff_values))
549 (c, id, h -> inner));
550 if (status == ISC_R_SUCCESS)
551 return status;
552 }
553
554 return ISC_R_SUCCESS;
555}
556
559{
560 omapi_value_t *tv = (omapi_value_t *)0;
561 isc_result_t status;
562
563 /* First see if we were sent a handle. */
564 if (ref) {
565 status = omapi_get_value_str (ref, id, "handle", &tv);
566 if (status == ISC_R_SUCCESS) {
567 status = omapi_handle_td_lookup (lp, tv -> value);
568
570 if (status != ISC_R_SUCCESS)
571 return status;
572
573 /* Don't return the object if the type is wrong. */
574 if ((*lp) -> type != dhcp_type_control) {
576 return DHCP_R_INVALIDARG;
577 }
578 }
579 }
580
581 /* Otherwise, stop playing coy - there's only one control object,
582 so we can just return it. */
583 dhcp_control_reference ((dhcp_control_object_t **)lp,
585 return ISC_R_SUCCESS;
586}
587
589 omapi_object_t *id)
590{
591 /* Can't create a control object - there can be only one. */
592 return ISC_R_NOPERM;
593}
594
596 omapi_object_t *id)
597{
598 /* Form is emptiness; emptiness form. The control object
599 cannot go out of existance. */
600 return ISC_R_NOPERM;
601}
602
604 omapi_object_t *id,
607{
608 /* In this function h should be a (struct subnet *) */
609
610 isc_result_t status;
611
612 if (h -> type != dhcp_type_subnet)
613 return DHCP_R_INVALIDARG;
614
615 /* No values to set yet. */
616
617 /* Try to find some inner object that can take the value. */
618 if (h -> inner && h -> inner -> type -> set_value) {
619 status = ((*(h -> inner -> type -> set_value))
620 (h -> inner, id, name, value));
621 if (status == ISC_R_SUCCESS || status == DHCP_R_UNCHANGED)
622 return status;
623 }
624
625 return ISC_R_NOTFOUND;
626}
627
628
632{
633 /* In this function h should be a (struct subnet *) */
634
635 isc_result_t status;
636
637 if (h -> type != dhcp_type_subnet)
638 return DHCP_R_INVALIDARG;
639
640 /* No values to get yet. */
641
642 /* Try to find some inner object that can provide the value. */
643 if (h -> inner && h -> inner -> type -> get_value) {
644 status = ((*(h -> inner -> type -> get_value))
645 (h -> inner, id, name, value));
646 if (status == ISC_R_SUCCESS)
647 return status;
648 }
649 return ISC_R_NOTFOUND;
650}
651
652isc_result_t dhcp_subnet_destroy (omapi_object_t *h, const char *file, int line)
653{
654 struct subnet *subnet;
655
656 if (h -> type != dhcp_type_subnet)
657 return DHCP_R_INVALIDARG;
658
659 subnet = (struct subnet *)h;
660 if (subnet -> next_subnet)
661 subnet_dereference (&subnet -> next_subnet, file, line);
662 if (subnet -> next_sibling)
663 subnet_dereference (&subnet -> next_sibling, file, line);
664 if (subnet -> shared_network)
665 shared_network_dereference (&subnet -> shared_network,
666 file, line);
667 if (subnet -> interface)
668 interface_dereference (&subnet -> interface, file, line);
669 if (subnet -> group)
671
672 return ISC_R_SUCCESS;
673}
674
676 const char *name, va_list ap)
677{
678 /* In this function h should be a (struct subnet *) */
679
680 isc_result_t status;
681
682 if (h -> type != dhcp_type_subnet)
683 return DHCP_R_INVALIDARG;
684
685 /* Can't write subnets yet. */
686
687 /* Try to find some inner object that can take the value. */
688 if (h -> inner && h -> inner -> type -> get_value) {
689 status = ((*(h -> inner -> type -> signal_handler))
690 (h -> inner, name, ap));
691 if (status == ISC_R_SUCCESS)
692 return status;
693 }
694
695 return ISC_R_NOTFOUND;
696}
697
699 omapi_object_t *id,
701{
702 /* In this function h should be a (struct subnet *) */
703
704 isc_result_t status;
705
706 if (h -> type != dhcp_type_subnet)
707 return DHCP_R_INVALIDARG;
708
709 /* Can't stuff subnet values yet. */
710
711 /* Write out the inner object, if any. */
712 if (h -> inner && h -> inner -> type -> stuff_values) {
713 status = ((*(h -> inner -> type -> stuff_values))
714 (c, id, h -> inner));
715 if (status == ISC_R_SUCCESS)
716 return status;
717 }
718
719 return ISC_R_SUCCESS;
720}
721
723 omapi_object_t *id,
724 omapi_object_t *ref)
725{
726 /* Can't look up subnets yet. */
727
728 /* If we get to here without finding a subnet, no valid key was
729 specified. */
730 if (!*lp)
731 return DHCP_R_NOKEYS;
732 return ISC_R_SUCCESS;
733}
734
736 omapi_object_t *id)
737{
739}
740
742 omapi_object_t *id)
743{
745}
746
748 omapi_object_t *id,
751{
752 /* In this function h should be a (struct shared_network *) */
753
754 isc_result_t status;
755
756 if (h -> type != dhcp_type_shared_network)
757 return DHCP_R_INVALIDARG;
758
759 /* No values to set yet. */
760
761 /* Try to find some inner object that can take the value. */
762 if (h -> inner && h -> inner -> type -> set_value) {
763 status = ((*(h -> inner -> type -> set_value))
764 (h -> inner, id, name, value));
765 if (status == ISC_R_SUCCESS || status == DHCP_R_UNCHANGED)
766 return status;
767 }
768
769 return ISC_R_NOTFOUND;
770}
771
772
774 omapi_object_t *id,
777{
778 /* In this function h should be a (struct shared_network *) */
779
780 isc_result_t status;
781
782 if (h -> type != dhcp_type_shared_network)
783 return DHCP_R_INVALIDARG;
784
785 /* No values to get yet. */
786
787 /* Try to find some inner object that can provide the value. */
788 if (h -> inner && h -> inner -> type -> get_value) {
789 status = ((*(h -> inner -> type -> get_value))
790 (h -> inner, id, name, value));
791 if (status == ISC_R_SUCCESS)
792 return status;
793 }
794 return ISC_R_NOTFOUND;
795}
796
798 const char *file, int line)
799{
800 /* In this function h should be a (struct shared_network *) */
801
803
804 if (h -> type != dhcp_type_shared_network)
805 return DHCP_R_INVALIDARG;
806
807 shared_network = (struct shared_network *)h;
808 if (shared_network -> next)
809 shared_network_dereference (&shared_network -> next,
810 file, line);
811 if (shared_network -> name) {
813 shared_network -> name = 0;
814 }
815 if (shared_network -> subnets)
816 subnet_dereference (&shared_network -> subnets, file, line);
818 interface_dereference (&shared_network -> interface,
819 file, line);
820 if (shared_network -> pools)
823 if (shared_network -> group)
825#if defined (FAILOVER_PROTOCOL)
829 file, line);
830#endif
831
832 return ISC_R_SUCCESS;
833}
834
836 const char *name,
837 va_list ap)
838{
839 /* In this function h should be a (struct shared_network *) */
840
841 isc_result_t status;
842
843 if (h -> type != dhcp_type_shared_network)
844 return DHCP_R_INVALIDARG;
845
846 /* Can't write shared_networks yet. */
847
848 /* Try to find some inner object that can take the value. */
849 if (h -> inner && h -> inner -> type -> get_value) {
850 status = ((*(h -> inner -> type -> signal_handler))
851 (h -> inner, name, ap));
852 if (status == ISC_R_SUCCESS)
853 return status;
854 }
855
856 return ISC_R_NOTFOUND;
857}
858
860 omapi_object_t *id,
862{
863 /* In this function h should be a (struct shared_network *) */
864
865 isc_result_t status;
866
867 if (h -> type != dhcp_type_shared_network)
868 return DHCP_R_INVALIDARG;
869
870 /* Can't stuff shared_network values yet. */
871
872 /* Write out the inner object, if any. */
873 if (h -> inner && h -> inner -> type -> stuff_values) {
874 status = ((*(h -> inner -> type -> stuff_values))
875 (c, id, h -> inner));
876 if (status == ISC_R_SUCCESS)
877 return status;
878 }
879
880 return ISC_R_SUCCESS;
881}
882
884 omapi_object_t *id,
885 omapi_object_t *ref)
886{
887 /* Can't look up shared_networks yet. */
888
889 /* If we get to here without finding a shared_network, no valid key was
890 specified. */
891 if (!*lp)
892 return DHCP_R_NOKEYS;
893 return ISC_R_SUCCESS;
894}
895
897 omapi_object_t *id)
898{
900}
901
903 omapi_object_t *id)
904{
906}
#define RC_MISC
Definition alloc.h:56
isc_result_t omapi_connection_put_uint32(omapi_object_t *, u_int32_t)
Definition buffer.c:595
isc_result_t dhcp_control_create(omapi_object_t **lp, omapi_object_t *id)
Definition comapi.c:588
isc_result_t dhcp_control_signal_handler(omapi_object_t *h, const char *name, va_list ap)
Definition comapi.c:504
isc_result_t dhcp_subnet_destroy(omapi_object_t *h, const char *file, int line)
Definition comapi.c:652
isc_result_t dhcp_shared_network_set_value(omapi_object_t *h, omapi_object_t *id, omapi_data_string_t *name, omapi_typed_data_t *value)
Definition comapi.c:747
isc_result_t dhcp_control_set_value(omapi_object_t *h, omapi_object_t *id, omapi_data_string_t *name, omapi_typed_data_t *value)
Definition comapi.c:434
isc_result_t dhcp_control_get_value(omapi_object_t *h, omapi_object_t *id, omapi_data_string_t *name, omapi_value_t **value)
Definition comapi.c:469
isc_result_t dhcp_group_create(omapi_object_t **lp, omapi_object_t *id)
Definition comapi.c:398
isc_result_t dhcp_subnet_remove(omapi_object_t *lp, omapi_object_t *id)
Definition comapi.c:741
isc_result_t dhcp_subnet_get_value(omapi_object_t *h, omapi_object_t *id, omapi_data_string_t *name, omapi_value_t **value)
Definition comapi.c:629
isc_result_t dhcp_control_lookup(omapi_object_t **lp, omapi_object_t *id, omapi_object_t *ref)
Definition comapi.c:557
isc_result_t dhcp_subnet_create(omapi_object_t **lp, omapi_object_t *id)
Definition comapi.c:735
isc_result_t dhcp_group_lookup(omapi_object_t **lp, omapi_object_t *id, omapi_object_t *ref)
Definition comapi.c:333
isc_result_t dhcp_subnet_stuff_values(omapi_object_t *c, omapi_object_t *id, omapi_object_t *h)
Definition comapi.c:698
isc_result_t dhcp_shared_network_get_value(omapi_object_t *h, omapi_object_t *id, omapi_data_string_t *name, omapi_value_t **value)
Definition comapi.c:773
isc_result_t dhcp_subnet_lookup(omapi_object_t **lp, omapi_object_t *id, omapi_object_t *ref)
Definition comapi.c:722
isc_result_t dhcp_control_remove(omapi_object_t *lp, omapi_object_t *id)
Definition comapi.c:595
isc_result_t dhcp_group_get_value(omapi_object_t *h, omapi_object_t *id, omapi_data_string_t *name, omapi_value_t **value)
Definition comapi.c:201
isc_result_t dhcp_group_set_value(omapi_object_t *h, omapi_object_t *id, omapi_data_string_t *name, omapi_typed_data_t *value)
Definition comapi.c:127
isc_result_t dhcp_shared_network_create(omapi_object_t **lp, omapi_object_t *id)
Definition comapi.c:896
isc_result_t dhcp_subnet_signal_handler(omapi_object_t *h, const char *name, va_list ap)
Definition comapi.c:675
isc_result_t dhcp_shared_network_stuff_values(omapi_object_t *c, omapi_object_t *id, omapi_object_t *h)
Definition comapi.c:859
isc_result_t dhcp_group_signal_handler(omapi_object_t *h, const char *name, va_list ap)
Definition comapi.c:256
isc_result_t dhcp_shared_network_destroy(omapi_object_t *h, const char *file, int line)
Definition comapi.c:797
isc_result_t dhcp_control_stuff_values(omapi_object_t *c, omapi_object_t *id, omapi_object_t *h)
Definition comapi.c:524
isc_result_t dhcp_subnet_set_value(omapi_object_t *h, omapi_object_t *id, omapi_data_string_t *name, omapi_typed_data_t *value)
Definition comapi.c:603
isc_result_t dhcp_shared_network_remove(omapi_object_t *lp, omapi_object_t *id)
Definition comapi.c:902
isc_result_t dhcp_shared_network_signal_handler(omapi_object_t *h, const char *name, va_list ap)
Definition comapi.c:835
isc_result_t dhcp_group_destroy(omapi_object_t *h, const char *file, int line)
Definition comapi.c:226
isc_result_t dhcp_shared_network_lookup(omapi_object_t **lp, omapi_object_t *id, omapi_object_t *ref)
Definition comapi.c:883
isc_result_t dhcp_group_stuff_values(omapi_object_t *c, omapi_object_t *id, omapi_object_t *h)
Definition comapi.c:301
isc_result_t dhcp_control_destroy(omapi_object_t *h, const char *file, int line)
Definition comapi.c:494
isc_result_t dhcp_group_remove(omapi_object_t *lp, omapi_object_t *id)
Definition comapi.c:414
int group_dereference(struct group **ptr, const char *file, int line)
Definition alloc.c:205
isc_result_t end_parse(struct parse **cfile)
Definition conflex.c:103
isc_result_t new_parse(struct parse **cfile, int file, char *inbuf, unsigned buflen, const char *name, int eolp)
Definition conflex.c:41
int parse_executable_statements(struct executable_statement **statements, struct parse *cfile, int *lose, enum expression_context case_context)
Definition parse.c:2117
isc_result_t dhcp_set_control_state(control_object_state_t oldstate, control_object_state_t newstate)
Definition dhclient.c:5616
@ server_startup
Definition dhcpd.h:523
#define GROUP_OBJECT_DELETED
Definition dhcpd.h:956
omapi_object_type_t * dhcp_type_subnet
omapi_object_type_t * dhcp_type_group
omapi_object_type_t * dhcp_type_control
dhcp_control_object_t * dhcp_control_object
struct subnet * subnets
Definition mdb.c:32
void dhcp_common_objects_setup(void)
struct ipv6_pool ** pools
#define cur_time
Definition dhcpd.h:2126
#define GROUP_OBJECT_DYNAMIC
Definition dhcpd.h:957
const char int line
Definition dhcpd.h:3802
omapi_object_type_t * dhcp_type_shared_network
const char * file
Definition dhcpd.h:3802
isc_result_t interface_setup()
Definition discover.c:95
#define ISC_R_NOTIMPLEMENTED
#define ISC_R_SUCCESS
int clone_group(struct group **gp, struct group *group, const char *file, int line)
Definition memory.c:130
struct group * root_group
Definition memory.c:31
int(* group_write_hook)(struct group_object *)
Definition memory.c:33
isc_result_t supersede_group(struct group_object *group, int writep)
Definition memory.c:74
group_hash_t * group_name_hash
Definition memory.c:32
isc_result_t omapi_value_dereference(omapi_value_t **, const char *, int)
Definition alloc.c:1060
#define MDL
Definition omapip.h:567
isc_result_t omapi_connection_put_string(omapi_object_t *, const char *)
Definition buffer.c:689
struct __omapi_object_type_t omapi_object_type_t
#define OMAPI_OBJECT_ALLOC(name, stype, type)
Definition omapip.h:160
isc_result_t omapi_object_dereference(omapi_object_t **, const char *, int)
Definition alloc.c:593
struct __omapi_object omapi_object_t
Definition omapip.h:39
isc_result_t omapi_handle_td_lookup(omapi_object_t **, omapi_typed_data_t *)
Definition handle.c:282
isc_result_t omapi_object_type_register(omapi_object_type_t **, const char *, isc_result_t(*)(omapi_object_t *, omapi_object_t *, omapi_data_string_t *, omapi_typed_data_t *), isc_result_t(*)(omapi_object_t *, omapi_object_t *, omapi_data_string_t *, omapi_value_t **), isc_result_t(*)(omapi_object_t *, const char *, int), isc_result_t(*)(omapi_object_t *, const char *, va_list), isc_result_t(*)(omapi_object_t *, omapi_object_t *, omapi_object_t *), isc_result_t(*)(omapi_object_t **, omapi_object_t *, omapi_object_t *), isc_result_t(*)(omapi_object_t **, omapi_object_t *), isc_result_t(*)(omapi_object_t *, omapi_object_t *), isc_result_t(*)(omapi_object_t *, const char *, int), isc_result_t(*)(omapi_object_t **, const char *, int), isc_result_t(*)(size_t), size_t, isc_result_t(*)(omapi_object_t *, const char *, int), int)
Definition support.c:193
@ omapi_datatype_string
Definition omapip.h:43
@ omapi_datatype_data
Definition omapip.h:44
isc_result_t omapi_make_string_value(omapi_value_t **, omapi_data_string_t *, const char *, const char *, int)
Definition support.c:807
isc_result_t omapi_object_reference(omapi_object_t **, omapi_object_t *, const char *, int)
Definition alloc.c:571
int omapi_ds_strcmp(omapi_data_string_t *, const char *)
Definition support.c:581
void * dmalloc(size_t, const char *, int)
Definition alloc.c:57
void dfree(void *, const char *, int)
Definition alloc.c:145
isc_result_t omapi_get_value_str(omapi_object_t *, omapi_object_t *, const char *, omapi_value_t **)
Definition support.c:482
isc_result_t omapi_get_int_value(unsigned long *, omapi_typed_data_t *)
Definition support.c:835
isc_result_t omapi_connection_put_name(omapi_object_t *, const char *)
Definition buffer.c:678
isc_result_t omapi_make_int_value(omapi_value_t **, omapi_data_string_t *, int, const char *, int)
Definition support.c:709
void log_fatal(const char *,...) __attribute__((__format__(__printf__
#define DHCP_R_UNCHANGED
Definition result.h:51
#define DHCP_R_INVALIDARG
Definition result.h:49
#define DHCP_R_BADPARSE
Definition result.h:54
#define DHCP_R_NOKEYS
Definition result.h:55
#define DHCP_R_KEYCONFLICT
Definition result.h:53
char * name
Definition dhcpd.h:954
int flags
Definition dhcpd.h:955
Definition dhcpd.h:962
Definition dhcpd.h:288
struct shared_network * next
Definition dhcpd.h:1059
struct interface_info * interface
Definition dhcpd.h:1066
char * name
Definition dhcpd.h:1060
dhcp_failover_state_t * failover_peer
Definition dhcpd.h:1071
struct subnet * next_subnet
Definition dhcpd.h:1077
struct interface_info * interface
Definition dhcpd.h:1080
struct subnet * next_sibling
Definition dhcpd.h:1078
@ context_any
Definition tree.h:84
Definition data.h:205