5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina/*
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina Authors:
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina Pavel Březina <pbrezina@redhat.com>
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina Copyright (C) 2012 Red Hat
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina This program is free software; you can redistribute it and/or modify
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina it under the terms of the GNU General Public License as published by
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina the Free Software Foundation; either version 3 of the License, or
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina (at your option) any later version.
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina This program is distributed in the hope that it will be useful,
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina but WITHOUT ANY WARRANTY; without even the implied warranty of
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina GNU General Public License for more details.
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina You should have received a copy of the GNU General Public License
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina along with this program. If not, see <http://www.gnu.org/licenses/>.
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina*/
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina#include <errno.h>
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina#include <tevent.h>
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina#include <talloc.h>
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina#include <sys/types.h>
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina#include <sys/socket.h>
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina#include <arpa/inet.h>
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina#include <ifaddrs.h>
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina#include <unistd.h>
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina#include <limits.h>
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina#include <string.h>
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina#include "util/util.h"
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina#include "providers/ldap/sdap.h"
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina#include "providers/ldap/sdap_id_op.h"
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina#include "providers/ldap/sdap_sudo.h"
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina#include "resolv/async_resolv.h"
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březinastatic int sdap_sudo_get_ip_addresses(TALLOC_CTX *mem_ctx, char ***_ip_addr);
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březinastruct sdap_sudo_get_hostinfo_state {
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina char **hostnames;
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina char **ip_addr;
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina};
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březinastruct sdap_sudo_get_hostnames_state {
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina struct tevent_context *ev;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina struct resolv_ctx *resolv_ctx;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina enum host_database *host_db;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina enum restrict_family family_order;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina char **hostnames;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina};
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březinastatic void sdap_sudo_get_hostinfo_done(struct tevent_req *req);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březinastatic struct tevent_req *sdap_sudo_get_hostnames_send(TALLOC_CTX *mem_ctx,
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina struct be_ctx *be_ctx);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březinastatic void sdap_sudo_get_hostnames_done(struct tevent_req *subreq);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březinastatic int sdap_sudo_get_hostnames_recv(TALLOC_CTX *mem_ctx,
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina struct tevent_req *req,
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina char ***hostnames);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březinastruct tevent_req * sdap_sudo_get_hostinfo_send(TALLOC_CTX *mem_ctx,
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina struct sdap_options *opts,
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina struct be_ctx *be_ctx)
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina{
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina struct tevent_req *req = NULL;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina struct tevent_req *subreq = NULL;
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina struct sdap_sudo_get_hostinfo_state *state = NULL;
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina char *conf_hostnames = NULL;
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina char *conf_ip_addr = NULL;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina int ret = EOK;
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina /* create request */
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina req = tevent_req_create(mem_ctx, &state,
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina struct sdap_sudo_get_hostinfo_state);
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina if (req == NULL) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_FATAL_FAILURE, "tevent_req_create() failed\n");
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina return NULL;
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina }
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina state->hostnames = NULL;
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina state->ip_addr = NULL;
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina /* load info from configuration */
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina conf_hostnames = dp_opt_get_string(opts->basic, SDAP_SUDO_HOSTNAMES);
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina conf_ip_addr = dp_opt_get_string(opts->basic, SDAP_SUDO_IP);
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina if (conf_hostnames != NULL) {
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek ret = split_on_separator(state, conf_hostnames, ' ', true, true,
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina &state->hostnames, NULL);
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina if (ret != EOK) {
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina DEBUG(SSSDBG_MINOR_FAILURE,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "Unable to parse hostnames [%d]: %s\n", ret, strerror(ret));
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina goto done;
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina } else {
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina DEBUG(SSSDBG_CONF_SETTINGS,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "Hostnames set to: %s\n", conf_hostnames);
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina }
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina }
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina if (conf_ip_addr != NULL) {
04759b59e71c78ab23b84d13dd29d9c6dd680adbMichal Zidek ret = split_on_separator(state, conf_ip_addr, ' ', true, true,
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina &state->ip_addr, NULL);
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina if (ret != EOK) {
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina DEBUG(SSSDBG_MINOR_FAILURE,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "Unable to parse IP addresses [%d]: %s\n",
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov ret, strerror(ret));
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina goto done;
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina } else {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_CONF_SETTINGS, "IP addresses set to: %s\n",
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov conf_ip_addr);
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina }
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina }
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina /* if IP addresses are not specified, configure it automatically */
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina if (state->ip_addr == NULL) {
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina ret = sdap_sudo_get_ip_addresses(state, &state->ip_addr);
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina if (ret != EOK) {
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina DEBUG(SSSDBG_OP_FAILURE,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "Unable to detect IP addresses [%d]: %s\n",
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov ret, strerror(ret));
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina }
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina }
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina /* if hostnames are not specified, configure it automatically */
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina if (state->hostnames == NULL) {
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina subreq = sdap_sudo_get_hostnames_send(state, be_ctx);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina if (subreq == NULL) {
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina ret = ENOMEM;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina goto done;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina }
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina tevent_req_set_callback(subreq, sdap_sudo_get_hostinfo_done, req);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina ret = EAGAIN;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina }
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březinadone:
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina if (ret != EAGAIN) {
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina if (ret == EOK) {
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina tevent_req_done(req);
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina } else {
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina tevent_req_error(req, ret);
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina }
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina tevent_req_post(req, be_ctx->ev);
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina }
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina return req;
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina}
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březinastatic void sdap_sudo_get_hostinfo_done(struct tevent_req *subreq)
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina{
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina struct tevent_req *req = NULL;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina struct sdap_sudo_get_hostinfo_state *state = NULL;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina int ret;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina req = tevent_req_callback_data(subreq, struct tevent_req);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina state = tevent_req_data(req, struct sdap_sudo_get_hostinfo_state);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina ret = sdap_sudo_get_hostnames_recv(state, subreq, &state->hostnames);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina talloc_zfree(subreq);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina if (ret != EOK) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE, "Unable to retrieve hostnames [%d]: %s\n",
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov ret, strerror(ret));
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina tevent_req_error(req, ret);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina return;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina }
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina tevent_req_done(req);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina}
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březinaint sdap_sudo_get_hostinfo_recv(TALLOC_CTX *mem_ctx,
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina struct tevent_req *req,
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina char ***hostnames, char ***ip_addr)
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina{
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina struct sdap_sudo_get_hostinfo_state *state = NULL;
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina state = tevent_req_data(req, struct sdap_sudo_get_hostinfo_state);
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina TEVENT_REQ_RETURN_ON_ERROR(req);
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina *hostnames = talloc_steal(mem_ctx, state->hostnames);
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina *ip_addr = talloc_steal(mem_ctx, state->ip_addr);
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina return EOK;
5f73b623fc72e3b9b3590420825f30e618b4d4ddPavel Březina}
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březinastatic int sdap_sudo_get_ip_addresses(TALLOC_CTX *mem_ctx,
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina char ***_ip_addr_list)
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina{
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina TALLOC_CTX *tmp_ctx = NULL;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina char **ip_addr_list = NULL;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina struct ifaddrs *ifaces = NULL;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina struct ifaddrs *iface = NULL;
3bd01976012ac3959f76da3272ce03964b359356Michal Zidek struct sockaddr_in ip4_addr;
3bd01976012ac3959f76da3272ce03964b359356Michal Zidek struct sockaddr_in ip4_network;
3bd01976012ac3959f76da3272ce03964b359356Michal Zidek struct sockaddr_in6 ip6_addr;
3bd01976012ac3959f76da3272ce03964b359356Michal Zidek struct sockaddr_in6 ip6_network;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina char ip_addr[INET6_ADDRSTRLEN + 1];
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina char network_addr[INET6_ADDRSTRLEN + 1];
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina in_addr_t ip4_netmask = 0;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina uint32_t ip6_netmask = 0;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina unsigned int netmask = 0;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina void *sinx_addr = NULL;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina void *sinx_network = NULL;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina int addr_count = 0;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina int ret;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina int i;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina tmp_ctx = talloc_new(NULL);
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina if (tmp_ctx == NULL) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE, "talloc_new() failed\n");
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina return ENOMEM;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina }
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina errno = 0;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina ret = getifaddrs(&ifaces);
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina if (ret == -1) {
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina ret = errno;
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE, "Could not read interfaces [%d][%s]\n",
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov ret, strerror(ret));
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina goto done;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina }
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina for (iface = ifaces; iface != NULL; iface = iface->ifa_next) {
34c222586c1ee4790ce3ff86a2ffb27c666c0662Stef Walter /* Some interfaces don't have an ifa_addr */
34c222586c1ee4790ce3ff86a2ffb27c666c0662Stef Walter if (!iface->ifa_addr) continue;
34c222586c1ee4790ce3ff86a2ffb27c666c0662Stef Walter
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina netmask = 0;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina switch (iface->ifa_addr->sa_family) {
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina case AF_INET:
3bd01976012ac3959f76da3272ce03964b359356Michal Zidek memcpy(&ip4_addr, iface->ifa_addr, sizeof(struct sockaddr_in));
3bd01976012ac3959f76da3272ce03964b359356Michal Zidek memcpy(&ip4_network, iface->ifa_netmask, sizeof(struct sockaddr_in));
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina
3bd01976012ac3959f76da3272ce03964b359356Michal Zidek if (!check_ipv4_addr(&ip4_addr.sin_addr,
3bd01976012ac3959f76da3272ce03964b359356Michal Zidek SSS_NO_LOOPBACK|SSS_NO_MULTICAST
3bd01976012ac3959f76da3272ce03964b359356Michal Zidek |SSS_NO_BROADCAST)) {
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina continue;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina }
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina /* get network mask length */
3bd01976012ac3959f76da3272ce03964b359356Michal Zidek ip4_netmask = ntohl(ip4_network.sin_addr.s_addr);
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina while (ip4_netmask) {
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina netmask++;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina ip4_netmask <<= 1;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina }
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina /* get network address */
3bd01976012ac3959f76da3272ce03964b359356Michal Zidek ip4_network.sin_addr.s_addr = ip4_addr.sin_addr.s_addr
3bd01976012ac3959f76da3272ce03964b359356Michal Zidek & ip4_network.sin_addr.s_addr;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina
3bd01976012ac3959f76da3272ce03964b359356Michal Zidek sinx_addr = &ip4_addr.sin_addr;
3bd01976012ac3959f76da3272ce03964b359356Michal Zidek sinx_network = &ip4_network.sin_addr;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina break;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina case AF_INET6:
3bd01976012ac3959f76da3272ce03964b359356Michal Zidek memcpy(&ip6_addr, iface->ifa_addr, sizeof(struct sockaddr_in6));
3bd01976012ac3959f76da3272ce03964b359356Michal Zidek memcpy(&ip6_network, iface->ifa_netmask, sizeof(struct sockaddr_in6));
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina
3bd01976012ac3959f76da3272ce03964b359356Michal Zidek if (!check_ipv6_addr(&ip6_addr.sin6_addr,
3bd01976012ac3959f76da3272ce03964b359356Michal Zidek SSS_NO_LOOPBACK|SSS_NO_MULTICAST)) {
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina continue;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina }
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina /* get network mask length */
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina for (i = 0; i < 4; i++) {
3bd01976012ac3959f76da3272ce03964b359356Michal Zidek ip6_netmask = ntohl(((uint32_t*)(&ip6_network.sin6_addr))[i]);
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina while (ip6_netmask) {
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina netmask++;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina ip6_netmask <<= 1;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina }
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina }
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina /* get network address */
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina for (i = 0; i < 4; i++) {
3bd01976012ac3959f76da3272ce03964b359356Michal Zidek ((uint32_t*)(&ip6_network.sin6_addr))[i] =
3bd01976012ac3959f76da3272ce03964b359356Michal Zidek ((uint32_t*)(&ip6_addr.sin6_addr))[i]
3bd01976012ac3959f76da3272ce03964b359356Michal Zidek & ((uint32_t*)(&ip6_network.sin6_addr))[i];
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina }
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina
3bd01976012ac3959f76da3272ce03964b359356Michal Zidek sinx_addr = &ip6_addr.sin6_addr;
3bd01976012ac3959f76da3272ce03964b359356Michal Zidek sinx_network = &ip6_network.sin6_addr;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina break;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina default:
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina /* skip other families */
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina continue;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina }
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina /* ip address */
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina errno = 0;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina if (inet_ntop(iface->ifa_addr->sa_family, sinx_addr,
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina ip_addr, INET6_ADDRSTRLEN) == NULL) {
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina ret = errno;
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_MINOR_FAILURE, "inet_ntop() failed [%d]: %s\n",
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov ret, strerror(ret));
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina goto done;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina }
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina /* network */
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina errno = 0;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina if (inet_ntop(iface->ifa_addr->sa_family, sinx_network,
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina network_addr, INET6_ADDRSTRLEN) == NULL) {
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina ret = errno;
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_MINOR_FAILURE, "inet_ntop() failed [%d]: %s\n",
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov ret, strerror(ret));
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina goto done;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina }
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina addr_count += 2;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina ip_addr_list = talloc_realloc(tmp_ctx, ip_addr_list, char*,
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina addr_count + 1);
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina if (ip_addr_list == NULL) {
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina ret = ENOMEM;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina goto done;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina }
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina ip_addr_list[addr_count - 2] = talloc_strdup(ip_addr_list, ip_addr);
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina if (ip_addr_list[addr_count - 2] == NULL) {
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina ret = ENOMEM;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina goto done;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina }
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina ip_addr_list[addr_count - 1] = talloc_asprintf(ip_addr_list, "%s/%d",
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina network_addr, netmask);
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina if (ip_addr_list[addr_count - 1] == NULL) {
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina ret = ENOMEM;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina goto done;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina }
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina DEBUG(SSSDBG_TRACE_INTERNAL,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "Found IP address: %s in network %s/%d\n",
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov ip_addr, network_addr, netmask);
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina }
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina
d6133b04d4ee47f147db26cd732ea5d209af5b8eStephen Gallagher if (ip_addr_list) {
d6133b04d4ee47f147db26cd732ea5d209af5b8eStephen Gallagher ip_addr_list[addr_count] = NULL;
d6133b04d4ee47f147db26cd732ea5d209af5b8eStephen Gallagher }
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina *_ip_addr_list = talloc_steal(mem_ctx, ip_addr_list);
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březinadone:
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina freeifaddrs(ifaces);
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina talloc_free(tmp_ctx);
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina return ret;
468f1c8d4763a65f24ab8d7523a5291ef6320db7Pavel Březina}
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina/*
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina * SUDO allows only one hostname that is returned from gethostname()
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina * (and set to "localhost" if the returned value is empty)
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina * and then - if allowed - resolves its fqdn using gethostbyname() or
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina * getaddrinfo() if available.
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina */
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březinastatic struct tevent_req *sdap_sudo_get_hostnames_send(TALLOC_CTX *mem_ctx,
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina struct be_ctx *be_ctx)
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina{
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina struct tevent_req *req = NULL;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina struct tevent_req *subreq = NULL;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina struct sdap_sudo_get_hostnames_state *state = NULL;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina char *dot = NULL;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina char hostname[HOST_NAME_MAX + 1];
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina int ret;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina req = tevent_req_create(mem_ctx, &state,
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina struct sdap_sudo_get_hostnames_state);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina if (req == NULL) {
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina return NULL;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina }
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina state->ev = be_ctx->ev;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina state->hostnames = NULL;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina /* hostname, fqdn and NULL */
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina state->hostnames = talloc_zero_array(state, char*, 3);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina if (state->hostnames == NULL) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE, "talloc_zero_array() failed\n");
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina ret = ENOMEM;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina goto done;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina }
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina /* get hostname */
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina errno = 0;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina ret = gethostname(hostname, HOST_NAME_MAX);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina if (ret != EOK) {
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina ret = errno;
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE, "Unable to retrieve machine hostname "
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "[%d]: %s\n", ret, strerror(ret));
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina goto done;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina }
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina hostname[HOST_NAME_MAX] = '\0';
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina state->hostnames[0] = talloc_strdup(state->hostnames, hostname);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina if (state->hostnames[0] == NULL) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE, "talloc_strdup() failed\n");
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina ret = ENOMEM;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina goto done;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina }
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina dot = strchr(hostname, '.');
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina if (dot != NULL) {
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina /* already a fqdn, determine hostname and finish */
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_TRACE_INTERNAL, "Found fqdn: %s\n", hostname);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina *dot = '\0';
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_TRACE_INTERNAL, "Found hostname: %s\n", hostname);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina state->hostnames[1] = talloc_strdup(state->hostnames, hostname);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina if (state->hostnames[1] == NULL) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE, "talloc_strdup() failed\n");
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina ret = ENOMEM;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina goto done;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina }
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina ret = EOK;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina goto done;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina } else {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_TRACE_INTERNAL, "Found hostname: %s\n", hostname);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina }
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
44fc7e53b403d45576ab61d2dea4608e323ed332Jakub Hrozek state->resolv_ctx = be_ctx->be_res->resolv;
44fc7e53b403d45576ab61d2dea4608e323ed332Jakub Hrozek state->host_db = default_host_dbs;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina /* get fqdn */
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina subreq = resolv_gethostbyname_send(state, state->ev, state->resolv_ctx,
584eda085e83a428f2c39dadf0d7adeaff5c87f4Jakub Hrozek hostname, be_ctx->be_res->family_order,
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina state->host_db);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina if (subreq == NULL) {
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina ret = ENOMEM;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina goto done;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina }
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina tevent_req_set_callback(subreq, sdap_sudo_get_hostnames_done, req);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina ret = EAGAIN;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březinadone:
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina if (ret != EAGAIN) {
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina if (ret == EOK) {
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina tevent_req_done(req);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina } else {
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina tevent_req_error(req, ret);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina }
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina tevent_req_post(req, be_ctx->ev);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina }
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina return req;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina}
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březinastatic void sdap_sudo_get_hostnames_done(struct tevent_req *subreq)
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina{
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina struct tevent_req *req = NULL;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina struct sdap_sudo_get_hostnames_state *state = NULL;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina struct resolv_hostent *rhostent = NULL;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina int resolv_status;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina int ret;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina req = tevent_req_callback_data(subreq, struct tevent_req);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina state = tevent_req_data(req, struct sdap_sudo_get_hostnames_state);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina ret = resolv_gethostbyname_recv(subreq, state, &resolv_status, NULL,
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina &rhostent);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina talloc_zfree(subreq);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina if (ret == ENOENT) {
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina /* Empty result, just quit */
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_TRACE_INTERNAL, "No hostent found\n");
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina goto done;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina } else if (ret != EOK) {
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina DEBUG(SSSDBG_OP_FAILURE,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "Could not resolve fqdn for this machine, error [%d]: %s, "
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina "resolver returned: [%d]: %s\n", ret, strerror(ret),
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov resolv_status, resolv_strerror(resolv_status));
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina tevent_req_error(req, ret);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina return;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina }
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina /* EOK */
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_TRACE_INTERNAL, "Found fqdn: %s\n", rhostent->name);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina if (state->hostnames == NULL) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE, "state->hostnames is NULL\n");
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina ret = EINVAL;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina goto done;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina }
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina state->hostnames[1] = talloc_strdup(state->hostnames, rhostent->name);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina if (state->hostnames[1] == NULL) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE, "talloc_strdup() failed\n");
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina ret = ENOMEM;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina goto done;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina }
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina ret = EOK;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březinadone:
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina if (ret == EOK) {
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina tevent_req_done(req);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina } else {
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina tevent_req_error(req, ret);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina }
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina}
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březinastatic int sdap_sudo_get_hostnames_recv(TALLOC_CTX *mem_ctx,
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina struct tevent_req *req,
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina char ***hostnames)
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina{
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina struct sdap_sudo_get_hostnames_state *state = NULL;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina state = tevent_req_data(req, struct sdap_sudo_get_hostnames_state);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina TEVENT_REQ_RETURN_ON_ERROR(req);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina *hostnames = talloc_steal(mem_ctx, state->hostnames);
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina return EOK;
fbaaa993eff7ef1ed5a62c38d6cdacd52a53d2d8Pavel Březina}