diff options
| author | David Phillips <david@sighup.nz> | 2018-06-04 00:09:02 +1200 | 
|---|---|---|
| committer | David Phillips <david@sighup.nz> | 2018-06-04 00:09:02 +1200 | 
| commit | 5f5316a034d68f8825a16e7b866c8e8b2b6c6bd8 (patch) | |
| tree | ba8d8b59113aa0ec02b92cf14a50e2cef0913684 /lib | |
| download | alarmd-5f5316a034d68f8825a16e7b866c8e8b2b6c6bd8.tar.xz | |
Initial dump of prototype
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/Makefile | 8 | ||||
| -rw-r--r-- | lib/libalarm.c | 140 | 
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; +} | 
