From 85e7590db3446916d8c6a9fc10b109bd9eca1364 Mon Sep 17 00:00:00 2001 From: Yann Weber Date: Mon, 15 May 2017 19:29:11 +0200 Subject: [PATCH] Fix starts for #11 - Add the option -P --permissive - Implement some behavior in files searching - May introduce bugs (being to much permissive) ! Actual implementation is not complete at all. --- src/include/ttail.h | 6 +++++ src/include/ttail_init.h | 4 ++- src/ttail_init.c | 8 ++++++ src/ttail_search.c | 2 +- src/ttail_search_files.c | 56 +++++++++++++++++++++++++++++++++++++--- 5 files changed, 70 insertions(+), 6 deletions(-) diff --git a/src/include/ttail.h b/src/include/ttail.h index e15adc8..eb2c198 100644 --- a/src/include/ttail.h +++ b/src/include/ttail.h @@ -41,6 +41,8 @@ typedef struct _ttail_s ttail_t; #define TTAIL_FLAG_FORMAT 8 #define TTAIL_FLAG_EXTENDED_RE 16 #define TTAIL_FLAG_CI_RE 32 +/**! When set indicate that ttail is in permissive mode */ +#define TTAIL_FLAG_PERMISSIVE 64 #define TTAIL_DEFAULT_FORMATS {"%m",\ "%A %B %d, %Y %H:%M:%S",\ @@ -62,6 +64,10 @@ typedef struct _ttail_s ttail_t; "%y-%m-%d",\ "%Y/%m/%d:%H:%M",NULL} +#define ttail_permissive(t) ( t->flag & TTAIL_FLAG_PERMISSIVE ) +#define ttail_strict_msg() fprintf(stderr, "This error can be non-fatal using \ +-P --permissive flag\n") + struct _ttail_s { diff --git a/src/include/ttail_init.h b/src/include/ttail_init.h index 39a2f17..5e18bd2 100644 --- a/src/include/ttail_init.h +++ b/src/include/ttail_init.h @@ -42,10 +42,11 @@ {"date-format", required_argument, 0, 'f'},\ {"date-min", required_argument, 0, 'd'},\ {"date-max", required_argument, 0, 'm'},\ + {"permissive", no_argument, 0, 'P'},\ {"help", no_argument, 0, 'h'},\ {0, 0, 0, 0 }\ } -#define TTAIL_SHORT_OPT "vr:Eip:f:d:l:m:h" +#define TTAIL_SHORT_OPT "vr:Eip:f:d:l:m:Ph" #define TTAIL_OPT_HELP {\ {"Augment the verbosity level",NULL},\ @@ -58,6 +59,7 @@ POSIX) ",NULL},\ ,"FORMAT"},\ {"Start to output loglines starting from this date","DATE"},\ {"Stop to output loglines before this date","DATE"},\ + {"Tell ttail to not stop on loglines not formatted as expected",NULL},\ {"Print this help and exit",NULL},\ {"",NULL}\ } diff --git a/src/ttail_init.c b/src/ttail_init.c index 2fb5dbd..8061729 100644 --- a/src/ttail_init.c +++ b/src/ttail_init.c @@ -151,6 +151,14 @@ given\n"); strcpy(date, optarg); dates[c=='d'?0:1] = date; break; + case 'P': + if(res->flag & TTAIL_FLAG_PERMISSIVE) + { + fprintf(stderr, "Warning : looks like \ +-P --permissive flag was set more than once\n"); + } + res->flag |= TTAIL_FLAG_PERMISSIVE; + break; default: /* ? */ goto ttail_init_err; diff --git a/src/ttail_search.c b/src/ttail_search.c index 0f3d0c4..18d7338 100644 --- a/src/ttail_search.c +++ b/src/ttail_search.c @@ -117,7 +117,7 @@ const char* ttail_logline_subst(ttail_t* t, const char* logline) if(ret) { regerror(ret, &(t->date_prefix), err,1024); - fprintf(stderr, "Exec error : %s\n", err); + fprintf(stderr, "RegEx exec error : %s\n", err); return NULL; } return logline + pmatch[0].rm_eo; diff --git a/src/ttail_search_files.c b/src/ttail_search_files.c index cc2327d..738a0ab 100644 --- a/src/ttail_search_files.c +++ b/src/ttail_search_files.c @@ -51,17 +51,21 @@ int _ttail_search_closest_files(ttail_t* t) ret = _ttail_file_minmax(t, i, ftm[i]); if(ret < 0) { - fprintf(stderr, "Minmax error\n"); goto _ttail_search_closest_files_loop_err; } else if (ret == 1) { - fprintf(stderr, "Warning : unable to find a valid date \ + fprintf(stderr, "Error : unable to find a valid date \ in '%s'\n", t->logfile_name[i]); free(ftm[i]); ftm[i] = NULL; fclose(t->logfile[i]); t->logfile[i] = NULL; + if(!ttail_permissive(t)) + { + ttail_strict_msg(); + goto _ttail_search_closest_files_loop_err; + } continue; } if(i && prev_found && @@ -312,6 +316,11 @@ running binary search algorithm in '%s'\n", t->logfile_name[*id]); } cmpres=0; ret = _ttail_file_cur_cmp(t, *id, in, &cmpres); + if(!ret && !ttail_permissive(t)) + { + ttail_strict_msg(); + return -1; + } if((min && cmpres < 0) || (!min && cmpres > 0)) { break; @@ -336,6 +345,10 @@ running binary search algorithm in '%s'\n", t->logfile_name[*id]); fprintf(stderr, "No files to scan\n"); return 0; } + if(*id == t->logfile_sz) + { + return 0; + } /* the answer is somewhere in *id file */ *off = _ttail_file_search_from_end(t, *id, in); return 0; @@ -606,6 +619,7 @@ inline int _ttail_file_minmax(ttail_t* t, size_t id, struct tm tm[2]) fp = t->logfile[id]; if(!fp) { + fprintf(stderr, "File pointer is null !\n"); return 1; } if(fseek(fp, 0, SEEK_SET) < 0) @@ -623,6 +637,22 @@ inline int _ttail_file_minmax(ttail_t* t, size_t id, struct tm tm[2]) { break; } + if(!ttail_permissive(t)) + { + if(t->verbose <= 0) + { + fprintf(stderr, + "Unable to find a date in logline\n"); + } + else + { + fprintf(stderr, + "Unable to find a date in '%s'\n", + ttail_file_getline_buf(t)); + } + ttail_strict_msg(); + return -1; + } } if(fseek(fp, -1, SEEK_END) < 0) { @@ -633,6 +663,8 @@ inline int _ttail_file_minmax(ttail_t* t, size_t id, struct tm tm[2]) { if((cur = _ttail_file_start_line(t, id)) < 0) { + fprintf(stderr, "Error will searching line starts in\ +%s\n", t->logfile_name[id]); return -1; } if(ttail_file_getline(t, id) < 0) @@ -647,6 +679,22 @@ inline int _ttail_file_minmax(ttail_t* t, size_t id, struct tm tm[2]) { return 1; } + else if(!ttail_permissive(t)) + { + if(t->verbose <= 0) + { + fprintf(stderr, + "Unable to find a date in logline\n"); + } + else + { + fprintf(stderr, + "Unable to find a date in '%s'\n", + ttail_file_getline_buf(t)); + } + ttail_strict_msg(); + return -1; + } if(fseek(fp, cur-1, SEEK_SET) < 0) { perror("Unable to manipulate fp"); @@ -872,11 +920,11 @@ inline int _ttail_file_cur_cmp(ttail_t* t, size_t id, const struct tm* tm , return -1; } ret = ttail_logline2date(t, ttail_file_getline_buf(t), &ctm); - if(ret) + if(ret < 0) { return -1; } - else if(ret == 1) + else if(ret > 1) { return 1; }