36static 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);
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);
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;
178 omapi_listener_dereference (&obj,
MDL);
187 if (obj->inner == h) {
191 if (obj->socket != -1) {
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);
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;
272 omapi_connection_dereference (&obj,
MDL);
281 struct sockaddr_in *remote_addr)
292 status = omapi_connection_allocate (obj,
MDL);
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);
311 omapi_connection_dereference (obj,
MDL);
316 omapi_listener_reference (&(*obj) -> listener, listener,
MDL);
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,
343 log_error (
"trace_listener_remember: %s",
344 isc_result_totext (status));
348 status = omapi_listener_array_extend (trace_listeners, obj,
354static 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;
368 memset (&remote_addr, 0,
sizeof remote_addr);
369 remote_addr.sin_addr = *addr;
377 lp, 0, &remote_addr);
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",
392static void trace_listener_accept_stop (
trace_type_t *ttype) { }
398 isc_result_t (*verify_addr)
408 l -> verify_addr = verify_addr;
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;
454 if (l -> socket != -1) {
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,
isc_result_t omapi_accept(omapi_object_t *h)
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_listener_destroy(omapi_object_t *h, const char *file, int line)
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_listen_addr(omapi_object_t *h, omapi_addr_t *addr, int max)
int omapi_listener_readfd(omapi_object_t *h)
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)
isc_result_t omapi_listener_signal_handler(omapi_object_t *h, const char *name, va_list ap)
isc_result_t omapi_listener_stuff_values(omapi_object_t *c, omapi_object_t *id, omapi_object_t *l)
isc_result_t omapi_listener_configure_security(omapi_object_t *h, isc_result_t(*verify_addr)(omapi_object_t *, omapi_addr_t *))
#define omapi_array_foreach_begin(array, stype, var)
#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_connection_reader(omapi_object_t *)
struct __omapi_object omapi_object_t
isc_result_t omapi_connection_writer(omapi_object_t *)
int omapi_listener_readfd(omapi_object_t *)
isc_result_t omapi_disconnect(omapi_object_t *, int)
isc_result_t omapi_connection_reaper(omapi_object_t *)
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(omapi_object_t *, const char *,...)
#define omapi_array_foreach_end(array, stype, var)
omapi_object_type_t * omapi_type_listener
#define OMAPI_ARRAY_TYPE(name, stype)
isc_result_t omapi_accept(omapi_object_t *)
isc_result_t omapi_listen(omapi_object_t *, unsigned, int)
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_listener_trace_setup(void)
struct __omapi_listener_object omapi_listener_object_t
void omapi_connection_register(omapi_connection_object_t *, const char *, int)
@ omapi_connection_connected
#define DHCP_R_INVALIDARG
unsigned char address[16]
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)
struct trace_type trace_type_t
isc_result_t trace_write_packet_iov(trace_type_t *, int, trace_iov_t *, const char *, int)