37static void trace_connect_input (
trace_type_t *,
unsigned,
char *);
39static void trace_disconnect_input (
trace_type_t *,
unsigned,
char *);
45static isc_result_t omapi_connection_connect_internal (
omapi_object_t *);
47static isc_result_t ctring_from_attribute(
omapi_object_t *obj,
char *attr_name,
54 const char *server_name,
64 log_debug (
"omapi_connect(%s, port=%d)", server_name, port);
67 if (!inet_aton (server_name, &foo)) {
70 he = gethostbyname (server_name);
73 for (i = 0; he -> h_addr_list [i]; i++)
82 for (i = 0; i < hix; i++) {
83 addrs -> addresses [i].addrtype = he -> h_addrtype;
84 addrs -> addresses [i].addrlen = he -> h_length;
85 memcpy (addrs -> addresses [i].address,
86 he -> h_addr_list [i],
87 (
unsigned)he -> h_length);
88 addrs -> addresses [i].port = port;
94 addrs -> addresses [0].addrtype = AF_INET;
95 addrs -> addresses [0].addrlen =
sizeof foo;
96 memcpy (addrs -> addresses [0].address, &foo,
sizeof foo);
97 addrs -> addresses [0].port = port;
111 struct sockaddr_in local_sin;
114 status = omapi_connection_allocate (&obj,
MDL);
121 omapi_connection_dereference (&obj,
MDL);
126 omapi_connection_dereference (&obj,
MDL);
142 socket (PF_INET, SOCK_STREAM, IPPROTO_TCP);
143 if (obj -> socket < 0) {
144 omapi_connection_dereference (&obj,
MDL);
145 if (errno == EMFILE || errno == ENFILE
147 return ISC_R_NORESOURCES;
148 return ISC_R_UNEXPECTED;
154 if (local_addr -> addrtype != AF_INET) {
156 omapi_connection_dereference (&obj,
MDL);
159 local_sin.sin_port = htons (local_addr -> port);
160 memcpy (&local_sin.sin_addr,
161 local_addr -> address,
162 local_addr -> addrlen);
163#if defined (HAVE_SA_LEN)
164 local_sin.sin_len =
sizeof local_addr;
166 local_sin.sin_family = AF_INET;
167 memset (&local_sin.sin_zero, 0,
168 sizeof local_sin.sin_zero);
170 if (bind (obj -> socket, (
struct sockaddr *)&local_sin,
171 sizeof local_sin) < 0) {
176 if (errno == EADDRINUSE)
177 return ISC_R_ADDRINUSE;
178 if (errno == EADDRNOTAVAIL)
179 return ISC_R_ADDRNOTAVAIL;
182 return ISC_R_UNEXPECTED;
184 obj -> local_addr = local_sin;
188 if (fcntl (obj -> socket, F_SETFD, 1) < 0) {
189 close (obj -> socket);
190 omapi_connection_dereference (&obj,
MDL);
191 return ISC_R_UNEXPECTED;
197 if (setsockopt (obj -> socket, SOL_SOCKET, SO_REUSEADDR,
198 (
char *)&flag,
sizeof flag) < 0) {
199 omapi_connection_dereference (&obj,
MDL);
200 return ISC_R_UNEXPECTED;
204 if (fcntl (obj -> socket, F_SETFL, O_NONBLOCK) < 0) {
205 omapi_connection_dereference (&obj,
MDL);
206 return ISC_R_UNEXPECTED;
215 if (setsockopt(obj->
socket, SOL_SOCKET, SO_NOSIGPIPE,
216 (
char *)&flag,
sizeof(flag)) < 0) {
217 omapi_connection_dereference (&obj,
MDL);
218 return ISC_R_UNEXPECTED;
238 if (status == ISC_R_INPROGRESS) {
247 omapi_connection_dereference (&obj,
MDL);
259 trace_connect_stop,
MDL);
261 trace_disconnect_input,
262 trace_disconnect_stop,
MDL);
271 int32_t connect_index, listener_index;
272 static int32_t index;
274 if (!omapi_connections) {
275 status = omapi_connection_array_allocate (&omapi_connections,
281 status = omapi_connection_array_extend (omapi_connections, obj,
299 connect_index = htonl (index);
302 listener_index = htonl (obj -> listener -> index);
304 listener_index = htonl (-1);
305 iov [iov_count].
buf = (
char *)&connect_index;
306 iov [iov_count++].
len =
sizeof connect_index;
307 iov [iov_count].
buf = (
char *)&listener_index;
308 iov [iov_count++].
len =
sizeof listener_index;
309 iov [iov_count].
buf = (
char *)&obj -> remote_addr.sin_port;
310 iov [iov_count++].
len =
sizeof obj -> remote_addr.sin_port;
311 iov [iov_count].
buf = (
char *)&obj -> local_addr.sin_port;
312 iov [iov_count++].
len =
sizeof obj -> local_addr.sin_port;
313 iov [iov_count].
buf = (
char *)&obj -> remote_addr.sin_addr;
314 iov [iov_count++].
len =
sizeof obj -> remote_addr.sin_addr;
315 iov [iov_count].
buf = (
char *)&obj -> local_addr.sin_addr;
316 iov [iov_count++].
len =
sizeof obj -> local_addr.sin_addr;
325 unsigned length,
char *buf)
327 struct sockaddr_in remote, local;
328 int32_t connect_index, listener_index;
334 if (length != ((
sizeof connect_index) +
335 (
sizeof remote.sin_port) +
336 (
sizeof remote.sin_addr)) * 2) {
337 log_error (
"Trace connect: invalid length %d", length);
341 memset (&remote, 0,
sizeof remote);
342 memset (&local, 0,
sizeof local);
343 memcpy (&connect_index, s,
sizeof connect_index);
344 s +=
sizeof connect_index;
345 memcpy (&listener_index, s,
sizeof listener_index);
346 s +=
sizeof listener_index;
347 memcpy (&remote.sin_port, s,
sizeof remote.sin_port);
348 s +=
sizeof remote.sin_port;
349 memcpy (&local.sin_port, s,
sizeof local.sin_port);
350 s +=
sizeof local.sin_port;
351 memcpy (&remote.sin_addr, s,
sizeof remote.sin_addr);
352 s +=
sizeof remote.sin_addr;
353 memcpy (&local.sin_addr, s,
sizeof local.sin_addr);
354 s +=
sizeof local.sin_addr;
357 connect_index = ntohl (connect_index);
358 listener_index = ntohl (listener_index);
362 if (listener_index != -1) {
367 if (lp -> address.sin_port == local.sin_port) {
368 omapi_listener_reference (&listener, lp,
MDL);
369 omapi_listener_dereference (&lp,
MDL);
376 "Spurious traced listener connect - index ",
377 (
long int)listener_index,
378 inet_ntoa (local.sin_addr),
379 ntohs (local.sin_port));
385 log_error (
"traced listener connect: %s",
386 isc_result_totext (status));
389 omapi_connection_dereference (&obj,
MDL);
390 omapi_listener_dereference (&listener,
MDL);
397 for (i = 0; (lp->connect_list &&
398 i < lp->connect_list->count); i++) {
399 if (!memcmp (&remote.sin_addr,
400 &lp->connect_list->addresses[i].address,
401 sizeof remote.sin_addr) &&
402 (ntohs (remote.sin_port) ==
403 lp->connect_list->addresses[i].port)) {
405 lp->remote_addr = remote;
406 lp->remote_addr.sin_family = AF_INET;
408 lp->index = connect_index;
411 omapi_connection_dereference (&lp,
MDL);
418 log_error (
"Spurious traced connect - index %ld, addr %s, port %d",
419 (
long int)connect_index, inet_ntoa (remote.sin_addr),
420 ntohs (remote.sin_port));
427 unsigned length,
char *buf)
430 if (length !=
sizeof *index) {
431 log_error (
"trace disconnect: wrong length %d", length);
435 index = (int32_t *)buf;
439 if (lp -> index == ntohl (*index)) {
441 omapi_connection_dereference (&lp,
MDL);
447 log_error (
"trace disconnect: no connection matching index %ld",
448 (
long int)ntohl (*index));
451static void trace_disconnect_stop (
trace_type_t *ttype) { }
464 log_debug (
"omapi_disconnect(force=%d)", force);
476 index = htonl (c -> index);
478 sizeof index, (
char *)&index,
483 isc_result_totext (status));
499 if (!shutdown (c -> socket,
SHUT_RD)) {
500 if (c -> out_bytes > 0) {
525 if (h -> outer -> inner)
540 if (h->inner != NULL) {
541 if (h->inner->outer != NULL) {
571 c -> bytes_needed = bytes;
572 if (c -> bytes_needed <= c -> in_bytes) {
618 status = omapi_connection_connect_internal (h);
619 if (status == ISC_R_INPROGRESS)
620 return ISC_R_INPROGRESS;
628static isc_result_t omapi_connection_connect_internal (
omapi_object_t *h)
641 if (getsockopt (c -> socket, SOL_SOCKET, SO_ERROR,
642 (
char *)&error, &sl) < 0) {
651 if (c -> cptr >= c -> connect_list -> count) {
654 status = ISC_R_CONNREFUSED;
657 status = ISC_R_NETUNREACH;
667 if (c -> connect_list -> addresses [c -> cptr].addrtype !=
673 memcpy (&c -> remote_addr.sin_addr,
674 &c -> connect_list -> addresses [c -> cptr].address,
675 sizeof c -> remote_addr.sin_addr);
676 c -> remote_addr.sin_family = AF_INET;
677 c -> remote_addr.sin_port =
678 htons (c -> connect_list -> addresses [c -> cptr].port);
679#if defined (HAVE_SA_LEN)
680 c -> remote_addr.sin_len =
sizeof c -> remote_addr;
682 memset (&c -> remote_addr.sin_zero, 0,
683 sizeof c -> remote_addr.sin_zero);
686 error = connect (c -> socket,
687 (
struct sockaddr *)&c -> remote_addr,
688 sizeof c -> remote_addr);
691 if (error != EINPROGRESS) {
695 status = ISC_R_CONNREFUSED;
698 status = ISC_R_NETUNREACH;
714 sl =
sizeof (c -> local_addr);
715 if (getsockname (c -> socket,
716 (
struct sockaddr *)&c -> local_addr, &sl) < 0) {
737 return ISC_R_INPROGRESS;
753 c -> out_bytes == 0) {
755 log_debug (
"omapi_connection_reaper(): disconnect");
761 log_debug (
"omapi_connection_reaper(): closed");
763 return ISC_R_NOTCONNECTED;
768static isc_result_t make_dst_key (dst_key_t **dst_key,
omapi_object_t *a) {
771 char *algorithm_str = 0;
775 status = ctring_from_attribute(a,
"name", &name_str);
778 status = ctring_from_attribute(a,
"algorithm", &algorithm_str);
791 if (*dst_key == NULL) {
792 status = ISC_R_NOMEMORY;
811 const unsigned char *data,
817 dst_context_t **dctx = (dst_context_t **)context;
821 status = dst_context_create(key,
dhcp_gbl_ctx.mctx, dctx);
830 region.base = (
unsigned char *)data;
832 dst_context_adddata(*dctx, ®ion);
837 unsigned int sigsize;
840 status = dst_key_sigsize(key, &sigsize);
853 status = dst_context_sign(*dctx, &sigbuf);
869 dst_context_destroy(dctx);
886 return ISC_R_NOTFOUND;
888 return(dst_key_sigsize(c->
out_key, l));
907 if (c -> in_context) {
920 status = make_dst_key (&c -> in_key,
932 if (c -> out_context) {
945 status = make_dst_key (&c -> out_key,
954 if (h -> inner && h -> inner -> type -> set_value)
955 return (*(h -> inner -> type -> set_value))
956 (h -> inner, id, name,
value);
957 return ISC_R_NOTFOUND;
968 unsigned int sigsize;
975 if (!c -> in_key || !c -> in_context)
976 return ISC_R_NOTFOUND;
991 return ISC_R_NOTFOUND;
993 status = dst_key_sigsize(c->
in_key, &sigsize);
1001 if (!c -> out_key || !c -> out_context)
1002 return ISC_R_NOTFOUND;
1017 return ISC_R_NOTFOUND;
1020 status = dst_key_sigsize(c->
out_key, &sigsize);
1028 if (h -> inner && h -> inner -> type -> get_value)
1029 return (*(h -> inner -> type -> get_value))
1030 (h -> inner, id, name,
value);
1031 return ISC_R_NOTFOUND;
1039#ifdef DEBUG_PROTOCOL
1040 log_debug (
"omapi_connection_destroy()");
1044 return ISC_R_UNEXPECTED;
1049 omapi_listener_dereference (&c -> listener,
file,
line);
1050 if (c -> connect_list)
1056 const char *name, va_list ap)
1061#ifdef DEBUG_PROTOCOL
1062 log_debug (
"omapi_connection_signal_handler(%s)", name);
1065 if (h -> inner && h -> inner -> type -> signal_handler)
1066 return (*(h -> inner -> type -> signal_handler)) (h -> inner,
1068 return ISC_R_NOTFOUND;
1081 if (m -> inner && m -> inner -> type -> stuff_values)
1082 return (*(m -> inner -> type -> stuff_values)) (c, id,
1098static isc_result_t ctring_from_attribute(
omapi_object_t *obj,
char *attr_name,
1119 status = ISC_R_NOMEMORY;
isc_result_t omapi_buffer_dereference(omapi_buffer_t **, const char *, int)
isc_result_t omapi_connection_destroy(omapi_object_t *h, const char *file, int line)
int omapi_connection_readfd(omapi_object_t *h)
isc_result_t omapi_connection_connect(omapi_object_t *h)
isc_result_t omapi_connection_set_value(omapi_object_t *h, omapi_object_t *id, omapi_data_string_t *name, omapi_typed_data_t *value)
isc_result_t omapi_connection_reaper(omapi_object_t *h)
isc_result_t omapi_connect_list(omapi_object_t *c, omapi_addr_list_t *remote_addrs, omapi_addr_t *local_addr)
isc_result_t omapi_connection_signal_handler(omapi_object_t *h, const char *name, va_list ap)
isc_result_t omapi_connection_output_auth_length(omapi_object_t *h, unsigned *l)
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_connection_get_value(omapi_object_t *h, omapi_object_t *id, omapi_data_string_t *name, omapi_value_t **value)
isc_result_t omapi_connection_require(omapi_object_t *h, unsigned bytes)
isc_result_t omapi_connection_stuff_values(omapi_object_t *c, omapi_object_t *id, omapi_object_t *m)
int omapi_connection_writefd(omapi_object_t *h)
isc_result_t omapi_disconnect(omapi_object_t *h, int force)
dhcp_context_t dhcp_gbl_ctx
isc_result_t isclib_make_dst_key(char *inname, char *algorithm, unsigned char *secret, int length, dst_key_t **dstkey)
isc_result_t omapi_value_dereference(omapi_value_t **, const char *, int)
#define omapi_array_foreach_begin(array, stype, var)
isc_result_t omapi_typed_data_reference(omapi_typed_data_t **, omapi_typed_data_t *, const char *, int)
#define OMAPI_OBJECT_ALLOC(name, stype, type)
isc_result_t omapi_register_io_object(omapi_object_t *, int(*)(omapi_object_t *), int(*)(omapi_object_t *), isc_result_t(*)(omapi_object_t *), isc_result_t(*)(omapi_object_t *), isc_result_t(*)(omapi_object_t *))
isc_result_t omapi_object_dereference(omapi_object_t **, const char *, int)
int omapi_connection_writefd(omapi_object_t *)
isc_result_t omapi_unregister_io_object(omapi_object_t *)
isc_result_t omapi_connection_reader(omapi_object_t *)
isc_result_t omapi_addr_list_dereference(omapi_addr_list_t **, const char *, int)
isc_result_t omapi_make_value(omapi_value_t **, omapi_data_string_t *, omapi_typed_data_t *, const char *, int)
isc_result_t omapi_addr_list_reference(omapi_addr_list_t **, omapi_addr_list_t *, const char *, int)
struct __omapi_object omapi_object_t
isc_result_t omapi_connection_writer(omapi_object_t *)
isc_result_t omapi_connection_reaper(omapi_object_t *)
isc_result_t omapi_connect(omapi_object_t *, const char *, unsigned)
isc_result_t omapi_typed_data_dereference(omapi_typed_data_t **, const char *, int)
int omapi_connection_readfd(omapi_object_t *)
isc_result_t omapi_object_reference(omapi_object_t **, omapi_object_t *, const char *, int)
isc_result_t omapi_signal_in(omapi_object_t *, const char *,...)
isc_result_t omapi_signal(omapi_object_t *, const char *,...)
isc_result_t omapi_reregister_io_object(omapi_object_t *, int(*)(omapi_object_t *), int(*)(omapi_object_t *), isc_result_t(*)(omapi_object_t *), isc_result_t(*)(omapi_object_t *), isc_result_t(*)(omapi_object_t *))
isc_result_t omapi_addr_list_new(omapi_addr_list_t **, unsigned, const char *, int)
#define omapi_array_foreach_end(array, stype, var)
int omapi_ds_strcmp(omapi_data_string_t *, const char *)
omapi_object_type_t * omapi_type_connection
isc_result_t omapi_typed_data_new(const char *, int, omapi_typed_data_t **, omapi_datatype_t,...)
void * dmalloc(size_t, const char *, int)
#define OMAPI_ARRAY_TYPE(name, stype)
void dfree(void *, const char *, int)
isc_result_t omapi_get_value_str(omapi_object_t *, omapi_object_t *, const char *, omapi_value_t **)
isc_result_t omapi_connection_connect(omapi_object_t *)
isc_result_t omapi_make_int_value(omapi_value_t **, omapi_data_string_t *, int, const char *, int)
isc_result_t uerr2isc(int)
isc_result_t omapi_listener_connect(omapi_connection_object_t **obj, omapi_listener_object_t *listener, int socket, struct sockaddr_in *remote_addr)
int log_error(const char *,...) __attribute__((__format__(__printf__
int int int log_debug(const char *,...) __attribute__((__format__(__printf__
struct __omapi_connection_object omapi_connection_object_t
void omapi_connection_trace_setup(void)
struct __omapi_listener_object omapi_listener_object_t
void omapi_connection_register(omapi_connection_object_t *, const char *, int)
@ omapi_connection_unconnected
@ omapi_connection_connected
@ omapi_connection_disconnecting
@ omapi_connection_closed
@ omapi_connection_connecting
#define DHCP_R_INVALIDARG
#define DHCP_R_INCOMPLETE
#define DHCP_R_HOSTUNKNOWN
struct omapi_typed_data_t::@005330231110240362320041053235346164005276246221::@131374275124060200224243254021133345104025056044 buffer
union omapi_typed_data_t::@005330231110240362320041053235346164005276246221 u
omapi_typed_data_t * value
struct trace_iov trace_iov_t
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 trace_write_packet(trace_type_t *, unsigned, const char *, const char *, int)
struct trace_type trace_type_t
isc_result_t trace_write_packet_iov(trace_type_t *, int, trace_iov_t *, const char *, int)