** aw Alexander Wenzel BMW **
*******************************************************************************/
+#include <stdio.h>
+#include <string.h>
#include "dlt_filetransfer.h"
+#include "dlt_common.h"
//!Defines the buffer size of a single file package which will be logged to dlt
#define BUFFER_SIZE 1024
//!Get some information about the file size of a file
/**See stat(2) for more informations.
* @param file Absolute file path
- * @return Returns the size of the file (if it is a regular file or a symbolic link) in bytes.
+ * @return Returns the size of the file (if it is a regular file or a symbolic link) in bytes. Returns 0 in case of error. Regard: can also be a size value!
*/
-unsigned long getFilesize(const char* file){
+unsigned long getFilesize(const char* file, int *ok){
struct stat st;
- stat(file, &st);
+
+ if ( -1 == stat(file, &st))
+ {
+ //we can only return 0, as the value is unsigned
+ *ok = 0;
+ return 0;
+ }
+ *ok = 1;
return (unsigned long)st.st_size;
}
* @param file Absolute file path
* @return Returns a unique number associated with each filename
*/
-unsigned long getFileSerialNumber(const char* file){
+unsigned long getFileSerialNumber(const char* file, int *ok){
struct stat st;
unsigned long ret;
- stat(file, &st);
- ret = st.st_ino;
- ret = ret << (sizeof(ret)*8)/2;
- ret |= st.st_size;
- ret ^= st.st_ctime;
- stringHash(file, &ret);
+ if ( -1 == stat(file, &st))
+ {
+ *ok = 0;
+ ret = 0;
+ }
+ else
+ {
+ *ok = 1;
+ ret = st.st_ino;
+ ret = ret << (sizeof(ret)*8)/2;
+ ret |= st.st_size;
+ ret ^= st.st_ctime;
+ stringHash(file, &ret);
+ }
return ret;
}
if(errno != ENOENT)
{
+ int ok = 0;
DLT_LOG(*fileContext,DLT_LOG_ERROR,
DLT_STRING("FLER"),
DLT_INT(errorCode),
DLT_INT(-errno),
- DLT_UINT(getFileSerialNumber(filename)),
+ DLT_UINT(getFileSerialNumber(filename,&ok)),
DLT_STRING(filename),
- DLT_UINT(getFilesize(filename)),
+ DLT_UINT(getFilesize(filename,&ok)),
DLT_STRING(getFileCreationDate2(filename)),
DLT_UINT(dlt_user_log_file_packagesCount(fileContext,filename)),
DLT_UINT(BUFFER_SIZE),
if(isFile(filename))
{
+ int ok;
DLT_LOG(*fileContext,DLT_LOG_INFO,
DLT_STRING("FLIF"),
- DLT_STRING("file serialnumber"),DLT_UINT(getFileSerialNumber(filename)),
+ DLT_STRING("file serialnumber"),DLT_UINT(getFileSerialNumber(filename,&ok)),
DLT_STRING("filename"),DLT_STRING(filename),
- DLT_STRING("file size in bytes"),DLT_UINT(getFilesize(filename)),
+ DLT_STRING("file size in bytes"),DLT_UINT(getFilesize(filename,&ok)),
DLT_STRING("file creation date"),DLT_STRING(getFileCreationDate2(filename)),
DLT_STRING("number of packages"),DLT_UINT(dlt_user_log_file_packagesCount(fileContext, filename)),
DLT_STRING("FLIF")
if(isFile(filename))
{
packages = 1;
- filesize = getFilesize(filename);
+ int ok;
+ filesize = getFilesize(filename,&ok);
+ if (!ok){
+ dlt_user_log_file_errorMessage(fileContext,filename,DLT_FILETRANSFER_ERROR_PACKAGE_COUNT);
+ return -1;
+ }
if(filesize < BUFFER_SIZE)
{
return packages;
if(isFile(filename))
{
+ int ok;
DLT_LOG(*fileContext,DLT_LOG_INFO,
- DLT_STRING("FLST"),
- DLT_UINT(getFileSerialNumber(filename)),
- DLT_STRING(alias),
- DLT_UINT(getFilesize(filename)),
- DLT_STRING(getFileCreationDate2(filename));
- DLT_UINT(dlt_user_log_file_packagesCount(fileContext,filename)),
- DLT_UINT(BUFFER_SIZE),
- DLT_STRING("FLST")
+ DLT_STRING("FLST"),
+ DLT_UINT(getFileSerialNumber(filename,&ok)),
+ DLT_STRING(alias),
+ DLT_UINT(getFilesize(filename,&ok)),
+ DLT_STRING(getFileCreationDate2(filename));
+ DLT_UINT(dlt_user_log_file_packagesCount(fileContext,filename)),
+ DLT_UINT(BUFFER_SIZE),
+ DLT_STRING("FLST")
);
return 0;
if(isFile(filename))
{
+ int ok;
DLT_LOG(*fileContext,DLT_LOG_INFO,
DLT_STRING("FLST"),
- DLT_UINT(getFileSerialNumber(filename)),
+ DLT_UINT(getFileSerialNumber(filename,&ok)),
DLT_STRING(filename),
- DLT_UINT(getFilesize(filename)),
+ DLT_UINT(getFilesize(filename,&ok)),
DLT_STRING(getFileCreationDate2(filename));
DLT_UINT(dlt_user_log_file_packagesCount(fileContext,filename)),
DLT_UINT(BUFFER_SIZE),
// if(checkUserBufferForFreeSpace()<0)
// return DLT_FILETRANSFER_ERROR_FILE_DATA_USER_BUFFER_FAILED;
- fseek ( file , (packageToTransfer-1)*BUFFER_SIZE , SEEK_SET );
+ if ( 0 != fseek ( file , (packageToTransfer-1)*BUFFER_SIZE , SEEK_SET ) )
+ {
+ DLT_LOG(*fileContext,DLT_LOG_ERROR,
+ DLT_STRING("failed to fseek in file: "),
+ DLT_STRING(filename),
+ DLT_STRING("ferror:"),
+ DLT_INT(ferror(file))
+ );
+ fclose (file);
+ return -1;
+ }
readBytes = fread(buffer, sizeof(char), BUFFER_SIZE, file);
+ int ok = 0;
DLT_LOG(*fileContext,DLT_LOG_INFO,
DLT_STRING("FLDA"),
- DLT_UINT(getFileSerialNumber(filename)),
+ DLT_UINT(getFileSerialNumber(filename,&ok)),
DLT_UINT(packageToTransfer),
DLT_RAW(buffer,readBytes),
DLT_STRING("FLDA")
{
pkgNumber++;
readBytes = fread(buffer, sizeof(char), BUFFER_SIZE, file);
-
+ int ok;
DLT_LOG(*fileContext,DLT_LOG_INFO,
DLT_STRING("FLDA"),
- DLT_UINT(getFileSerialNumber(filename)),
+ DLT_UINT(getFileSerialNumber(filename,&ok)),
DLT_UINT(pkgNumber),
DLT_RAW(buffer,readBytes),
DLT_STRING("FLDA")
if(isFile(filename))
{
+ int ok;
DLT_LOG(*fileContext,DLT_LOG_INFO,
DLT_STRING("FLFI"),
- DLT_UINT(getFileSerialNumber(filename)),
+ DLT_UINT(getFileSerialNumber(filename,&ok)),
DLT_STRING("FLFI")
);
if (dlt_file_read_header_extended(file, verbose)<0)
{
/* go back to last position in file */
- fseek(file->handle,file->file_position,SEEK_SET);
+ if ( 0 != fseek(file->handle,file->file_position,SEEK_SET))
+ {
+ sprintf(str,"Seek to last file pos failed!\n");
+ dlt_log(LOG_ERR, str);
+ }
return-1;
}
if (fseek(file->handle,file->msg.datasize,SEEK_CUR)!=0)
{
/* go back to last position in file */
- fseek(file->handle,file->file_position,SEEK_SET);
sprintf(str,"Seek failed to skip payload data of size %d!\n",file->msg.datasize);
dlt_log(LOG_ERR, str);
+
+ if (0 != fseek(file->handle,file->file_position,SEEK_SET))
+ {
+ sprintf(str,"Seek back also failed!\n");
+ dlt_log(LOG_ERR, str);
+ }
+
return -1;
}
}
if (dlt_file_read_header_raw(file,resync,verbose)<0)
{
/* go back to last position in file */
- fseek(file->handle,file->file_position,SEEK_SET);
+ if (0!= fseek(file->handle,file->file_position,SEEK_SET))
+ {
+ sprintf(str,"dlt_file_read_raw, fseek failed 1\n");
+ dlt_log(LOG_ERR, str);
+ }
return -1;
}
if (dlt_file_read_header_extended(file, verbose)<0)
{
/* go back to last position in file */
- fseek(file->handle,file->file_position,SEEK_SET);
+ if (0 != fseek(file->handle,file->file_position,SEEK_SET))
+ {
+ sprintf(str,"dlt_file_read_raw, fseek failed 2\n");
+ dlt_log(LOG_ERR, str);
+ }
return-1;
}
if (dlt_file_read_data(file,verbose)<0)
{
/* go back to last position in file */
- fseek(file->handle,file->file_position,SEEK_SET);
+ if (0 != fseek(file->handle,file->file_position,SEEK_SET))
+ {
+ sprintf(str,"dlt_file_read_raw, fseek failed 3\n");
+ dlt_log(LOG_ERR, str);
+ }
return-1;
}