12
13
#include "identifier.h"
15
static char* ofono_name = "org.ofono";
16
static gint fail_next_get_mac = 0;
17
static gint fail_next_get_uuid = 0;
19
void whoopsie_identifier_set_ofono_name (char *name) {
15
24
whoopsie_hex_to_char (char* buf, const char *str, int len)
42
51
g_return_if_fail (res);
53
if (g_atomic_int_compare_and_exchange (&fail_next_get_mac, WHOOPSIE_FAIL_GENERIC, 0)) {
54
g_set_error (error, g_quark_from_static_string ("whoopsie-quark"), WHOOPSIE_FAILED_BY_REQUEST,
55
"Failed by tester request");
44
59
sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
46
61
g_set_error (error, g_quark_from_static_string ("whoopsie-quark"), 0,
62
for (i = ifc.ifc_len / sizeof(struct ifreq); --i >= 0; it++) {
63
strcpy(ifr.ifr_name, it->ifr_name);
64
if (ioctl(sock, SIOCGIFFLAGS, &ifr) == 0) {
65
if (! (ifr.ifr_flags & IFF_LOOPBACK)) { // don't count loopback
66
if (ioctl(sock, SIOCGIFHWADDR, &ifr) == 0) {
77
if (!g_atomic_int_compare_and_exchange (&fail_next_get_mac, WHOOPSIE_FAIL_MAC_SIOCGIFFLAGS, 0)) {
78
for (i = ifc.ifc_len / sizeof(struct ifreq); --i >= 0; it++) {
79
strcpy(ifr.ifr_name, it->ifr_name);
80
if (ioctl(sock, SIOCGIFFLAGS, &ifr) == 0) {
81
if (! (ifr.ifr_flags & IFF_LOOPBACK)) { // don't count loopback
82
if (ioctl(sock, SIOCGIFHWADDR, &ifr) == 0) {
94
114
g_return_if_fail (res);
116
if (g_atomic_int_compare_and_exchange (&fail_next_get_uuid, WHOOPSIE_FAIL_GENERIC, 0)) {
117
g_set_error (error, g_quark_from_static_string ("whoopsie-quark"), WHOOPSIE_FAILED_BY_REQUEST,
118
"Failed by tester request");
96
122
fp = open ("/sys/class/dmi/id/product_uuid", O_RDONLY);
98
124
g_set_error (error, g_quark_from_static_string ("whoopsie-quark"), 0,
148
174
gcry_md_close (sha512);
177
void whoopsie_identifier_append_imei (char** result, GError** error)
182
GDBusConnection* con = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &err);
185
g_set_error (error, g_quark_from_static_string ("whoopsie-quark"), 0,
186
"Unable to connect to the bus: %s", err->message);
190
res = g_dbus_connection_call_sync (con, ofono_name, "/",
191
"org.ofono.Manager", "GetModems",
192
NULL, G_VARIANT_TYPE ("(a(oa{sv}))"),
193
G_DBUS_CALL_FLAGS_NONE,
197
g_set_error (error, g_quark_from_static_string ("whoopsie-quark"), 0,
198
"Unable to call ofono's GetModems: %s", err->message);
201
g_object_unref (con);
203
/* res is an a(oa{sv}) */
204
GVariant* var1 = g_variant_get_child_value (res, 0);
205
g_variant_unref (res);
206
/* but the first array can be empty */
207
if (g_variant_n_children (var1) < 1) {
208
g_set_error (error, g_quark_from_static_string ("whoopsie-quark"), 0,
209
"No modems in GetModems response");
212
GVariant* var2 = g_variant_get_child_value (var1, 0);
213
g_variant_unref (var1);
214
GVariant* var3 = g_variant_get_child_value (var2, 1);
215
g_variant_unref (var2);
216
GVariant* var4 = g_variant_lookup_value (var3, "Serial", G_VARIANT_TYPE ("s"));
217
g_variant_unref (var3);
219
g_set_error (error, g_quark_from_static_string ("whoopsie-quark"), 0,
220
"No Serial key in GetModems response");
224
const gchar* imei = g_variant_get_string(var4, &imei_len);
225
if (imei_len < 15 || imei_len > 16) {
226
g_set_error (error, g_quark_from_static_string ("whoopsie-quark"), 0,
227
"GetModems' Serial key is not an IMEI (has length %zu)", imei_len);
231
size_t old_len = *result ? strlen(*result) : 0;
233
*result = g_realloc (*result, old_len + imei_len + 1);
234
strcpy (*result + old_len, imei);
236
g_variant_unref(var4);
152
240
whoopsie_identifier_generate (char** res, GError** error)