00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include "dhcpd.h"
00030 #include <omapip/omapip_p.h>
00031 #include "dhcpctl.h"
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 dhcpctl_status dhcpctl_set_callback (dhcpctl_handle h, void *data,
00047 void (*func) (dhcpctl_handle,
00048 dhcpctl_status, void *))
00049 {
00050 dhcpctl_callback_object_t *callback;
00051 omapi_object_t *inner;
00052
00053 callback = dmalloc (sizeof *callback, MDL);
00054 if (!callback)
00055 return ISC_R_NOMEMORY;
00056
00057
00058 for (inner = h; inner -> inner; inner = inner -> inner)
00059 ;
00060 omapi_object_reference (&inner -> inner,
00061 (omapi_object_t *)callback, MDL);
00062 omapi_object_reference ((omapi_object_t **)&callback -> outer,
00063 inner, MDL);
00064
00065
00066 omapi_object_reference (&callback -> object, h, MDL);
00067 callback -> data = data;
00068 callback -> callback = func;
00069
00070 return ISC_R_SUCCESS;
00071 }
00072
00073
00074
00075 isc_result_t dhcpctl_callback_set_value (omapi_object_t *h,
00076 omapi_object_t *id,
00077 omapi_data_string_t *name,
00078 omapi_typed_data_t *value)
00079 {
00080 if (h -> type != dhcpctl_callback_type)
00081 return DHCP_R_INVALIDARG;
00082
00083 if (h -> inner && h -> inner -> type -> set_value)
00084 return (*(h -> inner -> type -> set_value))
00085 (h -> inner, id, name, value);
00086 return ISC_R_NOTFOUND;
00087 }
00088
00089 isc_result_t dhcpctl_callback_get_value (omapi_object_t *h,
00090 omapi_object_t *id,
00091 omapi_data_string_t *name,
00092 omapi_value_t **value)
00093 {
00094 if (h -> type != dhcpctl_callback_type)
00095 return DHCP_R_INVALIDARG;
00096
00097 if (h -> inner && h -> inner -> type -> get_value)
00098 return (*(h -> inner -> type -> get_value))
00099 (h -> inner, id, name, value);
00100 return ISC_R_NOTFOUND;
00101 }
00102
00103 isc_result_t dhcpctl_callback_signal_handler (omapi_object_t *o,
00104 const char *name, va_list ap)
00105 {
00106 dhcpctl_callback_object_t *p;
00107 isc_result_t waitstatus;
00108
00109 if (o -> type != dhcpctl_callback_type)
00110 return DHCP_R_INVALIDARG;
00111 p = (dhcpctl_callback_object_t *)o;
00112
00113
00114 if (strcmp (name, "ready")) {
00115 if (p -> inner && p -> inner -> type -> signal_handler)
00116 return (*(p -> inner -> type -> signal_handler))
00117 (p -> inner, name, ap);
00118 return ISC_R_NOTFOUND;
00119 }
00120
00121 if (p -> object -> type == dhcpctl_remote_type) {
00122 waitstatus = (((dhcpctl_remote_object_t *)
00123 (p -> object)) -> waitstatus);
00124 } else
00125 waitstatus = ISC_R_SUCCESS;
00126
00127
00128 if (p -> callback)
00129 (*(p -> callback)) (p -> object, waitstatus, p -> data);
00130
00131 return ISC_R_SUCCESS;
00132 }
00133
00134 isc_result_t dhcpctl_callback_destroy (omapi_object_t *h,
00135 const char *file, int line)
00136 {
00137 dhcpctl_callback_object_t *p;
00138 if (h -> type != dhcpctl_callback_type)
00139 return DHCP_R_INVALIDARG;
00140 p = (dhcpctl_callback_object_t *)h;
00141 if (p -> handle)
00142 omapi_object_dereference ((omapi_object_t **)&p -> handle,
00143 file, line);
00144 return ISC_R_SUCCESS;
00145 }
00146
00147
00148
00149
00150 isc_result_t dhcpctl_callback_stuff_values (omapi_object_t *c,
00151 omapi_object_t *id,
00152 omapi_object_t *p)
00153 {
00154 if (p -> type != dhcpctl_callback_type)
00155 return DHCP_R_INVALIDARG;
00156
00157 if (p -> inner && p -> inner -> type -> stuff_values)
00158 return (*(p -> inner -> type -> stuff_values)) (c, id,
00159 p -> inner);
00160 return ISC_R_SUCCESS;
00161 }
00162