//
// aegis - project change supervisor
// Copyright (C) 2004-2006, 2008, 2009, 2012 Peter Miller
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3 of the License, or
// (at your option) any later version.
//
// This program 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see
// .
//
#include
#include
#include
#include
#include
static bool
is_a_valid_domain_string(const nstring &candidate)
{
if (candidate.empty())
return false;
const char *s = candidate.c_str();
int numdots = 0;
unsigned char state = '.';
for (;;)
{
unsigned char c = *s++;
switch (c)
{
case 0:
return (state == 0 && numdots != 0);
case '.':
if (state == '.')
return false;
state = '.';
++numdots;
break;
case '0': case '1': case '2': case '3': case '4': case '5':
case '6': case '7': case '8': case '9':
case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n':
case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u':
case 'v': case 'w': case 'x': case 'y': case 'z':
case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G':
case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N':
case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U':
case 'V': case 'W': case 'X': case 'Y': case 'Z':
case '=':
state = 0;
break;
default:
return false;
}
}
}
static bool
try_etc_mailname(nstring &result)
{
bool ok = false;
nstring mailname("/etc/mailname");
os_become_orig();
if (os_exists(mailname.get_ref()))
{
result = read_whole_file(mailname);
ok = is_a_valid_domain_string(result);
}
os_become_undo();
return ok;
}
static nstring
run_a_command(const char *cmd)
{
nstring temp_file_name(os_edit_filename(0));
nstring command(nstring(cmd) + " > " + temp_file_name + " 2> /dev/null");
os_become_orig();
nstring dir(os_curdir());
int exit_status =
os_execute_retcode
(
command.get_ref(),
OS_EXEC_FLAG_SILENT,
dir.get_ref()
);
nstring result;
if (exit_status == 0)
result = read_whole_file(temp_file_name);
os_unlink_errok(temp_file_name);
os_become_undo();
return result;
}
static bool
try_a_command(const char *cmd, nstring &result)
{
result = run_a_command(cmd);
return is_a_valid_domain_string(result);
}
static bool
try_hostname_d(nstring &result)
{
return try_a_command("hostname -d", result);
}
static bool
try_hostname_fqdn(nstring &result)
{
result = run_a_command("hostname");
const char *dot = strchr(result.c_str(), '.');
if (!dot)
return false;
result = nstring(dot + 1);
return is_a_valid_domain_string(result);
}
static bool
try_dnsdomainname(nstring &result)
{
return try_a_command("dnsdomainname", result);
}
static bool
try_domainname(nstring &result)
{
return try_a_command("domainname", result);
}
nstring
os_domain_name(void)
{
static nstring cached_answer;
if (cached_answer.size() == 0)
{
if
(
!try_etc_mailname(cached_answer)
&&
!try_hostname_d(cached_answer)
&&
!try_hostname_fqdn(cached_answer)
&&
!try_dnsdomainname(cached_answer)
&&
!try_domainname(cached_answer)
)
cached_answer = nstring(uname_node_get());
}
return cached_answer;
}
// vim: set ts=8 sw=4 et :