aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDavid Phillips <david@sighup.nz>2018-06-04 00:09:02 +1200
committerDavid Phillips <david@sighup.nz>2018-06-04 00:09:02 +1200
commit5f5316a034d68f8825a16e7b866c8e8b2b6c6bd8 (patch)
treeba8d8b59113aa0ec02b92cf14a50e2cef0913684 /lib
downloadalarmd-5f5316a034d68f8825a16e7b866c8e8b2b6c6bd8.tar.xz
Initial dump of prototype
Diffstat (limited to 'lib')
-rw-r--r--lib/Makefile8
-rw-r--r--lib/libalarm.c140
2 files changed, 148 insertions, 0 deletions
diff --git a/lib/Makefile b/lib/Makefile
new file mode 100644
index 0000000..52368e0
--- /dev/null
+++ b/lib/Makefile
@@ -0,0 +1,8 @@
+
+CFLAGS += "-I../inc/"
+
+libalarm.so: libalarm.o
+ $(CC) -shared -o $@ $< $(LDFLAGS)
+
+.o.c:
+ $(CC) -o $@ $< $(LDFLAGS)
diff --git a/lib/libalarm.c b/lib/libalarm.c
new file mode 100644
index 0000000..856d8f6
--- /dev/null
+++ b/lib/libalarm.c
@@ -0,0 +1,140 @@
+#include <stdio.h>
+#include <stdint.h>
+#include <sys/socket.h>
+#include <strings.h>
+
+int8_t recv_string(int sock, char (*buffer)[128])
+{
+ uint8_t length = 0;
+ if (recv(sock, &length, sizeof(uint8_t), 0) < sizeof(uint8_t)) {
+ return -1;
+ }
+ if (length >= 128) {
+ return -1;
+ }
+ if (recv(sock, buffer, length, 0) < 0) {
+ return -1;
+ }
+ (*buffer)[length] = '\0';
+ return length;
+}
+
+int send_string(int sock, char *buffer)
+{
+ ssize_t sent = 0;
+ size_t length = 0;
+ uint8_t length8 = 0;
+
+ /* Protocol allows strings of length < 128 */
+ if (length >= 128) {
+ return 1;
+ }
+
+ /* bitmasking is unnecessary by now aside from clarity */
+ length8 = length8 & 0xFF;
+
+ if (send(sock, &length8, sizeof(length8), 0) < sizeof(length8)) {
+ return 1;
+ }
+ sent = send(sock, buffer, length8, 0);
+ if (sent < 0) {
+ perror("send");
+ return 1;
+ } else if (sent < length8) {
+ return 1;
+ }
+ return 0;
+}
+
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+#include <arpa/inet.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+#include <unistd.h>
+
+#include "alarmd_proto.h"
+
+int alarmd_register(int sock, char *desc, char (*uuid)[16])
+{
+ uint8_t length = 0;
+ uint32_t packet_type = 0;
+
+ packet_type = htonl(ALARMD_PACKET_TYPE_REGISTER);
+ if (send(sock, &packet_type, sizeof(packet_type), 0) != sizeof(packet_type)) {
+ perror("send");
+ return 1;
+ }
+
+ length = strlen(desc);
+ if (send(sock, &length, sizeof(length), 0) != sizeof(length)) {
+ perror("send");
+ return 1;
+ }
+
+ if (send(sock, desc, strlen(desc), 0) != strlen(desc)) {
+ perror("send");
+ return 1;
+ }
+ if (recv(sock, uuid, 16, 0) != 16) {
+ perror("recv");
+ return 1;
+ }
+ return 0;
+}
+
+int alarmd_deregister(int sock, char uuid[16])
+{
+ uint32_t packet_type = 0;
+
+ packet_type = htonl(ALARMD_PACKET_TYPE_DEREGISTER);
+ if (send(sock, &packet_type, sizeof(packet_type), 0) != sizeof(packet_type)) {
+ perror("send");
+ return 1;
+ }
+
+ /* FIXME 16 magic */
+ if (send(sock, uuid, 16, 0) != 16) {
+ perror("send");
+ return 1;
+ }
+ return 0;
+}
+
+int alarmd_raise(int sock, char uuid[16])
+{
+ uint32_t packet_type = 0;
+
+ packet_type = htonl(ALARMD_PACKET_TYPE_RAISE);
+ if (send(sock, &packet_type, sizeof(packet_type), 0) != sizeof(packet_type)) {
+ perror("send");
+ return 1;
+ }
+
+ /* FIXME 16 magic */
+ if (send(sock, uuid, 16, 0) != 16) {
+ perror("send");
+ return 1;
+ }
+ return 0;
+}
+
+int alarmd_clear(int sock, char uuid[16])
+{
+ uint32_t packet_type = 0;
+
+ packet_type = htonl(ALARMD_PACKET_TYPE_CLEAR);
+ if (send(sock, &packet_type, sizeof(packet_type), 0) != sizeof(packet_type)) {
+ perror("send");
+ return 1;
+ }
+
+ /* FIXME 16 magic */
+ if (send(sock, uuid, 16, 0) != 16) {
+ perror("send");
+ return 1;
+ }
+ return 0;
+}