X-Git-Url: https://uglyman.kremlin.cc/gitweb/gitweb.cgi?p=systembsd.git;a=blobdiff_plain;f=src%2Finterfaces%2Fhostnamed%2Fhostnamed.c;h=7d2fbc60785926bbf891d6d32ddfa6b191c43b1d;hp=2fa5d7c617f76e8fb4f67308fdfcc7efe37ad511;hb=3ccecdd66ce8503f958d2bd34abca7219a13b14d;hpb=19c6b83ddaa85bbeb53b95cc5c5710aa82ef7499 diff --git a/src/interfaces/hostnamed/hostnamed.c b/src/interfaces/hostnamed/hostnamed.c index 2fa5d7c..7d2fbc6 100644 --- a/src/interfaces/hostnamed/hostnamed.c +++ b/src/interfaces/hostnamed/hostnamed.c @@ -29,7 +29,7 @@ #include #include -/* #include */ +#include #include "hostnamed-gen.h" #include "hostnamed.h" @@ -120,9 +120,8 @@ on_handle_set_hostname(Hostname1 *hn1_passed_interf, GVariant *params; gchar *proposed_hostname, *valid_hostname_buf; gboolean policykit_auth, ret; - size_t check_length, bad_length; + size_t check_length; - bad_length = MAXHOSTNAMELEN + 1; proposed_hostname = NULL; ret = FALSE; @@ -131,14 +130,22 @@ on_handle_set_hostname(Hostname1 *hn1_passed_interf, if(proposed_hostname && (valid_hostname_buf = g_hostname_to_ascii(proposed_hostname))) { - check_length = strnlen(proposed_hostname, bad_length); + check_length = strnlen(proposed_hostname, MAXHOSTNAMELEN + 1); - if(check_length < bad_length && !sethostname(proposed_hostname, check_length)) - ret = TRUE; - } + if(check_length > MAXHOSTNAMELEN) + g_dbus_method_invocation_return_dbus_error(invoc, "org.freedesktop.hostname1.Error.ENAMETOOLONG", "Hostname string exceeded maximum length."); - hostname1_complete_set_hostname(hn1_passed_interf, invoc); + else if(sethostname(proposed_hostname, check_length)) + g_dbus_method_invocation_return_dbus_error(invoc, "org.freedesktop.hostname1.Error.EACCES", "Insufficient permissions to change hostname."); + else { + HOSTNAME = proposed_hostname; + hostname1_set_hostname(hn1_passed_interf, HOSTNAME); + ret = TRUE; + hostname1_complete_set_hostname(hn1_passed_interf, invoc); + } + } + if(proposed_hostname) g_free(proposed_hostname); if(valid_hostname_buf) @@ -188,75 +195,39 @@ on_handle_set_icon_name(Hostname1 *hn1_passed_interf, const gchar * our_get_hostname() { - /*gchar *hostname_buf, *ret; - size_t hostname_divider; - - hostname_buf = (gchar*) g_malloc0(MAXHOSTNAMELEN); - ret = (gchar*) g_malloc0(MAXHOSTNAMELEN); + gchar *hostname_buf; + hostname_buf = (gchar *)g_malloc0(MAXHOSTNAMELEN); - g_ptr_array_add(hostnamed_freeable, hostname_buf); - g_ptr_array_add(hostnamed_freeable, ret); - - if(gethostname(hostname_buf, MAXHOSTNAMELEN) || g_strcmp0(hostname_buf, "") == 0) - return "localhost"; - - hostname_divider = strcspn(hostname_buf, "."); - - return strncpy(ret, hostname_buf, hostname_divider);*/ + if(gethostname(hostname_buf, MAXHOSTNAMELEN)) + return "localhost.home.network"; /* TODO bomb out here probably */ + + else if(!g_strcmp0(HOSTNAME, hostname_buf)) { - if(HOSTNAME) + g_free(hostname_buf); return HOSTNAME; + } - return "localhost"; + g_ptr_array_add(hostnamed_freeable, hostname_buf); + HOSTNAME = hostname_buf; + hostname1_set_hostname(hostnamed_interf, HOSTNAME); + + return HOSTNAME; } const gchar * our_get_static_hostname() { - /*const gchar *pretty_hostname; - const gchar *ret; - - pretty_hostname = our_get_pretty_hostname(); - - if(g_strcmp0(pretty_hostname, "") == 0) - ret = our_get_hostname(); - - else if((ret = g_hostname_to_ascii(pretty_hostname))) { - - g_ptr_array_add(hostnamed_freeable, (gpointer)ret); - return ret; - } - - return ret;*/ - - if(STATIC_HOSTNAME) + if(STATIC_HOSTNAME && g_strcmp0(STATIC_HOSTNAME, "")) return STATIC_HOSTNAME; else if(HOSTNAME) return HOSTNAME; - return "localhost"; + return "localhost.home.network"; } const gchar * our_get_pretty_hostname() { - /*GKeyFile *config; - gchar *ret; - - config = g_key_file_new(); - - if(g_key_file_load_from_file(config, "/etc/systemd_compat.conf", G_KEY_FILE_NONE, NULL) - && (ret = g_key_file_get_value(config, "hostnamed", "PrettyHostname", NULL))) { ret might need to be freed, docs dont specify but i am suspicious - - g_key_file_unref(config); - return ret; - } - - if(config) - g_free(config); - - return "";*/ - if(PRETTY_HOSTNAME) return PRETTY_HOSTNAME; @@ -431,13 +402,14 @@ int main() { CHASSIS = ICON = OS_CPENAME = 0; KERN_NAME = KERN_RELEASE = KERN_VERS = 0; + HOSTNAME = STATIC_HOSTNAME = PRETTY_HOSTNAME = NULL; set_signal_handlers(); - if(!determine_chassis_and_icon() || !set_uname_properties()) + if(!determine_chassis_and_icon() || !set_uname_properties() || !set_names()) return 1; - hostnamed_loop = g_main_loop_new(NULL, TRUE); + hostnamed_loop = g_main_loop_new(NULL, TRUE); bus_descriptor = g_bus_own_name(G_BUS_TYPE_SYSTEM, "org.freedesktop.hostname1", @@ -461,6 +433,54 @@ int main() { return 0; } +gboolean set_names() { + + /* (1) set up */ + gchar *hostname_buf, *static_hostname_buf, *pretty_hostname_buf; + GKeyFile *config; + size_t hostname_divider; + + hostname_buf = (gchar*) g_malloc0(MAXHOSTNAMELEN); + static_hostname_buf = (gchar*) g_malloc0(4096); + pretty_hostname_buf = (gchar*) g_malloc0(4096); + + config = g_key_file_new(); + + g_ptr_array_add(hostnamed_freeable, hostname_buf); + g_ptr_array_add(hostnamed_freeable, static_hostname_buf); + g_ptr_array_add(hostnamed_freeable, pretty_hostname_buf); + + /* (2) set HOSTNAME */ + if(gethostname(hostname_buf, MAXHOSTNAMELEN) || !g_strcmp0(hostname_buf, "")) + HOSTNAME = "localhost"; + + HOSTNAME = hostname_buf; + + /* this bit gets you the /etc/myname style hostname + hostname_divider = strcspn(hostname_buf, "."); + strncpy(ret, hostname_buf, hostname_divider); */ + + /* (3) set PRETTY_HOSTNAME */ + if(g_key_file_load_from_file(config, "/etc/systemd_compat.conf", G_KEY_FILE_NONE, NULL) + && (pretty_hostname_buf = g_key_file_get_value(config, "hostnamed", "PrettyHostname", NULL))) + PRETTY_HOSTNAME = pretty_hostname_buf; + else + PRETTY_HOSTNAME = ""; + + if(config) + g_key_file_unref(config); + + /* (4) set STATIC_HOSTNAME */ + if(!g_strcmp0(PRETTY_HOSTNAME, "")) + STATIC_HOSTNAME = HOSTNAME; + + else if((static_hostname_buf = g_hostname_to_ascii(PRETTY_HOSTNAME))) + STATIC_HOSTNAME = static_hostname_buf; + + return (HOSTNAME && STATIC_HOSTNAME && PRETTY_HOSTNAME) ? TRUE : FALSE; + +} + gboolean set_uname_properties() { struct utsname un;