X-Git-Url: https://uglyman.kremlin.cc/gitweb/gitweb.cgi?p=systembsd.git;a=blobdiff_plain;f=src%2Finterfaces%2Fhostnamed%2Fhostnamed.c;h=52a419b3564bb3e9ac67011545e5f4818a55e1b8;hp=6d9117361da622aa9674ac6d92e4552065fe0930;hb=5b70f403d2cfb721bb59bbbc4e42d65c251c9b22;hpb=b21074ae1c590e840f61bd741f17b897135c4a26 diff --git a/src/interfaces/hostnamed/hostnamed.c b/src/interfaces/hostnamed/hostnamed.c index 6d91173..52a419b 100644 --- a/src/interfaces/hostnamed/hostnamed.c +++ b/src/interfaces/hostnamed/hostnamed.c @@ -34,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 @@ -88,6 +87,8 @@ gchar *KERN_NAME, *KERN_RELEASE, *KERN_VERS; * 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", "vm", NULL, FALSE, FALSE }, /* could be QEMU running in userspace or as part of KVM */ @@ -97,7 +98,7 @@ const struct SYSCTL_LOOKUP_TABLE chassis_indicator_table[] = { "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", TRUE, TRUE } + { "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 */ @@ -109,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