diff options
Diffstat (limited to 'src/packet.c')
-rw-r--r-- | src/packet.c | 39 |
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; +} + |