37 static void trace_listener_accept_input (
trace_type_t *,
unsigned,
char *);
54 log_debug (
"omapi_listen(port=%d, max=%d)", port, max);
58 addr.
addrlen =
sizeof (
struct in_addr);
79 status = omapi_listener_allocate (&obj,
MDL);
80 if (status != ISC_R_SUCCESS)
94 if (status != ISC_R_SUCCESS)
97 if (status != ISC_R_SUCCESS)
101 obj -> address.sin_port = htons (addr -> port);
102 memcpy (&obj -> address.sin_addr,
103 addr -> address,
sizeof obj -> address.sin_addr);
104 #if defined (HAVE_SA_LEN) 105 obj -> address.sin_len =
106 sizeof (
struct sockaddr_in);
108 obj -> address.sin_family = AF_INET;
109 memset (&(obj -> address.sin_zero), 0,
110 sizeof obj -> address.sin_zero);
112 #if defined (TRACING) 116 trace_listener_remember (obj,
MDL);
120 obj -> socket = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP);
123 || errno == ENFILE || errno == ENOBUFS)
124 status = ISC_R_NORESOURCES;
126 status = ISC_R_UNEXPECTED;
130 #if defined (HAVE_SETFD) 131 if (fcntl (obj -> socket, F_SETFD, 1) < 0) {
132 status = ISC_R_UNEXPECTED;
140 if (setsockopt (obj -> socket, SOL_SOCKET, SO_REUSEADDR,
141 (
char *)&i,
sizeof i) < 0) {
142 status = ISC_R_UNEXPECTED;
148 i = bind (obj -> socket,
149 (
struct sockaddr *)&obj -> address,
150 sizeof obj -> address);
152 if (errno == EADDRINUSE)
153 status = ISC_R_ADDRNOTAVAIL;
154 else if (errno == EPERM)
155 status = ISC_R_NOPERM;
157 status = ISC_R_UNEXPECTED;
162 if (listen (obj -> socket, max)) {
163 status = ISC_R_UNEXPECTED;
167 if (fcntl (obj -> socket, F_SETFL, O_NONBLOCK) < 0) {
168 status = ISC_R_UNEXPECTED;
175 #if defined (TRACING) 179 omapi_listener_dereference (&obj,
MDL);
188 if (obj->inner == h) {
195 omapi_listener_dereference(&obj,
MDL);
220 struct sockaddr_in addr;
229 socket = accept (listener -> socket,
230 ((
struct sockaddr *)&(addr)), &len);
232 if (errno == EMFILE || errno == ENFILE || errno == ENOBUFS)
233 return ISC_R_NORESOURCES;
234 return ISC_R_UNEXPECTED;
239 return (ISC_R_NORESOURCES);
242 #if defined (TRACING) 246 iov [0].
buf = (
char *)&addr.sin_port;
247 iov [0].
len =
sizeof addr.sin_port;
248 iov [1].
buf = (
char *)&addr.sin_addr;
249 iov [1].
len =
sizeof addr.sin_addr;
250 iov [2].
buf = (
char *)&listener -> address.sin_port;
251 iov [2].
len =
sizeof listener -> address.sin_port;
259 if (status != ISC_R_SUCCESS) {
273 omapi_connection_dereference (&obj,
MDL);
274 if (status != ISC_R_SUCCESS)
282 struct sockaddr_in *remote_addr)
288 #ifdef DEBUG_PROTOCOL 293 status = omapi_connection_allocate (obj,
MDL);
294 if (status != ISC_R_SUCCESS)
298 (*obj) -> remote_addr = *remote_addr;
299 (*obj) -> socket = socket;
302 if (listener -> verify_addr) {
304 addr.
addrlen =
sizeof (remote_addr -> sin_addr);
305 memcpy (addr.
address, &remote_addr -> sin_addr,
306 sizeof (remote_addr -> sin_addr));
307 addr.
port = ntohs(remote_addr -> sin_port);
309 status = (listener -> verify_addr) (h, &addr);
310 if (status != ISC_R_SUCCESS) {
312 omapi_connection_dereference (obj,
MDL);
317 omapi_listener_reference (&(*obj) -> listener, listener,
MDL);
318 #if defined (TRACING) 325 #if defined (TRACING) 329 trace_listener_accept =
331 trace_listener_accept_input,
332 trace_listener_accept_stop,
MDL);
339 if (!trace_listeners) {
340 status = omapi_listener_array_allocate (&trace_listeners,
342 if (status != ISC_R_SUCCESS) {
344 log_error (
"trace_listener_remember: %s",
345 isc_result_totext (status));
349 status = omapi_listener_array_extend (trace_listeners, obj,
351 if (status != ISC_R_SUCCESS)
355 static void trace_listener_accept_input (
trace_type_t *ttype,
356 unsigned length,
char *buf)
358 struct in_addr *addr;
363 struct sockaddr_in remote_addr;
365 addr = (
struct in_addr *)buf;
366 remote_port = (u_int16_t *)(addr + 1);
367 local_port = remote_port + 1;
369 memset (&remote_addr, 0,
sizeof remote_addr);
370 remote_addr.sin_addr = *addr;
375 if (lp -> address.sin_port == *local_port) {
378 lp, 0, &remote_addr);
379 if (status != ISC_R_SUCCESS) {
380 log_error(
"%s:%d: OMAPI: Failed to connect " 383 omapi_listener_dereference (&lp,
MDL);
388 log_error (
"trace_listener_accept: %s from %s/%d to port %d",
389 "unexpected connect",
390 inet_ntoa (*addr), *remote_port, *local_port);
393 static void trace_listener_accept_stop (
trace_type_t *ttype) { }
399 isc_result_t (*verify_addr)
409 l -> verify_addr = verify_addr;
411 return ISC_R_SUCCESS;
422 if (h -> inner && h -> inner -> type -> set_value)
423 return (*(h -> inner -> type -> set_value))
424 (h -> inner, id, name, value);
425 return ISC_R_NOTFOUND;
436 if (h -> inner && h -> inner -> type -> get_value)
437 return (*(h -> inner -> type -> get_value))
438 (h -> inner, id, name, value);
439 return ISC_R_NOTFOUND;
451 #ifdef DEBUG_PROTOCOL 455 if (l -> socket != -1) {
459 return ISC_R_SUCCESS;
463 const char *name, va_list ap)
468 if (h -> inner && h -> inner -> type -> signal_handler)
469 return (*(h -> inner -> type -> signal_handler)) (h -> inner,
471 return ISC_R_NOTFOUND;
484 if (l -> inner && l -> inner -> type -> stuff_values)
485 return (*(l -> inner -> type -> stuff_values)) (c, id,
487 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)
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 trace_write_packet_iov(trace_type_t *, int, trace_iov_t *, const char *, int)
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)
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_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 *,...)
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 *)