From 48a94012fd2785d500c17e1f6f2315a13b2a0a2f Mon Sep 17 00:00:00 2001 From: David Phillips Date: Wed, 27 Jun 2018 22:55:01 +1200 Subject: Refactor client handling code, loop --- alarmd/alarmd.c | 88 ++++++++++++++++++++++++++++++--------------------------- 1 file changed, 47 insertions(+), 41 deletions(-) (limited to 'alarmd') diff --git a/alarmd/alarmd.c b/alarmd/alarmd.c index d1cef7d..4b3df78 100644 --- a/alarmd/alarmd.c +++ b/alarmd/alarmd.c @@ -109,7 +109,7 @@ int handle_set_raised_generic(int c_sock, int shall_raise) struct alarm *target = NULL; if ((nread = recv(c_sock, &uuid, 16, 0)) < 16) { - fprintf(stderr, "received not enough - %d\n", nread); + fprintf(stderr, "Received UUID too short\n"); return 1; } @@ -168,47 +168,13 @@ int handle_query(int c_sock) return 0; } - -int main(int argc, char **argv) +void handle_client(int c_sock) { - int sock = 0; - int c_sock = 0; - socklen_t c_addr_l = 0; - struct sockaddr_un local, c_addr; uint32_t packet_type = 0; ssize_t nread = 0; - int cred_len = 0; + unsigned int cred_len = 0; struct ucred cred; - 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; - } - - local.sun_family = AF_UNIX; - strcpy(local.sun_path, argv[1]); - unlink(local.sun_path); - if (bind(sock, (struct sockaddr *)&local, strlen(local.sun_path) + sizeof(local.sun_family)) < 0) { - perror("bind"); - return 1; - } - - if (listen(sock, 128) < 0) { - perror("listen"); - return 1; - } - - c_addr_l = sizeof(c_addr); - if ((c_sock = accept(sock, (struct sockaddr *)&c_addr, &c_addr_l)) < 0) { - perror("accept"); - return 1; - } - cred_len = sizeof(struct ucred); if (getsockopt(c_sock, SOL_SOCKET, SO_PEERCRED, &cred, &cred_len) < 0) { @@ -221,13 +187,12 @@ int main(int argc, char **argv) nread = recv(c_sock, &packet_type, sizeof(packet_type), 0); if (nread < 0) { perror("recv"); - return 1; + return; } else if (nread == 0) { - printf("Zschero\n"); break; } else if (nread < sizeof(packet_type)) { fprintf(stderr, "Packet type too short\n"); - return 1; + return; } switch(packet_type) { @@ -261,6 +226,47 @@ int main(int argc, char **argv) break; } } - fprintf(stderr, "Server stopping\n"); + close(c_sock); +} + +int main(int argc, char **argv) +{ + int sock = 0; + int c_sock = 0; + socklen_t c_addr_l = 0; + struct sockaddr_un local, c_addr; + + 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; + } + + local.sun_family = AF_UNIX; + strcpy(local.sun_path, argv[1]); + unlink(local.sun_path); + if (bind(sock, (struct sockaddr *)&local, strlen(local.sun_path) + sizeof(local.sun_family)) < 0) { + perror("bind"); + return 1; + } + + if (listen(sock, 128) < 0) { + perror("listen"); + return 1; + } + + c_addr_l = sizeof(c_addr); + while (1) { + if ((c_sock = accept(sock, (struct sockaddr *)&c_addr, &c_addr_l)) < 0) { + perror("accept"); + return 1; + } + handle_client(c_sock); + } + fprintf(stderr, "Shutting down\n"); close(sock); } -- cgit v1.1