aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Phillips <david@sighup.nz>2018-06-27 22:24:35 +1200
committerDavid Phillips <david@sighup.nz>2018-06-27 22:24:35 +1200
commitee4b21dbeb516c06453c2ac6d78b7e02c1b485ce (patch)
tree6b785ebdcedd16ec5d482ed5035bba79fb66f961
parent85e52fd4eaa0de7a98f294dd8e8c952cc3eaf758 (diff)
downloadalarmd-ee4b21dbeb516c06453c2ac6d78b7e02c1b485ce.tar.xz
Record pid of process regsitering alarm
-rw-r--r--alarm-tools/alarms-show.c7
-rw-r--r--alarmd/alarmd.c22
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 <stdio.h>
#include <stdbool.h>
#include <stdint.h>
@@ -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;