⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 support.c

📁 DHCP服务器源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* support.c   Subroutines providing general support for objects. *//* * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") * Copyright (c) 1999-2003 by Internet Software Consortium * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * *   Internet Systems Consortium, Inc. *   950 Charter Street *   Redwood City, CA 94063 *   <info@isc.org> *   http://www.isc.org/ * * This software has been written for Internet Systems Consortium * by Ted Lemon in cooperation with Vixie Enterprises and Nominum, Inc. * To learn more about Internet Systems Consortium, see * ``http://www.isc.org/''.  To learn more about Vixie Enterprises, * see ``http://www.vix.com''.   To learn more about Nominum, Inc., see * ``http://www.nominum.com''. */#include <omapip/omapip_p.h>omapi_object_type_t *omapi_type_connection;omapi_object_type_t *omapi_type_listener;omapi_object_type_t *omapi_type_io_object;omapi_object_type_t *omapi_type_datagram;omapi_object_type_t *omapi_type_generic;omapi_object_type_t *omapi_type_protocol;omapi_object_type_t *omapi_type_protocol_listener;omapi_object_type_t *omapi_type_waiter;omapi_object_type_t *omapi_type_remote;omapi_object_type_t *omapi_type_message;omapi_object_type_t *omapi_type_auth_key;omapi_object_type_t *omapi_object_types;int omapi_object_type_count;static int ot_max;#if defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)void omapi_type_relinquish (){	omapi_object_type_t *t, *n;	for (t = omapi_object_types; t; t = n) {		n = t -> next;		dfree (t, MDL);	}	omapi_object_types = (omapi_object_type_t *)0;}#endifisc_result_t omapi_init (void){	isc_result_t status;	dst_init();	/* Register all the standard object types... */	status = omapi_object_type_register (&omapi_type_connection,					     "connection",					     omapi_connection_set_value,					     omapi_connection_get_value,					     omapi_connection_destroy,					     omapi_connection_signal_handler,					     omapi_connection_stuff_values,					     0, 0, 0, 0, 0, 0,					     sizeof					     (omapi_connection_object_t), 0,					     RC_MISC);	if (status != ISC_R_SUCCESS)		return status;	status = omapi_object_type_register (&omapi_type_listener,					     "listener",					     omapi_listener_set_value,					     omapi_listener_get_value,					     omapi_listener_destroy,					     omapi_listener_signal_handler,					     omapi_listener_stuff_values,					     0, 0, 0, 0, 0, 0,					     sizeof (omapi_listener_object_t),					     0, RC_MISC);	if (status != ISC_R_SUCCESS)		return status;	status = omapi_object_type_register (&omapi_type_io_object,					     "io",					     omapi_io_set_value,					     omapi_io_get_value,					     omapi_io_destroy,					     omapi_io_signal_handler,					     omapi_io_stuff_values,					     0, 0, 0, 0, 0, 0,					     sizeof (omapi_io_object_t),					     0, RC_MISC);	if (status != ISC_R_SUCCESS)		return status;	status = omapi_object_type_register (&omapi_type_generic,					     "generic",					     omapi_generic_set_value,					     omapi_generic_get_value,					     omapi_generic_destroy,					     omapi_generic_signal_handler,					     omapi_generic_stuff_values,					     0, 0, 0, 0, 0, 0,					     sizeof (omapi_generic_object_t),					     0, RC_MISC);	if (status != ISC_R_SUCCESS)		return status;	status = omapi_object_type_register (&omapi_type_protocol,					     "protocol",					     omapi_protocol_set_value,					     omapi_protocol_get_value,					     omapi_protocol_destroy,					     omapi_protocol_signal_handler,					     omapi_protocol_stuff_values,					     0, 0, 0, 0, 0, 0,					     sizeof (omapi_protocol_object_t),					     0, RC_MISC);	if (status != ISC_R_SUCCESS)		return status;	status = (omapi_object_type_register		  (&omapi_type_protocol_listener, "protocol-listener",		   omapi_protocol_listener_set_value,		   omapi_protocol_listener_get_value,		   omapi_protocol_listener_destroy,		   omapi_protocol_listener_signal,		   omapi_protocol_listener_stuff,		   0, 0, 0, 0, 0, 0,		   sizeof (omapi_protocol_listener_object_t), 0, RC_MISC));	if (status != ISC_R_SUCCESS)		return status;	status = omapi_object_type_register (&omapi_type_message,					     "message",					     omapi_message_set_value,					     omapi_message_get_value,					     omapi_message_destroy,					     omapi_message_signal_handler,					     omapi_message_stuff_values,					     0, 0, 0, 0, 0, 0,					     sizeof (omapi_message_object_t),					     0, RC_MISC);	if (status != ISC_R_SUCCESS)		return status;	status = omapi_object_type_register (&omapi_type_waiter,					     "waiter",					     0,					     0,					     0,					     omapi_waiter_signal_handler, 0,					     0, 0, 0, 0, 0, 0,					     sizeof (omapi_waiter_object_t),					     0, RC_MISC);	if (status != ISC_R_SUCCESS)		return status;	status = omapi_object_type_register (&omapi_type_auth_key,					     "authenticator",					     0,					     omapi_auth_key_get_value,					     omapi_auth_key_destroy,					     0,					     omapi_auth_key_stuff_values,					     omapi_auth_key_lookup,					     0, 0, 0, 0, 0,					     sizeof (omapi_auth_key_t), 0,					     RC_MISC);	if (status != ISC_R_SUCCESS)		return status;#if defined (TRACING)	omapi_listener_trace_setup ();	omapi_connection_trace_setup ();	omapi_buffer_trace_setup ();	trace_mr_init ();#endif	/* This seems silly, but leave it. */	return ISC_R_SUCCESS;}isc_result_t omapi_object_type_register (omapi_object_type_t **type,					 const char *name,					 isc_result_t (*set_value)						 (omapi_object_t *,						  omapi_object_t *,						  omapi_data_string_t *,						  omapi_typed_data_t *),					 isc_result_t (*get_value)						(omapi_object_t *,						 omapi_object_t *,						 omapi_data_string_t *,						 omapi_value_t **),					 isc_result_t (*destroy)						(omapi_object_t *,						 const char *, int),					 isc_result_t (*signal_handler)						 (omapi_object_t *,						  const char *, va_list),					 isc_result_t (*stuff_values)						(omapi_object_t *,						 omapi_object_t *,						 omapi_object_t *),					 isc_result_t (*lookup)						(omapi_object_t **,						 omapi_object_t *,						 omapi_object_t *),					 isc_result_t (*create)						(omapi_object_t **,						 omapi_object_t *),					 isc_result_t (*remove)						(omapi_object_t *,						 omapi_object_t *),					 isc_result_t (*freer)						(omapi_object_t *,						 const char *, int),					 isc_result_t (*allocator)						(omapi_object_t **,						 const char *, int),					 isc_result_t (*sizer) (size_t),					 size_t size,					 isc_result_t (*initialize)						(omapi_object_t *,						 const char *, int),					 int rc_flag){	omapi_object_type_t *t;	t = dmalloc (sizeof *t, MDL);	if (!t)		return ISC_R_NOMEMORY;	memset (t, 0, sizeof *t);	t -> name = name;	t -> set_value = set_value;	t -> get_value = get_value;	t -> destroy = destroy;	t -> signal_handler = signal_handler;	t -> stuff_values = stuff_values;	t -> lookup = lookup;	t -> create = create;	t -> remove = remove;	t -> next = omapi_object_types;	t -> sizer = sizer;	t -> size = size;	t -> freer = freer;	t -> allocator = allocator;	t -> initialize = initialize;	t -> rc_flag = rc_flag;	omapi_object_types = t;	if (type)		*type = t;	return ISC_R_SUCCESS;}isc_result_t omapi_signal (omapi_object_t *handle, const char *name, ...){	va_list ap;	omapi_object_t *outer;	isc_result_t status;	va_start (ap, name);	for (outer = handle; outer -> outer; outer = outer -> outer)		;	if (outer -> type -> signal_handler)		status = (*(outer -> type -> signal_handler)) (outer,							       name, ap);	else		status = ISC_R_NOTFOUND;	va_end (ap);	return status;}isc_result_t omapi_signal_in (omapi_object_t *handle, const char *name, ...){	va_list ap;	omapi_object_t *outer;	isc_result_t status;	if (!handle)		return ISC_R_NOTFOUND;	va_start (ap, name);	if (handle -> type -> signal_handler)		status = (*(handle -> type -> signal_handler)) (handle,								name, ap);	else		status = ISC_R_NOTFOUND;	va_end (ap);	return status;}isc_result_t omapi_set_value (omapi_object_t *h,			      omapi_object_t *id,			      omapi_data_string_t *name,			      omapi_typed_data_t *value){	omapi_object_t *outer;	isc_result_t status;#if defined (DEBUG)	if (!value) {		log_info ("omapi_set_value (%.*s, NULL)",			  (int)name -> len, name -> value);	} else if (value -> type == omapi_datatype_int) {		log_info ("omapi_set_value (%.*s, %ld)",			  (int)name -> len, name -> value,			  (long)value -> u.integer);	} else if (value -> type == omapi_datatype_string) {		log_info ("omapi_set_value (%.*s, %.*s)",			  (int)name -> len, name -> value,			  (int)value -> u.buffer.len, value -> u.buffer.value);	} else if (value -> type == omapi_datatype_data) {		log_info ("omapi_set_value (%.*s, %ld %lx)",			  (int)name -> len, name -> value,			  (long)value -> u.buffer.len,			  (unsigned long)value -> u.buffer.value);	} else if (value -> type == omapi_datatype_object) {		log_info ("omapi_set_value (%.*s, %s)",			  (int)name -> len, name -> value,			  value -> u.object			  ? (value -> u.object -> type			     ? value -> u.object -> type -> name			     : "(unknown object)")			  : "(unknown object)");	}#endif	for (outer = h; outer -> outer; outer = outer -> outer)		;	if (outer -> type -> set_value)		status = (*(outer -> type -> set_value)) (outer,							  id, name, value);	else		status = ISC_R_NOTFOUND;#if defined (DEBUG)	log_info (" ==> %s", isc_result_totext (status));#endif	return status;}isc_result_t omapi_set_value_str (omapi_object_t *h,				  omapi_object_t *id,				  const char *name,				  omapi_typed_data_t *value){	omapi_object_t *outer;	omapi_data_string_t *nds;	isc_result_t status;	nds = (omapi_data_string_t *)0;	status = omapi_data_string_new (&nds, strlen (name), MDL);	if (status != ISC_R_SUCCESS)		return status;	memcpy (nds -> value, name, strlen (name));	status = omapi_set_value (h, id, nds, value);	omapi_data_string_dereference (&nds, MDL);	return status;}isc_result_t omapi_set_boolean_value (omapi_object_t *h, omapi_object_t *id,				      const char *name, int value){	isc_result_t status;	omapi_typed_data_t *tv = (omapi_typed_data_t *)0;	omapi_data_string_t *n = (omapi_data_string_t *)0;	int len;	int ip;	status = omapi_data_string_new (&n, strlen (name), MDL);	if (status != ISC_R_SUCCESS)		return status;	memcpy (n -> value, name, strlen (name));	status = omapi_typed_data_new (MDL, &tv, omapi_datatype_int, value);	if (status != ISC_R_SUCCESS) {		omapi_data_string_dereference (&n, MDL);		return status;	}	status = omapi_set_value (h, id, n, tv);	omapi_data_string_dereference (&n, MDL);	omapi_typed_data_dereference (&tv, MDL);	return status;}isc_result_t omapi_set_int_value (omapi_object_t *h, omapi_object_t *id,				  const char *name, int value){	isc_result_t status;	omapi_typed_data_t *tv = (omapi_typed_data_t *)0;	omapi_data_string_t *n = (omapi_data_string_t *)0;	int len;	int ip;	status = omapi_data_string_new (&n, strlen (name), MDL);	if (status != ISC_R_SUCCESS)		return status;	memcpy (n -> value, name, strlen (name));	status = omapi_typed_data_new (MDL, &tv, omapi_datatype_int, value);	if (status != ISC_R_SUCCESS) {		omapi_data_string_dereference (&n, MDL);		return status;	}	status = omapi_set_value (h, id, n, tv);	omapi_data_string_dereference (&n, MDL);	omapi_typed_data_dereference (&tv, MDL);	return status;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -