|
1 |
| -#include <stdio.h> |
| 1 | +#include <unistd.h> |
| 2 | +#include <sys/types.h> |
| 3 | +#include <sys/stat.h> |
| 4 | +#include <fcntl.h> |
| 5 | + |
2 | 6 | #include "buffer.h"
|
3 | 7 | #include "packet.h"
|
4 | 8 |
|
@@ -66,3 +70,58 @@ int send_buffer_write(char *data, int len)
|
66 | 70 |
|
67 | 71 | return retval;
|
68 | 72 | }
|
| 73 | + |
| 74 | +int64_t send_file_buffer_write(int fd, int64_t offset, int64_t size, int64_t blocksize) |
| 75 | +{ |
| 76 | + |
| 77 | + packet_t packet; |
| 78 | + |
| 79 | + int retval; |
| 80 | + int seqnum; |
| 81 | + char buffer[PACKET_DATA_SIZE]; |
| 82 | + int boundary; |
| 83 | + int len; |
| 84 | + |
| 85 | + retval = 0; |
| 86 | + seqnum = 2142894844; /* TODO: generate random number */ |
| 87 | + boundary = PACKET_BOUNDARY_START; |
| 88 | + |
| 89 | + if (fd < 0) return -1; |
| 90 | + |
| 91 | + while (size > 0) |
| 92 | + { |
| 93 | + len = pread(fd, buffer, PACKET_DATA_SIZE, offset); |
| 94 | + if (len < 0) break; |
| 95 | + retval += len; |
| 96 | + size -= len; |
| 97 | + |
| 98 | + boundary |= (size > 0) ? PACKET_BOUNDARY_NONE : PACKET_BOUNDARY_END; |
| 99 | + |
| 100 | + packet_clear_header (packet); |
| 101 | + packet_set_data (packet); |
| 102 | + packet_set_seqnum (packet, seqnum++); |
| 103 | + packet_set_boundary (packet, boundary); |
| 104 | + packet_set_order (packet, 1); |
| 105 | + packet_set_msgnum (packet, 1); |
| 106 | + packet_set_timestamp(packet, 0x0000051c); /* TODO: calculate time */ |
| 107 | + packet_set_id (packet, 0x08c42c74); /* TODO: generate an id */ |
| 108 | + |
| 109 | + packet_new(&packet, buffer, len); |
| 110 | + send_packet_buffer_write(&packet); |
| 111 | + |
| 112 | + boundary = PACKET_BOUNDARY_NONE; |
| 113 | + |
| 114 | + offset += len; |
| 115 | + } |
| 116 | + |
| 117 | + packet_clear_header (packet); |
| 118 | + packet_set_ctrl (packet); |
| 119 | + packet_set_type (packet, PACKET_TYPE_ACK); |
| 120 | + packet_set_timestamp(packet, 0x0000051c); /* TODO: calculate time */ |
| 121 | + packet_set_id (packet, 0x08c42c74); /* TODO: generate an id */ |
| 122 | + |
| 123 | + packet_new(&packet, NULL, 0); |
| 124 | + send_packet_buffer_write(&packet); |
| 125 | + |
| 126 | + return retval; |
| 127 | +} |
0 commit comments