📄 adns.h
字号:
* adns_init * adns_submit 1 * adns_submit 2 * adns_submit 3 * adns_wait 1 * adns_check 3 -> EAGAIN * adns_wait 2 * adns_wait 3 * .... * adns_finish *//* * Entrypoints for generic asynch io: * (these entrypoints are not very useful except in combination with * * some of the other I/O model calls which can tell you which fds to * be interested in): * * Note that any adns call may cause adns to open and close fds, so * you must call beforeselect or beforepoll again just before * blocking, or you may not have an up-to-date list of it's fds. */int adns_processany(adns_state ads);/* Gives adns flow-of-control for a bit. This will never block, and * can be used with any threading/asynch-io model. If some error * occurred which might cause an event loop to spin then the errno * value is returned. */int adns_processreadable(adns_state ads, int fd, const struct timeval *now);int adns_processwriteable(adns_state ads, int fd, const struct timeval *now);int adns_processexceptional(adns_state ads, int fd, const struct timeval *now);/* Gives adns flow-of-control so that it can process incoming data * from, or send outgoing data via, fd. Very like _processany. If it * returns zero then fd will no longer be readable or writeable * (unless of course more data has arrived since). adns will _only_ * use that fd and only in the manner specified, regardless of whether * adns_if_noautosys was specified. * * adns_processexceptional should be called when select(2) reports an * exceptional condition, or poll(2) reports POLLPRI. * * It is fine to call _processreabable or _processwriteable when the * fd is not ready, or with an fd that doesn't belong to adns; it will * then just return 0. * * If some error occurred which might prevent an event loop to spin * then the errno value is returned. */void adns_processtimeouts(adns_state ads, const struct timeval *now);/* Gives adns flow-of-control so that it can process any timeouts * which might have happened. Very like _processreadable/writeable. * * now may be 0; if it isn't, *now must be the current time, recently * obtained from gettimeofday. */void adns_firsttimeout(adns_state ads, struct timeval **tv_mod, struct timeval *tv_buf, struct timeval now);/* Asks adns when it would first like the opportunity to time * something out. now must be the current time, from gettimeofday. * * If tv_mod points to 0 then tv_buf must be non-null, and * _firsttimeout will fill in *tv_buf with the time until the first * timeout, and make *tv_mod point to tv_buf. If adns doesn't have * anything that might need timing out it will leave *tv_mod as 0. * * If *tv_mod is not 0 then tv_buf is not used. adns will update * *tv_mod if it has any earlier timeout, and leave it alone if it * doesn't. * * This call will not actually do any I/O, or change the fds that adns * is using. It always succeeds and never blocks. */void adns_globalsystemfailure(adns_state ads);/* If serious problem(s) happen which globally affect your ability to * interact properly with adns, or adns's ability to function * properly, you or adns can call this function. * * All currently outstanding queries will be made to fail with * adns_s_systemfail, and adns will close any stream sockets it has * open. * * This is used by adns, for example, if gettimeofday() fails. * Without this the program's event loop might start to spin ! * * This call will never block. *//* * Entrypoints for select-loop based asynch io: */void adns_beforeselect(adns_state ads, int *maxfd, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval **tv_mod, struct timeval *tv_buf, const struct timeval *now);/* Find out file descriptors adns is interested in, and when it would * like the opportunity to time something out. If you do not plan to * block then tv_mod may be 0. Otherwise, tv_mod and tv_buf are as * for adns_firsttimeout. readfds, writefds, exceptfds and maxfd_io may * not be 0. * * If now is not 0 then this will never actually do any I/O, or change * the fds that adns is using or the timeouts it wants. In any case * it won't block, and it will set the timeout to zero if a query * finishes in _beforeselect. */void adns_afterselect(adns_state ads, int maxfd, const fd_set *readfds, const fd_set *writefds, const fd_set *exceptfds, const struct timeval *now);/* Gives adns flow-of-control for a bit; intended for use after * select. This is just a fancy way of calling adns_processreadable/ * writeable/timeouts as appropriate, as if select had returned the * data being passed. Always succeeds. *//* * Example calling sequence: * * adns_init _noautosys * loop { * adns_beforeselect * select * adns_afterselect * ... * adns_submit / adns_check * ... * } *//* * Entrypoints for poll-loop based asynch io: */struct pollfd;/* In case your system doesn't have it or you forgot to include * <sys/poll.h>, to stop the following declarations from causing * problems. If your system doesn't have poll then the following * entrypoints will not be defined in libadns. Sorry ! */int adns_beforepoll(adns_state ads, struct pollfd *fds, int *nfds_io, int *timeout_io, const struct timeval *now);/* Finds out which fd's adns is interested in, and when it would like * to be able to time things out. This is in a form suitable for use * with poll(2). * * On entry, usually fds should point to at least *nfds_io structs. * adns will fill up to that many structs will information for poll, * and record in *nfds_io how many structs it filled. If it wants to * listen for more structs then *nfds_io will be set to the number * required and _beforepoll will return ERANGE. * * You may call _beforepoll with fds==0 and *nfds_io 0, in which case * adns will fill in the number of fds that it might be interested in * in *nfds_io, and always return either 0 (if it is not interested in * any fds) or ERANGE (if it is). * * NOTE that (unless now is 0) adns may acquire additional fds * from one call to the next, so you must put adns_beforepoll in a * loop, rather than assuming that the second call (with the buffer * size requested by the first) will not return ERANGE. * * adns only ever sets POLLIN, POLLOUT and POLLPRI in its pollfd * structs, and only ever looks at those bits. POLLPRI is required to * detect TCP Urgent Data (which should not be used by a DNS server) * so that adns can know that the TCP stream is now useless. * * In any case, *timeout_io should be a timeout value as for poll(2), * which adns will modify downwards as required. If the caller does * not plan to block then *timeout_io should be 0 on entry, or * alternatively, timeout_io may be 0. (Alternatively, the caller may * use _beforeselect with timeout_io==0 to find out about file * descriptors, and use _firsttimeout is used to find out when adns * might want to time something out.) * * adns_beforepoll will return 0 on success, and will not fail for any * reason other than the fds buffer being too small (ERANGE). * * This call will never actually do any I/O. If you supply the * current time it will not change the fds that adns is using or the * timeouts it wants. * * In any case this call won't block. */#define ADNS_POLLFDS_RECOMMENDED 2/* If you allocate an fds buf with at least RECOMMENDED entries then * you are unlikely to need to enlarge it. You are recommended to do * so if it's convenient. However, you must be prepared for adns to * require more space than this. */void adns_afterpoll(adns_state ads, const struct pollfd *fds, int nfds, const struct timeval *now);/* Gives adns flow-of-control for a bit; intended for use after * poll(2). fds and nfds should be the results from poll(). pollfd * structs mentioning fds not belonging to adns will be ignored. */adns_status adns_rr_info(adns_rrtype type, const char **rrtname_r, const char **fmtname_r, int *len_r, const void *datap, char **data_r);/* * Get information about a query type, or convert reply data to a * textual form. type must be specified, and the official name of the * corresponding RR type will be returned in *rrtname_r, and * information about the processing style in *fmtname_r. The length * of the table entry in an answer for that type will be returned in * in *len_r. Any or all of rrtname_r, fmtname_r and len_r may be 0. * If fmtname_r is non-null then *fmtname_r may be null on return, * indicating that no special processing is involved. * * data_r be must be non-null iff datap is. In this case *data_r will * be set to point to a string pointing to a representation of the RR * data in master file format. (The owner name, timeout, class and * type will not be present - only the data part of the RR.) The * memory will have been obtained from malloc() and must be freed by * the caller. * * Usually this routine will succeed. Possible errors include: * adns_s_nomemory * adns_s_rrtypeunknown * adns_s_invaliddata (*datap contained garbage) * If an error occurs then no memory has been allocated, * and *rrtname_r, *fmtname_r, *len_r and *data_r are undefined. * * There are some adns-invented data formats which are not official * master file formats. These include: * * Mailboxes if __qtf_mail822: these are just included as-is. * * Addresses (adns_rr_addr): these may be of pretty much any type. * The representation is in two parts: first, a word for the address * family (ie, in AF_XXX, the XXX), and then one or more items for the * address itself, depending on the format. For an IPv4 address the * syntax is INET followed by the dotted quad (from inet_ntoa). * Currently only IPv4 is supported. * * Text strings (as in adns_rr_txt) appear inside double quotes, and * use \" and \\ to represent " and \, and \xHH to represent * characters not in the range 32-126. * * Hostname with addresses (adns_rr_hostaddr): this consists of the * hostname, as usual, followed by the adns_status value, as an * abbreviation, and then a descriptive string (encoded as if it were * a piece of text), for the address lookup, followed by zero or more * addresses enclosed in ( and ). If the result was a temporary * failure, then a single ? appears instead of the ( ). If the * result was a permanent failure then an empty pair of parentheses * appears (which a space in between). For example, one of the NS * records for greenend.org.uk comes out like * ns.chiark.greenend.org.uk ok "OK" ( INET 195.224.76.132 ) * an MX referring to a nonexistent host might come out like: * 50 sun2.nsfnet-relay.ac.uk nxdomain "No such domain" ( ) * and if nameserver information is not available you might get: * dns2.spong.dyn.ml.org timeout "DNS query timed out" ? */const char *adns_strerror(adns_status st);const char *adns_errabbrev(adns_status st);const char *adns_errtypeabbrev(adns_status st);/* Like strerror but for adns_status values. adns_errabbrev returns * the abbreviation of the error - eg, for adns_s_timeout it returns * "timeout". adns_errtypeabbrev returns the abbreviation of the * error class: ie, for values up to adns_s_max_XXX it will return the * string XXX. You MUST NOT call these functions with status values * not returned by the same adns library. */#ifdef __cplusplus} /* end of extern "C" */#endif#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -