+static bool
+register_callback( RES_STAT *s, void (*cbfunc)(int, short))
+{
+ assert(cbfunc != NULL);
+ assert(s != NULL);
+ assert(s->resolver_fd >= 0);
+
+ if (io_setnonblock(s->resolver_fd) &&
+ io_event_create(s->resolver_fd, IO_WANTREAD, cbfunc))
+ return true;
+
+ Log( LOG_CRIT, "Resolver: Could not register callback function: %s!", strerror(errno));
+ close(s->resolver_fd);
+ Resolve_Init(s);
+ return false;
+}
+
+
+GLOBAL bool
+Resolve_Shutdown( RES_STAT *s)
+{
+ bool ret = false;
+
+ assert(s != NULL);
+ assert(s->resolver_fd >= 0);
+
+ if (s->resolver_fd >= 0)
+ ret = io_close(s->resolver_fd);
+
+ Resolve_Init(s);
+ return ret;
+}
+
+
+/**
+ * Read result of resolver sub-process from pipe
+ */
+GLOBAL size_t
+Resolve_Read( RES_STAT *s, void* readbuf, size_t buflen)
+{
+ ssize_t bytes_read;
+
+ assert(buflen > 0);
+
+ /* Read result from pipe */
+ bytes_read = read(s->resolver_fd, readbuf, buflen);
+ if (bytes_read < 0) {
+ if (errno == EAGAIN)
+ return 0;
+
+ Log( LOG_CRIT, "Resolver: Can't read result: %s!", strerror(errno));
+ bytes_read = 0;
+ }
+#ifdef DEBUG
+ else if (bytes_read == 0)
+ Log( LOG_DEBUG, "Resolver: Can't read result: EOF");
+#endif
+ Resolve_Shutdown(s);
+ return (size_t)bytes_read;
+}