-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)
-{
- struct group_object *group;
- isc_result_t status;
- int foo;
-
- if (h -> type != dhcp_type_group)
- return ISC_R_INVALIDARG;
- group = (struct group_object *)h;
-
- /* XXX For now, we can only set these values on new group objects.
- XXX Soon, we need to be able to update group objects. */
- if (!omapi_ds_strcmp (name, "name")) {
- if (group -> name)
- return ISC_R_EXISTS;
- if (value -> type == omapi_datatype_data ||
- value -> type == omapi_datatype_string) {
- group -> name = dmalloc (value -> u.buffer.len + 1,
- MDL);
- if (!group -> name)
- return ISC_R_NOMEMORY;
- memcpy (group -> name,
- value -> u.buffer.value,
- value -> u.buffer.len);
- group -> name [value -> u.buffer.len] = 0;
- } else
- return ISC_R_INVALIDARG;
- return ISC_R_SUCCESS;
- }
-
- if (!omapi_ds_strcmp (name, "statements")) {
- if (group -> group && group -> group -> statements)
- return ISC_R_EXISTS;
- if (!group -> group)
- group -> group = clone_group (&root_group, MDL);
- if (!group -> group)
- return ISC_R_NOMEMORY;
- if (value -> type == omapi_datatype_data ||
- value -> type == omapi_datatype_string) {
- struct parse *parse;
- int lose = 0;
- parse = (struct parse *)0;
- status = new_parse (&parse, -1,
- (char *)value -> u.buffer.value,
- value -> u.buffer.len,
- "network client");
- if (status != ISC_R_SUCCESS)
- return status;
- if (!(parse_executable_statements
- (&group -> group -> statements, parse, &lose,
- context_any))) {
- end_parse (&parse);
- return ISC_R_BADPARSE;
- }
- end_parse (&parse);
- return ISC_R_SUCCESS;
- } else
- return ISC_R_INVALIDARG;
- }
-
- /* Try to find some inner object that can take the value. */
- if (h -> inner && h -> inner -> type -> set_value) {
- status = ((*(h -> inner -> type -> set_value))
- (h -> inner, id, name, value));
- if (status == ISC_R_SUCCESS || status == ISC_R_UNCHANGED)
- return status;
- }
-
- return ISC_R_NOTFOUND;
-}
-
-
-isc_result_t dhcp_group_get_value (omapi_object_t *h, omapi_object_t *id,
- omapi_data_string_t *name,
- omapi_value_t **value)
-{
- struct group_object *group;
- isc_result_t status;
- struct data_string ip_addrs;
-
- if (h -> type != dhcp_type_group)
- return ISC_R_INVALIDARG;
- group = (struct group_object *)h;
-
- if (!omapi_ds_strcmp (name, "name"))
- return omapi_make_string_value (value,
- name, group -> name, MDL);
-
- /* Try to find some inner object that can take the value. */
- if (h -> inner && h -> inner -> type -> get_value) {
- status = ((*(h -> inner -> type -> get_value))
- (h -> inner, id, name, value));
- if (status == ISC_R_SUCCESS)
- return status;
- }
- return ISC_R_NOTFOUND;
-}
-
-isc_result_t dhcp_group_destroy (omapi_object_t *h, const char *file, int line)
-{
- struct group_object *group, *t;
- isc_result_t status;
-
- if (h -> type != dhcp_type_group)
- return ISC_R_INVALIDARG;
- group = (struct group_object *)h;
-
- if (group -> name) {
- if (group_name_hash) {
- t = ((struct group_object *)
- hash_lookup (group_name_hash,
- (unsigned char *)group -> name,
- strlen (group -> name)));
- if (t) {
- delete_hash_entry (group_name_hash,
- (unsigned char *)
- group -> name,
- strlen (group -> name));
- --group -> refcnt;
- }
- }
- dfree (group -> name, file, line);
- group -> name = (char *)0;
- }
- if (group -> group)
- group -> group = (struct group *)0; /* XXX refcounts!!! */
-
- return ISC_R_SUCCESS;
-}
-
-isc_result_t dhcp_group_signal_handler (omapi_object_t *h,
- const char *name, va_list ap)
-{
- struct group_object *group, *t;
- isc_result_t status;
- int updatep = 0;
-
- if (h -> type != dhcp_type_group)
- return ISC_R_INVALIDARG;
- group = (struct group_object *)h;
-
- if (!strcmp (name, "updated")) {
- /* A group object isn't valid if a subgroup hasn't yet been
- associated with it. */
- if (!group -> group)
- return ISC_R_INVALIDARG;
-
- /* Group objects always have to have names. */
- if (!group -> name) {
- char hnbuf [64];
- sprintf (hnbuf, "ng%08lx%08lx",
- cur_time, (unsigned long)group);
- group -> name = dmalloc (strlen (hnbuf) + 1, MDL);
- if (!group -> name)
- return ISC_R_NOMEMORY;
- strcpy (group -> name, hnbuf);
- }
-
- supersede_group (group, 1);
- updatep = 1;
- }
-
- /* Try to find some inner object that can take the value. */
- if (h -> inner && h -> inner -> type -> get_value) {
- status = ((*(h -> inner -> type -> signal_handler))
- (h -> inner, name, ap));
- if (status == ISC_R_SUCCESS)
- return status;
- }
- if (updatep)
- return ISC_R_SUCCESS;
- return ISC_R_NOTFOUND;
-}
-
-isc_result_t dhcp_group_stuff_values (omapi_object_t *c,
- omapi_object_t *id,
- omapi_object_t *h)
-{
- struct group_object *group;
- isc_result_t status;
-
- if (h -> type != dhcp_type_group)
- return ISC_R_INVALIDARG;
- group = (struct group_object *)h;
-
- /* Write out all the values. */
- if (group -> name) {
- status = omapi_connection_put_name (c, "name");
- if (status != ISC_R_SUCCESS)
- return status;
- status = omapi_connection_put_string (c, group -> name);
- if (status != ISC_R_SUCCESS)
- return status;
- }
-
- /* Write out the inner object, if any. */
- if (h -> inner && h -> inner -> type -> stuff_values) {
- status = ((*(h -> inner -> type -> stuff_values))
- (c, id, h -> inner));
- if (status == ISC_R_SUCCESS)
- return status;
- }
-
- return ISC_R_SUCCESS;
-}
-
-isc_result_t dhcp_group_lookup (omapi_object_t **lp,
- omapi_object_t *id, omapi_object_t *ref)
-{
- omapi_value_t *tv = (omapi_value_t *)0;
- isc_result_t status;
- struct group_object *group;
-
- /* First see if we were sent a handle. */
- status = omapi_get_value_str (ref, id, "handle", &tv);
- if (status == ISC_R_SUCCESS) {
- status = omapi_handle_td_lookup (lp, tv -> value);
-
- omapi_value_dereference (&tv, MDL);
- if (status != ISC_R_SUCCESS)
- return status;
-
- /* Don't return the object if the type is wrong. */
- if ((*lp) -> type != dhcp_type_group) {
- omapi_object_dereference (lp, MDL);
- return ISC_R_INVALIDARG;
- }
- }
-
- /* Now look for a name. */
- status = omapi_get_value_str (ref, id, "name", &tv);
- if (status == ISC_R_SUCCESS) {
- if (group_name_hash) {
- group = ((struct group_object *)
- hash_lookup (group_name_hash,
- tv -> value -> u.buffer.value,
- tv -> value -> u.buffer.len));
- omapi_value_dereference (&tv, MDL);
-
- /* Don't register a deleted group here. */
- if (group -> flags & GROUP_OBJECT_DELETED) {
- if (!*lp)
- return ISC_R_NOTFOUND;
- group = (struct group_object *)0;
- }
-
- if (*lp && *lp != (omapi_object_t *)group) {
- omapi_object_dereference (lp, MDL);
- return ISC_R_KEYCONFLICT;
- } else if (!group) {
- omapi_object_dereference (lp, MDL);
- return ISC_R_NOTFOUND;
- } else if (!*lp) {
- /* XXX fix so that hash lookup itself creates
- XXX the reference. */
- omapi_object_reference (lp,
- (omapi_object_t *)group,
- MDL);
- }
- } else if (!*lp)
- return ISC_R_NOTFOUND;
- }
-
- /* If we get to here without finding a group, no valid key was
- specified. */
- if (!*lp)
- return ISC_R_NOKEYS;
-
- if (((struct group_object *)(*lp)) -> flags & GROUP_OBJECT_DELETED) {
- omapi_object_dereference (lp, MDL);
- return ISC_R_NOTFOUND;
- }
- return ISC_R_SUCCESS;
-}
-
-isc_result_t dhcp_group_create (omapi_object_t **lp,
- omapi_object_t *id)
-{
- struct group_object *group;
- group = (struct group_object *)dmalloc (sizeof (struct group_object),
- MDL);
- if (!group)
- return ISC_R_NOMEMORY;
- memset (group, 0, sizeof *group);
- group -> refcnt = 0;
- group -> type = dhcp_type_group;
- group -> flags = GROUP_OBJECT_DYNAMIC;
- return omapi_object_reference (lp, (omapi_object_t *)group, MDL);
-}
-
-isc_result_t dhcp_group_remove (omapi_object_t *lp,
- omapi_object_t *id)
-{
- struct group_object *group;
- isc_result_t status;
- if (lp -> type != dhcp_type_group)
- return ISC_R_INVALIDARG;
- group = (struct group_object *)lp;
-
- group -> flags |= GROUP_OBJECT_DELETED;
- if (!write_group (group) || !commit_leases ())
- return ISC_R_IOERROR;
-
- status = dhcp_group_destroy ((omapi_object_t *)group, MDL);
-
- return ISC_R_SUCCESS;
-}
-