Bind update

David Rhodus drhodus at catpa.com
Sat Nov 22 18:39:16 PST 2003


Richard Coleman wrote:

Do you envision all this being handled by daemons running as pure 
kernel threads?  It would be cool if DragonFly could have a standard 
API for asynchronous DNS resolutions.
I really like the idea of something like a lookupd, like darwin has, not 
only for resolver type
of things but also authentication.

As for async lookups API, most likely we will follow the same path 
everyone else has as
it mainly for application developers use(in my mind). Here kind of an 
API guide I think
we should follow in DragonFly for asynchronous lookup's.

There are quite a few interface available today for
host lookup (gethostbyname,gethostname2,getaddrinfo...)
AIO(asynchronous I/O) API introduced in POSIX-1b
<netdb.h> -- definitions for newwork database opertations

const char *ar_name;	/* Host name to look up */
const char *ar_service;	/* Service name. */
const struct addrinfo *ar_request; /* Request attributes. */
struct addrinfo *ar_result;	/* Pointer to first
				element of result. */
getaddrinfo_a()
GAI_WAIT
	The function will not return intil all the work is done.
GAI_NOWAIT
	The function immediately return after queueing the requests.
int getaddrinfo_a(int, struct gaicb *restrict [restrict], int
			struct sigevent *restrict);
int gai_suspend(const struct gaicb *restrict
		const[restrict], int,
		const strcut timespec *restrict);
int gai_error(struct gaicb *);
int gai_cabcel(struct gaicb *);
getaddrinfo_a()
	asynchronicall get address information
gai_suspend
	Suspend execution until a request result is available
gai_error()
	Get status of lookup request
gai_cancel
	Cancel an asynchronous name lookup request


Example

	int new_name;

	/* This is the sginal handler. We just set a flag that
	when poll() returns(which happens right after the signal
	handler return) the flag is set and we can use the name.
	*/
	void sighandle (int sig) { 
		new_name = 1;
	}

	/* This is the array with the request. This will probably
	have to be dynamic in size in a real implementiation
	*/
	{
	struct gaicb reqs[10];
	struct sigeven sigev = {
		.sigev_notify = SIGEV_SIGNAL,
		.sigev_signo = SIGRT1
	};
	struct sigaction sa = {
		.sa_handle = sighandler,
		sa._flahgs = 0 /* Note: not SA_RESTART */
	};
	sigemptyset (&sa.sa_mask);
	/* Install signal handler. */
	/* All requests are reported using the same machanism:
	with a signal send. We initialize a sigevent struct,
	a sigaction structre, and set using sigaction() the
	signal handler for later use.
	*/
	while(1) {
	/* Wait until data is available or interrupted
	   by a signal. */
	int n = poll(fds, nfds, 0);
	/* This poll() call serves two purposes. First, we track
	multiple incoming connections. this could be the different
	files makeing up a request.
	But unless the SA_RESTART flag is set for the signal hanlder
	poll() return with an EINTR error if a signal is delivered.
	This is what we use here. After SIGRT1 is delivered (sighandler()
	is called)poll() return with a value zero.
	*/
	/* See whether any name got resolved. We can come
	   here even if no stream has input (i.e., n == 0)
	   since we are using signal from notification for
	   sinished lookups. This causes poll() to return
	   with errno == EINTR. */
	if (new_name != 0) {
		int i;
	/* here we seatch for a finished request and initiate
	   a connection baed on the information ... */
	/* This is where we recognize newly resolved names and
	start using them. 
	*/
	}

	if ( n != 0) {
		/* read from descriptors */
		if (URL) {
	/*
	If the test read for the URL contains a reference to another 
	entiy we initiate here a new lookpup request
	*/
			int idx = find_free_req_idx();
			reqs[idx].ar_name = URL;
			reqs[idx].ar_service = htons(80); /* HTTP port */
			reqs[idx].ar_request = NULL;

			getaddrinfo_a(GAI_NOWAIT, &reqs[idx], 1, &sigeev);
			}
		}
	}

And given all the discussion in FreeBSD-current in the last few days 
about the changes to make /bin and /sbin dynamic so that NSS works 
correctly, I would be interested how this could be better achieved in 
the DragonFly world?
DragonFly will not have a dynamic / unless someone does a custom compile 
for their system.
As for NSS I'm not sure that is the best thing at this point....

-DR






More information about the Kernel mailing list