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);
121 if (obj->socket == -1) {
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) {
192 if (obj->socket != -1) {
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;
237 #if defined (TRACING) 241 iov [0].
buf = (
char *)&addr.sin_port;
242 iov [0].
len =
sizeof addr.sin_port;
243 iov [1].
buf = (
char *)&addr.sin_addr;
244 iov [1].
len =
sizeof addr.sin_addr;
245 iov [2].
buf = (
char *)&listener -> address.sin_port;
246 iov [2].
len =
sizeof listener -> address.sin_port;
254 if (status != ISC_R_SUCCESS) {
268 omapi_connection_dereference (&obj,
MDL);
269 if (status != ISC_R_SUCCESS)
277 struct sockaddr_in *remote_addr)
283 #ifdef DEBUG_PROTOCOL 288 status = omapi_connection_allocate (obj,
MDL);
289 if (status != ISC_R_SUCCESS)
293 (*obj) -> remote_addr = *remote_addr;
294 (*obj) -> socket = socket;
297 if (listener -> verify_addr) {
299 addr.
addrlen =
sizeof (remote_addr -> sin_addr);
300 memcpy (addr.
address, &remote_addr -> sin_addr,
301 sizeof (remote_addr -> sin_addr));
302 addr.
port = ntohs(remote_addr -> sin_port);
304 status = (listener -> verify_addr) (h, &addr);
305 if (status != ISC_R_SUCCESS) {
307 omapi_connection_dereference (obj,
MDL);
312 omapi_listener_reference (&(*obj) -> listener, listener,
MDL);
313 #if defined (TRACING) 320 #if defined (TRACING) 324 trace_listener_accept =
326 trace_listener_accept_input,
327 trace_listener_accept_stop,
MDL);
334 if (!trace_listeners) {
335 status = omapi_listener_array_allocate (&trace_listeners,
337 if (status != ISC_R_SUCCESS) {
339 log_error (
"trace_listener_remember: %s",
340 isc_result_totext (status));
344 status = omapi_listener_array_extend (trace_listeners, obj,
346 if (status != ISC_R_SUCCESS)
350 static void trace_listener_accept_input (
trace_type_t *ttype,
351 unsigned length,
char *buf)
353 struct in_addr *addr;
358 struct sockaddr_in remote_addr;
360 addr = (
struct in_addr *)buf;
361 remote_port = (u_int16_t *)(addr + 1);
362 local_port = remote_port + 1;
364 memset (&remote_addr, 0,
sizeof remote_addr);
365 remote_addr.sin_addr = *addr;
370 if (lp -> address.sin_port == *local_port) {
373 lp, 0, &remote_addr);
374 if (status != ISC_R_SUCCESS) {
375 log_error(
"%s:%d: OMAPI: Failed to connect " 378 omapi_listener_dereference (&lp,
MDL);
383 log_error (
"trace_listener_accept: %s from %s/%d to port %d",
384 "unexpected connect",
385 inet_ntoa (*addr), *remote_port, *local_port);
388 static void trace_listener_accept_stop (
trace_type_t *ttype) { }
394 isc_result_t (*verify_addr)
404 l -> verify_addr = verify_addr;
406 return ISC_R_SUCCESS;
417 if (h -> inner && h -> inner -> type -> set_value)
418 return (*(h -> inner -> type -> set_value))
419 (h -> inner, id, name, value);
420 return ISC_R_NOTFOUND;
431 if (h -> inner && h -> inner -> type -> get_value)
432 return (*(h -> inner -> type -> get_value))
433 (h -> inner, id, name, value);
434 return ISC_R_NOTFOUND;
446 #ifdef DEBUG_PROTOCOL 450 if (l -> socket != -1) {
454 return ISC_R_SUCCESS;
458 const char *name, va_list ap)
463 if (h -> inner && h -> inner -> type -> signal_handler)
464 return (*(h -> inner -> type -> signal_handler)) (h -> inner,
466 return ISC_R_NOTFOUND;
479 if (l -> inner && l -> inner -> type -> stuff_values)
480 return (*(l -> inner -> type -> stuff_values)) (c, id,
482 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 *)
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)
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_set_value(omapi_object_t *h, omapi_object_t *id, omapi_data_string_t *name, omapi_typed_data_t *value)
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 *,...)
void omapi_connection_register(omapi_connection_object_t *, const char *, int)
isc_result_t omapi_listen(omapi_object_t *, unsigned, int)
unsigned char address[16]
#define omapi_array_foreach_end(array, stype, var)
#define OMAPI_ARRAY_TYPE(name, stype)
isc_result_t omapi_accept(omapi_object_t *h)
isc_result_t omapi_disconnect(omapi_object_t *, int)
#define omapi_array_foreach_begin(array, stype, var)
isc_result_t omapi_listen_addr(omapi_object_t *h, omapi_addr_t *addr, int max)
int omapi_connection_readfd(omapi_object_t *)