/* This file is part of GNUnet. Copyright (C) 2001-2013 GNUnet e.V. GNUnet is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GNUnet is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . SPDX-License-Identifier: AGPL3.0-or-later */ /** * @author Christian Grothoff * * @file * Functions related to doing DNS lookups * * @defgroup resolver Resolver service * Asynchronous standard DNS lookups * @{ */ #ifndef GNUNET_RESOLVER_SERVICE_H #define GNUNET_RESOLVER_SERVICE_H #ifdef __cplusplus extern "C" { #if 0 /* keep Emacsens' auto-indent happy */ } #endif #endif #include "gnunet_configuration_lib.h" #include "gnunet_scheduler_lib.h" #include "gnunet_time_lib.h" /** * Function called by the resolver for each address obtained from DNS. * * @param cls closure * @param addr one of the addresses of the host, NULL for the last address * @param addrlen length of @a addr */ typedef void (*GNUNET_RESOLVER_AddressCallback) (void *cls, const struct sockaddr *addr, socklen_t addrlen); /** * Handle to a request given to the resolver. Can be used to cancel * the request prior to the timeout or successful execution. */ struct GNUNET_RESOLVER_RequestHandle; /** * Create the connection to the resolver service. * * @param cfg configuration to use */ void GNUNET_RESOLVER_connect (const struct GNUNET_CONFIGURATION_Handle *cfg); /** * Destroy the connection to the resolver service. */ void GNUNET_RESOLVER_disconnect (void); /** * Convert a string to one or more IP addresses. * * @param hostname the hostname to resolve * @param af AF_INET or AF_INET6; use AF_UNSPEC for "any" * @param callback function to call with addresses * @param callback_cls closure for @a callback * @param timeout how long to try resolving * @return handle that can be used to cancel the request, NULL on error */ struct GNUNET_RESOLVER_RequestHandle * GNUNET_RESOLVER_ip_get (const char *hostname, int af, struct GNUNET_TIME_Relative timeout, GNUNET_RESOLVER_AddressCallback callback, void *callback_cls); /** * Resolve our hostname to an IP address. * * @param af AF_INET or AF_INET6; use AF_UNSPEC for "any" * @param callback function to call with addresses * @param cls closure for @a callback * @param timeout how long to try resolving * @return handle that can be used to cancel the request, NULL on error */ struct GNUNET_RESOLVER_RequestHandle * GNUNET_RESOLVER_hostname_resolve (int af, struct GNUNET_TIME_Relative timeout, GNUNET_RESOLVER_AddressCallback callback, void *cls); /** * Function called by the resolver for each hostname obtained from DNS. * * @param cls closure * @param hostname one of the names for the host, NULL * on the last call to the callback */ typedef void (*GNUNET_RESOLVER_HostnameCallback) (void *cls, const char *hostname); /** * Get local fully qualified domain name * * @return local hostname, caller must free */ char * GNUNET_RESOLVER_local_fqdn_get (void); /** * Perform a reverse DNS lookup. * * @param sa host address * @param salen length of @a sa * @param do_resolve use #GNUNET_NO to return numeric hostname * @param timeout how long to try resolving * @param callback function to call with hostnames * @param cls closure for @a callback * @return handle that can be used to cancel the request, NULL on error */ struct GNUNET_RESOLVER_RequestHandle * GNUNET_RESOLVER_hostname_get (const struct sockaddr *sa, socklen_t salen, int do_resolve, struct GNUNET_TIME_Relative timeout, GNUNET_RESOLVER_HostnameCallback callback, void *cls); /** * Cancel a request that is still pending with the resolver. * Note that a client MUST NOT cancel a request that has * been completed (i.e, the callback has been called to * signal timeout or the final result). * * @param rh handle of request to cancel */ void GNUNET_RESOLVER_request_cancel (struct GNUNET_RESOLVER_RequestHandle *rh); #if 0 /* keep Emacsens' auto-indent happy */ { #endif #ifdef __cplusplus } #endif /* ifndef GNUNET_RESOLVER_SERVICE_H */ #endif /** @} */ /* end of group resolver */ /* end of gnunet_resolver_service.h */