36 static void trace_listener_accept_input (
trace_type_t *,
unsigned,
char *);
53 log_debug (
"omapi_listen(port=%d, max=%d)", port, max);
57 addr.
addrlen =
sizeof (
struct in_addr);
78 status = omapi_listener_allocate (&obj,
MDL);
79 if (status != ISC_R_SUCCESS)
93 if (status != ISC_R_SUCCESS)
96 if (status != ISC_R_SUCCESS)
100 obj -> address.sin_port = htons (addr -> port);
101 memcpy (&obj -> address.sin_addr,
102 addr -> address,
sizeof obj -> address.sin_addr);
103 #if defined (HAVE_SA_LEN) 104 obj -> address.sin_len =
105 sizeof (
struct sockaddr_in);
107 obj -> address.sin_family = AF_INET;
108 memset (&(obj -> address.sin_zero), 0,
109 sizeof obj -> address.sin_zero);
111 #if defined (TRACING) 115 trace_listener_remember (obj,
MDL);
119 obj -> socket = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP);
122 || errno == ENFILE || errno == ENOBUFS)
123 status = ISC_R_NORESOURCES;
125 status = ISC_R_UNEXPECTED;
129 #if defined (HAVE_SETFD) 130 if (fcntl (obj -> socket, F_SETFD, 1) < 0) {
131 status = ISC_R_UNEXPECTED;
139 if (setsockopt (obj -> socket, SOL_SOCKET, SO_REUSEADDR,
140 (
char *)&i,
sizeof i) < 0) {
141 status = ISC_R_UNEXPECTED;
147 i = bind (obj -> socket,
148 (
struct sockaddr *)&obj -> address,
149 sizeof obj -> address);
151 if (errno == EADDRINUSE)
152 status = ISC_R_ADDRNOTAVAIL;
153 else if (errno == EPERM)
154 status = ISC_R_NOPERM;
156 status = ISC_R_UNEXPECTED;
161 if (listen (obj -> socket, max)) {
162 status = ISC_R_UNEXPECTED;
166 if (fcntl (obj -> socket, F_SETFL, O_NONBLOCK) < 0) {
167 status = ISC_R_UNEXPECTED;
174 #if defined (TRACING) 178 omapi_listener_dereference (&obj,
MDL);
187 if (obj->inner == h) {
194 omapi_listener_dereference(&obj,
MDL);
219 struct sockaddr_in addr;
228 socket = accept (listener -> socket,
229 ((
struct sockaddr *)&(addr)), &len);
231 if (errno == EMFILE || errno == ENFILE || errno == ENOBUFS)
232 return ISC_R_NORESOURCES;
233 return ISC_R_UNEXPECTED;
238 return (ISC_R_NORESOURCES);
241 #if defined (TRACING) 245 iov [0].
buf = (
char *)&addr.sin_port;
246 iov [0].
len =
sizeof addr.sin_port;
247 iov [1].
buf = (
char *)&addr.sin_addr;
248 iov [1].
len =
sizeof addr.sin_addr;
249 iov [2].
buf = (
char *)&listener -> address.sin_port;
250 iov [2].
len =
sizeof listener -> address.sin_port;
258 if (status != ISC_R_SUCCESS) {
272 omapi_connection_dereference (&obj,
MDL);
273 if (status != ISC_R_SUCCESS)
281 struct sockaddr_in *remote_addr)
287 #ifdef DEBUG_PROTOCOL 292 status = omapi_connection_allocate (obj,
MDL);
293 if (status != ISC_R_SUCCESS)
297 (*obj) -> remote_addr = *remote_addr;
298 (*obj) -> socket = socket;
301 if (listener -> verify_addr) {
303 addr.
addrlen =
sizeof (remote_addr -> sin_addr);
304 memcpy (addr.
address, &remote_addr -> sin_addr,
305 sizeof (remote_addr -> sin_addr));
306 addr.
port = ntohs(remote_addr -> sin_port);
308 status = (listener -> verify_addr) (h, &addr);
309 if (status != ISC_R_SUCCESS) {
311 omapi_connection_dereference (obj,
MDL);
316 omapi_listener_reference (&(*obj) -> listener, listener,
MDL);
317 #if defined (TRACING) 324 #if defined (TRACING) 328 trace_listener_accept =
330 trace_listener_accept_input,
331 trace_listener_accept_stop,
MDL);
338 if (!trace_listeners) {
339 status = omapi_listener_array_allocate (&trace_listeners,
341 if (status != ISC_R_SUCCESS) {
343 log_error (
"trace_listener_remember: %s",
344 isc_result_totext (status));
348 status = omapi_listener_array_extend (trace_listeners, obj,
350 if (status != ISC_R_SUCCESS)
354 static void trace_listener_accept_input (
trace_type_t *ttype,
355 unsigned length,
char *buf)
357 struct in_addr *addr;
362 struct sockaddr_in remote_addr;
364 addr = (
struct in_addr *)buf;
365 remote_port = (u_int16_t *)(addr + 1);
366 local_port = remote_port + 1;
368 memset (&remote_addr, 0,
sizeof remote_addr);
369 remote_addr.sin_addr = *addr;
374 if (lp -> address.sin_port == *local_port) {
377 lp, 0, &remote_addr);
378 if (status != ISC_R_SUCCESS) {
379 log_error(
"%s:%d: OMAPI: Failed to connect " 382 omapi_listener_dereference (&lp,
MDL);
387 log_error (
"trace_listener_accept: %s from %s/%d to port %d",
388 "unexpected connect",
389 inet_ntoa (*addr), *remote_port, *local_port);
392 static void trace_listener_accept_stop (
trace_type_t *ttype) { }
398 isc_result_t (*verify_addr)
408 l -> verify_addr = verify_addr;
410 return ISC_R_SUCCESS;
421 if (h -> inner && h -> inner -> type -> set_value)
422 return (*(h -> inner -> type -> set_value))
423 (h -> inner, id, name, value);
424 return ISC_R_NOTFOUND;
435 if (h -> inner && h -> inner -> type -> get_value)
436 return (*(h -> inner -> type -> get_value))
437 (h -> inner, id, name, value);
438 return ISC_R_NOTFOUND;
450 #ifdef DEBUG_PROTOCOL 454 if (l -> socket != -1) {
458 return ISC_R_SUCCESS;
462 const char *name, va_list ap)
467 if (h -> inner && h -> inner -> type -> signal_handler)
468 return (*(h -> inner -> type -> signal_handler)) (h -> inner,
470 return ISC_R_NOTFOUND;
483 if (l -> inner && l -> inner -> type -> stuff_values)
484 return (*(l -> inner -> type -> stuff_values)) (c, id,
486 return ISC_R_SUCCESS;
isc_result_t omapi_listener_connect(omapi_connection_object_t **obj, omapi_listener_object_t *listener, int socket, struct sockaddr_in *remote_addr)
isc_result_t omapi_connection_reader(omapi_object_t *)
#define omapi_array_foreach_end(array, stype, var)
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_reference(omapi_object_t **, omapi_object_t *, const char *, int)
isc_result_t omapi_listener_get_value(omapi_object_t *h, omapi_object_t *id, omapi_data_string_t *name, omapi_value_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 omapi_listener_configure_security(omapi_object_t *h, isc_result_t(*verify_addr)(omapi_object_t *, omapi_addr_t *))
void omapi_listener_trace_setup(void)
#define DHCP_R_INVALIDARG
int int int log_debug(const char *,...) __attribute__((__format__(__printf__
isc_result_t omapi_listener_stuff_values(omapi_object_t *c, omapi_object_t *id, omapi_object_t *l)
int log_error(const char *,...) __attribute__((__format__(__printf__
isc_result_t omapi_connection_reaper(omapi_object_t *)
OMAPI_OBJECT_ALLOC(omapi_listener, omapi_listener_object_t, omapi_type_listener)
isc_result_t omapi_listener_set_value(omapi_object_t *h, omapi_object_t *id, omapi_data_string_t *name, omapi_typed_data_t *value)
#define omapi_array_foreach_begin(array, stype, var)
int omapi_connection_writefd(omapi_object_t *)
omapi_object_type_t * omapi_type_listener
isc_result_t omapi_listener_signal_handler(omapi_object_t *h, const char *name, va_list ap)
isc_result_t omapi_listener_destroy(omapi_object_t *h, const char *file, int line)
isc_result_t omapi_connection_writer(omapi_object_t *)
int omapi_listener_readfd(omapi_object_t *h)
isc_result_t omapi_object_dereference(omapi_object_t **, const char *, int)
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)
void omapi_connection_register(omapi_connection_object_t *, const char *, int)
#define OMAPI_ARRAY_TYPE(name, stype)
isc_result_t omapi_listen(omapi_object_t *, unsigned, int)
unsigned char address[16]
isc_result_t omapi_accept(omapi_object_t *h)
isc_result_t omapi_disconnect(omapi_object_t *, int)
isc_result_t omapi_listen_addr(omapi_object_t *h, omapi_addr_t *addr, int max)
int omapi_connection_readfd(omapi_object_t *)