From 7c5b8b1fc1612a98dcd4af1046e03810d125add4 Mon Sep 17 00:00:00 2001 From: David Phillips Date: Wed, 29 Aug 2018 21:28:02 +1200 Subject: Add alarm change timestamping --- TODO | 1 + alarm-tools/alarms-show.c | 10 +++++++++- alarmd/alarmd.c | 17 +++++++++-------- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/TODO b/TODO index 58e81da..ad7ccd8 100644 --- a/TODO +++ b/TODO @@ -1,2 +1,3 @@ - Watch /proc/ and destroy alarms last owned by processes when they die - Allow ownership change command so long as uuid can be given +- Add alarm querying to libalarmd diff --git a/alarm-tools/alarms-show.c b/alarm-tools/alarms-show.c index 938401e..58d0064 100644 --- a/alarm-tools/alarms-show.c +++ b/alarm-tools/alarms-show.c @@ -18,7 +18,10 @@ int dump_alarms(int sock) uint32_t count = 0; uint32_t packet_type = 0; uint8_t is_raised = 0; + time_t last_change; + struct tm last_change_tm; char buffer[128]; + char time_string[32]; pid_t owner = 0; packet_type = ALARMD_PACKET_TYPE_QUERY; @@ -49,11 +52,16 @@ int dump_alarms(int sock) perror("recv"); break; } + if (recv(sock, &last_change, sizeof(last_change), 0) != sizeof(last_change)) { + perror("recv"); + break; + } if (recv(sock, &owner, sizeof(owner), 0) != sizeof(owner)) { perror("recv"); break; } - printf("[%s] [pid %d] %s\n", is_raised ? "\x1b[1;31mRAISE\x1b[0m" : "\x1b[1;32mCLEAR\x1b[0m", owner, buffer); + strftime(time_string, sizeof(time_string), "%Y-%m-%d %H:%M:%S", localtime_r(&last_change, &last_change_tm)); + printf("[%s] [pid %d] [%s] %s\n", is_raised ? "\x1b[1;31mRAISE\x1b[0m" : "\x1b[1;32mCLEAR\x1b[0m", owner, time_string, buffer); } if (count == 0) { diff --git a/alarmd/alarmd.c b/alarmd/alarmd.c index 84ae195..b5106eb 100644 --- a/alarmd/alarmd.c +++ b/alarmd/alarmd.c @@ -24,7 +24,7 @@ struct alarm { char *name; bool is_raised; pid_t owner; -// time_t last_change; + time_t last_change; }; static struct alarm *alarms; @@ -56,8 +56,6 @@ int handle_register(int c_sock, pid_t owner) } uuid_generate(uuid); - //uuid_unparse(uuid, uuid_str); - //fprintf(stderr, "Registering alarm %s with uuid %s\n", buffer, uuid_str); if (send(c_sock, uuid, sizeof(uuid_t), 0) != sizeof(uuid_t)) { perror("send"); @@ -72,6 +70,7 @@ int handle_register(int c_sock, pid_t owner) new_alarm->name = strdup((const char*)buffer); memcpy(new_alarm->uuid, uuid, sizeof(new_alarm->uuid)); new_alarm->is_raised = 0; + time(&(new_alarm->last_change)); new_alarm->owner = owner; alarmd_lock(); @@ -84,15 +83,11 @@ int handle_deregister(int c_sock) { uuid_t uuid; struct alarm *target = NULL; -// char uuid_str[37]; if (recv(c_sock, &uuid, sizeof(uuid_t), 0) < sizeof(uuid_t)) { return 1; } -// uuid_unparse(uuid, uuid_str); -// fprintf(stderr, "Deregistering alarm %s\n", uuid_str); - alarmd_lock(); HASH_FIND(hh, alarms, uuid, sizeof(uuid_t), target); if (target != NULL) { @@ -118,7 +113,10 @@ int handle_set_raised_generic(int c_sock, int shall_raise) alarmd_lock(); HASH_FIND(hh, alarms, uuid, sizeof(uuid_t), target); if (target != NULL) { - target->is_raised = shall_raise; + if (target->is_raised != shall_raise) { + time(&(target->last_change)); + target->is_raised = shall_raise; + } } alarmd_unlock(); return 0; @@ -160,6 +158,9 @@ int handle_query(int c_sock) if (send(c_sock, &(a->is_raised), sizeof(a->is_raised), 0) < sizeof(a->is_raised)) { perror("send"); } + if (send(c_sock, &(a->last_change), sizeof(a->last_change), 0) < sizeof(a->last_change)) { + perror("send"); + } if (send(c_sock, &(a->owner), sizeof(a->owner), 0) < sizeof(a->owner)) { perror("send"); } -- cgit v1.1