-// Copyright (C) 2011-2014 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2011-2015 Internet Systems Consortium, Inc. ("ISC")
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
} else if (label_count == 2) {
// If there are two labels, it means that the client has specified
// the unqualified name. We have to concatenate the unqalified name
- // with the domain name.
- opt_hostname_resp->setValue(d2_mgr.qualifyName(hostname,false));
+ // with the domain name. The false value passed as a second argument
+ // indicates that the trailing dot should not be appended to the
+ // hostname. We don't want to append the trailing dot because
+ // we don't know whether the hostname is partial or not and some
+ // clients do not handle the hostnames with the trailing dot.
+ opt_hostname_resp->setValue(d2_mgr.qualifyName(hostname, false));
}
answer->addOption(opt_hostname_resp);
// hostname is empty, it means that server is responsible for
// generating the entire hostname for the client. The example of the
// client's name, generated from the IP address is: host-192-0-2-3.
- if ((fqdn || opt_hostname) && lease->hostname_.empty()) {
- if(fqdn) {
- lease->hostname_ = CfgMgr::instance().getD2ClientMgr().generateFqdn(lease->addr_,true);
- }
- if(opt_hostname) {
- lease->hostname_ = CfgMgr::instance().getD2ClientMgr().generateFqdn(lease->addr_,false);
- }
+ if ((fqdn || opt_hostname) && lease->hostname_.empty()) {
+ // Note that if we have received the hostname option, rather than
+ // Client FQDN the trailing dot is not appended to the generated
+ // hostname because some clients don't handle the trailing dot in
+ // the hostname. Whether the trailing dot is appended or not is
+ // controlled by the second argument to the generateFqdn().
+ lease->hostname_ = CfgMgr::instance().getD2ClientMgr()
+ .generateFqdn(lease->addr_, static_cast<bool>(fqdn));
+
// The operations below are rather safe, but we want to catch
// any potential exceptions (e.g. invalid lease database backend
// implementation) and log an error.
-// Copyright (C) 2011-2014 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2011-2015 Internet Systems Consortium, Inc. ("ISC")
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
// Get the IPv6 address acquired by the client.
IOAddress addr = iaaddr->getAddress();
std::string generated_name =
- CfgMgr::instance().getD2ClientMgr().generateFqdn(addr,true);
+ CfgMgr::instance().getD2ClientMgr().generateFqdn(addr);
try {
// The lease has been acquired but the FQDN for this lease hasn't
// been updated in the lease database. We now have new FQDN
-// Copyright (C) 2014 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2014-2015 Internet Systems Consortium, Inc. ("ISC")
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
}
std::string
-D2ClientMgr::generateFqdn(const asiolink::IOAddress& address, bool appendDot) const {
+D2ClientMgr::generateFqdn(const asiolink::IOAddress& address,
+ const bool trailing_dot) const {
std::string hostname = address.toText();
std::replace(hostname.begin(), hostname.end(),
(address.isV4() ? '.' : ':'), '-');
std::ostringstream gen_name;
gen_name << d2_client_config_->getGeneratedPrefix() << "-" << hostname;
- return (qualifyName(gen_name.str(),appendDot));
+ return (qualifyName(gen_name.str(), trailing_dot));
}
std::string
-D2ClientMgr::qualifyName(const std::string& partial_name, bool appendDot) const {
+D2ClientMgr::qualifyName(const std::string& partial_name,
+ const bool trailing_dot) const {
std::ostringstream gen_name;
gen_name << partial_name << "." << d2_client_config_->getQualifyingSuffix();
std::string str = gen_name.str();
size_t len = str.length();
- //unless it's forced, will append trailing dot
- if(appendDot) {
- // Tack on a trailing dot in case suffix doesn't have one.
- if ((len > 0) && (str[len - 1] != '.')) {
- gen_name << ".";
- }
+
+ if(trailing_dot) {
+ // If trailing dot should be added but there is no trailing dot,
+ // append it.
+ if ((len > 0) && (str[len - 1] != '.')) {
+ gen_name << ".";
+ }
+
} else {
- //if a call with appendDot is false, remove the dot if exists
- if ((len > 0) && (str[len - 1] == '.')) {
- gen_name.str(str.substr(0,len-1));
- }
+ // If the trailing dot should not be appended but it is present,
+ // remove it.
+ if ((len > 0) && (str[len - 1] == '.')) {
+ gen_name.str(str.substr(0,len-1));
+ }
+
}
return (gen_name.str());
}
-
-
void
D2ClientMgr::startSender(D2ClientErrorHandler error_handler) {
if (amSending()) {
/// ('.' for IPv4 or ':' for IPv6) replaced with a hyphen, '-'.
///
/// @param address IP address from which to derive the name (IPv4 or IPv6)
- /// @param appendDot wether if a trailing dot should be appended or not
+ /// @param trailing_dot A boolean value which indicates whether trailing
+ /// dot should be appended (if true) or not (false).
///
/// @return std::string containing the generated name.
- std::string generateFqdn(const asiolink::IOAddress& address, bool appendDot) const;
+ std::string generateFqdn(const asiolink::IOAddress& address,
+ const bool trailing_dot = true) const;
/// @brief Adds a qualifying suffix to a given domain name
///
/// a partial domain name as follows:
///
/// <partial_name>.<qualifying-suffix>.
- /// Note it will add a trailing '.' should qualifying-suffix not end with
- /// one.
///
/// @param partial_name domain name to qualify
- /// @param appendDot wether if a trailing dot should be appended or not
+ /// @param trailing_dot A boolean value which indicates whether trailing
+ /// dot should be appended (if true) or not (false).
///
/// @return std::string containing the qualified name.
- std::string qualifyName(const std::string& partial_name, bool appendDot) const;
+ std::string qualifyName(const std::string& partial_name,
+ const bool trailing_dot) const;
/// @brief Set server FQDN flags based on configuration and a given FQDN
///