domain_server
—
generic DOMAIN server
PDEL Library (libpdel, -lpdel)
#include
<sys/types.h>
#include <sys/un.h>
#include <stdio.h>
#include
<pdel/net/domain_server.h>
struct domain_server *
domain_server_start
(struct
pevent_ctx *ctx, void
*cookie, const char
*mtype, struct in_addr
ip, u_int16_t port,
u_int max_conn,
u_int conn_timeout,
domain_setup_t *setup,
domain_handler_t
*handler,
domain_teardown_t
*teardown);
void
domain_server_stop
(struct
domain_server **servp);
void *
domain_server_get_cookie
(struct
domain_server *serv);
struct domain_server *
domain_connection_get_server
(struct
domain_connection *conn);
void *
domain_connection_get_cookie
(struct
domain_connection *conn);
int
domain_connection_get_fd
(struct
domain_connection *conn);
FILE *
domain_connection_get_fp
(struct
domain_connection *conn);
void
domain_connection_get_peer
(struct
domain_connection *conn,
struct sockaddr_un
*sun);
These functions provide support for implementing DOMAIN
servers.
domain_server_start
()
creates a new DOMAIN server listening for connections on IP address
ip and port port. Memory for the
domain_server
is dynamically allocated with
typed_mem(3)
type mtype. At most max_conn
simultaneous connections will be allowed. If
conn_timeout is non-zero, then if an attempt to read
from or write to a peer blocks for more than
conn_timeout seconds, the connection will be
terminated. ctx is a
pevent(3)
event context used to listen for incoming connections.
The setup, handler,
and teardown arguments are pointers to functions
having these types:
typedef void *domain_setup_t(struct domain_connection *conn);
typedef void domain_handler_t(struct domain_connection *conn);
typedef void domain_teardown_t(struct domain_connection *conn);
Each connection is represented by a
domain_connection
object. For each new connection,
setup
() is
called to initialize user state for the connection. If setup is
unsuccessful, setup
() should return
NULL
and set errno
appropriately, and the connection will be closed. Otherwise, it should
return a non-NULL cookie; this cookie can be accessed later in
handler
() and teardown
() by
calling
domain_connection_get_cookie
().
handler
()
is used to service the connection. The thread calling this function may be
canceled at any cancellation point; therefore,
handler
() may need to register cleanup hooks to
clean up allocated resources should that happen.
teardown
()
is called when handler
() returns, or the thread is
canceled. If setup
() returns successfully,
teardown
() is guaranteed to be called exactly
once.
domain_server_stop
()
stops and destroys a domain_server
. All existing
connection threads are canceled and the current thread blocks until
teardown
() has been called for each connection.
domain_connection_get_peer
()
retrieves the peer's address.
domain_connection_get_server
()
returns the domain_server
object associated with the
connection conn.
domain_connection_get_fd
()
returns the DOMAIN socket associated with the connection.
domain_connection_get_fp
()
returns a stream opened on top of the socket for use with stream based
I/O.
The user code should
not close either the
socket or the stream; these will be closed automatically when the connection
is terminated.
domain_server_start
() returns
NULL
to indicate an error, with
errno set appropriately.
The PDEL library was developed at Packet Design, LLC.
http://www.packetdesign.com/
Archie Cobbs
⟨archie@freebsd.org⟩
Mark Gooderum ⟨markpdel@jumpweb.com⟩