1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
#include <gio/gio.h>
GDBusNodeInfo *spect_data;
static void handle_method_call(GDBusConnection *conn,
const gchar *sender,
const gchar *obj_path,
const gchar *interf_name,
const gchar *method_name,
GVariant *params,
GDBusMethodInvocation *invc,
gpointer usrdat) {
//if(g_strcmp0(method_name, "Introspect"
GVariant *xml_ret_gvar;
GString *xml_ret;
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,
const gchar *obj_path,
const gchar *interf_name,
const gchar *prop_name,
GError **err,
gpointer usr_data) {
GVariant *ret;
return ret;
}
static gboolean handle_set_property(GDBusConnection *conn,
const gchar *sender,
const gchar *obj_path,
const gchar *interf_name,
const gchar *prop_name,
GVariant *val,
GError **err,
gpointer usr_data) {
g_dbus_connection_emit_signal(conn,
NULL,
obj_path,
"org.freedesktop.DBus.Properties",
"PropertiesChanged",
NULL, /* incorrect */
NULL);
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);
}
static void on_name_acquired(GDBusConnection *conn,
const gchar *name,
gpointer user_data) {
g_print("got name %s\n", name);
}
static void on_name_lost(GDBusConnection *conn,
const gchar *name,
gpointer user_data) {
g_print("lost name %s, exiting...", name);
//TODO exit through g_main_loop properly...
exit(0);
}
/* safe call to try and start hostnamed */
GError * hostnamed_init() {
guint bus_descriptor;
GError *err = NULL;
gchar **hnd_ispect_xml;
GDir *cur_dir;
gchar *dir;
cur_dir = g_dir_open("./../", 0, err);
g_sprintf(dir, "%s\n", g_dir_read_name(cur_dir));
//g_file_get_contents("../../../../conf/hostnamed-ispect.xml", hnd_ispect_xml, NULL, err);
//spect_data = g_dbus_node_info_new_for_xml(hnd_ispect_xml, &err);
bus_descriptor = g_bus_own_name(G_BUS_TYPE_SYSTEM,
(gchar *)"org.freedesktop.hostname1",
G_BUS_NAME_OWNER_FLAGS_NONE,
on_bus_acquired,
on_name_acquired,
on_name_lost,
NULL,
NULL);
//TODO: malloc and return reference as if a main() closed
return err;
}
|