From e6f072384d1362a33cada63b085528b384182854 Mon Sep 17 00:00:00 2001 From: Sebastian Pastor Date: Tue, 13 Jun 2017 22:35:10 +0200 Subject: [PATCH] dey-examples: tamper: check tamper_events before waiting for events If the event is already signaled, read the timestamp, log and ack the event, perform actions and exit. If it is already acknowledged, then do nothing. Signed-off-by: Sebastian Pastor --- .../files/tamper_sample/tamper_sample.c | 62 ++++++++++++++++--- 1 file changed, 53 insertions(+), 9 deletions(-) diff --git a/meta-digi-dey/recipes-digi/dey-examples/files/tamper_sample/tamper_sample.c b/meta-digi-dey/recipes-digi/dey-examples/files/tamper_sample/tamper_sample.c index d63f9df7e..834ed4895 100644 --- a/meta-digi-dey/recipes-digi/dey-examples/files/tamper_sample/tamper_sample.c +++ b/meta-digi-dey/recipes-digi/dey-examples/files/tamper_sample/tamper_sample.c @@ -86,11 +86,10 @@ static void tamper_event_actions(mca_tamper_t *tdata) static void tamper_event_ack(mca_tamper_t *tdata) { int ret; - char *tamper_sysfs_dir; + char tamper_sysfs_dir[sizeof("/sys/bus/iio/devices/iio:deviceX")]; - ret = asprintf(&tamper_sysfs_dir, - "/sys/bus/iio/devices/iio:device%d", - tdata->dev_num); + ret = sprintf(tamper_sysfs_dir, + "/sys/bus/iio/devices/iio:device%d", tdata->dev_num); if (ret < 0) { fprintf(stdout, "Failed to build event ack file name\n"); return; @@ -98,15 +97,14 @@ static void tamper_event_ack(mca_tamper_t *tdata) /* Finally, acknowledge the event */ ret = write_sysfs_string("tamper_events", tamper_sysfs_dir, "ack"); - if (ret < 0) { + if (ret < 0) fprintf(stdout, "Failed to acknowledge tamper%d event\n", tdata->iface); - } } -static void process_tamper_event(mca_tamper_t *tdata) +static void process_tamper_event(mca_tamper_t *tdata, bool check_event) { - if (!event_is_tamper(&tdata->event)) { + if (check_event && !event_is_tamper(&tdata->event)) { fprintf(stdout, "Unknown event: time: %lld, id: %llx\n", tdata->event.timestamp, tdata->event.id); return; @@ -117,6 +115,48 @@ static void process_tamper_event(mca_tamper_t *tdata) tamper_event_ack(tdata); } +static int check_tamper_event(mca_tamper_t *tdata) +{ + int ret; + char tamper_sysfs_dir[sizeof("/sys/bus/iio/devices/iio:deviceX")]; + char str[50]; + + ret = sprintf(tamper_sysfs_dir, + "/sys/bus/iio/devices/iio:device%d", tdata->dev_num); + if (ret < 0) { + fprintf(stdout, "Failed to build event file name\n"); + return -1; + } + + ret = read_sysfs_string("tamper_events", tamper_sysfs_dir, str); + if (ret < 0) { + fprintf(stdout, "Failed to read tamper%d event\n", + tdata->iface); + return -1; + } + + if (!strncmp(str, "none", strlen("none"))) { + /* Continue to wait for tamper event to happen */ + return 0; + } else if (!strncmp(str, "signaled+acked", strlen("signaled+acked"))) { + fprintf(stdout, "Tamper event already acknowledged, not taking actions\n"); + return 1; + } else if (!strncmp(str, "signaled", strlen("signaled"))) { + tdata->event.timestamp = read_sysfs_posint("timestamp", + tamper_sysfs_dir); + if (tdata->event.timestamp < 0) + fprintf(stdout, "Failed to read timestamp for tamper%d!\n", + tdata->iface); + + fprintf(stdout, "Tamper event was already signaled.\n"); + process_tamper_event(tdata, false); + return 1; + } + + fprintf(stdout, "Unkown status for tamper%d: '%s'\n", tdata->iface, str); + return -1; +} + int main(int argc, char **argv) { mca_tamper_t *tdata = &tamper_data; @@ -169,6 +209,10 @@ int main(int argc, char **argv) goto error_ret2; } + ret = check_tamper_event(tdata); + if (ret) + goto error_ret3; + fd = open(tdata->chrdev_name, 0); if (fd < 0) { fprintf(stdout, "Failed to open %s\n", tdata->chrdev_name); @@ -201,7 +245,7 @@ int main(int argc, char **argv) } } - process_tamper_event(tdata); + process_tamper_event(tdata, true); } close(tdata->event_fd);