X-Git-Url: https://uglyman.kremlin.cc/gitweb/gitweb.cgi?a=blobdiff_plain;f=src%2Finterfaces%2Fhostnamed%2Fhostnamed.c;h=0e5c93c4c681e21dd8c7a8ebb1e982a677958a29;hb=c7028b11306cb1025dd07cb3615d603f65b05ee2;hp=f1c3fb4b1b11e47cf17f3ef9fdc61343a4cd4e5a;hpb=b81ab32a35147a06710a58f32283d12b08599ea7;p=systembsd.git diff --git a/src/interfaces/hostnamed/hostnamed.c b/src/interfaces/hostnamed/hostnamed.c index f1c3fb4..0e5c93c 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 @@ -80,21 +80,26 @@ guint bus_descriptor; gboolean dbus_interface_exported; /* reliable because of gdbus operational guarantees */ gchar *CHASSIS, *ICON; +gchar *OS_CPENAME; +gchar *KERN_NAME, *KERN_RELEASE, *KERN_VERS; /* 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[] = { @@ -233,31 +238,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 +378,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()) 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,6 +415,28 @@ int main() { return 0; } +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; @@ -409,12 +449,18 @@ gboolean determine_chassis_and_icon() { 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;