diff options
author | kremlin <ian@kremlin.cc> | 2014-06-03 05:18:33 +0800 |
---|---|---|
committer | kremlin <ian@kremlin.cc> | 2014-06-03 05:18:33 +0800 |
commit | a622ef09a6520566359ce83a2f540cc519648307 (patch) | |
tree | e1168bd84d9ea57a5a6de5c77679bc052fec19c4 /src/interfaces | |
parent | 0df0018d1c9e682286e262be3d185ccf10f81038 (diff) | |
download | systembsd-a622ef09a6520566359ce83a2f540cc519648307.tar systembsd-a622ef09a6520566359ce83a2f540cc519648307.tar.gz systembsd-a622ef09a6520566359ce83a2f540cc519648307.tar.bz2 systembsd-a622ef09a6520566359ce83a2f540cc519648307.tar.lz systembsd-a622ef09a6520566359ce83a2f540cc519648307.tar.xz systembsd-a622ef09a6520566359ce83a2f540cc519648307.tar.zst systembsd-a622ef09a6520566359ce83a2f540cc519648307.zip |
divorce XML literal to hostnamed.h, update types to be glib-appropriate, comments
Diffstat (limited to 'src/interfaces')
-rw-r--r-- | src/interfaces/hostnamed/hostnamed.c | 137 | ||||
-rw-r--r-- | src/interfaces/hostnamed/hostnamed.h | 78 |
2 files changed, 105 insertions, 110 deletions
diff --git a/src/interfaces/hostnamed/hostnamed.c b/src/interfaces/hostnamed/hostnamed.c index d804b89..4d4332b 100644 --- a/src/interfaces/hostnamed/hostnamed.c +++ b/src/interfaces/hostnamed/hostnamed.c @@ -1,97 +1,8 @@ #include <gio/gio.h> +#include "hostnamed.h" -/* testing, for now */ -static GDBusNodeInfo *spect_data = NULL; -static const gchar spect_xml[] = - "<node>" - " <interface name='org.freedesktop.DBus.Peer'>" - " <method name='Ping'/>" - " <method name='GetMachineId'>" - " <arg type='s' name='machine_uuid' direction='out'/>" - " </method>" - " </interface>" - " <interface name='org.freedesktop.DBus.Introspectable'>" - " <method name='Introspect'>" - " <arg name='data' type='s' direction='out'/>" - " </method>" - " </interface>" - " <interface name='org.freedesktop.DBus.Properties'>" - " <method name='Get'>" - " <arg name='interface' direction='in' type='s'/>" - " <arg name='property' direction='in' type='s'/>" - " <arg name='value' direction='out' type='v'/>" - " </method>" - " <method name='GetAll'>" - " <arg name='interface' direction='in' type='s'/>" - " <arg name='properties' direction='out' type='a{sv}'/>" - " </method>" - " <method name='Set'>" - " <arg name='interface' direction='in' type='s'/>" - " <arg name='property' direction='in' type='s'/>" - " <arg name='value' direction='in' type='v'/>" - " </method>" - " <signal name='PropertiesChanged'>" - " <arg type='s' name='interface'/>" - " <arg type='a{sv}' name='changed_properties'/>" - " <arg type='as' name='invalidated_properties'/>" - " </signal>" - " </interface>" - " <interface name='org.freedesktop.hostname1'>" - " <property name='Hostname' type='s' access='read'>" - " <annotation name='org.freedesktop.DBus.Property.EmitsChangedSignal' value='false'/>" - " </property>" - " <property name='StaticHostname' type='s' access='read'>" - " </property>" - " <property name='PrettyHostname' type='s' access='read'>" - " </property>" - " <property name='IconName' type='s' access='read'>" - " </property>" - " <property name='Chassis' type='s' access='read'>" - " </property>" - " <property name='KernelName' type='s' access='read'>" - " <annotation name='org.freedesktop.DBus.Property.EmitsChangedSignal' value='const'/>" - " </property>" - " <property name='KernelRelease' type='s' access='read'>" - " <annotation name='org.freedesktop.DBus.Property.EmitsChangedSignal' value='const'/>" - " </property>" - " <property name='KernelVersion' type='s' access='read'>" - " <annotation name='org.freedesktop.DBus.Property.EmitsChangedSignal' value='const'/>" - " </property>" - " <property name='OperatingSystemPrettyName' type='s' access='read'>" - " <annotation name='org.freedesktop.DBus.Property.EmitsChangedSignal' value='const'/>" - " </property>" - " <property name='OperatingSystemCPEName' type='s' access='read'>" - " <annotation name='org.freedesktop.DBus.Property.EmitsChangedSignal' value='const'/>" - " </property>" - " <method name='SetHostname'>" - " <arg type='s' direction='in'/>" - " <arg type='b' direction='in'/>" - " </method>" - " <method name='SetStaticHostname'>" - " <arg type='s' direction='in'/>" - " <arg type='b' direction='in'/>" - " </method>" - " <method name='SetPrettyHostname'>" - " <arg type='s' direction='in'/>" - " <arg type='b' direction='in'/>" - " </method>" - " <method name='SetIconName'>" - " <arg type='s' direction='in'/>" - " <arg type='b' direction='in'/>" - " </method>" - " <method name='SetChassis'>" - " <arg type='s' direction='in'/>" - " <arg type='b' direction='in'/>" - " </method>" - " </interface>" - "</node>"; - -static const GDBusInterfaceVTable interface_vtable = -{ - handle_method_call, - handle_get_property, - handle_set_property -}; +GDBusNodeInfo *spect_data; +GMainLoop *loop; static void handle_method_call(GDBusConnection *conn, const gchar *sender, @@ -104,10 +15,14 @@ static void handle_method_call(GDBusConnection *conn, g_printf("%s wants to call %s, at %s with interface %s\n", sender, method_name, obj_path, interf_name); - g_dbus_method_invocation_return_value(invc, &spect_xml); + GString *xml_ret; + GVariant *xml_ret_gvar; -} + g_dbus_interface_info_generate_xml(spect_data->interfaces[0], (guint)0, xml_ret); + xml_ret_gvar = g_variant_new_string(xml_ret->str); + g_dbus_method_invocation_return_value(invc, xml_ret_gvar); +} static GVariant * handle_get_property(GDBusConnection *conn, const gchar *sender, @@ -118,8 +33,6 @@ static GVariant * handle_get_property(GDBusConnection *conn, gpointer usr_data) { GVariant *ret; - ret = g_variant_new_string(""); - g_snprintf(ret, 100, "%s touched property %s at %s", sender, prop_name, obj_path); return ret; } @@ -143,25 +56,31 @@ static gboolean handle_set_property(GDBusConnection *conn, return TRUE; } +/* "hot" functions initially passed to gdbus */ +static const GDBusInterfaceVTable interface_vtable = +{ + handle_method_call, + handle_get_property, + handle_set_property +}; + /* end method/property functions, begin bus name handlers * TODO: these should be intertwined as to handle edge cases * for when the system cannot immediately grab the name, as * well as cases where the system unintendedly loses the name */ - - static void on_bus_acquired(GDBusConnection *conn, const gchar *name, gpointer user_data) { g_print("got bus, name: %s\n", name); guint reg_id; - reg_id = g_dbus_connection_register_object (conn, - "/org/freedesktop/hostname1", - spect_data->interfaces[0], - &interface_vtable, - NULL, - NULL, - NULL ); + reg_id = g_dbus_connection_register_object(conn, + "/org/freedesktop/hostname1", + spect_data->interfaces[0], + &interface_vtable, + NULL, + NULL, + NULL ); g_assert(reg_id > 0); } @@ -171,18 +90,16 @@ static void on_name_acquired(GDBusConnection *conn, const gchar *name, gpointer static void on_name_lost(GDBusConnection *conn, const gchar *name, gpointer user_data) { g_print("lost name %s, exiting...\n", name); - exit(1); + g_main_loop_quit(loop); } /* safe call to try and start hostnamed */ GError hostnamed_init() { guint bus_descriptor; - GError *err = NULL; - GMainLoop *loop; + GError *err = NULL; - /* TODO: there is a correct way to generate introspection XML, switch to that */ - spect_data = g_dbus_node_info_new_for_xml(spect_xml, NULL); + spect_data = g_dbus_node_info_new_for_xml(SYSTEMD_HOSTNAMED_XML, &err); bus_descriptor = g_bus_own_name(G_BUS_TYPE_SESSION, (gchar *)"org.freedesktop.hostname1", diff --git a/src/interfaces/hostnamed/hostnamed.h b/src/interfaces/hostnamed/hostnamed.h new file mode 100644 index 0000000..6bc1478 --- /dev/null +++ b/src/interfaces/hostnamed/hostnamed.h @@ -0,0 +1,78 @@ +#include <gio/gio.h> + +static const gchar SYSTEMD_HOSTNAMED_XML[] = + "<!DOCTYPE node PUBLIC '-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'" + "'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>" + "<node>" + " <interface name='org.freedesktop.DBus.Peer'>" + " <method name='Ping'/>" + " <method name='GetMachineId'>" + " <arg type='s' name='machine_uuid' direction='out'/>" + " </method>" + " </interface>" + " <interface name='org.freedesktop.DBus.Introspectable'>" + " <method name='Introspect'>" + " <arg name='data' type='s' direction='out'/>" + " </method>" + " </interface>" + " <interface name='org.freedesktop.DBus.Properties'>" + " <method name='Get'>" + " <arg name='interface' direction='in' type='s'/>" + " <arg name='property' direction='in' type='s'/>" + " <arg name='value' direction='out' type='v'/>" + " </method>" + " <method name='GetAll'>" + " <arg name='interface' direction='in' type='s'/>" + " <arg name='properties' direction='out' type='a{sv}'/>" + " </method>" + " <method name='Set'>" + " <arg name='interface' direction='in' type='s'/>" + " <arg name='property' direction='in' type='s'/>" + " <arg name='value' direction='in' type='v'/>" + " </method>" + " <signal name='PropertiesChanged'>" + " <arg type='s' name='interface'/>" + " <arg type='a{sv}' name='changed_properties'/>" + " <arg type='as' name='invalidated_properties'/>" + " </signal>" + " </interface>" + " <interface name='org.freedesktop.hostname1'>" + " <property name='Hostname' type='s' access='read'>" + " <annotation name='org.freedesktop.DBus.Property.EmitsChangedSignal' value='false'/>" + " </property>" + " <property name='StaticHostname' type='s' access='read'>" + " </property>" + " <property name='PrettyHostname' type='s' access='read'>" + " </property>" + " <property name='IconName' type='s' access='read'>" + " </property>" + " <property name='Chassis' type='s' access='read'>" + " </property>" + " <property name='OperatingSystemPrettyName' type='s' access='read'>" + " <annotation name='org.freedesktop.DBus.Property.EmitsChangedSignal' value='const'/>" + " </property>" + " <property name='OperatingSystemCPEName' type='s' access='read'>" + " <annotation name='org.freedesktop.DBus.Property.EmitsChangedSignal' value='const'/>" + " </property>" + " <method name='SetHostname'>" + " <arg type='s' direction='in'/>" + " <arg type='b' direction='in'/>" + " </method>" + " <method name='SetStaticHostname'>" + " <arg type='s' direction='in'/>" + " <arg type='b' direction='in'/>" + " </method>" + " <method name='SetPrettyHostname'>" + " <arg type='s' direction='in'/>" + " <arg type='b' direction='in'/>" + " </method>" + " <method name='SetIconName'>" + " <arg type='s' direction='in'/>" + " <arg type='b' direction='in'/>" + " </method>" + " <method name='SetChassis'>" + " <arg type='s' direction='in'/>" + " <arg type='b' direction='in'/>" + " </method>" + " </interface>" + "</node>"; |