MCPcopy Create free account
hub / github.com/cgsecurity/testdisk / fat_copy_file

Function fat_copy_file

src/fat_unformat.c:155–220  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

153}
154
155static copy_file_t fat_copy_file(disk_t *disk, const partition_t *partition, const unsigned int cluster_size, const uint64_t start_data, const char *recup_dir, const unsigned int dir_num, const unsigned int inode_num, const file_info_t *file)
156{
157 char *new_file;
158 FILE *f_out;
159 unsigned int cluster;
160 unsigned int file_size=file->st_size;
161 const unsigned long int no_of_cluster=(partition->part_size - start_data) / cluster_size;
162 unsigned char *buffer_file=(unsigned char *)MALLOC(cluster_size);
163 cluster = file->st_ino;
164 new_file=(char *)MALLOC(1024);
165#ifdef HAVE_MKDIR
166 snprintf(new_file, 1024, "%s.%u/inode_%u", recup_dir, dir_num, inode_num);
167#ifdef __MINGW32__
168 mkdir(new_file);
169#else
170 (void)mkdir(new_file, 0775);
171#endif
172#endif
173 snprintf(new_file, 1024, "%s.%u/inode_%u/%s", recup_dir, dir_num, inode_num,
174 file->name);
175 strip_fn(new_file);
176 if((f_out=fopen(new_file, "rb"))!=NULL)
177 {
178 fclose(f_out);
179 snprintf(new_file, 1024, "%s.%u/inode_%u/f%07u-%s", recup_dir, dir_num, inode_num,
180 (unsigned int)((start_data - partition->part_offset + (uint64_t)(cluster-2)*cluster_size)/disk->sector_size),
181 file->name);
182 strip_fn(new_file);
183 }
184 log_info("fat_copy_file %s\n", new_file);
185 f_out=fopen(new_file, "wb");
186 if(!f_out)
187 {
188 log_critical("Can't create file %s: \n",new_file);
189 free(new_file);
190 free(buffer_file);
191 return CP_CREATE_FAILED;
192 }
193 while(cluster>=2 && cluster<=no_of_cluster+2 && file_size>0)
194 {
195 const uint64_t start=start_data + (uint64_t)(cluster-2)*cluster_size;
196 unsigned int toread = cluster_size;
197 if (toread > file_size)
198 toread = file_size;
199 if((unsigned)disk->pread(disk, buffer_file, toread, start) != toread)
200 {
201 log_error("fat_copy_file: Can't read cluster %u.\n", cluster);
202 }
203 if(fwrite(buffer_file, 1, toread, f_out) != toread)
204 {
205 log_error("fat_copy_file: no space left on destination.\n");
206 fclose(f_out);
207 set_date(new_file, file->td_atime, file->td_mtime);
208 free(new_file);
209 free(buffer_file);
210 return CP_NOSPACE;
211 }
212 file_size -= toread;

Callers 1

fat_unformat_auxFunction · 0.85

Calls 4

MALLOCFunction · 0.85
snprintfFunction · 0.85
set_dateFunction · 0.85
strip_fnFunction · 0.70

Tested by

no test coverage detected