示例#1
0
isc_result_t omapi_protocol_listener_signal (omapi_object_t *o,
					     const char *name, va_list ap)
{
	isc_result_t status;
	omapi_object_t *c;
	omapi_protocol_object_t *obj;
	omapi_protocol_listener_object_t *p;

	if (!o || o -> type != omapi_type_protocol_listener)
		return ISC_R_INVALIDARG;
	p = (omapi_protocol_listener_object_t *)o;

	/* Not a signal we recognize? */
	if (strcmp (name, "connect")) {
		if (p -> inner && p -> inner -> type -> signal_handler)
			return (*(p -> inner -> type -> signal_handler))
				(p -> inner, name, ap);
		return ISC_R_NOTFOUND;
	}

	c = va_arg (ap, omapi_object_t *);
	if (!c || c -> type != omapi_type_connection)
		return ISC_R_INVALIDARG;

	obj = (omapi_protocol_object_t *)0;
	status = omapi_protocol_allocate (&obj, MDL);
	if (status != ISC_R_SUCCESS)
		return status;

	obj -> verify_auth = p -> verify_auth;
	obj -> insecure = p -> insecure;

	status = omapi_object_reference (&obj -> outer, c, MDL);
	if (status != ISC_R_SUCCESS) {
	      lose:
		omapi_protocol_dereference (&obj, MDL);
		omapi_disconnect (c, 1);
		return status;
	}

	status = omapi_object_reference (&c -> inner,
					 (omapi_object_t *)obj, MDL);
	if (status != ISC_R_SUCCESS)
		goto lose;

	/* Send the introductory message. */
	status = omapi_protocol_send_intro ((omapi_object_t *)obj,
					    OMAPI_PROTOCOL_VERSION,
					    sizeof (omapi_protocol_header_t));
	if (status != ISC_R_SUCCESS)
		goto lose;

	omapi_protocol_dereference (&obj, MDL);
	return status;
}
示例#2
0
isc_result_t omapi_message_destroy (omapi_object_t *h,
				    const char *file, int line)
{
	omapi_message_object_t *m;
	if (h -> type != omapi_type_message)
		return DHCP_R_INVALIDARG;
	m = (omapi_message_object_t *)h;
	if (m -> authenticator) {
		omapi_typed_data_dereference (&m -> authenticator, file, line);
	}
	if (!m -> prev && omapi_registered_messages != m)
		omapi_message_unregister (h);
	if (m -> id_object)
		omapi_object_dereference (&m -> id_object, file, line);
	if (m -> object)
		omapi_object_dereference (&m -> object, file, line);
	if (m -> notify_object)
		omapi_object_dereference (&m -> notify_object, file, line);
	if (m -> protocol_object)
		omapi_protocol_dereference (&m -> protocol_object, file, line);
	return ISC_R_SUCCESS;
}
示例#3
0
isc_result_t omapi_protocol_connect (omapi_object_t *h,
				     const char *server_name,
				     unsigned port,
				     omapi_object_t *a)
{
	isc_result_t rstatus, status;
	omapi_protocol_object_t *obj;

#ifdef DEBUG_PROTOCOL
	log_debug ("omapi_protocol_connect(%s port=%d)", server_name, port);
#endif

	obj = (omapi_protocol_object_t *)0;
	status = omapi_protocol_allocate (&obj, MDL);
	if (status != ISC_R_SUCCESS)
		return status;

	rstatus = omapi_connect ((omapi_object_t *)obj, server_name, port);
	if (rstatus != ISC_R_SUCCESS && rstatus != ISC_R_INCOMPLETE) {
		omapi_protocol_dereference (&obj, MDL);
		return rstatus;
	}
	status = omapi_object_reference (&h -> outer,
					 (omapi_object_t *)obj, MDL);
	if (status != ISC_R_SUCCESS) {
		omapi_protocol_dereference (&obj, MDL);
		return status;
	}
	status = omapi_object_reference (&obj -> inner, h, MDL);
	if (status != ISC_R_SUCCESS) {
		omapi_protocol_dereference (&obj, MDL);
		return status;
	}

	/* If we were passed a default authenticator, store it now.  We'll
	   open it once we're connected. */
	if (a) {
		obj -> default_auth =
			dmalloc (sizeof(omapi_remote_auth_t), MDL);
		if (!obj -> default_auth) {
			omapi_protocol_dereference (&obj, MDL);
			return ISC_R_NOMEMORY;
		}

		obj -> default_auth -> next = (omapi_remote_auth_t *)0;
		status = omapi_object_reference (&obj -> default_auth -> a,
						 a, MDL);
		if (status != ISC_R_SUCCESS) {
			dfree (obj -> default_auth, MDL);
			omapi_protocol_dereference (&obj, MDL);
			return status;
		}

		obj -> insecure = 0;
		rstatus = ISC_R_INCOMPLETE;
	} else {
		obj -> insecure = 1;
#if 0
		status = ISC_R_SUCCESS;
#endif
	}

	omapi_protocol_dereference (&obj, MDL);
	return rstatus;
}