From ee4b21dbeb516c06453c2ac6d78b7e02c1b485ce Mon Sep 17 00:00:00 2001 From: David Phillips Date: Wed, 27 Jun 2018 22:24:35 +1200 Subject: Record pid of process regsitering alarm --- alarm-tools/alarms-show.c | 7 ++++++- alarmd/alarmd.c | 22 +++++++++++++++++++--- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/alarm-tools/alarms-show.c b/alarm-tools/alarms-show.c index 65d0e91..8418ee8 100644 --- a/alarm-tools/alarms-show.c +++ b/alarm-tools/alarms-show.c @@ -19,6 +19,7 @@ int dump_alarms(int sock) uint32_t packet_type = 0; uint8_t is_raised = 0; char buffer[128]; + pid_t owner = 0; packet_type = htonl(ALARMD_PACKET_TYPE_QUERY); @@ -50,7 +51,11 @@ int dump_alarms(int sock) perror("recv"); break; } - printf("[%s] %s\n", is_raised ? "\x1b[1;31mRAISE\x1b[0m" : "\x1b[1;32mCLEAR\x1b[0m", buffer); + 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); } if (count == 0) { diff --git a/alarmd/alarmd.c b/alarmd/alarmd.c index fcf96e4..3f95142 100644 --- a/alarmd/alarmd.c +++ b/alarmd/alarmd.c @@ -1,3 +1,6 @@ +/* FIXME bother remobing _GNU_SOURCE? It only gives struct ucred, which + * is linux-only anyway */ +#define _GNU_SOURCE #include #include #include @@ -18,6 +21,7 @@ struct alarm { uuid_t uuid; char *name; bool is_raised; + pid_t owner; // time_t last_change; }; @@ -39,7 +43,7 @@ int8_t read_string(int sock, unsigned char (*buffer)[128]) return length; } -int handle_register(int c_sock) +int handle_register(int c_sock, pid_t owner) { uuid_t uuid; unsigned char buffer[128]; @@ -66,6 +70,7 @@ int handle_register(int c_sock) new_alarm->name = strdup((const char*)buffer); memcpy(new_alarm->uuid, uuid, 16); new_alarm->is_raised = 0; + new_alarm->owner = owner; /* LOCK */ HASH_ADD(hh, alarms, uuid, 16, new_alarm); @@ -115,7 +120,6 @@ int handle_set_raised_generic(int c_sock, int shall_raise) } /* UNLOCK */ return 0; - } int handle_raise(int c_sock) @@ -155,6 +159,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->owner), sizeof(a->owner), 0) < sizeof(a->owner)) { + perror("send"); + } fprintf(stderr, "SENT.\n"); } /* UNLOCK */ @@ -170,6 +177,8 @@ int main(int argc, char **argv) struct sockaddr_un local, c_addr; uint32_t packet_type = 0; ssize_t nread = 0; + int cred_len = 0; + struct ucred cred; if (argc != 2) { fprintf(stderr, "Syntax: %s socket_name\n", argv[0]); @@ -200,6 +209,13 @@ int main(int argc, char **argv) return 1; } + cred_len = sizeof(struct ucred); + + if (getsockopt(c_sock, SOL_SOCKET, SO_PEERCRED, &cred, &cred_len) < 0) { + perror("getsockopt"); + close(c_sock); + } + while (1) { /* read packet type */ nread = recv(c_sock, &packet_type, sizeof(packet_type), 0); @@ -217,7 +233,7 @@ int main(int argc, char **argv) switch(packet_type) { case ALARMD_PACKET_TYPE_REGISTER: - if (handle_register(c_sock)) { + if (handle_register(c_sock, cred.pid)) {; close(c_sock); } break; -- cgit v1.1