summaryrefslogtreecommitdiffstats
path: root/src/photorec.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/photorec.c')
-rw-r--r--src/photorec.c89
1 files changed, 65 insertions, 24 deletions
diff --git a/src/photorec.c b/src/photorec.c
index 0b7006a5..85bee7a6 100644
--- a/src/photorec.c
+++ b/src/photorec.c
@@ -24,11 +24,12 @@
#include <config.h>
#endif
-#if defined(__FRAMAC__) || defined(MAIN_photorec)
+#if defined(DISABLED_FOR_FRAMAC)
#undef HAVE_FTRUNCATE
#undef HAVE_LIBEXT2FS
#undef HAVE_LIBNTFS
#undef HAVE_LIBNTFS3G
+#undef ENABLE_DFXML
#endif
#include <stdio.h>
@@ -51,6 +52,7 @@
#if defined(__FRAMAC__)
#include "__fc_builtin.h"
#endif
+#include <limits.h>
#include "types.h"
#include "common.h"
#include "fnctdsk.h"
@@ -91,7 +93,7 @@ void file_block_log(const file_recovery_t *file_recovery, const unsigned int sec
struct td_list_head *tmp;
if(file_recovery->filename[0]=='\0')
return;
-#ifndef __FRAMAC__
+#ifndef DISABLED_FOR_FRAMAC
log_info("%s\t",file_recovery->filename);
td_list_for_each(tmp, &file_recovery->location.list)
{
@@ -114,6 +116,7 @@ void del_search_space(alloc_data_t *list_search_space, const uint64_t start, con
@ requires \valid(list_search_space);
@ requires new_current_search_space == \null || \valid(*new_current_search_space);
@ requires offset == \null || \valid(offset);
+ @ decreases end-start;
@*/
static void update_search_space_aux(alloc_data_t *list_search_space, const uint64_t start, const uint64_t end, alloc_data_t **new_current_search_space, uint64_t *offset)
{
@@ -267,43 +270,46 @@ void free_list_search_space(alloc_data_t *list_search_space)
unsigned int photorec_mkdir(const char *recup_dir, const unsigned int initial_dir_num)
{
- int dir_ok=0;
- int dir_num=initial_dir_num;
+ unsigned int dir_num=initial_dir_num;
#ifdef DJGPP
int i=0;
+ /*@ assert valid_read_string(recup_dir); */
#endif
- /*@ loop invariant valid_read_string(recup_dir); */
- do
+ /*@
+ @ loop invariant \separated(recup_dir, &errno);
+ @ loop assigns errno, dir_num;
+ @*/
+ while(1)
{
char working_recup_dir[2048];
- snprintf(working_recup_dir,sizeof(working_recup_dir)-1,"%s.%d",recup_dir,dir_num);
+ snprintf(working_recup_dir, sizeof(working_recup_dir)-1, "%s.%u", recup_dir, dir_num);
+ working_recup_dir[sizeof(working_recup_dir)-1]='\0';
+ /*@ assert valid_read_string(&working_recup_dir[0]); */
#ifdef HAVE_MKDIR
#ifdef __MINGW32__
- if(mkdir(working_recup_dir)!=0 && errno==EEXIST)
+ if(mkdir(working_recup_dir)==0 || errno!=EEXIST)
+ return dir_num;
#else
- if(mkdir(working_recup_dir, 0775)!=0 && errno==EEXIST)
+ if(mkdir(working_recup_dir, 0775)==0 || errno!=EEXIST)
+ return dir_num;
#endif
#else
#warning "You need a mkdir function!"
#endif
- {
- dir_num++;
- }
- else
- {
- dir_ok=1;
- }
+ if(dir_num == UINT_MAX)
+ dir_num=0;
+ else
+ dir_num++;
#ifdef DJGPP
/* Avoid endless loop in Dos version of Photorec after 999 directories if working with short name */
i++;
- if(dir_ok==0 && i==1000)
+ if(i==1000)
{
dir_num=initial_dir_num;
- dir_ok=1;
+ return dir_num;
}
#endif
- } while(dir_ok==0);
- return dir_num;
+ }
}
/*@
@@ -365,6 +371,7 @@ void forget(const alloc_data_t *list_search_space, alloc_data_t *current_search_
unsigned int remove_used_space(disk_t *disk_car, const partition_t *partition, alloc_data_t *list_search_space)
{
+#ifndef DISABLED_FOR_FRAMAC
if( partition->upart_type==UP_FAT12 ||
partition->upart_type==UP_FAT16 ||
partition->upart_type==UP_FAT32)
@@ -379,6 +386,7 @@ unsigned int remove_used_space(disk_t *disk_car, const partition_t *partition, a
else if(partition->upart_type==UP_EXT2 || partition->upart_type==UP_EXT3 || partition->upart_type==UP_EXT4)
return ext2_remove_used_space(disk_car, partition, list_search_space);
#endif
+#endif
return 0;
}
@@ -406,10 +414,14 @@ void update_stats(file_stat_t *file_stats, alloc_data_t *list_search_space)
void write_stats_log(const file_stat_t *file_stats)
{
+#ifndef DISABLED_FOR_FRAMAC
unsigned int file_nbr=0;
unsigned int i;
unsigned int nbr;
file_stat_t *new_file_stats;
+ /*@
+ @ loop assigns i;
+ @*/
for(i=0;file_stats[i].file_hint!=NULL;i++);
if(i==0)
return ;
@@ -437,6 +449,7 @@ void write_stats_log(const file_stat_t *file_stats)
{
log_info("Total: %u file found\n\n",file_nbr);
}
+#endif
}
int sorfile_stat_ts(const void *p1, const void *p2)
@@ -574,10 +587,12 @@ static void file_block_free(alloc_list_t *list_allocation)
@ requires \valid(file_recovery->handle);
@ requires valid_file_recovery(file_recovery);
@ requires \separated(file_recovery, params, file_recovery->handle);
+ @ decreases 0;
@*/
static void file_finish_aux(file_recovery_t *file_recovery, struct ph_param *params, const int paranoid)
{
/*@ assert valid_file_recovery(file_recovery); */
+ /*@ assert file_recovery->file_check == \null || \valid_function(file_recovery->file_check); */
if(params->status!=STATUS_EXT2_ON_SAVE_EVERYTHING &&
params->status!=STATUS_EXT2_OFF_SAVE_EVERYTHING &&
file_recovery->file_stat!=NULL && file_recovery->file_check!=NULL && paranoid>0)
@@ -594,7 +609,7 @@ static void file_finish_aux(file_recovery_t *file_recovery, struct ph_param *par
if(file_recovery->file_stat!=NULL && file_recovery->file_size> 0 &&
file_recovery->file_size < file_recovery->min_filesize)
{
-#ifndef __FRAMAC__
+#ifndef DISABLED_FOR_FRAMAC
log_info("%s File too small ( %llu < %llu), reject it\n",
file_recovery->filename,
(long long unsigned) file_recovery->file_size,
@@ -723,7 +738,7 @@ pfstatus_t file_finish2(file_recovery_t *file_recovery, struct ph_param *params,
void info_list_search_space(const alloc_data_t *list_search_space, const alloc_data_t *current_search_space, const unsigned int sector_size, const int keep_corrupted_file, const int verbose)
{
-#ifndef __FRAMAC__
+#ifndef DISABLED_FOR_FRAMAC
struct td_list_head *search_walker = NULL;
unsigned long int nbr_headers=0;
uint64_t sectors_with_unknown_data=0;
@@ -838,16 +853,42 @@ uint64_t set_search_start(struct ph_param *params, alloc_data_t **new_current_se
return offset;
}
-void params_reset(struct ph_param *params, const struct ph_options *options)
+/*@
+ @ requires valid_ph_param(params);
+ @ requires params->disk->sector_size > 0;
+ @ requires valid_read_string(params->recup_dir);
+ @ assigns params->file_nbr;
+ @ assigns params->status;
+ @ assigns params->real_start_time;
+ @ assigns params->dir_num;
+ @ assigns params->offset;
+ @ assigns params->blocksize;
+ @ ensures valid_ph_param(params);
+ @ ensures params->file_nbr == 0;
+ @ ensures params->status == STATUS_FIND_OFFSET;
+ @ ensures params->dir_num == 1;
+ @ ensures params->offset == PH_INVALID_OFFSET;
+ @ ensures params->blocksize > 0;
+ @ ensures valid_read_string(params->recup_dir);
+ @*/
+static void params_reset_aux(struct ph_param *params)
{
params->file_nbr=0;
params->status=STATUS_FIND_OFFSET;
params->real_start_time=time(NULL);
params->dir_num=1;
- params->file_stats=init_file_stats(options->list_file_format);
params->offset=PH_INVALID_OFFSET;
if(params->blocksize==0)
params->blocksize=params->disk->sector_size;
+ /*@ assert params->blocksize > 0; */
+}
+
+void params_reset(struct ph_param *params, const struct ph_options *options)
+{
+ /*@ assert valid_ph_param(params); */
+ params->file_stats=init_file_stats(options->list_file_format);
+ /*@ assert valid_ph_param(params); */
+ params_reset_aux(params);
}
const char *status_to_name(const photorec_status_t status)