diff options
author | Lassi Marttala <lassi.lm.marttala@partner.bmw.de> | 2012-05-30 11:56:22 +0200 |
---|---|---|
committer | Christian Muck <christian.muck@bmw.de> | 2012-06-13 23:52:40 +0200 |
commit | bea4e475456745f444e2451415366d0e283f835c (patch) | |
tree | b9a84d2fbf19784f1b33f5c59f5d664b3d8b8dc4 /src/system/dlt-system-filetransfer.c | |
parent | f8f80a07afd45d60c2975bfd7e4b859fb8c10a96 (diff) | |
download | DLT-daemon-bea4e475456745f444e2451415366d0e283f835c.tar.gz |
dlt-system: Logging of error conditions. Assert memory allocations.
dlt-system: logfile module would sometimes deadlock in the end of a
file because of feof() reset in the end of the file.
Signed-off-by: Christian Muck <christian.muck@bmw.de>
Diffstat (limited to 'src/system/dlt-system-filetransfer.c')
-rw-r--r-- | src/system/dlt-system-filetransfer.c | 35 |
1 files changed, 32 insertions, 3 deletions
diff --git a/src/system/dlt-system-filetransfer.c b/src/system/dlt-system-filetransfer.c index b05fc39..275818e 100644 --- a/src/system/dlt-system-filetransfer.c +++ b/src/system/dlt-system-filetransfer.c @@ -82,6 +82,7 @@ char *unique_name(const char *src) unsigned long l = getFileSerialNumber(src) ^ t; // Length of ULONG_MAX + 1 char *ret = malloc(11); + MALLOC_ASSERT(ret); snprintf(ret, 11, "%lu", l); return ret; } @@ -92,6 +93,7 @@ char *compress_file(char *src, int level) DLT_STRING("dlt-system-filetransfer, compressing file.")); char *buf; char *dst = malloc(strlen(src)+4); + MALLOC_ASSERT(dst); char dst_mode[8]; sprintf(dst, "%s.gz", src); sprintf(dst_mode, "wb%d", level); @@ -116,6 +118,7 @@ char *compress_file(char *src, int level) } buf = malloc(Z_CHUNK_SZ); + MALLOC_ASSERT(buf); while(!feof(src_file)) { @@ -130,7 +133,8 @@ char *compress_file(char *src, int level) gzwrite(dst_file, buf, read); } - remove(src); + if(remove(src) < 0) + DLT_LOG(dltsystem, DLT_LOG_WARN, DLT_STRING("Could not remove file"), DLT_STRING(src)); free(buf); fclose(src_file); gzclose(dst_file); @@ -147,8 +151,21 @@ int send_one(char *src, FiletransferOptions opts, int which) char *fn = basename(src); char *rn = unique_name(src); char *dst = malloc(strlen(opts.TempDir)+strlen(rn)+2); + MALLOC_ASSERT(fn); + MALLOC_ASSERT(rn); + MALLOC_ASSERT(dst); + sprintf(dst, "%s/%s", opts.TempDir, rn); - rename(src, dst); + if(rename(src, dst) < 0) + { + DLT_LOG(dltsystem, DLT_LOG_ERROR, + DLT_STRING("Could not move file"), + DLT_STRING(src), + DLT_STRING(dst)); + free(rn); + free(dst); + return -1; + } // Compress if needed if(opts.Compression[which] > 0) @@ -156,6 +173,7 @@ int send_one(char *src, FiletransferOptions opts, int which) dst = compress_file(dst, opts.CompressionLevel[which]); char *old_fn = fn; fn = malloc(strlen(old_fn)+4); + MALLOC_ASSERT(fn); sprintf(fn, "%s.gz", old_fn); } @@ -208,11 +226,19 @@ int flush_dir(FiletransferOptions opts, int which) DLT_LOG(dltsystem, DLT_LOG_DEBUG, DLT_STRING("dlt-system-filetransfer, old file found in directory.")); fn = malloc(strlen(sdir)+dp->d_reclen+2); + MALLOC_ASSERT(fn); sprintf(fn, "%s/%s", sdir, dp->d_name); if(send_one(fn, opts, which) < 0) return -1; } } + else + { + DLT_LOG(dltsystem, DLT_LOG_ERROR, + DLT_STRING("Could not open directory"), + DLT_STRING(sdir)); + return -1; + } closedir(dir); return 0; } @@ -251,7 +277,7 @@ int init_filetransfer_dirs(FiletransferOptions opts) int wait_for_files(FiletransferOptions opts) { DLT_LOG(dltsystem, DLT_LOG_DEBUG, DLT_STRING("dlt-system-filetransfer, waiting for files.")); - char buf[INOTIFY_LEN]; + static char buf[INOTIFY_LEN]; int len = read(ino.handle, buf, INOTIFY_LEN); if(len < 0) { @@ -302,7 +328,10 @@ void filetransfer_thread(void *v_conf) while(!threads.shutdown) { if(wait_for_files(conf->Filetransfer) < 0) + { + DLT_LOG(dltsystem, DLT_LOG_ERROR, DLT_STRING("Error while waiting files. File transfer shutdown.")); return; + } sleep(conf->Filetransfer.TimeDelay); } } |