1 /*
2 * fixed-sized file chunking
3 */
4 static int file_chunk_fsp(int fd, int fd_ldata, int fd_bdata, unsigned int *pos, unsigned int *block_num,
5 block_id_t **metadata, hashtable *htable, char *last_block_buf, unsigned int *last_block_len)
6 {
7 int ret = 0;
8 unsigned int rwsize;
9 unsigned char md5_checksum[16 + 1] = {0};
10 char *buf = NULL;
11
12 buf = (char *)malloc(g_block_size);
13 if (buf == NULL)
14 {
15 perror("malloc in file_chunk_fsp");
16 return errno;
17 }
18
19 while (rwsize = read(fd, buf, g_block_size))
20 {
21 /* if the last block */
22 if (rwsize != g_block_size)
23 break;
24
25 /* calculate md5 */
26 md5(buf, rwsize, md5_checksum);
27 if (0 != (ret = dedup_regfile_block_process(buf, rwsize, md5_checksum, fd_ldata,
28 fd_bdata, pos, block_num, metadata, htable)))
29 {
30 perror("dedup_regfile_block_process in file_chunk_fsp");
31 goto _FILE_CHUNK_FSP_EXIT;
32 }
33 }
34 *last_block_len = (rwsize > 0) ? rwsize : 0;
35 if ((*last_block_len)) memcpy(last_block_buf, buf, *last_block_len);
36
37 _FILE_CHUNK_FSP_EXIT:
38 if (buf) free(buf);
39 return ret;
40 }