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 *);
51 const char *server_name,
61 log_debug (
"omapi_connect(%s, port=%d)", server_name, port);
64 if (!inet_aton (server_name, &foo)) {
67 he = gethostbyname (server_name);
70 for (i = 0; he -> h_addr_list [i]; i++)
79 for (i = 0; i < hix; i++) {
80 addrs -> addresses [i].addrtype = he -> h_addrtype;
81 addrs -> addresses [i].addrlen = he -> h_length;
82 memcpy (addrs -> addresses [i].address,
83 he -> h_addr_list [i],
84 (
unsigned)he -> h_length);
85 addrs -> addresses [i].port = port;
91 addrs -> addresses [0].addrtype = AF_INET;
92 addrs -> addresses [0].addrlen =
sizeof foo;
93 memcpy (addrs -> addresses [0].address, &foo,
sizeof foo);
94 addrs -> addresses [0].port = port;
108 struct sockaddr_in local_sin;
111 status = omapi_connection_allocate (&obj,
MDL);
118 omapi_connection_dereference (&obj,
MDL);
123 omapi_connection_dereference (&obj,
MDL);
139 socket (PF_INET, SOCK_STREAM, IPPROTO_TCP);
140 if (obj -> socket < 0) {
141 omapi_connection_dereference (&obj,
MDL);
142 if (errno == EMFILE || errno == ENFILE
144 return ISC_R_NORESOURCES;
145 return ISC_R_UNEXPECTED;
151 if (local_addr -> addrtype != AF_INET) {
153 omapi_connection_dereference (&obj,
MDL);
156 local_sin.sin_port = htons (local_addr -> port);
157 memcpy (&local_sin.sin_addr,
158 local_addr -> address,
159 local_addr -> addrlen);
160#if defined (HAVE_SA_LEN)
161 local_sin.sin_len =
sizeof local_addr;
163 local_sin.sin_family = AF_INET;
164 memset (&local_sin.sin_zero, 0,
165 sizeof local_sin.sin_zero);
167 if (bind (obj -> socket, (
struct sockaddr *)&local_sin,
168 sizeof local_sin) < 0) {
173 if (errno == EADDRINUSE)
174 return ISC_R_ADDRINUSE;
175 if (errno == EADDRNOTAVAIL)
176 return ISC_R_ADDRNOTAVAIL;
179 return ISC_R_UNEXPECTED;
181 obj -> local_addr = local_sin;
185 if (fcntl (obj -> socket, F_SETFD, 1) < 0) {
186 close (obj -> socket);
187 omapi_connection_dereference (&obj,
MDL);
188 return ISC_R_UNEXPECTED;
194 if (setsockopt (obj -> socket, SOL_SOCKET, SO_REUSEADDR,
195 (
char *)&flag,
sizeof flag) < 0) {
196 omapi_connection_dereference (&obj,
MDL);
197 return ISC_R_UNEXPECTED;
201 if (fcntl (obj -> socket, F_SETFL, O_NONBLOCK) < 0) {
202 omapi_connection_dereference (&obj,
MDL);
203 return ISC_R_UNEXPECTED;
212 if (setsockopt(obj->
socket, SOL_SOCKET, SO_NOSIGPIPE,
213 (
char *)&flag,
sizeof(flag)) < 0) {
214 omapi_connection_dereference (&obj,
MDL);
215 return ISC_R_UNEXPECTED;
235 if (status == ISC_R_INPROGRESS) {
244 omapi_connection_dereference (&obj,
MDL);
256 trace_connect_stop,
MDL);
258 trace_disconnect_input,
259 trace_disconnect_stop,
MDL);
268 int32_t connect_index, listener_index;
269 static int32_t index;
271 if (!omapi_connections) {
272 status = omapi_connection_array_allocate (&omapi_connections,
278 status = omapi_connection_array_extend (omapi_connections, obj,
296 connect_index = htonl (index);
299 listener_index = htonl (obj -> listener -> index);
301 listener_index = htonl (-1);
302 iov [iov_count].
buf = (
char *)&connect_index;
303 iov [iov_count++].
len =
sizeof connect_index;
304 iov [iov_count].
buf = (
char *)&listener_index;
305 iov [iov_count++].
len =
sizeof listener_index;
306 iov [iov_count].
buf = (
char *)&obj -> remote_addr.sin_port;
307 iov [iov_count++].len =
sizeof obj -> remote_addr.sin_port;
308 iov [iov_count].buf = (
char *)&obj -> local_addr.sin_port;
309 iov [iov_count++].
len =
sizeof obj -> local_addr.sin_port;
310 iov [iov_count].
buf = (
char *)&obj -> remote_addr.sin_addr;
311 iov [iov_count++].len =
sizeof obj -> remote_addr.sin_addr;
312 iov [iov_count].buf = (
char *)&obj -> local_addr.sin_addr;
313 iov [iov_count++].
len =
sizeof obj -> local_addr.sin_addr;
322 unsigned length,
char *buf)
324 struct sockaddr_in remote, local;
325 int32_t connect_index, listener_index;
331 if (length != ((
sizeof connect_index) +
332 (
sizeof remote.sin_port) +
333 (
sizeof remote.sin_addr)) * 2) {
334 log_error (
"Trace connect: invalid length %d", length);
338 memset (&remote, 0,
sizeof remote);
339 memset (&local, 0,
sizeof local);
340 memcpy (&connect_index, s,
sizeof connect_index);
341 s +=
sizeof connect_index;
342 memcpy (&listener_index, s,
sizeof listener_index);
343 s +=
sizeof listener_index;
344 memcpy (&remote.sin_port, s,
sizeof remote.sin_port);
345 s +=
sizeof remote.sin_port;
346 memcpy (&local.sin_port, s,
sizeof local.sin_port);
347 s +=
sizeof local.sin_port;
348 memcpy (&remote.sin_addr, s,
sizeof remote.sin_addr);
349 s +=
sizeof remote.sin_addr;
350 memcpy (&local.sin_addr, s,
sizeof local.sin_addr);
351 s +=
sizeof local.sin_addr;
354 connect_index = ntohl (connect_index);
355 listener_index = ntohl (listener_index);
359 if (listener_index != -1) {
364 if (lp -> address.sin_port == local.sin_port) {
365 omapi_listener_reference (&listener, lp,
MDL);
366 omapi_listener_dereference (&lp,
MDL);
373 "Spurious traced listener connect - index ",
374 (
long int)listener_index,
375 inet_ntoa (local.sin_addr),
376 ntohs (local.sin_port));
382 log_error (
"traced listener connect: %s",
383 isc_result_totext (status));
386 omapi_connection_dereference (&obj,
MDL);
387 omapi_listener_dereference (&listener,
MDL);
394 for (i = 0; (lp->connect_list &&
395 i < lp->connect_list->count); i++) {
396 if (!memcmp (&remote.sin_addr,
397 &lp->connect_list->addresses[i].address,
398 sizeof remote.sin_addr) &&
399 (ntohs (remote.sin_port) ==
400 lp->connect_list->addresses[i].port)) {
402 lp->remote_addr = remote;
403 lp->remote_addr.sin_family = AF_INET;
405 lp->index = connect_index;
408 omapi_connection_dereference (&lp,
MDL);
415 log_error (
"Spurious traced connect - index %ld, addr %s, port %d",
416 (
long int)connect_index, inet_ntoa (remote.sin_addr),
417 ntohs (remote.sin_port));
424 unsigned length,
char *buf)
427 if (length !=
sizeof *index) {
428 log_error (
"trace disconnect: wrong length %d", length);
432 index = (int32_t *)buf;
436 if (lp -> index == ntohl (*index)) {
438 omapi_connection_dereference (&lp,
MDL);
444 log_error (
"trace disconnect: no connection matching index %ld",
445 (
long int)ntohl (*index));
448static void trace_disconnect_stop (
trace_type_t *ttype) { }
461 log_debug (
"omapi_disconnect(%s)", force ?
"force" :
"");
473 index = htonl (c -> index);
475 sizeof index, (
char *)&index,
480 isc_result_totext (status));
496 if (!shutdown (c -> socket,
SHUT_RD)) {
497 if (c -> out_bytes > 0) {
522 if (h -> outer -> inner)
537 if (h->inner != NULL) {
538 if (h->inner->outer != NULL) {
568 c -> bytes_needed = bytes;
569 if (c -> bytes_needed <= c -> in_bytes) {
615 status = omapi_connection_connect_internal (h);
616 if (status == ISC_R_INPROGRESS)
617 return ISC_R_INPROGRESS;
625static isc_result_t omapi_connection_connect_internal (
omapi_object_t *h)
638 if (getsockopt (c -> socket, SOL_SOCKET, SO_ERROR,
639 (
char *)&error, &sl) < 0) {
648 if (c -> cptr >= c -> connect_list -> count) {
651 status = ISC_R_CONNREFUSED;
654 status = ISC_R_NETUNREACH;
664 if (c -> connect_list -> addresses [c -> cptr].addrtype !=
670 memcpy (&c -> remote_addr.sin_addr,
671 &c -> connect_list -> addresses [c -> cptr].address,
672 sizeof c -> remote_addr.sin_addr);
673 c -> remote_addr.sin_family = AF_INET;
674 c -> remote_addr.sin_port =
675 htons (c -> connect_list -> addresses [c -> cptr].port);
676#if defined (HAVE_SA_LEN)
677 c -> remote_addr.sin_len =
sizeof c -> remote_addr;
679 memset (&c -> remote_addr.sin_zero, 0,
680 sizeof c -> remote_addr.sin_zero);
683 error = connect (c -> socket,
684 (
struct sockaddr *)&c -> remote_addr,
685 sizeof c -> remote_addr);
688 if (error != EINPROGRESS) {
692 status = ISC_R_CONNREFUSED;
695 status = ISC_R_NETUNREACH;
711 sl =
sizeof (c -> local_addr);
712 if (getsockname (c -> socket,
713 (
struct sockaddr *)&c -> local_addr, &sl) < 0) {
734 return ISC_R_INPROGRESS;
750 c -> out_bytes == 0) {
752 log_debug (
"omapi_connection_reaper(): disconnect");
758 log_debug (
"omapi_connection_reaper(): closed");
760 return ISC_R_NOTCONNECTED;
765static isc_result_t make_dst_key (dst_key_t **dst_key,
omapi_object_t *a) {
769 char *name_str = NULL;
797 status = ISC_R_NOMEMORY;
802 name ->
value -> u.buffer.value,
803 name ->
value -> u.buffer.len);
804 name_str [name ->
value -> u.buffer.len] = 0;
812 if (*dst_key == NULL)
813 status = ISC_R_NOMEMORY;
831 const unsigned char *data,
837 dst_context_t **dctx = (dst_context_t **)context;
850 region.base = (
unsigned char *)data;
852 dst_context_adddata(*dctx, ®ion);
857 unsigned int sigsize;
860 status = dst_key_sigsize(key, &sigsize);
873 status = dst_context_sign(*dctx, &sigbuf);
889 dst_context_destroy(dctx);
906 return ISC_R_NOTFOUND;
908 return(dst_key_sigsize(c->
out_key, l));
927 if (c -> in_context) {
940 status = make_dst_key (&c -> in_key,
952 if (c -> out_context) {
965 status = make_dst_key (&c -> out_key,
974 if (h -> inner && h -> inner -> type -> set_value)
975 return (*(h -> inner -> type -> set_value))
976 (h -> inner, id, name,
value);
977 return ISC_R_NOTFOUND;
988 unsigned int sigsize;
995 if (!c -> in_key || !c -> in_context)
996 return ISC_R_NOTFOUND;
1011 return ISC_R_NOTFOUND;
1013 status = dst_key_sigsize(c->
in_key, &sigsize);
1021 if (!c -> out_key || !c -> out_context)
1022 return ISC_R_NOTFOUND;
1037 return ISC_R_NOTFOUND;
1040 status = dst_key_sigsize(c->
out_key, &sigsize);
1048 if (h -> inner && h -> inner -> type -> get_value)
1049 return (*(h -> inner -> type -> get_value))
1050 (h -> inner, id, name,
value);
1051 return ISC_R_NOTFOUND;
1059#ifdef DEBUG_PROTOCOL
1060 log_debug (
"omapi_connection_destroy()");
1064 return ISC_R_UNEXPECTED;
1069 omapi_listener_dereference (&c -> listener,
file,
line);
1070 if (c -> connect_list)
1076 const char *name, va_list ap)
1081#ifdef DEBUG_PROTOCOL
1082 log_debug (
"omapi_connection_signal_handler(%s)", name);
1085 if (h -> inner && h -> inner -> type -> signal_handler)
1086 return (*(h -> inner -> type -> signal_handler)) (h -> inner,
1088 return ISC_R_NOTFOUND;
1101 if (m -> inner && m -> inner -> type -> stuff_values)
1102 return (*(m -> inner -> type -> stuff_values)) (c, id,
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)
OMAPI_OBJECT_ALLOC(omapi_connection, omapi_connection_object_t, omapi_type_connection)
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
#define DHCP_HMAC_MD5_NAME
isc_result_t isclib_make_dst_key(char *inname, char *algorithm, unsigned char *secret, int length, dst_key_t **dstkey)
#define NS_TSIG_ALG_HMAC_MD5
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)
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)
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)
isc_result_t omapi_connection_writer(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)
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_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__
void omapi_connection_trace_setup(void)
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::@3::@4 buffer
union omapi_typed_data_t::@3 u
omapi_typed_data_t * value
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)
isc_result_t trace_write_packet_iov(trace_type_t *, int, trace_iov_t *, const char *, int)