[PATCH 1/4] checksum: Drop unused field
by Andrew Zaborowski
---
ell/checksum.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/ell/checksum.c b/ell/checksum.c
index f6f5cb2..729399e 100644
--- a/ell/checksum.c
+++ b/ell/checksum.c
@@ -69,7 +69,6 @@ struct sockaddr_alg {
#endif
struct checksum_info {
- enum l_checksum_type type;
const char *name;
uint8_t digest_len;
bool supported;
--
2.19.1
3 years, 6 months
[PATCH] uuid: Added l_uuid_parse
by Michał 'Khorne' Lowas-Rzechonek
From: Michał Lowas-Rzechonek <michal.lowas-rzechonek(a)silvair.com>
This commit adds API complementary to l_uuid_to_string, allowing parsing
canonical string representation into a byte array.
I've also changed printf/scanf formatting to use PRIx/SCNx macros, for
better portability.
---
ell/uuid.c | 54 ++++++++++++++++++++++++++++++++++++-------
ell/uuid.h | 1 +
unit/test-uuid.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 107 insertions(+), 8 deletions(-)
diff --git a/ell/uuid.c b/ell/uuid.c
index a4d72fc..26893a5 100644
--- a/ell/uuid.c
+++ b/ell/uuid.c
@@ -25,6 +25,7 @@
#endif
#define _GNU_SOURCE
+#include <inttypes.h>
#include <stdio.h>
#include "checksum.h"
@@ -210,17 +211,54 @@ LIB_EXPORT bool l_uuid_to_string(const uint8_t uuid[16],
{
int n;
- n = snprintf(dest, dest_size, "%02x%02x%02x%02x-%02x%02x-%02x%02x-"
- "%02x%02x-%02x%02x%02x%02x%02x%02x",
- uuid[0], uuid[1], uuid[2], uuid[3],
- uuid[4], uuid[5],
- uuid[6], uuid[7],
- uuid[8], uuid[9],
- uuid[10], uuid[11], uuid[12],
- uuid[13], uuid[14], uuid[15]);
+ n = snprintf(dest, dest_size,
+ "%02" PRIx8 "%02" PRIx8 "%02" PRIx8 "%02" PRIx8 "-"
+ "%02" PRIx8 "%02" PRIx8 "-"
+ "%02" PRIx8 "%02" PRIx8 "-"
+ "%02" PRIx8 "%02" PRIx8 "-"
+ "%02" PRIx8 "%02" PRIx8 "%02" PRIx8 "%02" PRIx8 "%02" PRIx8 "%02" PRIx8 "",
+ uuid[0], uuid[1], uuid[2], uuid[3],
+ uuid[4], uuid[5],
+ uuid[6], uuid[7],
+ uuid[8], uuid[9],
+ uuid[10], uuid[11], uuid[12], uuid[13], uuid[14], uuid[15]);
if (n < 0 || (size_t) n >= dest_size)
return false;
return true;
}
+
+LIB_EXPORT bool l_uuid_parse(const char *src, size_t src_size,
+ uint8_t uuid[16])
+{
+ uint8_t buf[16];
+ int n;
+
+ /*
+ * textual representation: 32 hex digits + 4 group separators
+ */
+ if (src_size != 16 * 2 + 4)
+ return false;
+
+ n = sscanf(src,
+ "%02" SCNx8 "%02" SCNx8 "%02" SCNx8 "%02" SCNx8 "-"
+ "%02" SCNx8 "%02" SCNx8 "-"
+ "%02" SCNx8 "%02" SCNx8 "-"
+ "%02" SCNx8 "%02" SCNx8 "-"
+ "%02" SCNx8 "%02" SCNx8 "%02" SCNx8 "%02" SCNx8 "%02" SCNx8 "%02" SCNx8 "",
+ &buf[0], &buf[1], &buf[2], &buf[3],
+ &buf[4], &buf[5],
+ &buf[6], &buf[7],
+ &buf[8], &buf[9],
+ &buf[10], &buf[11], &buf[12], &buf[13], &buf[14], &buf[15]);
+
+ if (n != 16)
+ return false;
+
+ if (!l_uuid_is_valid(buf))
+ return false;
+
+ memcpy(uuid, buf, sizeof(buf));
+ return true;
+}
diff --git a/ell/uuid.h b/ell/uuid.h
index 89be520..1cb7923 100644
--- a/ell/uuid.h
+++ b/ell/uuid.h
@@ -53,6 +53,7 @@ bool l_uuid_is_valid(const uint8_t uuid[16]);
enum l_uuid_version l_uuid_get_version(const uint8_t uuid[16]);
bool l_uuid_to_string(const uint8_t uuid[16], char *dest, size_t dest_size);
+bool l_uuid_parse(const char *src, size_t src_size, uint8_t uuid[16]);
#ifdef __cplusplus
}
diff --git a/unit/test-uuid.c b/unit/test-uuid.c
index 088d45c..5a4650d 100644
--- a/unit/test-uuid.c
+++ b/unit/test-uuid.c
@@ -158,6 +158,61 @@ static void test_to_string(const void *data)
assert(!strcmp(buf, expected_uuid));
}
+static void test_parse_too_short(const void *data)
+{
+ uint8_t uuid[16];
+ const char *string_uuid = "65fcc697-0776-5bf9-8573-72a51080c7d";
+ bool r;
+
+ r = l_uuid_parse(string_uuid, strlen(string_uuid), uuid);
+ assert(!r);
+}
+
+static void test_parse_too_long(const void *data)
+{
+ uint8_t uuid[16];
+ const char *string_uuid = "65fcc697-0776-5bf9-8573-72a51080c7detoolong";
+ bool r;
+
+ r = l_uuid_parse(string_uuid, strlen(string_uuid), uuid);
+ assert(!r);
+}
+
+static void test_parse_invalid_variant(const void *data)
+{
+ uint8_t uuid[16];
+ const char *string_uuid = "65fcc697-0776-5bf9-c573-72a51080c7de";
+ bool r;
+
+ r = l_uuid_parse(string_uuid, strlen(string_uuid), uuid);
+ assert(!r);
+}
+
+static void test_parse_invalid_hex(const void *data)
+{
+ uint8_t uuid[16];
+ const char *string_uuid = "65fcc697-this-isno-tava-lidhexstring";
+ bool r;
+
+ r = l_uuid_parse(string_uuid, strlen(string_uuid), uuid);
+ assert(!r);
+}
+
+static void test_parse(const void *data)
+{
+ uint8_t uuid[16];
+ bool r;
+ const char *string_uuid = "65fcc697-0776-5bf9-8573-72a51080c7de";
+ uint8_t expected_uuid[16] = { 0x65, 0xfc, 0xc6, 0x97, 0x07, 0x76, 0x5b, 0xf9,
+ 0x85, 0x73, 0x72, 0xa5, 0x10, 0x80, 0xc7, 0xde };
+
+ r = l_uuid_parse(string_uuid, strlen(string_uuid), uuid);
+ assert(r);
+
+ assert(!memcmp(uuid, expected_uuid, sizeof(uuid)));
+
+}
+
int main(int argc, char *argv[])
{
l_test_init(&argc, &argv);
@@ -169,6 +224,11 @@ int main(int argc, char *argv[])
l_test_add("/uuid/v5", test_v5, NULL);
l_test_add("/uuid/to string", test_to_string, NULL);
+ l_test_add("/uuid/parse too short", test_parse_too_short, NULL);
+ l_test_add("/uuid/parse too long", test_parse_too_long, NULL);
+ l_test_add("/uuid/parse invalid variant", test_parse_invalid_variant, NULL);
+ l_test_add("/uuid/parse invalid hex", test_parse_invalid_hex, NULL);
+ l_test_add("/uuid/parse", test_parse, NULL);
return l_test_run();
--
2.19.1
3 years, 6 months
[PATCH] dbus: Added l_dbus_signal_emit
by Michał 'Khorne' Lowas-Rzechonek
From: Michał Lowas-Rzechonek <michal.lowas-rzechonek(a)silvair.com>
After declaring a signal with l_dbus_interface_signal, we need a way to
actually publish it.
This commit adds API for this, along with an updated example.
---
ell/dbus-service.c | 98 +++++++++++++++++++++++++++++++++++++++++
ell/dbus-service.h | 4 ++
examples/dbus-service.c | 12 ++++-
3 files changed, 112 insertions(+), 2 deletions(-)
diff --git a/ell/dbus-service.c b/ell/dbus-service.c
index 531b710..428f590 100644
--- a/ell/dbus-service.c
+++ b/ell/dbus-service.c
@@ -125,12 +125,19 @@ struct property_change_record {
struct l_queue *properties;
};
+struct user_signal_record {
+ char *path;
+ struct object_node *object;
+ struct l_dbus_message *message;
+};
+
struct _dbus_object_tree {
struct l_hashmap *interfaces;
struct l_hashmap *objects;
struct object_node *root;
struct l_queue *object_managers;
struct l_queue *property_changes;
+ struct l_queue *user_signals;
struct l_idle *emit_signals_work;
bool flushing;
};
@@ -551,6 +558,15 @@ static void property_change_record_free(void *data)
l_free(rec);
}
+static void user_signal_record_free(void *data)
+{
+ struct user_signal_record *rec = data;
+
+ l_free(rec->path);
+ l_dbus_message_unref(rec->message);
+ l_free(rec);
+}
+
static void properties_setup_func(struct l_dbus_interface *);
static void object_manager_setup_func(struct l_dbus_interface *);
@@ -570,6 +586,7 @@ struct _dbus_object_tree *_dbus_object_tree_new()
tree->root = l_new(struct object_node, 1);
tree->property_changes = l_queue_new();
+ tree->user_signals = l_queue_new();
_dbus_object_tree_register_interface(tree, L_DBUS_INTERFACE_PROPERTIES,
properties_setup_func, NULL,
@@ -629,6 +646,8 @@ void _dbus_object_tree_free(struct _dbus_object_tree *tree)
l_queue_destroy(tree->property_changes, property_change_record_free);
+ l_queue_destroy(tree->user_signals, user_signal_record_free);
+
if (tree->emit_signals_work)
l_idle_remove(tree->emit_signals_work);
@@ -1100,6 +1119,22 @@ static bool emit_properties_changed(void *data, void *user_data)
return true;
}
+static bool emit_user_signal(void *data, void *user_data)
+{
+ struct user_signal_record *rec = data;
+ struct emit_signals_data *es = user_data;
+
+ if (es->node && rec->object != es->node)
+ return false;
+
+ l_dbus_send(es->dbus, rec->message);
+ rec->message = NULL;
+
+ user_signal_record_free(rec);
+
+ return true;
+}
+
void _dbus_object_tree_signals_flush(struct l_dbus *dbus, const char *path)
{
struct _dbus_object_tree *tree = _dbus_get_tree(dbus);
@@ -1138,6 +1173,12 @@ void _dbus_object_tree_signals_flush(struct l_dbus *dbus, const char *path)
if (!l_queue_isempty(tree->property_changes))
all_done = false;
+ l_queue_foreach_remove(tree->user_signals,
+ emit_user_signal, &data);
+
+ if (!l_queue_isempty(tree->user_signals))
+ all_done = false;
+
if (all_done) {
l_idle_remove(tree->emit_signals_work);
tree->emit_signals_work = NULL;
@@ -1757,6 +1798,63 @@ LIB_EXPORT bool l_dbus_property_changed(struct l_dbus *dbus, const char *path,
property);
}
+LIB_EXPORT bool l_dbus_signal_emit(struct l_dbus *dbus,
+ const char *path,
+ const char *interface_name,
+ const char *signal_name,
+ const char *signature,
+ ...)
+{
+ struct user_signal_record *rec;
+ struct object_node *object;
+ struct interface_instance *instance;
+ struct l_dbus_message_builder *builder;
+ struct _dbus_signal *signal;
+ struct _dbus_object_tree *tree = _dbus_get_tree(dbus);
+ va_list args;
+
+ object = l_hashmap_lookup(tree->objects, path);
+ if (!object)
+ return false;
+
+ instance = l_queue_find(object->instances, match_interface_instance,
+ interface_name);
+ if (!instance)
+ return false;
+
+ signal = _dbus_interface_find_signal(instance->interface,
+ signal_name);
+ if (!signal)
+ return false;
+
+ rec = l_new(struct user_signal_record, 1);
+ rec->path = l_strdup(path);
+ rec->object = object;
+ rec->message = l_dbus_message_new_signal(dbus, path,
+ interface_name, signal_name);
+
+ builder = l_dbus_message_builder_new(rec->message);
+ if (!builder) {
+ l_dbus_message_unref(rec->message);
+ l_free(rec->path);
+ l_free(rec);
+ return false;
+ }
+
+ va_start(args, signature);
+ l_dbus_message_builder_append_from_valist(builder, signature, args);
+ va_end(args);
+
+ l_dbus_message_builder_finalize(builder);
+ l_dbus_message_builder_destroy(builder);
+
+ l_queue_push_tail(tree->user_signals, rec);
+ schedule_emit_signals(dbus);
+
+ return true;
+}
+
+
static struct l_dbus_message *properties_get(struct l_dbus *dbus,
struct l_dbus_message *message,
void *user_data)
diff --git a/ell/dbus-service.h b/ell/dbus-service.h
index 153bb3a..1b442b0 100644
--- a/ell/dbus-service.h
+++ b/ell/dbus-service.h
@@ -86,6 +86,10 @@ bool l_dbus_interface_property(struct l_dbus_interface *interface,
bool l_dbus_property_changed(struct l_dbus *dbus, const char *path,
const char *interface, const char *property);
+bool l_dbus_signal_emit(struct l_dbus *dbus, const char *path,
+ const char *interface_name, const char *signal_name,
+ const char *signature, ...);
+
#ifdef __cplusplus
}
#endif
diff --git a/examples/dbus-service.c b/examples/dbus-service.c
index 280057c..e30a91d 100644
--- a/examples/dbus-service.c
+++ b/examples/dbus-service.c
@@ -87,11 +87,15 @@ static struct l_dbus_message *test_method_call(struct l_dbus *dbus,
{
struct l_dbus_message *reply;
- l_info("Method Call");
+ uint32_t argument;
+ l_dbus_message_get_arguments(message, "u", &argument);
+ l_info("Method Call: %" PRIu32 "", argument);
reply = l_dbus_message_new_method_return(message);
l_dbus_message_set_arguments(reply, "");
+ l_dbus_signal_emit(dbus, "/test", "org.test", "MethodCalled", "u", argument);
+
return reply;
}
@@ -167,10 +171,14 @@ static struct l_dbus_message *test_int_setter(struct l_dbus *dbus,
static void setup_test_interface(struct l_dbus_interface *interface)
{
l_dbus_interface_method(interface, "MethodCall", 0,
- test_method_call, "", "");
+ test_method_call, "", "u", "argument");
+
+ l_dbus_interface_signal(interface, "MethodCalled", 0,
+ "u", "argument");
l_dbus_interface_property(interface, "String", 0, "s",
test_string_getter, test_string_setter);
+
l_dbus_interface_property(interface, "Integer", 0, "u",
test_int_getter, test_int_setter);
}
--
2.19.1
3 years, 6 months