X-Git-Url: https://uglyman.kremlin.cc/gitweb/gitweb.cgi?a=blobdiff_plain;f=src%2Finterfaces%2Fhostnamed%2Fhostnamed.c;h=2fa5d7c617f76e8fb4f67308fdfcc7efe37ad511;hb=5fcfacccdc7187118fe4410a2edbe1eeab778831;hp=0e5c93c4c681e21dd8c7a8ebb1e982a677958a29;hpb=2e337f4639545d3b389ad84669449df8186decb1;p=systembsd.git diff --git a/src/interfaces/hostnamed/hostnamed.c b/src/interfaces/hostnamed/hostnamed.c index 0e5c93c..2fa5d7c 100644 --- a/src/interfaces/hostnamed/hostnamed.c +++ b/src/interfaces/hostnamed/hostnamed.c @@ -79,9 +79,9 @@ GMainLoop *hostnamed_loop; guint bus_descriptor; gboolean dbus_interface_exported; /* reliable because of gdbus operational guarantees */ +gchar *HOSTNAME, *STATIC_HOSTNAME, *PRETTY_HOSTNAME; gchar *CHASSIS, *ICON; -gchar *OS_CPENAME; -gchar *KERN_NAME, *KERN_RELEASE, *KERN_VERS; +gchar *KERN_NAME, *KERN_RELEASE, *KERN_VERS, *OS_CPENAME; /* TODO no specific vm or laptop icon in gnome * NOTE paravirtualization on xen is only available for linuxes right now @@ -110,12 +110,41 @@ const gchar *server_archs[] = { /* --- begin method/property/dbus signal code --- */ +/* TODO the extra boolean passed to these funcs is for policykit auth */ +/* TODO complete call with error, message, etc */ static gboolean on_handle_set_hostname(Hostname1 *hn1_passed_interf, GDBusMethodInvocation *invoc, const gchar *greet, gpointer data) { - return FALSE; + GVariant *params; + gchar *proposed_hostname, *valid_hostname_buf; + gboolean policykit_auth, ret; + size_t check_length, bad_length; + + bad_length = MAXHOSTNAMELEN + 1; + proposed_hostname = NULL; + ret = FALSE; + + params = g_dbus_method_invocation_get_parameters(invoc); + g_variant_get(params, "(sb)", &proposed_hostname, &policykit_auth); + + if(proposed_hostname && (valid_hostname_buf = g_hostname_to_ascii(proposed_hostname))) { + + check_length = strnlen(proposed_hostname, bad_length); + + if(check_length < bad_length && !sethostname(proposed_hostname, check_length)) + ret = TRUE; + } + + hostname1_complete_set_hostname(hn1_passed_interf, invoc); + + if(proposed_hostname) + g_free(proposed_hostname); + if(valid_hostname_buf) + g_free(valid_hostname_buf); + + return ret; } static gboolean @@ -159,7 +188,7 @@ on_handle_set_icon_name(Hostname1 *hn1_passed_interf, const gchar * our_get_hostname() { - gchar *hostname_buf, *ret; + /*gchar *hostname_buf, *ret; size_t hostname_divider; hostname_buf = (gchar*) g_malloc0(MAXHOSTNAMELEN); @@ -173,13 +202,18 @@ our_get_hostname() { hostname_divider = strcspn(hostname_buf, "."); - return strncpy(ret, hostname_buf, hostname_divider); + return strncpy(ret, hostname_buf, hostname_divider);*/ + + if(HOSTNAME) + return HOSTNAME; + + return "localhost"; } const gchar * our_get_static_hostname() { - const gchar *pretty_hostname; + /*const gchar *pretty_hostname; const gchar *ret; pretty_hostname = our_get_pretty_hostname(); @@ -193,19 +227,26 @@ our_get_static_hostname() { return ret; } - return ret; + return ret;*/ + + if(STATIC_HOSTNAME) + return STATIC_HOSTNAME; + else if(HOSTNAME) + return HOSTNAME; + + return "localhost"; } const gchar * our_get_pretty_hostname() { - GKeyFile *config; + /*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 */ + && (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; @@ -214,6 +255,11 @@ our_get_pretty_hostname() { if(config) g_free(config); + return "";*/ + + if(PRETTY_HOSTNAME) + return PRETTY_HOSTNAME; + return ""; } @@ -223,7 +269,7 @@ our_get_chassis() { if(CHASSIS) return CHASSIS; - return "desktop"; + return "desktop"; /* this leads to the most generic beheivor in the unlikely case its returned */ } const gchar *