#include #include #include #include #include #include #include #include #include #include "alarmd_proto.h" int dump_alarms(int sock) { ssize_t i = 0; ssize_t nread = 0; size_t length = 0; 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; if (send(sock, &packet_type, sizeof(packet_type), 0) != sizeof(packet_type)) { perror("send"); return 1; } nread = recv(sock, &count, sizeof(count), 0); if (nread < 0) { perror("recv"); return 1; } else if (nread < sizeof(count)) { fprintf(stderr, "Alarm count size too small\n"); return 1; } printf("Alarms\n" "------\n"); for (i = 0; i < count; i++) { if ((length = recv_string(sock, &buffer)) < 0) { perror("recv"); break; } if (recv(sock, &is_raised, sizeof(is_raised), 0) != sizeof(is_raised)) { 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; } 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) { printf("No alarms registered.\n"); } if (i < count) { fprintf(stderr, "Not all alarms received, output must be missing some\n"); return 1; } printf("\n"); return 0; } int main(int argc, char **argv) { int sock = 0; struct sockaddr_un server; if (argc != 2) { fprintf(stderr, "Syntax: %s socket_name\n", argv[0]); return 1; } if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { perror("socket"); return 1; } server.sun_family = AF_UNIX; strcpy(server.sun_path, argv[1]); printf("Connecting...\n"); if (connect(sock, (struct sockaddr *)&server, strlen(server.sun_path) + sizeof(server.sun_family)) < 0) { close(sock); perror("connect"); return 1; } printf("Connected.\n"); dump_alarms(sock); close(sock); }