36 static void trace_connection_input_input (
trace_type_t *,
unsigned,
char *);
37 static void trace_connection_input_stop (
trace_type_t *);
38 static void trace_connection_output_input (
trace_type_t *,
unsigned,
char *);
39 static void trace_connection_output_stop (
trace_type_t *);
42 static isc_result_t omapi_connection_reader_trace (
omapi_object_t *,
49 trace_connection_input =
52 trace_connection_input_input,
53 trace_connection_input_stop,
MDL);
54 trace_connection_output =
57 trace_connection_output_input,
58 trace_connection_output_stop,
MDL);
61 static void trace_connection_input_input (
trace_type_t *ttype,
62 unsigned length,
char *buf)
64 unsigned left, taken, cc = 0;
66 int32_t connect_index;
70 memcpy (&connect_index, buf,
sizeof connect_index);
71 connect_index = ntohl (connect_index);
75 if (lp ->
index == ntohl (connect_index)) {
76 omapi_connection_reference (&c, lp,
MDL);
77 omapi_connection_dereference (&lp,
MDL);
84 log_error (
"trace connection input: no connection index %ld",
85 (
long int)connect_index);
89 s = buf +
sizeof connect_index;
90 left = length -
sizeof connect_index;
96 if (status != ISC_R_SUCCESS) {
98 isc_result_totext (status));
104 "input is not being consumed.");
113 omapi_connection_dereference (&c,
MDL);
116 static void trace_connection_input_stop (
trace_type_t *ttype) { }
118 static void trace_connection_output_input (
trace_type_t *ttype,
119 unsigned length,
char *buf)
125 static void trace_connection_output_stop (
trace_type_t *ttype) { }
134 #if defined (TRACING) 135 return omapi_connection_reader_trace (h, 0, (
char *)0, (
unsigned *)0);
138 static isc_result_t omapi_connection_reader_trace (
omapi_object_t *h,
141 unsigned *stuff_taken)
149 unsigned bytes_to_read;
157 c -> in_bytes > c -> bytes_needed)
158 return ISC_R_SUCCESS;
162 for (buffer = c -> inbufs; buffer -> next;
163 buffer = buffer -> next)
167 if (status != ISC_R_SUCCESS)
169 buffer = buffer -> next;
173 if (status != ISC_R_SUCCESS)
175 buffer = c -> inbufs;
180 while (bytes_to_read) {
181 if (buffer -> tail > buffer -> head)
182 read_len =
sizeof (buffer -> buf) - buffer -> tail;
184 read_len = buffer -> head - buffer -> tail;
186 #if defined (TRACING) 189 if (read_len > stuff_len)
190 read_len = stuff_len;
192 *stuff_taken += read_len;
193 memcpy (&buffer -> buf [buffer -> tail],
194 stuff_buf, read_len);
195 stuff_len -= read_len;
196 stuff_buf += read_len;
197 read_status = read_len;
204 read_status = read (c -> socket,
205 &buffer -> buf [buffer -> tail],
208 if (read_status < 0) {
209 if (errno == EWOULDBLOCK)
211 else if (errno == EIO)
212 return ISC_R_IOERROR;
213 else if (errno == EINVAL)
215 else if (errno == ECONNRESET) {
217 return ISC_R_SHUTTINGDOWN;
219 return ISC_R_UNEXPECTED;
224 if (read_status == 0) {
226 return ISC_R_SHUTTINGDOWN;
228 #if defined (TRACING) 231 int32_t connect_index;
233 connect_index = htonl (c ->
index);
235 iov [0].
buf = (
char *)&connect_index;
236 iov [0].
len =
sizeof connect_index;
237 iov [1].
buf = &buffer -> buf [buffer -> tail];
238 iov [1].
len = read_status;
241 (trace_connection_input, 2, iov,
MDL));
242 if (status != ISC_R_SUCCESS) {
245 isc_result_totext (status));
249 buffer -> tail += read_status;
250 c -> in_bytes += read_status;
251 if (buffer -> tail ==
sizeof buffer -> buf)
253 if (read_status < read_len)
255 bytes_to_read -= read_status;
258 if (c -> bytes_needed <= c -> in_bytes) {
261 return ISC_R_SUCCESS;
267 const unsigned char *bufp,
272 int bytes_copied = 0;
286 return ISC_R_NOTCONNECTED;
289 for (buffer = c -> outbufs;
290 buffer -> next; buffer = buffer -> next)
294 if (status != ISC_R_SUCCESS)
296 buffer = c -> outbufs;
299 while (bytes_copied < len) {
304 if (status != ISC_R_SUCCESS)
306 buffer = buffer -> next;
309 if (buffer -> tail > buffer -> head)
310 copy_len =
sizeof (buffer -> buf) - buffer -> tail;
312 copy_len = buffer -> head - buffer -> tail;
314 if (copy_len > (len - bytes_copied))
315 copy_len = len - bytes_copied;
318 if (!c -> out_context)
321 (sig_flags, c -> out_key, &c -> out_context,
322 &bufp [bytes_copied], copy_len,
324 if (status != ISC_R_SUCCESS)
328 memcpy (&buffer -> buf [buffer -> tail],
329 &bufp [bytes_copied], copy_len);
330 buffer -> tail += copy_len;
331 c -> out_bytes += copy_len;
332 bytes_copied += copy_len;
333 if (buffer -> tail ==
sizeof buffer -> buf)
337 status = ISC_R_SUCCESS;
346 if ((c->outer != NULL) &&
349 isc_socket_fdwatchpoke(io->
fd,
350 ISC_SOCKFDWATCH_WRITE);
364 unsigned bytes_remaining;
365 unsigned bytes_this_copy;
377 if (size > c -> in_bytes)
380 bytes_remaining = size;
381 buffer = c -> inbufs;
383 while (bytes_remaining) {
385 return ISC_R_UNEXPECTED;
387 if (buffer -> head == (
sizeof buffer -> buf) - 1)
390 first_byte = buffer -> head + 1;
392 if (first_byte > buffer -> tail) {
393 bytes_this_copy = (
sizeof buffer -> buf -
397 buffer -> tail - first_byte;
399 if (bytes_this_copy > bytes_remaining)
400 bytes_this_copy = bytes_remaining;
403 if (!c -> in_context)
410 &buffer -> buf [first_byte],
413 if (status != ISC_R_SUCCESS)
417 memcpy (bufp, &buffer -> buf [first_byte],
419 bufp += bytes_this_copy;
421 bytes_remaining -= bytes_this_copy;
422 buffer -> head = first_byte + bytes_this_copy - 1;
423 c -> in_bytes -= bytes_this_copy;
427 buffer = buffer -> next;
432 while (c -> inbufs &&
434 if (c -> inbufs -> next) {
436 c -> inbufs -> next,
MDL);
442 (&c -> inbufs, buffer,
MDL);
446 return ISC_R_SUCCESS;
451 unsigned bytes_this_write;
463 return ISC_R_SUCCESS;
465 buffer = c -> outbufs;
467 while (c -> out_bytes) {
469 return ISC_R_UNEXPECTED;
471 if (buffer -> head == (
sizeof buffer -> buf) - 1)
474 first_byte = buffer -> head + 1;
476 if (first_byte > buffer -> tail) {
477 bytes_this_write = (
sizeof buffer -> buf -
481 buffer -> tail - first_byte;
483 bytes_written = write (c -> socket,
484 &buffer -> buf [first_byte],
490 if (bytes_written < 0) {
491 if (errno == EWOULDBLOCK || errno == EAGAIN)
492 return ISC_R_INPROGRESS;
493 else if (errno == EPIPE)
496 else if (errno == EFBIG || errno == EDQUOT)
498 else if (errno == EFBIG)
500 return ISC_R_NORESOURCES;
501 else if (errno == ENOSPC)
502 return ISC_R_NOSPACE;
503 else if (errno == EIO)
504 return ISC_R_IOERROR;
505 else if (errno == EINVAL)
507 else if (errno == ECONNRESET)
508 return ISC_R_SHUTTINGDOWN;
510 return ISC_R_UNEXPECTED;
512 if (bytes_written == 0)
513 return ISC_R_INPROGRESS;
515 #if defined (TRACING) 519 int32_t connect_index;
521 connect_index = htonl (c ->
index);
523 iov [0].
buf = (
char *)&connect_index;
524 iov [0].
len =
sizeof connect_index;
525 iov [1].
buf = &buffer -> buf [buffer -> tail];
526 iov [1].
len = bytes_written;
529 (trace_connection_input, 2, iov,
531 if (status != ISC_R_SUCCESS) {
535 isc_result_totext (status));
540 buffer -> head = first_byte + bytes_written - 1;
541 c -> out_bytes -= bytes_written;
546 if (bytes_written != bytes_this_write)
547 return ISC_R_INPROGRESS;
551 buffer = buffer -> next;
556 while (c -> outbufs &&
558 if (c -> outbufs -> next) {
560 c -> outbufs -> next,
MDL);
569 return ISC_R_SUCCESS;
580 if (status != ISC_R_SUCCESS)
583 *result = ntohl (inbuf);
584 return ISC_R_SUCCESS;
592 inbuf = htonl (value);
606 if (status != ISC_R_SUCCESS)
609 *result = ntohs (inbuf);
610 return ISC_R_SUCCESS;
618 inbuf = htons (value);
634 switch (data -> type) {
637 if (status != ISC_R_SUCCESS)
645 if (status != ISC_R_SUCCESS)
649 (c, data -> u.
buffer.value,
651 return ISC_R_SUCCESS;
657 if (status != ISC_R_SUCCESS)
662 if (status != ISC_R_SUCCESS)
673 unsigned len = strlen (name);
676 if (status != ISC_R_SUCCESS)
688 len = strlen (
string);
693 if (status != ISC_R_SUCCESS)
697 (c, (
const unsigned char *)
string, len);
698 return ISC_R_SUCCESS;
708 if (status != ISC_R_SUCCESS)
713 if (status != ISC_R_SUCCESS)
725 if (status != ISC_R_SUCCESS)
729 if (status != ISC_R_SUCCESS)
#define omapi_array_foreach_end(array, stype, var)
omapi_object_type_t * omapi_type_connection
#define BUFFER_BYTES_FREE(x)
isc_result_t omapi_buffer_dereference(omapi_buffer_t **, const char *, int)
trace_type_t * trace_type_register(const char *, void *, void(*)(trace_type_t *, unsigned, char *), void(*)(trace_type_t *), const char *, int)
isc_result_t omapi_connection_copyin(omapi_object_t *h, const unsigned char *bufp, unsigned len)
isc_result_t omapi_connection_put_named_uint32(omapi_object_t *c, const char *name, u_int32_t value)
#define DHCP_R_INVALIDARG
int log_error(const char *,...) __attribute__((__format__(__printf__
isc_result_t omapi_connection_put_string(omapi_object_t *c, const char *string)
isc_result_t omapi_connection_get_uint32(omapi_object_t *c, u_int32_t *result)
#define omapi_array_foreach_begin(array, stype, var)
isc_result_t omapi_connection_copyout(unsigned char *buf, omapi_object_t *h, unsigned size)
struct omapi_typed_data_t::@3::@4 buffer
isc_result_t omapi_connection_put_handle(omapi_object_t *c, omapi_object_t *h)
isc_result_t omapi_signal(omapi_object_t *, const char *,...)
isc_result_t trace_write_packet_iov(trace_type_t *, int, trace_iov_t *, const char *, int)
isc_result_t omapi_connection_put_name(omapi_object_t *c, const char *name)
isc_result_t omapi_connection_write_typed_data(omapi_object_t *c, omapi_typed_data_t *data)
isc_result_t omapi_object_handle(omapi_handle_t *, omapi_object_t *)
isc_result_t omapi_connection_put_uint32(omapi_object_t *c, u_int32_t value)
isc_result_t omapi_connection_reader(omapi_object_t *h)
isc_result_t omapi_connection_get_uint16(omapi_object_t *c, u_int16_t *result)
unsigned int omapi_handle_t
isc_result_t omapi_buffer_reference(omapi_buffer_t **, omapi_buffer_t *, const char *, int)
isc_result_t omapi_connection_writer(omapi_object_t *h)
isc_result_t omapi_connection_put_uint16(omapi_object_t *c, u_int32_t value)
omapi_object_type_t * omapi_type_io_object
void omapi_buffer_trace_setup(void)
#define BYTES_IN_BUFFER(x)
omapi_type_protocol_listener omapi_type_listener omapi_type_waiter omapi_type_message isc_result_t omapi_connection_sign_data(int mode, dst_key_t *key, void **context, const unsigned char *data, const unsigned len, omapi_typed_data_t **result)
isc_result_t omapi_disconnect(omapi_object_t *, int)
isc_result_t omapi_buffer_new(omapi_buffer_t **, const char *, int)