about summary refs log tree commit diff stats
path: root/src/packet.c
diff options
context:
space:
mode:
authorRen Kararou <[email protected]>2025-01-07 20:52:27 -0600
committerRen Kararou <[email protected]>2025-01-07 20:52:27 -0600
commit660da53647cdcdc5ce07054f74e5c420a15702fe (patch)
tree796f00487c00a16a958467860354ad9f4bcc0276 /src/packet.c
parentb9635ce3b4ca30b14128c131bb9fe9be08740d6d (diff)
downloadnbtpd-660da53647cdcdc5ce07054f74e5c420a15702fe.tar.gz
nbtpd-660da53647cdcdc5ce07054f74e5c420a15702fe.tar.bz2
nbtpd-660da53647cdcdc5ce07054f74e5c420a15702fe.zip
first RRQ processed
Diffstat (limited to 'src/packet.c')
-rw-r--r--src/packet.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/packet.c b/src/packet.c
index 5bc8be6..0c9d592 100644
--- a/src/packet.c
+++ b/src/packet.c
@@ -1,3 +1,7 @@
+#include <stdlib.h>
+#include <unistd.h>
+#include <arpa/inet.h>
+#include <string.h>
 #include "packet.h"
 
 char *nbd_tftp_error_to_message(nbd_tftp_ecode error) {
@@ -22,3 +26,38 @@ char *nbd_tftp_error_to_message(nbd_tftp_ecode error) {
 	return "UNKNOWN ERROR";
 }
 
+char *nbd_tftp_ser_data(nbd_tftp_packet_data d) {
+	char *buf = malloc(sizeof(d.opcode) + sizeof(d.block_num) + d.datalen);
+	if (buf != NULL) {
+		uint16_t netopcode = htons(d.opcode);
+		uint16_t netbnum = htons(d.block_num);
+		memcpy(buf, &netopcode, sizeof(netopcode));
+		memcpy((buf + sizeof(netopcode)), &netbnum, sizeof(netbnum));
+		memcpy((buf + sizeof(netopcode) + sizeof(netbnum)), d.data, d.datalen);
+	}
+	return buf;
+}
+
+char *nbd_tftp_ser_data_from_parts(uint16_t blocknum, char *data, size_t datalen) {
+	char *buf = malloc(sizeof(uint16_t) + sizeof(blocknum) + datalen);
+	if (buf != NULL) {
+		uint16_t netopcode = htons(3);
+		uint16_t netbnum = htons(blocknum);
+		memcpy(buf, &netopcode, sizeof(netopcode));
+		memcpy((buf + sizeof(netopcode)), &netbnum, sizeof(netbnum));
+		memcpy((buf + sizeof(netopcode) + sizeof(netbnum)), data, datalen);
+	}
+	return buf;
+}
+
+nbd_tftp_packet_ack nbd_tftp_de_ack(char *buf, ssize_t buflen) {
+	nbd_tftp_packet_ack ack = { 0, 0 };
+	if ((buf != NULL) && (buflen == 4)) {
+		uint16_t opcode = ((uint16_t)buf[0] << 8) + buf[1];
+		uint16_t block_num = ((uint16_t)buf[2] << 8) + buf[3];
+		ack.opcode = opcode;
+		ack.block_num = block_num;
+	}
+	return ack;
+}
+