ISC DHCP  4.3.4
A reference DHCPv4 and DHCPv6 implementation
dhcpctl.c
Go to the documentation of this file.
1 /* dhcpctl.c
2 
3  Subroutines providing general support for objects. */
4 
5 /*
6  * Copyright (c) 2009,2013,2014 by Internet Systems Consortium, Inc. ("ISC")
7  * Copyright (c) 2004,2007 by Internet Systems Consortium, Inc. ("ISC")
8  * Copyright (c) 1999-2003 by Internet Software Consortium
9  *
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.
13  *
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.
21  *
22  * Internet Systems Consortium, Inc.
23  * 950 Charter Street
24  * Redwood City, CA 94063
25  * <info@isc.org>
26  * https://www.isc.org/
27  *
28  */
29 
30 #include "dhcpd.h"
31 #include <omapip/omapip_p.h>
32 #include "dhcpctl.h"
33 
36 
37 /* dhcpctl_initialize ()
38 
39  Must be called before any other dhcpctl function. */
40 
42 {
43  isc_result_t status;
44 
45  /* Set up the isc and dns library managers */
47  NULL, NULL);
48  if (status != ISC_R_SUCCESS)
49  return status;
50 
51  status = omapi_init();
52  if (status != ISC_R_SUCCESS)
53  return status;
54 
55  status = omapi_object_type_register (&dhcpctl_callback_type,
56  "dhcpctl-callback",
62  0, 0, 0, 0, 0, 0,
63  sizeof
65  RC_MISC);
66  if (status != ISC_R_SUCCESS)
67  return status;
68 
69  status = omapi_object_type_register (&dhcpctl_remote_type,
70  "dhcpctl-remote",
76  0, 0, 0, 0, 0, 0,
77  sizeof (dhcpctl_remote_object_t),
78  0, RC_MISC);
79  if (status != ISC_R_SUCCESS)
80  return status;
81 
82  return ISC_R_SUCCESS;
83 }
84 
85 /* dhcpctl_connect
86 
87  synchronous
88  returns nonzero status code if it didn't connect, zero otherwise
89  stores connection handle through connection, which can be used
90  for subsequent access to the specified server.
91  server_name is the name of the server, and port is the TCP
92  port on which it is listening.
93  authinfo is the handle to an object containing authentication
94  information. */
95 
97  const char *server_name, int port,
98  dhcpctl_handle authinfo)
99 {
100  isc_result_t status;
101 
102  status = omapi_generic_new (connection, MDL);
103  if (status != ISC_R_SUCCESS) {
104  return status;
105  }
106 
107  status = omapi_protocol_connect (*connection, server_name,
108  (unsigned)port, authinfo);
109  if (status == ISC_R_SUCCESS)
110  return status;
111  if (status != DHCP_R_INCOMPLETE) {
112  omapi_object_dereference (connection, MDL);
113  return status;
114  }
115 
116  status = omapi_wait_for_completion (*connection, 0);
117  if (status != ISC_R_SUCCESS) {
118  omapi_object_dereference (connection, MDL);
119  return status;
120  }
121 
122  return status;
123 }
124 
125 /* dhcpctl_wait_for_completion
126 
127  synchronous
128  returns zero if the callback completes, a nonzero status if
129  there was some problem relating to the wait operation. The
130  status of the queued request will be stored through s, and
131  will also be either zero for success or nonzero for some kind
132  of failure. Never returns until completion or until the
133  connection to the server is lost. This performs the same
134  function as dhcpctl_set_callback and the subsequent callback,
135  for programs that want to do inline execution instead of using
136  callbacks. */
137 
139  dhcpctl_status *s)
140 {
141  isc_result_t status;
142  status = omapi_wait_for_completion (h, 0);
143  if (status != ISC_R_SUCCESS)
144  return status;
145  if (h -> type == dhcpctl_remote_type)
146  *s = ((dhcpctl_remote_object_t *)h) -> waitstatus;
147  return ISC_R_SUCCESS;
148 }
149 
150 /* dhcpctl_get_value
151 
152  synchronous
153  returns zero if the call succeeded, a nonzero status code if
154  it didn't.
155  result is the address of an empty data string (initialized
156  with bzero or cleared with data_string_forget). On
157  successful completion, the addressed data string will contain
158  the value that was fetched.
159  dhcpctl_handle refers to some dhcpctl item
160  value_name refers to some value related to that item - e.g.,
161  for a handle associated with a completed host lookup, value
162  could be one of "hardware-address", "dhcp-client-identifier",
163  "known" or "client-hostname". */
164 
166  dhcpctl_handle h, const char *value_name)
167 {
168  isc_result_t status;
169  omapi_value_t *tv = (omapi_value_t *)0;
170  unsigned len;
171  int ip;
172 
173  status = omapi_get_value_str (h, (omapi_object_t *)0, value_name, &tv);
174  if (status != ISC_R_SUCCESS)
175  return status;
176 
177  switch (tv -> value -> type) {
178  case omapi_datatype_int:
179  len = sizeof (int);
180  break;
181 
183  case omapi_datatype_data:
184  len = tv -> value -> u.buffer.len;
185  break;
186 
188  len = sizeof (omapi_handle_t);
189  break;
190 
191  default:
192  omapi_typed_data_dereference (&tv -> value, MDL);
193  return ISC_R_UNEXPECTED;
194  }
195 
196  status = omapi_data_string_new (result, len, MDL);
197  if (status != ISC_R_SUCCESS) {
198  omapi_typed_data_dereference (&tv -> value, MDL);
199  return status;
200  }
201 
202  switch (tv -> value -> type) {
203  case omapi_datatype_int:
204  ip = htonl (tv -> value -> u.integer);
205  memcpy ((*result) -> value, &ip, sizeof ip);
206  break;
207 
209  case omapi_datatype_data:
210  memcpy ((*result) -> value,
211  tv -> value -> u.buffer.value,
212  tv -> value -> u.buffer.len);
213  break;
214 
216  ip = htonl (tv -> value -> u.object -> handle);
217  memcpy ((*result) -> value, &ip, sizeof ip);
218  break;
219  }
220 
222  return ISC_R_SUCCESS;
223 }
224 
225 /* dhcpctl_get_boolean
226 
227  like dhcpctl_get_value, but more convenient for boolean
228  values, since no data_string needs to be dealt with. */
229 
231  dhcpctl_handle h, const char *value_name)
232 {
233  isc_result_t status;
235  int rv;
236 
237  status = dhcpctl_get_value (&data, h, value_name);
238  if (status != ISC_R_SUCCESS)
239  return status;
240  if (data -> len != sizeof rv) {
242  return ISC_R_UNEXPECTED;
243  }
244  memcpy (&rv, data -> value, sizeof rv);
245  *result = ntohl (rv);
247  return ISC_R_SUCCESS;
248 }
249 
250 /* dhcpctl_set_value
251 
252  Sets a value on an object referred to by a dhcpctl_handle.
253  The opposite of dhcpctl_get_value. Does not update the
254  server - just sets the value on the handle. */
255 
257  const char *value_name)
258 {
259  isc_result_t status;
262 
263  status = omapi_data_string_new (&name, strlen (value_name), MDL);
264  if (status != ISC_R_SUCCESS)
265  return status;
266  memcpy (name -> value, value_name, strlen (value_name));
267 
269  value -> len);
270  if (status != ISC_R_SUCCESS) {
272  return status;
273  }
274  memcpy (tv -> u.buffer.value, value -> value, value -> len);
275 
276  status = omapi_set_value (h, (omapi_object_t *)0, name, tv);
279  return status;
280 }
281 
282 /* dhcpctl_set_string_value
283 
284  Sets a NUL-terminated ASCII value on an object referred to by
285  a dhcpctl_handle. like dhcpctl_set_value, but saves the
286  trouble of creating a data_string for a NUL-terminated string.
287  Does not update the server - just sets the value on the handle. */
288 
290  const char *value_name)
291 {
292  isc_result_t status;
295 
296  status = omapi_data_string_new (&name, strlen (value_name), MDL);
297  if (status != ISC_R_SUCCESS)
298  return status;
299  memcpy (name -> value, value_name, strlen (value_name));
300 
301  status = omapi_typed_data_new (MDL, &tv, omapi_datatype_string, value);
302  if (status != ISC_R_SUCCESS) {
304  return status;
305  }
306 
307  status = omapi_set_value (h, (omapi_object_t *)0, name, tv);
310  return status;
311 }
312 
313 /* dhcpctl_set_buffer_value
314 
315  Sets a value on an object referred to by a dhcpctl_handle. like
316  dhcpctl_set_value, but saves the trouble of creating a data_string
317  for string for which we have a buffer and length. Does not update
318  the server - just sets the value on the handle. */
319 
321  const char *value, unsigned len,
322  const char *value_name)
323 {
324  isc_result_t status;
327  unsigned ll;
328 
329  ll = strlen (value_name);
330  status = omapi_data_string_new (&name, ll, MDL);
331  if (status != ISC_R_SUCCESS)
332  return status;
333  memcpy (name -> value, value_name, ll);
334 
335  status = omapi_typed_data_new (MDL, &tv,
336  omapi_datatype_data, len, value);
337  if (status != ISC_R_SUCCESS) {
339  return status;
340  }
341  memcpy (tv -> u.buffer.value, value, len);
342 
343  status = omapi_set_value (h, (omapi_object_t *)0, name, tv);
346  return status;
347 }
348 
349 /* dhcpctl_set_null_value
350 
351  Sets a null value on an object referred to by a dhcpctl_handle. */
352 
354  const char *value_name)
355 {
356  isc_result_t status;
358  unsigned ll;
359 
360  ll = strlen (value_name);
361  status = omapi_data_string_new (&name, ll, MDL);
362  if (status != ISC_R_SUCCESS)
363  return status;
364  memcpy (name -> value, value_name, ll);
365 
366  status = omapi_set_value (h, (omapi_object_t *)0, name,
367  (omapi_typed_data_t *)0);
369  return status;
370 }
371 
372 /* dhcpctl_set_boolean_value
373 
374  Sets a boolean value on an object - like dhcpctl_set_value,
375  only more convenient for booleans. */
376 
378  const char *value_name)
379 {
380  isc_result_t status;
383 
384  status = omapi_data_string_new (&name, strlen (value_name), MDL);
385  if (status != ISC_R_SUCCESS)
386  return status;
387  memcpy (name -> value, value_name, strlen (value_name));
388 
389  status = omapi_typed_data_new (MDL, &tv, omapi_datatype_int, value);
390  if (status != ISC_R_SUCCESS) {
392  return status;
393  }
394 
395  status = omapi_set_value (h, (omapi_object_t *)0, name, tv);
398  return status;
399 }
400 
401 /* dhcpctl_set_int_value
402 
403  Sets a boolean value on an object - like dhcpctl_set_value,
404  only more convenient for booleans. */
405 
407  const char *value_name)
408 {
409  isc_result_t status;
412 
413  status = omapi_data_string_new (&name, strlen (value_name), MDL);
414  if (status != ISC_R_SUCCESS)
415  return status;
416  memcpy (name -> value, value_name, strlen (value_name));
417 
418  status = omapi_typed_data_new (MDL, &tv, omapi_datatype_int, value);
419  if (status != ISC_R_SUCCESS) {
421  return status;
422  }
423 
424  status = omapi_set_value (h, (omapi_object_t *)0, name, tv);
427  return status;
428 }
429 
430 /* dhcpctl_object_update
431 
432  Queues an update on the object referenced by the handle (there
433  can't be any other work in progress on the handle). An
434  update means local parameters will be sent to the server. */
435 
437  dhcpctl_handle h)
438 {
439  isc_result_t status;
440  omapi_object_t *message = (omapi_object_t *)0;
442 
443  if (h -> type != dhcpctl_remote_type)
444  return DHCP_R_INVALIDARG;
445  ro = (dhcpctl_remote_object_t *)h;
446 
447  status = omapi_message_new (&message, MDL);
448  if (status != ISC_R_SUCCESS) {
449  omapi_object_dereference (&message, MDL);
450  return status;
451  }
452  status = omapi_set_int_value (message, (omapi_object_t *)0,
453  "op", OMAPI_OP_UPDATE);
454  if (status != ISC_R_SUCCESS) {
455  omapi_object_dereference (&message, MDL);
456  return status;
457  }
458 
459  status = omapi_set_object_value (message, (omapi_object_t *)0,
460  "object", h);
461  if (status != ISC_R_SUCCESS) {
462  omapi_object_dereference (&message, MDL);
463  return status;
464  }
465 
466  status = omapi_set_int_value (message, (omapi_object_t *)0, "handle",
467  (int)(ro -> remote_handle));
468  if (status != ISC_R_SUCCESS) {
469  omapi_object_dereference (&message, MDL);
470  return status;
471  }
472 
473  omapi_message_register (message);
474  status = omapi_protocol_send_message (connection -> outer,
475  (omapi_object_t *)0,
476  message, (omapi_object_t *)0);
477  omapi_object_dereference (&message, MDL);
478  return status;
479 }
480 
481 /* Requests a refresh on the object referenced by the handle (there
482  can't be any other work in progress on the handle). A
483  refresh means local parameters are updated from the server. */
484 
486  dhcpctl_handle h)
487 {
488  isc_result_t status;
489  omapi_object_t *message = (omapi_object_t *)0;
491 
492  if (h -> type != dhcpctl_remote_type)
493  return DHCP_R_INVALIDARG;
494  ro = (dhcpctl_remote_object_t *)h;
495 
496  status = omapi_message_new (&message, MDL);
497  if (status != ISC_R_SUCCESS) {
498  omapi_object_dereference (&message, MDL);
499  return status;
500  }
501  status = omapi_set_int_value (message, (omapi_object_t *)0,
502  "op", OMAPI_OP_REFRESH);
503  if (status != ISC_R_SUCCESS) {
504  omapi_object_dereference (&message, MDL);
505  return status;
506  }
507  status = omapi_set_int_value (message, (omapi_object_t *)0,
508  "handle", (int)(ro -> remote_handle));
509  if (status != ISC_R_SUCCESS) {
510  omapi_object_dereference (&message, MDL);
511  return status;
512  }
513 
514  omapi_message_register (message);
515  status = omapi_protocol_send_message (connection -> outer,
516  (omapi_object_t *)0,
517  message, (omapi_object_t *)0);
518 
519  /* We don't want to send the contents of the object down the
520  wire, but we do need to reference it so that we know what
521  to do with the update. */
522  status = omapi_set_object_value (message, (omapi_object_t *)0,
523  "object", h);
524  if (status != ISC_R_SUCCESS) {
525  omapi_object_dereference (&message, MDL);
526  return status;
527  }
528 
529  omapi_object_dereference (&message, MDL);
530  return status;
531 }
532 
533 /* Requests the removal of the object referenced by the handle (there
534  can't be any other work in progress on the handle). A
535  removal means that all searchable references to the object on the
536  server are deleted. */
537 
539  dhcpctl_handle h)
540 {
541  isc_result_t status;
542  omapi_object_t *message = (omapi_object_t *)0;
544 
545  if (h -> type != dhcpctl_remote_type)
546  return DHCP_R_INVALIDARG;
547  ro = (dhcpctl_remote_object_t *)h;
548 
549  status = omapi_message_new (&message, MDL);
550  if (status != ISC_R_SUCCESS) {
551  omapi_object_dereference (&message, MDL);
552  return status;
553  }
554  status = omapi_set_int_value (message, (omapi_object_t *)0,
555  "op", OMAPI_OP_DELETE);
556  if (status != ISC_R_SUCCESS) {
557  omapi_object_dereference (&message, MDL);
558  return status;
559  }
560 
561  status = omapi_set_int_value (message, (omapi_object_t *)0, "handle",
562  (int)(ro -> remote_handle));
563  if (status != ISC_R_SUCCESS) {
564  omapi_object_dereference (&message, MDL);
565  return status;
566  }
567 
568  status = omapi_set_object_value (message, (omapi_object_t *)0,
569  "notify-object", h);
570  if (status != ISC_R_SUCCESS) {
571  omapi_object_dereference (&message, MDL);
572  return status;
573  }
574 
575  omapi_message_register (message);
576  status = omapi_protocol_send_message (connection -> outer,
577  (omapi_object_t *)0,
578  message, (omapi_object_t *)0);
579  omapi_object_dereference (&message, MDL);
580  return status;
581 }
582 
584  const char *file, int line)
585 {
586  return omapi_data_string_dereference (vp, file, line);
587 }
isc_result_t dhcpctl_callback_stuff_values(omapi_object_t *c, omapi_object_t *id, omapi_object_t *p)
Definition: callback.c:150
isc_result_t omapi_typed_data_new(const char *, int, omapi_typed_data_t **, omapi_datatype_t,...)
Definition: alloc.c:789
const char int line
Definition: dhcpd.h:3717
dhcpctl_status dhcpctl_get_value(dhcpctl_data_string *result, dhcpctl_handle h, const char *value_name)
Definition: dhcpctl.c:165
isc_result_t omapi_message_new(omapi_object_t **, const char *, int)
#define OMAPI_OP_UPDATE
Definition: omapip_p.h:92
isc_result_t omapi_data_string_dereference(omapi_data_string_t **, const char *, int)
Definition: alloc.c:974
dhcpctl_status dhcpctl_get_boolean(int *result, dhcpctl_handle h, const char *value_name)
Definition: dhcpctl.c:230
isc_result_t omapi_message_register(omapi_object_t *)
Definition: message.c:267
dhcpctl_status dhcpctl_set_null_value(dhcpctl_handle h, const char *value_name)
Definition: dhcpctl.c:353
isc_result_t dhcpctl_remote_set_value(omapi_object_t *, omapi_object_t *, omapi_data_string_t *, omapi_typed_data_t *)
Definition: remote.c:251
dhcpctl_status dhcpctl_connect(dhcpctl_handle *connection, const char *server_name, int port, dhcpctl_handle authinfo)
Definition: dhcpctl.c:96
#define OMAPI_OP_REFRESH
Definition: omapip_p.h:91
#define MDL
Definition: omapip.h:568
isc_result_t dhcpctl_callback_destroy(omapi_object_t *h, const char *file, int line)
Definition: callback.c:134
#define DHCP_R_INVALIDARG
Definition: result.h:48
omapi_typed_data_t * value
Definition: omapip.h:91
isc_result_t omapi_set_value(omapi_object_t *, omapi_object_t *, omapi_data_string_t *, omapi_typed_data_t *)
Definition: support.c:304
#define DHCP_CONTEXT_PRE_DB
Definition: isclib.h:126
isc_result_t dhcpctl_remote_destroy(omapi_object_t *, const char *, int)
Definition: remote.c:324
isc_result_t omapi_set_object_value(omapi_object_t *, omapi_object_t *, const char *, omapi_object_t *)
Definition: support.c:420
isc_result_t dhcpctl_data_string_dereference(dhcpctl_data_string *vp, const char *file, int line)
Definition: dhcpctl.c:583
dhcpctl_status dhcpctl_set_boolean_value(dhcpctl_handle h, int value, const char *value_name)
Definition: dhcpctl.c:377
isc_result_t dhcpctl_callback_get_value(omapi_object_t *h, omapi_object_t *id, omapi_data_string_t *name, omapi_value_t **value)
Definition: callback.c:89
dhcpctl_status dhcpctl_initialize()
Definition: dhcpctl.c:41
#define DHCP_CONTEXT_POST_DB
Definition: isclib.h:127
struct omapi_typed_data_t::@3::@4 buffer
dhcpctl_status dhcpctl_wait_for_completion(dhcpctl_handle h, dhcpctl_status *s)
Definition: dhcpctl.c:138
isc_result_t dhcp_context_create(int flags, struct in_addr *local4, struct in6_addr *local6)
Definition: isclib.c:138
isc_result_t omapi_get_value_str(omapi_object_t *, omapi_object_t *, const char *, omapi_value_t **)
Definition: support.c:483
dhcpctl_status dhcpctl_set_value(dhcpctl_handle h, dhcpctl_data_string value, const char *value_name)
Definition: dhcpctl.c:256
dhcpctl_status dhcpctl_set_data_value(dhcpctl_handle h, const char *value, unsigned len, const char *value_name)
Definition: dhcpctl.c:320
isc_result_t dhcpctl_status
Definition: dhcpctl.h:34
isc_result_t omapi_object_dereference(omapi_object_t **, const char *, int)
Definition: alloc.c:579
isc_result_t omapi_generic_new(omapi_object_t **, const char *, int)
dhcpctl_status dhcpctl_set_int_value(dhcpctl_handle h, int value, const char *value_name)
Definition: dhcpctl.c:406
Definition: ip.h:47
isc_result_t dhcpctl_callback_signal_handler(omapi_object_t *o, const char *name, va_list ap)
Definition: callback.c:103
isc_result_t omapi_protocol_send_message(omapi_object_t *, omapi_object_t *, omapi_object_t *, omapi_object_t *)
Definition: protocol.c:149
dhcpctl_status dhcpctl_object_remove(dhcpctl_handle connection, dhcpctl_handle h)
Definition: dhcpctl.c:538
omapi_object_type_t * dhcpctl_remote_type
Definition: dhcpctl.c:35
isc_result_t omapi_protocol_connect(omapi_object_t *, const char *, unsigned, omapi_object_t *)
unsigned int omapi_handle_t
Definition: omapip.h:37
isc_result_t dhcpctl_remote_signal_handler(omapi_object_t *, const char *, va_list)
Definition: remote.c:291
isc_result_t omapi_value_dereference(omapi_value_t **, const char *, int)
Definition: alloc.c:1046
isc_result_t omapi_wait_for_completion(omapi_object_t *, struct timeval *)
Definition: dispatch.c:421
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)
const char int
Definition: omapip.h:443
dhcpctl_status dhcpctl_object_refresh(dhcpctl_handle connection, dhcpctl_handle h)
Definition: dhcpctl.c:485
isc_result_t omapi_data_string_new(omapi_data_string_t **, unsigned, const char *, int)
Definition: alloc.c:936
omapi_object_type_t * dhcpctl_callback_type
Definition: dhcpctl.c:34
isc_result_t dhcpctl_remote_stuff_values(omapi_object_t *, omapi_object_t *, omapi_object_t *)
Definition: remote.c:343
isc_result_t omapi_set_int_value(omapi_object_t *, omapi_object_t *, const char *, int)
Definition: support.c:396
isc_result_t dhcpctl_callback_set_value(omapi_object_t *h, omapi_object_t *id, omapi_data_string_t *name, omapi_typed_data_t *value)
Definition: callback.c:75
dhcpctl_status dhcpctl_set_string_value(dhcpctl_handle h, const char *value, const char *value_name)
Definition: dhcpctl.c:289
#define DHCP_R_INCOMPLETE
Definition: result.h:57
const char * file
Definition: dhcpd.h:3717
isc_result_t dhcpctl_remote_get_value(omapi_object_t *, omapi_object_t *, omapi_data_string_t *, omapi_value_t **)
Definition: remote.c:277
dhcpctl_status dhcpctl_object_update(dhcpctl_handle connection, dhcpctl_handle h)
Definition: dhcpctl.c:436
omapi_data_string_t * dhcpctl_data_string
Definition: dhcpctl.h:36
#define RC_MISC
Definition: alloc.h:56
isc_result_t omapi_typed_data_dereference(omapi_typed_data_t **, const char *, int)
Definition: alloc.c:887
#define OMAPI_OP_DELETE
Definition: omapip_p.h:95
isc_result_t omapi_init(void)
Definition: support.c:62