transport: dbus: Implement erase

Change-Id: Ic10ba2be78deb6307af195fc01daceb19a82ef95
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
diff --git a/transport_dbus.c b/transport_dbus.c
index e04db67..3ad0dad 100644
--- a/transport_dbus.c
+++ b/transport_dbus.c
@@ -400,6 +400,39 @@
 	return sd_bus_send(NULL, n, NULL);
 }
 
+static int transport_dbus_erase(sd_bus_message *m, void *userdata,
+				sd_bus_error *ret_error)
+{
+	struct mbox_context *context = userdata;
+	struct protocol_erase io;
+	sd_bus_message *n;
+	int rc;
+
+	if (!context) {
+		MSG_ERR("DBUS Internal Error\n");
+		return -EINVAL;
+	}
+
+	rc = sd_bus_message_read(m, "qq", &io.req.offset, &io.req.size);
+	if (rc < 0) {
+		MSG_ERR("DBUS error reading message: %s\n", strerror(-rc));
+		return rc;
+	}
+
+	rc = context->protocol->erase(context, &io);
+	if (rc < 0) {
+		return rc;
+	}
+
+	rc = sd_bus_message_new_method_return(m, &n);
+	if (rc < 0) {
+		MSG_ERR("sd_bus_message_new_method_return failed: %d\n", rc);
+		return rc;
+	}
+
+	return sd_bus_send(NULL, n, NULL);
+}
+
 static int transport_dbus_get_property(sd_bus *bus,
 				       const char *path,
 				       const char *interface,
@@ -460,6 +493,8 @@
 		      SD_BUS_VTABLE_UNPRIVILEGED),
 	SD_BUS_METHOD("Ack", "y", NULL, &transport_dbus_ack,
 		      SD_BUS_VTABLE_UNPRIVILEGED),
+	SD_BUS_METHOD("Erase", "qq", NULL, &transport_dbus_erase,
+		      SD_BUS_VTABLE_UNPRIVILEGED),
 	SD_BUS_PROPERTY("FlashControlLost", "b", transport_dbus_get_property,
 			0, /* Just a pointer to struct mbox_context */
 			SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),