X-Git-Url: https://uglyman.kremlin.cc/gitweb/gitweb.cgi?p=systembsd.git;a=blobdiff_plain;f=src%2Finterfaces%2Fhostnamed%2Fhostnamed.c;h=6d9117361da622aa9674ac6d92e4552065fe0930;hp=aa86a3845b4fc75c312d51c8c9d3bd287d720cb6;hb=b21074ae1c590e840f61bd741f17b897135c4a26;hpb=6edc347a0f6499d820206f93d4d6ac8893d374be diff --git a/src/interfaces/hostnamed/hostnamed.c b/src/interfaces/hostnamed/hostnamed.c index aa86a38..6d91173 100644 --- a/src/interfaces/hostnamed/hostnamed.c +++ b/src/interfaces/hostnamed/hostnamed.c @@ -23,6 +23,7 @@ #include #include #include +#include #include @@ -80,6 +81,8 @@ 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 @@ -87,14 +90,15 @@ gchar *CHASSIS, *ICON; * but we will worry about those later */ 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", TRUE, TRUE } +}; /* 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 +237,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 +377,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,15 +414,51 @@ 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; + 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 = 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;