aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--TODO1
-rw-r--r--alarm-tools/alarms-show.c10
-rw-r--r--alarmd/alarmd.c17
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/<client_pid> 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");
}