aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkremlin <kremlin@juliana.home.network>2014-08-25 09:47:58 +0800
committerkremlin <kremlin@juliana.home.network>2014-08-25 09:47:58 +0800
commitdf8fc34169ec6b61b9695700e61687b27ad89958 (patch)
tree400b2717b410b896849aa13d6e28b81c02c68009
parentfdc85a01566e858b6706610351238145f56f8f05 (diff)
downloadsystembsd-df8fc34169ec6b61b9695700e61687b27ad89958.tar
systembsd-df8fc34169ec6b61b9695700e61687b27ad89958.tar.gz
systembsd-df8fc34169ec6b61b9695700e61687b27ad89958.tar.bz2
systembsd-df8fc34169ec6b61b9695700e61687b27ad89958.tar.lz
systembsd-df8fc34169ec6b61b9695700e61687b27ad89958.tar.xz
systembsd-df8fc34169ec6b61b9695700e61687b27ad89958.tar.zst
systembsd-df8fc34169ec6b61b9695700e61687b27ad89958.zip
add get_bsd_hostname() and has_domain()
get_bsd_hostname takes a string and returns a proper FQDN to be written to /etc/myname or NULL if the passed string is unsalvagable. if passed string does not contain a domain, the current domain from /etc/myname is used. if /etc/myname does not contain a trailing domain, an error message is printed and the default (".home.network") is used.
-rw-r--r--src/interfaces/hostnamed/hostnamed.c104
-rw-r--r--src/interfaces/hostnamed/hostnamed.h2
2 files changed, 105 insertions, 1 deletions
diff --git a/src/interfaces/hostnamed/hostnamed.c b/src/interfaces/hostnamed/hostnamed.c
index 0f4af9a..f6543e6 100644
--- a/src/interfaces/hostnamed/hostnamed.c
+++ b/src/interfaces/hostnamed/hostnamed.c
@@ -110,6 +110,9 @@ const gchar *server_archs[] = {
"sparc64"
};
+static const gchar *DEFAULT_DOMAIN = ".home.network";
+static const gchar *OS_HOSTNAME_PATH = "/etc/myname";
+
/* --- begin method/property/dbus signal code --- */
/* TODO free some strings here */
@@ -745,6 +748,8 @@ int main() {
/* TODO: check for valid, writable config at init. if no, complain to `make install` */
+ get_bsd_hostname("adsf"); /* TODO KILL ME */
+
CHASSIS = ICON = OS_CPENAME = 0;
KERN_NAME = KERN_RELEASE = KERN_VERS = 0;
HOSTNAME = STATIC_HOSTNAME = PRETTY_HOSTNAME = NULL;
@@ -1022,4 +1027,101 @@ static gboolean is_valid_chassis_type(gchar *test) {
return TRUE;
return FALSE;
-}
+}
+
+/* returns a proper, bsd-style FQDN hostname safe to write to /etc/myname
+ * if proposed_hostname does not contain an appended domain, the one in /etc/myname is substituted.
+ * failing that, DEFAULT_DOMAIN is used. NULL if proposed_hostname is invalid
+ * returns string that should be g_free()'d, or NULL if passed an invalid hostname */
+static gchar *get_bsd_hostname(gchar *proposed_hostname) {
+
+ gchar *bsd_hostname, *ascii_translated_hostname, **myname_contents, *passed_domain, *temp_buf;
+ size_t domain_len, check_len;
+ gboolean read_result;
+
+ g_strdelimit(proposed_hostname, "`~!@#$%^&*()_=+[{]}|:;'\"\\", '-');
+
+ ascii_translated_hostname = g_hostname_to_ascii(proposed_hostname);
+ check_len = strnlen(ascii_translated_hostname, MAXHOSTNAMELEN);
+
+ if(!ascii_translated_hostname || !check_len || check_len > MAXHOSTNAMELEN || !g_strcmp0("", ascii_translated_hostname) || !g_strcmp0(".", ascii_translated_hostname)) {
+
+ bsd_hostname = NULL;
+ passed_domain = NULL;
+ myname_contents = NULL;
+
+ } else if((passed_domain = has_domain(ascii_translated_hostname))) {
+
+ bsd_hostname = (gchar *) g_malloc0(MAXHOSTNAMELEN);
+ g_strlcpy(bsd_hostname, ascii_translated_hostname, MAXHOSTNAMELEN);
+
+ passed_domain = NULL;
+ myname_contents = NULL;
+
+ } else {
+
+ myname_contents = (gchar **) g_malloc0(MAXHOSTNAMELEN * 2);
+ read_result = g_file_get_contents(OS_HOSTNAME_PATH, myname_contents, NULL, NULL);
+
+ if(read_result && (passed_domain = has_domain(myname_contents[0]))) {
+
+ domain_len = strnlen(passed_domain, MAXHOSTNAMELEN);
+
+ if((domain_len + check_len) > MAXHOSTNAMELEN)
+ bsd_hostname = NULL;
+ else
+ bsd_hostname = g_strconcat(ascii_translated_hostname, passed_domain, NULL);
+
+ } else if(myname_contents[0]) {
+
+ g_printf("%s does not contain a proper FQDN! this is a significant error on BSD machines, otherwise OK.\nfalling back to default domain, '%s'\n", OS_HOSTNAME_PATH, DEFAULT_DOMAIN);
+
+ domain_len = strnlen(DEFAULT_DOMAIN, MAXHOSTNAMELEN);
+
+ if((domain_len + check_len) > MAXHOSTNAMELEN)
+ bsd_hostname = NULL;
+ else
+ bsd_hostname = g_strconcat(ascii_translated_hostname, DEFAULT_DOMAIN, NULL);
+
+ } else {
+
+ g_printf("could not read hostname at %s, this is a major error\n", OS_HOSTNAME_PATH);
+ bsd_hostname = NULL;
+ passed_domain = (gchar *) g_malloc0(MAXHOSTNAMELEN);
+ }
+ }
+
+ if(passed_domain)
+ g_free(passed_domain);
+ if(myname_contents)
+ g_free(myname_contents);
+
+ if(bsd_hostname && !strchr(bsd_hostname, '\n')) {
+
+ temp_buf = bsd_hostname;
+ bsd_hostname = g_strconcat(bsd_hostname, "\n", NULL);
+ g_free(temp_buf);
+ }
+
+ return bsd_hostname;
+}
+
+/* returns NULL if no domain, otherwise append-appropriate domain string you must g_free()
+ * i.e. has_domain("foo.bar.com") returns ".bar.com"
+ * only pass g_hostname_to_ascii'd strings */
+static gchar *has_domain(const gchar *test) {
+
+ size_t hostname_len, full_len;
+ gchar *ret;
+
+ hostname_len = strcspn(test, ".");
+ full_len = strnlen(test, MAXHOSTNAMELEN);
+
+ if(full_len == hostname_len)
+ return NULL;
+
+ ret = (gchar *) g_malloc0(MAXHOSTNAMELEN);
+ g_strlcpy(ret, &test[hostname_len], MAXHOSTNAMELEN);
+
+ return ret;
+}
diff --git a/src/interfaces/hostnamed/hostnamed.h b/src/interfaces/hostnamed/hostnamed.h
index c79b57a..a4dbc0b 100644
--- a/src/interfaces/hostnamed/hostnamed.h
+++ b/src/interfaces/hostnamed/hostnamed.h
@@ -27,3 +27,5 @@ gboolean is_server(gchar *arch);
gboolean set_uname_properties();
gboolean set_names();
static gboolean is_valid_chassis_type(gchar *test);
+static gchar *get_bsd_hostname(gchar *proposed_hostname);
+static gchar *has_domain(const gchar *test);