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

📄 buffer.c

📁 DHCP服务器源码
💻 C
📖 第 1 页 / 共 2 页
字号:
	unsigned first_byte;	omapi_buffer_t *buffer;	unsigned char *bufp;	int sig_flags = SIG_MODE_UPDATE;	omapi_connection_object_t *c;	isc_result_t status;	if (!h || h -> type != omapi_type_connection)		return ISC_R_INVALIDARG;	c = (omapi_connection_object_t *)h;	if (size > c -> in_bytes)		return ISC_R_NOMORE;	bufp = buf;	bytes_remaining = size;	buffer = c -> inbufs;	while (bytes_remaining) {		if (!buffer)			return ISC_R_UNEXPECTED;		if (BYTES_IN_BUFFER (buffer)) {			if (buffer -> head == (sizeof buffer -> buf) - 1)				first_byte = 0;			else				first_byte = buffer -> head + 1;			if (first_byte > buffer -> tail) {				bytes_this_copy = (sizeof buffer -> buf -						   first_byte);			} else {				bytes_this_copy =					buffer -> tail - first_byte;			}			if (bytes_this_copy > bytes_remaining)				bytes_this_copy = bytes_remaining;			if (bufp) {				if (c -> in_key) {					if (!c -> in_context)						sig_flags |= SIG_MODE_INIT;					status = omapi_connection_sign_data						(sig_flags,						 c -> in_key,						 &c -> in_context,						 (unsigned char *)						 &buffer -> buf [first_byte],						 bytes_this_copy,						 (omapi_typed_data_t **)0);					if (status != ISC_R_SUCCESS)						return status;				}				memcpy (bufp, &buffer -> buf [first_byte],					bytes_this_copy);				bufp += bytes_this_copy;			}			bytes_remaining -= bytes_this_copy;			buffer -> head = first_byte + bytes_this_copy - 1;			c -> in_bytes -= bytes_this_copy;		}					if (!BYTES_IN_BUFFER (buffer))			buffer = buffer -> next;	}	/* Get rid of any input buffers that we emptied. */	buffer = (omapi_buffer_t *)0;	while (c -> inbufs &&	       !BYTES_IN_BUFFER (c -> inbufs)) {		if (c -> inbufs -> next) {			omapi_buffer_reference (&buffer,						c -> inbufs -> next, MDL);			omapi_buffer_dereference (&c -> inbufs -> next, MDL);		}		omapi_buffer_dereference (&c -> inbufs, MDL);		if (buffer) {			omapi_buffer_reference				(&c -> inbufs, buffer, MDL);			omapi_buffer_dereference (&buffer, MDL);		}	}	return ISC_R_SUCCESS;}isc_result_t omapi_connection_writer (omapi_object_t *h){	unsigned bytes_this_write;	int bytes_written;	unsigned first_byte;	omapi_buffer_t *buffer;	unsigned char *bufp;	omapi_connection_object_t *c;	isc_result_t status;	if (!h || h -> type != omapi_type_connection)		return ISC_R_INVALIDARG;	c = (omapi_connection_object_t *)h;	/* Already flushed... */	if (!c -> out_bytes)		return ISC_R_SUCCESS;	buffer = c -> outbufs;	while (c -> out_bytes) {		if (!buffer)			return ISC_R_UNEXPECTED;		if (BYTES_IN_BUFFER (buffer)) {			if (buffer -> head == (sizeof buffer -> buf) - 1)				first_byte = 0;			else				first_byte = buffer -> head + 1;			if (first_byte > buffer -> tail) {				bytes_this_write = (sizeof buffer -> buf -						   first_byte);			} else {				bytes_this_write =					buffer -> tail - first_byte;			}			bytes_written = write (c -> socket,					       &buffer -> buf [first_byte],					       bytes_this_write);			/* If the write failed with EWOULDBLOCK or we wrote			   zero bytes, a further write would block, so we have			   flushed as much as we can for now.   Other errors			   are really errors. */			if (bytes_written < 0) {				if (errno == EWOULDBLOCK || errno == EAGAIN)					return ISC_R_SUCCESS;				else if (errno == EPIPE)					return ISC_R_NOCONN;#ifdef EDQUOT				else if (errno == EFBIG || errno == EDQUOT)#else				else if (errno == EFBIG)#endif					return ISC_R_NORESOURCES;				else if (errno == ENOSPC)					return ISC_R_NOSPACE;				else if (errno == EIO)					return ISC_R_IOERROR;				else if (errno == EINVAL)					return ISC_R_INVALIDARG;				else if (errno == ECONNRESET)					return ISC_R_SHUTTINGDOWN;				else					return ISC_R_UNEXPECTED;			}			if (bytes_written == 0)				return ISC_R_SUCCESS;#if defined (TRACING)			if (trace_record ()) {				trace_iov_t iov [2];				int32_t connect_index;								connect_index = htonl (c -> index);								iov [0].buf = (char *)&connect_index;				iov [0].len = sizeof connect_index;				iov [1].buf = &buffer -> buf [buffer -> tail];				iov [1].len = bytes_written;								status = (trace_write_packet_iov					  (trace_connection_input, 2, iov,					   MDL));				if (status != ISC_R_SUCCESS) {					trace_stop ();					log_error ("trace %s output: %s",						   "connection",						   isc_result_totext (status));				}			}#endif			buffer -> head = first_byte + bytes_written - 1;			c -> out_bytes -= bytes_written;			/* If we didn't finish out the write, we filled the			   O.S. output buffer and a further write would block,			   so stop trying to flush now. */			if (bytes_written != bytes_this_write)				return ISC_R_SUCCESS;		}					if (!BYTES_IN_BUFFER (buffer))			buffer = buffer -> next;	}			/* Get rid of any output buffers we emptied. */	buffer = (omapi_buffer_t *)0;	while (c -> outbufs &&	       !BYTES_IN_BUFFER (c -> outbufs)) {		if (c -> outbufs -> next) {			omapi_buffer_reference (&buffer,						c -> outbufs -> next, MDL);			omapi_buffer_dereference (&c -> outbufs -> next, MDL);		}		omapi_buffer_dereference (&c -> outbufs, MDL);		if (buffer) {			omapi_buffer_reference (&c -> outbufs, buffer, MDL);			omapi_buffer_dereference (&buffer, MDL);		}	}	return ISC_R_SUCCESS;}isc_result_t omapi_connection_get_uint32 (omapi_object_t *c,					  u_int32_t *result){	u_int32_t inbuf;	isc_result_t status;	status = omapi_connection_copyout ((unsigned char *)&inbuf,					   c, sizeof inbuf);	if (status != ISC_R_SUCCESS)		return status;	*result = ntohl (inbuf);	return ISC_R_SUCCESS;}isc_result_t omapi_connection_put_uint32 (omapi_object_t *c,					  u_int32_t value){	u_int32_t inbuf;	isc_result_t status;	inbuf = htonl (value);		return omapi_connection_copyin (c, (unsigned char *)&inbuf,					sizeof inbuf);}isc_result_t omapi_connection_get_uint16 (omapi_object_t *c,					  u_int16_t *result){	u_int16_t inbuf;	isc_result_t status;	status = omapi_connection_copyout ((unsigned char *)&inbuf,					   c, sizeof inbuf);	if (status != ISC_R_SUCCESS)		return status;	*result = ntohs (inbuf);	return ISC_R_SUCCESS;}isc_result_t omapi_connection_put_uint16 (omapi_object_t *c,					  u_int32_t value){	u_int16_t inbuf;	isc_result_t status;	inbuf = htons (value);		return omapi_connection_copyin (c, (unsigned char *)&inbuf,					sizeof inbuf);}isc_result_t omapi_connection_write_typed_data (omapi_object_t *c,						omapi_typed_data_t *data){	isc_result_t status;	omapi_handle_t handle;	/* Null data is valid. */	if (!data)		return omapi_connection_put_uint32 (c, 0);	switch (data -> type) {	      case omapi_datatype_int:		status = omapi_connection_put_uint32 (c, sizeof (u_int32_t));		if (status != ISC_R_SUCCESS)			return status;		return omapi_connection_put_uint32 (c, ((u_int32_t)							(data -> u.integer)));	      case omapi_datatype_string:	      case omapi_datatype_data:		status = omapi_connection_put_uint32 (c, data -> u.buffer.len);		if (status != ISC_R_SUCCESS)			return status;		if (data -> u.buffer.len)			return omapi_connection_copyin				(c, data -> u.buffer.value,				 data -> u.buffer.len);		return ISC_R_SUCCESS;	      case omapi_datatype_object:		if (data -> u.object) {			status = omapi_object_handle (&handle,						      data -> u.object);			if (status != ISC_R_SUCCESS)				return status;		} else			handle = 0;		status = omapi_connection_put_uint32 (c, sizeof handle);		if (status != ISC_R_SUCCESS)			return status;		return omapi_connection_put_uint32 (c, handle);	}	return ISC_R_INVALIDARG;}isc_result_t omapi_connection_put_name (omapi_object_t *c, const char *name){	isc_result_t status;	unsigned len = strlen (name);	status = omapi_connection_put_uint16 (c, len);	if (status != ISC_R_SUCCESS)		return status;	return omapi_connection_copyin (c, (const unsigned char *)name, len);}isc_result_t omapi_connection_put_string (omapi_object_t *c,					  const char *string){	isc_result_t status;	unsigned len;	if (string)		len = strlen (string);	else		len = 0;	status = omapi_connection_put_uint32 (c, len);	if (status != ISC_R_SUCCESS)		return status;	if (len)		return omapi_connection_copyin			(c, (const unsigned char *)string, len);	return ISC_R_SUCCESS;}isc_result_t omapi_connection_put_handle (omapi_object_t *c, omapi_object_t *h){	isc_result_t status;	omapi_handle_t handle;	if (h) {		status = omapi_object_handle (&handle, h);		if (status != ISC_R_SUCCESS)			return status;	} else		handle = 0;	/* The null handle. */	status = omapi_connection_put_uint32 (c, sizeof handle);	if (status != ISC_R_SUCCESS)		return status;	return omapi_connection_put_uint32 (c, handle);}

⌨️ 快捷键说明

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