aboutsummaryrefslogtreecommitdiff
path: root/alarmd
diff options
context:
space:
mode:
authorDavid Phillips <david@sighup.nz>2018-06-27 22:55:01 +1200
committerDavid Phillips <david@sighup.nz>2018-06-27 22:55:01 +1200
commit48a94012fd2785d500c17e1f6f2315a13b2a0a2f (patch)
treea84678a30a50b5440cb69d6ec7c24072b77c8936 /alarmd
parentce768385713db023e874db420b034dcbe94b5d48 (diff)
downloadalarmd-48a94012fd2785d500c17e1f6f2315a13b2a0a2f.tar.xz
Refactor client handling code, loop
Diffstat (limited to 'alarmd')
-rw-r--r--alarmd/alarmd.c88
1 files changed, 47 insertions, 41 deletions
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);
}