summaryrefslogtreecommitdiffstats
path: root/src/filegen.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/filegen.c')
-rw-r--r--src/filegen.c61
1 files changed, 42 insertions, 19 deletions
diff --git a/src/filegen.c b/src/filegen.c
index fee262d3..49f56a3e 100644
--- a/src/filegen.c
+++ b/src/filegen.c
@@ -363,17 +363,18 @@ file_stat_t * init_file_stats(file_enable_t *files_enable)
}
/* The original filename begins at offset in buffer and is null terminated */
-void file_rename(const char *old_filename, const void *buffer, const int buffer_size, const int offset, const char *new_ext, const int force_ext)
+int file_rename(file_recovery_t *file_recovery, const void *buffer, const int buffer_size, const int offset, const char *new_ext, const int force_ext)
{
/* new_filename is large enough to avoid a buffer overflow */
char *new_filename;
- const char *src=old_filename;
- const char *ext=src;
+ const char *src=file_recovery->filename;
+ const char *ext=NULL;
char *dst;
char *directory_sep;
- int len=strlen(old_filename)+1;
+ int len;
if(buffer_size<0)
- return ;
+ return -1;
+ len=strlen(src)+1;
if(offset < buffer_size && buffer!=NULL)
len+=buffer_size-offset+1;
if(new_ext!=NULL)
@@ -384,7 +385,10 @@ void file_rename(const char *old_filename, const void *buffer, const int buffer_
while(*src!='\0')
{
if(*src=='/')
+ {
directory_sep=dst;
+ ext=NULL;
+ }
if(*src=='.')
ext=src;
*dst++ = *src++;
@@ -450,31 +454,42 @@ void file_rename(const char *old_filename, const void *buffer, const int buffer_
}
else if(force_ext>0)
{
- while(*ext!='\0')
- *dst++ = *ext++;
+ if(ext!=NULL)
+ {
+ while(*ext!='\0')
+ *dst++ = *ext++;
+ }
}
*dst='\0';
- if(rename(old_filename, new_filename)<0)
+ if(rename(file_recovery->filename, new_filename)<0)
{
- /* Rename has failed, try without the original filename */
- if(buffer!=NULL)
- file_rename(old_filename, NULL, 0, 0, new_ext, force_ext);
+ /* Rename has failed */
+ free(new_filename);
+ if(buffer==NULL)
+ return -1;
+ /* Try without the original filename */
+ return file_rename(file_recovery, NULL, 0, 0, new_ext, force_ext);
+ }
+ if(strlen(new_filename)<sizeof(file_recovery->filename))
+ {
+ strcpy(file_recovery->filename, new_filename);
}
free(new_filename);
+ return 0;
}
/* The original filename begins at offset in buffer and is null terminated */
-void file_rename_unicode(const char *old_filename, const void *buffer, const int buffer_size, const int offset, const char *new_ext, const int force_ext)
+int file_rename_unicode(file_recovery_t *file_recovery, const void *buffer, const int buffer_size, const int offset, const char *new_ext, const int force_ext)
{
/* new_filename is large enough to avoid a buffer overflow */
char *new_filename;
- const char *src=old_filename;
+ const char *src=file_recovery->filename;
const char *ext=src;
char *dst;
char *directory_sep;
- int len=strlen(old_filename)+1;
+ int len=strlen(src)+1;
if(buffer_size<0)
- return ;
+ return -1;
if(offset < buffer_size && buffer!=NULL)
len+=buffer_size-offset;
if(new_ext!=NULL)
@@ -551,11 +566,19 @@ void file_rename_unicode(const char *old_filename, const void *buffer, const int
*dst++ = *ext++;
}
*dst='\0';
- if(rename(old_filename, new_filename)<0)
+ if(rename(file_recovery->filename, new_filename)<0)
+ {
+ /* Rename has failed */
+ free(new_filename);
+ if(buffer==NULL)
+ return -1;
+ /* Try without the original filename */
+ return file_rename_unicode(file_recovery, NULL, 0, 0, new_ext, force_ext);
+ }
+ if(strlen(new_filename)<sizeof(file_recovery->filename))
{
- /* Rename has failed, try without the original filename */
- if(buffer!=NULL)
- file_rename_unicode(old_filename, NULL, 0, 0, new_ext, force_ext);
+ strcpy(file_recovery->filename, new_filename);
}
free(new_filename);
+ return 0;
}