summaryrefslogtreecommitdiff
path: root/src/system
diff options
context:
space:
mode:
authorAlexander Wenzel <Alexander.AW.Wenzel@bmw.de>2011-11-22 10:57:33 +0100
committerAlexander Wenzel <Alexander.AW.Wenzel@bmw.de>2011-11-22 10:57:33 +0100
commitc8cd582507923a1f7ddcc05af47ea30a452e8c34 (patch)
tree0769d18dd9935f4228a32a6744707bc64d2331ad /src/system
parentc870bcb94957fcbab7f56b6cd3ff5a0fc659f24c (diff)
downloadDLT-daemon-c8cd582507923a1f7ddcc05af47ea30a452e8c34.tar.gz
dlt-system filetransfer now recovers when file is deleted during filetransfer.
Added check of file size when starting and deleting files during filetransfer. Added check of shm buffer availability when push to shm.
Diffstat (limited to 'src/system')
-rw-r--r--src/system/dlt-system-log.c51
-rw-r--r--src/system/dlt-system.h1
2 files changed, 34 insertions, 18 deletions
diff --git a/src/system/dlt-system-log.c b/src/system/dlt-system-log.c
index cf2b495..6c9f2bc 100644
--- a/src/system/dlt-system-log.c
+++ b/src/system/dlt-system-log.c
@@ -106,10 +106,16 @@ void dlt_system_filetransfer_run(DltSystemOptions *options,DltSystemRuntime *run
if(runtime->filetransferRunning == 0) {
/* delete last transmitted file */
if(runtime->filetransferFile[0]!=0) {
- printf("Remove File: %s\n",runtime->filetransferFile);
- if(remove(runtime->filetransferFile)) {
- printf("Remove file %s failed!\n",runtime->filetransferFile);
- return;
+ if(stat(runtime->filetransferFile,&status)==0)
+ {
+ if(runtime->filetransferFilesize == status.st_size)
+ {
+ /* delete file only if size is not changed since starting transfer */
+ printf("Remove File: %s\n",runtime->filetransferFile);
+ if(remove(runtime->filetransferFile)) {
+ printf("Remove file %s failed!\n",runtime->filetransferFile);
+ }
+ }
}
runtime->filetransferFile[0]=0;
}
@@ -121,10 +127,13 @@ void dlt_system_filetransfer_run(DltSystemOptions *options,DltSystemRuntime *run
while ((dp=readdir(dir)) != NULL) {
if(strcmp(dp->d_name,".")!=0 && strcmp(dp->d_name,"..")!=0) {
sprintf(filename,"%s/%s",options->FiletransferDirectory1,dp->d_name);
- stat(filename,&status);
- if(time_oldest == 0 || status.st_mtime < time_oldest) {
- time_oldest = status.st_mtime;
- strcpy(runtime->filetransferFile,filename);
+ if(stat(filename,&status)==0)
+ {
+ if((time_oldest == 0 || status.st_mtime < time_oldest) && (status.st_size != 0) ) {
+ time_oldest = status.st_mtime;
+ strcpy(runtime->filetransferFile,filename);
+ runtime->filetransferFilesize = status.st_size;
+ }
}
}
}
@@ -135,10 +144,13 @@ void dlt_system_filetransfer_run(DltSystemOptions *options,DltSystemRuntime *run
while ((dp=readdir(dir)) != NULL) {
if(strcmp(dp->d_name,".")!=0 && strcmp(dp->d_name,"..")!=0) {
sprintf(filename,"%s/%s",options->FiletransferDirectory2,dp->d_name);
- stat(filename,&status);
- if(time_oldest == 0 || status.st_mtime < time_oldest) {
- time_oldest = status.st_mtime;
- strcpy(runtime->filetransferFile,filename);
+ if(stat(filename,&status)==0)
+ {
+ if((time_oldest == 0 || status.st_mtime < time_oldest) && (status.st_size != 0) ) {
+ time_oldest = status.st_mtime;
+ strcpy(runtime->filetransferFile,filename);
+ runtime->filetransferFilesize = status.st_size;
+ }
}
}
}
@@ -151,8 +163,10 @@ void dlt_system_filetransfer_run(DltSystemOptions *options,DltSystemRuntime *run
runtime->filetransferCountPackages = dlt_user_log_file_packagesCount(context,runtime->filetransferFile);
if(runtime->filetransferCountPackages < 0 )
{
+ /* a problem occured; stop filetransfer and continue with next file after timeout */
printf("Error: dlt_user_log_file_packagesCount\n");
runtime->filetransferCountPackages = 0;
+ runtime->filetransferRunning = 0;
runtime->timeFiletransferDelay = options->FiletransferTimeDelay;
return;
}
@@ -160,6 +174,7 @@ void dlt_system_filetransfer_run(DltSystemOptions *options,DltSystemRuntime *run
transferResult = dlt_user_log_file_header(context,runtime->filetransferFile);
if(transferResult < 0)
{
+ /* a problem occured; stop filetransfer and continue with next file after timeout */
printf("Error: dlt_user_log_file_header\n");
runtime->filetransferCountPackages = 0;
runtime->filetransferRunning = 0;
@@ -178,7 +193,11 @@ void dlt_system_filetransfer_run(DltSystemOptions *options,DltSystemRuntime *run
transferResult = dlt_user_log_file_data(context,runtime->filetransferFile,runtime->filetransferLastSentPackage,0);
if(transferResult < 0)
{
+ /* a problem occured; stop filetransfer and continue with next file after timeout */
printf("Error: dlt_user_log_file_data\n");
+ runtime->filetransferCountPackages = 0;
+ runtime->filetransferRunning = 0;
+ runtime->timeFiletransferDelay = options->FiletransferTimeDelay;
return;
}
/* wait sending next package if more than 50% of buffer used */
@@ -198,12 +217,8 @@ void dlt_system_filetransfer_run(DltSystemOptions *options,DltSystemRuntime *run
}
runtime->timeFiletransferDelay = options->FiletransferTimeDelay;
runtime->filetransferRunning = 0;
- }
-
- }
-
-
-
+ }
+ }
}
void dlt_system_log_file(DltSystemOptions *options,DltContext *context,int num) {
diff --git a/src/system/dlt-system.h b/src/system/dlt-system.h
index 0a4b7d5..8fca0ae 100644
--- a/src/system/dlt-system.h
+++ b/src/system/dlt-system.h
@@ -114,6 +114,7 @@ typedef struct {
int timeStartup; /* time in seconds since startup of dlt-system */
int timeFiletransferDelay; /* time in seconds to start next filetransfer */
char filetransferFile[256];
+ long int filetransferFilesize;
int timeLogFileDelay[DLT_SYSTEM_LOG_FILE_MAX]; /* time in seconds to start next file log */
int timeLogProcessDelay[DLT_SYSTEM_LOG_PROCESSES_MAX]; /* time in seconds to start next process log */
int filetransferRunning; /* 0 = stooped, 1 = running */