From c18dd2b30e2dc95043492d2b8495ecca3d1b8e40 Mon Sep 17 00:00:00 2001 From: vg Date: Fri, 23 Feb 2024 14:37:47 +0100 Subject: add new syslog-listen program to repository --- small-codes/syslog-listen.c | 47 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 small-codes/syslog-listen.c diff --git a/small-codes/syslog-listen.c b/small-codes/syslog-listen.c new file mode 100644 index 0000000..c878076 --- /dev/null +++ b/small-codes/syslog-listen.c @@ -0,0 +1,47 @@ +// This program is able to listen to a datagram unix socket displaying +// a linefeed at each receive. Useful when other program wants scrutinize +// syslog forwarded outputs for example (like in omuxsock module by rsyslog +// does). +// +// compile with gcc/clang -o syslog-listen syslog-listen.c + + +#include +#include +#include +#include +#include +#include +#include + +#define PERROR(code, msg) { if ((code) == -1) { perror((msg)); exit(1); } } + +int main(int argc, const char** argv) +{ + if (argc < 2) { + fprintf(stderr, "Usage: syslog-listen \n"); + exit(1); + } + + struct sockaddr_un sock_file; + memset(&sock_file, 0, sizeof(sock_file)); + sock_file.sun_family = AF_UNIX; + strncpy(sock_file.sun_path, argv[1], sizeof(sock_file.sun_path)); + + int sock = socket(AF_UNIX, SOCK_DGRAM, 0); + PERROR(sock, "socket"); + unlink(argv[1]); // no need to test ret as bind will crash if needed + int ret = bind(sock, (struct sockaddr*)&sock_file, sizeof(sock_file)); + PERROR(ret, "bind"); + + char buf[8192]; + int receive; + while (1) { + receive = recv(sock, buf, sizeof(buf), 0); + PERROR(receive, "recv"); + buf[receive] = '\0'; + printf("received: %s\n", buf); + } + + return 0; +} -- cgit v1.2.3