X-Git-Url: https://uglyman.kremlin.cc/gitweb/gitweb.cgi?p=systembsd.git;a=blobdiff_plain;f=src%2Finterfaces%2Fhostnamed%2Fhostnamed.c;h=c9f1b4d44e207f1997eb8ba901ff02a960171a24;hp=fae193ebd972ab79ed0f51d903878f8ed74239d4;hb=46835f3eef54d2011ad51d9bef58b35d811c188b;hpb=68e777c60747f9701ff48e0135c4a5bb08ad0acc diff --git a/src/interfaces/hostnamed/hostnamed.c b/src/interfaces/hostnamed/hostnamed.c index fae193e..c9f1b4d 100644 --- a/src/interfaces/hostnamed/hostnamed.c +++ b/src/interfaces/hostnamed/hostnamed.c @@ -23,6 +23,7 @@ #include #include #include +#include #include @@ -33,7 +34,6 @@ #include "hostnamed-gen.h" #include "hostnamed.h" -/* add any sysctl strings that suggest virtualization here */ /* format: { * (1) string to be matched against runtime machine's sysctl output. * can be either the exact string or a substring contained @@ -79,22 +79,27 @@ 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 *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 * dmesg on linux systems reveals xen and virtualization method (HVM or PVM) * but we will worry about those later */ + +/* add any sysctl strings that suggest virtualization here */ const struct SYSCTL_LOOKUP_TABLE chassis_indicator_table[] = { - { "QEMU Virtual CPU", "container", NULL, FALSE, FALSE }, /* could be QEMU running in userspace or as part of KVM */ + { "QEMU Virtual CPU", "vm", NULL, FALSE, FALSE }, /* could be QEMU running in userspace or as part of KVM */ { "KVM", "vm", "drive-multidisk", FALSE, FALSE }, - { "SmartDC HVM", "vm", "drive-multidisk", TRUE, TRUE }, /* oracle solaris kvm */ - { "VirtualBox", "container", "drive-optical", TRUE, TRUE }, - { "VMware, Inc.", "container", "drive-optical", TRUE, TRUE }, - { "VMware Virtual Platform", "container", "drive-optical", TRUE, TRUE }, - { "Parallels", "container", "drive-optical", TRUE, TRUE } /* need verification */ -}; + { "SmartDC HVM", "vm", "drive-multidisk", TRUE, TRUE }, /* illumos-joyent kvm */ + { "VirtualBox", "vm", "drive-multidisk", TRUE, TRUE }, + { "VMware, Inc.", "vm", "drive-multidisk", TRUE, TRUE }, + { "VMware Virtual Platform", "vm", "drive-multidisk", TRUE, TRUE }, + { "Parallels", "vm", "drive-multidisk", TRUE, TRUE }, /* need verification */ + { "Xen", "vm", "drive-multidisk", FALSE, FALSE } +}; /* TODO: chroots, etc. are the actual "containers", add them */ /* archs to check against when determining if machine is server */ const gchar *server_archs[] = { @@ -105,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 @@ -154,60 +188,28 @@ 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); - - 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"; + if(HOSTNAME) + return HOSTNAME; - hostname_divider = strcspn(hostname_buf, "."); - - return strncpy(ret, hostname_buf, hostname_divider); + return "localhost"; } 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(); + if(STATIC_HOSTNAME) + return STATIC_HOSTNAME; + else if(HOSTNAME) + return HOSTNAME; - else if((ret = g_hostname_to_ascii(pretty_hostname))) { - - g_ptr_array_add(hostnamed_freeable, (gpointer)ret); - return ret; - } - - return ret; + return "localhost"; } 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); + if(PRETTY_HOSTNAME) + return PRETTY_HOSTNAME; return ""; } @@ -218,7 +220,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 * @@ -233,31 +235,40 @@ our_get_icon_name() { const gchar * our_get_kernel_name() { - return "TODO"; + if(KERN_NAME) + return KERN_NAME; + + return ""; } const gchar * our_get_kernel_version() { - return "TODO"; + if(KERN_VERS) + return KERN_VERS; + + return ""; } const gchar * our_get_kernel_release() { - return "TODO"; + if(KERN_RELEASE) + return KERN_RELEASE; + + return ""; } const gchar * our_get_os_cpename() { - return "TODO"; + return "ONEDAY"; } const gchar * our_get_os_pretty_name() { - return "TODO"; + return "OpenBSD"; } /* --- end method/property/dbus signal code, begin bus/name handlers --- */ @@ -364,16 +375,20 @@ void set_signal_handlers() { } int main() { - + + hostnamed_freeable = g_ptr_array_new(); + /* TODO: check for valid, writable config at init. if no, complain to `make install` */ + + CHASSIS = ICON = OS_CPENAME = 0; + KERN_NAME = KERN_RELEASE = KERN_VERS = 0; set_signal_handlers(); - if(!determine_chassis_and_icon()) + if(!determine_chassis_and_icon() || !set_uname_properties() || !set_names()) return 1; hostnamed_loop = g_main_loop_new(NULL, TRUE); - hostnamed_freeable = g_ptr_array_new(); bus_descriptor = g_bus_own_name(G_BUS_TYPE_SYSTEM, "org.freedesktop.hostname1", @@ -397,17 +412,112 @@ int main() { return 0; } +gboolean set_names() { + + /*gchar *hostname_buf, *ret; + size_t hostname_divider; + + hostname_buf = (gchar*) g_malloc0(MAXHOSTNAMELEN); + ret = (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);*/ + + + + /*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;*/ + + + + /*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 "";*/ + + + + + return FALSE; /* temp */ +} + +gboolean set_uname_properties() { + + struct utsname un; + + if(-1 == uname(&un)) + return FALSE; + + KERN_NAME = (gchar*)g_malloc0(sizeof(un.sysname)); + g_ptr_array_add(hostnamed_freeable, KERN_NAME); + g_strlcpy(KERN_NAME, un.sysname, sizeof(un.sysname)); + + KERN_RELEASE = (gchar*)g_malloc0(sizeof(un.release)); + g_ptr_array_add(hostnamed_freeable, KERN_RELEASE); + g_strlcpy(KERN_RELEASE, un.release, sizeof(un.release)); + + KERN_VERS = (gchar*)g_malloc0(sizeof(un.version)); + g_ptr_array_add(hostnamed_freeable, KERN_VERS); + g_strlcpy(KERN_VERS, un.version, sizeof(un.version)); + + return TRUE; +} + gboolean determine_chassis_and_icon() { + const size_t bufsize = 4096; + char *hwproduct, *hwmodel, *hwvendor, *hwmachine; size_t hwproduct_size, hwmodel_size, hwvendor_size, hwmachine_size; int hwproduct_name[2], hwmodel_name[2], hwvendor_name[2], hwmachine_name[2]; unsigned int i; gboolean UNSURE_CHASSIS_FLAG, UNSURE_ICON_FLAG; - hwproduct = hwmodel = hwvendor = hwmachine = NULL; - hwproduct_size = hwmodel_size = hwvendor_size = hwmachine_size = 0; + hwproduct_size = hwmodel_size = hwvendor_size = hwmachine_size = bufsize; UNSURE_CHASSIS_FLAG = UNSURE_ICON_FLAG = FALSE; + i = 0; + + hwproduct = (char*)g_malloc0(4096); + hwmodel = (char*)g_malloc0(4096); + hwvendor = (char*)g_malloc0(4096); + hwmachine = (char*)g_malloc0(4096); + + g_ptr_array_add(hostnamed_freeable, hwproduct); + g_ptr_array_add(hostnamed_freeable, hwmodel); + g_ptr_array_add(hostnamed_freeable, hwvendor); + g_ptr_array_add(hostnamed_freeable, hwmachine); hwproduct_name[0] = CTL_HW; hwproduct_name[1] = HW_PRODUCT;