[Feature][T8TSK-284][syslog]  after syslog 4k/8k/16k buffer, add time-out flush

       Affected branch: unknown
       Affected module: unknown
       Is it affected on both ZXIC and MTK: only GSW
       Self-test: Yes
       Doc Update: No

Change-Id: I17fa0dfd06bb31b0ccc5df5c6b34a8571d5da24f
diff --git a/meta-sdk/meta/meta-mediatek-ivt/recipes-core/busybox/busybox/ring_buf.patch b/meta-sdk/meta/meta-mediatek-ivt/recipes-core/busybox/busybox/ring_buf.patch
index 968cb53..89b810b 100755
--- a/meta-sdk/meta/meta-mediatek-ivt/recipes-core/busybox/busybox/ring_buf.patch
+++ b/meta-sdk/meta/meta-mediatek-ivt/recipes-core/busybox/busybox/ring_buf.patch
@@ -22,20 +22,23 @@
  #define DEBUG 0
  
  /* MARK code is not very useful, is bloat, and broken:
-@@ -210,6 +217,7 @@
- 
- typedef struct logFile_t {
+@@ -212,6 +219,8 @@
  	const char *path;
-+	FILE * fp;
  	int fd;
  	time_t last_log_time;
++   	FILE * fp;
++    int will_flush_bytes;
  #if ENABLE_FEATURE_ROTATE_LOGFILE
-@@ -677,6 +685,79 @@
+ 	unsigned size;
+ 	uint8_t isRegular;
+@@ -677,6 +686,129 @@
  static void log_to_kmsg(int pri UNUSED_PARAM, const char *msg UNUSED_PARAM) {}
  #endif /* FEATURE_KMSG_SYSLOG */
  
 +int g_syslog_buffer_size=8*1024;
 +char g_syslog_buffer[16*1024];
++int g_max_flush_interval=0;
++
 +
 +int syslog_is_buffer_write()
 +{
@@ -51,15 +54,33 @@
 +
 +void syslog_close_fp_fd(FILE * fp, int* fd)
 +{
-+	if(syslog_is_buffer_write() && (*fd) > 1)
-+    {   
-+    	fclose(fp);	
-+    }
-+	else 
-+	{
-+		close(*fd);
-+	}
-+	(*fd) = -1;
++	if((*fd) > 1)
++    {
++        if(syslog_is_buffer_write())
++        {   
++        	fclose(fp);	
++        }
++    	else 
++    	{
++    		close(*fd);
++    	}    
++        (*fd) = -1;
++    }		
++}
++
++void syslog_close_all_fp_fd()
++{
++#if ENABLE_FEATURE_SYSLOGD_CFG	
++	logRule_t *rule;
++
++	for (rule = G.log_rules; rule; rule = rule->next) {		
++        if(rule->file!=NULL)
++        {
++            syslog_close_fp_fd(rule->file->fp,&(rule->file->fd));
++        }        
++	}			
++#endif
++    syslog_close_fp_fd(G.logFile.fp,&(G.logFile.fd));
 +}
 +
 +void syslog_get_fp_fd(const char * path, FILE** fp, int* fd)
@@ -95,22 +116,52 @@
 +	}
 +}
 +
-+int syslog_write(FILE* fp, int fd, char *msg, int len)
++void syslog_get_now_time(time_t* now)
 +{
++
++    time(now);
++}
++
++void syslog_write(FILE* fp, int fd, char *msg, int* len, time_t* last_log_time,int* will_flush_bytes)
++{
++	unsigned long interval;
++    time_t now;
 +	if(syslog_is_buffer_write() && fd > 1)
 +	{
-+	    return fwrite(msg,1,len,fp);
++	    *len = fwrite(msg,1,*len,fp);	 	
++        if(*len > 0 && g_max_flush_interval>0)
++        {          
++            (*will_flush_bytes)+=(*len);
++            syslog_get_now_time(&now);			
++            if((*will_flush_bytes) >=g_syslog_buffer_size)
++            {
++                (*will_flush_bytes)=(*will_flush_bytes)%g_syslog_buffer_size;             
++    
++                *last_log_time=now;
++            }
++            else
++            {
++                interval = difftime(now,*last_log_time);   
++
++                if(interval>=g_max_flush_interval)
++                {
++                    fflush(fp);
++                    *last_log_time=now;
++  				   (*will_flush_bytes) = 0;
++                }
++            }                      
++        }	
 +	}	
 +	else
 +	{
-+		return full_write(fd, msg, len);
++		*len =  full_write(fd, msg, *len);
 +	}
 +}
 +
  /* Print a message to the log file. */
  static void log_locally(time_t now, char *msg, logFile_t *log_file)
  {
-@@ -693,14 +774,24 @@
+@@ -693,14 +825,24 @@
  		 * This costs almost nothing since it happens
  		 * _at most_ once a second for each file, and happens
  		 * only when each file is actually written.
@@ -130,7 +181,7 @@
 +		    }   
 +			if(log_file->last_log_time != now) {
 +				log_file->last_log_time = now;
-+				close(log_file->fd);
++				syslog_close_fp_fd(log_file->fp,&(log_file->fd));                   
 +				goto reopen;				
 +			}					        
  		}
@@ -142,7 +193,7 @@
  	}
  	else if (log_file->fd == 1) {
  		/* We are logging to stdout: do nothing */
-@@ -710,10 +801,8 @@
+@@ -710,10 +852,8 @@
  			log_file->fd = 1;
  			/* log_file->isRegular = 0; - already is */
  		} else {
@@ -155,7 +206,21 @@
  			if (log_file->fd < 0) {
  				/* cannot open logfile? - print to /dev/console then */
  				int fd = device_open(DEV_CONSOLE, O_WRONLY | O_NOCTTY | O_NONBLOCK);
-@@ -759,6 +848,10 @@
+@@ -723,7 +863,12 @@
+ 				if (fd != 2)
+ 					close(fd);
+ 				return;
+-			}
++			}            
++            if(syslog_is_buffer_write())
++            {
++                syslog_get_now_time(&(log_file->last_log_time));                 
++                log_file->will_flush_bytes=0;
++            }            
+ #if ENABLE_FEATURE_ROTATE_LOGFILE
+ 			{
+ 				struct stat statf;
+@@ -759,6 +904,10 @@
  				rename(oldFile, newFile);
  			}
  			/* newFile == "f.0" now */
@@ -166,7 +231,7 @@
  			rename(log_file->path, newFile);
  		}
  
-@@ -776,15 +869,16 @@
+@@ -776,15 +925,18 @@
  		fl.l_type = F_UNLCK;
  		fcntl(log_file->fd, F_SETLKW, &fl);
  #endif
@@ -176,29 +241,47 @@
  	}
  /* TODO: what to do on write errors ("disk full")? */
 -	len = full_write(log_file->fd, msg, len);
-+	len = syslog_write(log_file->fp,log_file->fd,msg,len);	
++	syslog_write(log_file->fp,log_file->fd,msg,&len,&(log_file->last_log_time),&(log_file->will_flush_bytes));	
 +	
  	if (len > 0)
- 		log_file->size += len;
+-		log_file->size += len;
++    {   
++		log_file->size += len;        
++    }
  #else
 -	full_write(log_file->fd, msg, len);
-+	syslog_write(log_file->fp,log_file->fd,msg,len);	
++	syslog_write(log_file->fp,log_file->fd,msg,&len,&(log_file->last_log_time),&(log_file->will_flush_bytes));	
  #endif
  
  #ifdef SYSLOGD_WRLOCK
-@@ -974,6 +1068,11 @@
+@@ -974,6 +1126,26 @@
  }
  #endif
  
 +static void syslog_signal_handler(int signum) {    
 +	fflush_all();
++	if(syslog_is_buffer_write() && g_max_flush_interval > 0)
++	{
++		time(&(G.logFile.last_log_time));	
++	    G.logFile.will_flush_bytes =0;	
++#if ENABLE_FEATURE_SYSLOGD_CFG	
++    	logRule_t *rule;
++    	for (rule = G.log_rules; rule; rule = rule->next) {		
++            if(rule->file!=NULL)
++            {
++                time(&(rule->file->last_log_time));
++                rule->file->will_flush_bytes =0;	
++            }            
++    	}			
++#endif
++	}	
 +}
 +
 +
  static void do_syslogd(void) NORETURN;
  static void do_syslogd(void)
  {
-@@ -997,6 +1096,7 @@
+@@ -997,6 +1169,7 @@
  	signal(SIGALRM, do_mark);
  	alarm(G.markInterval);
  #endif
@@ -206,15 +289,15 @@
  	xmove_fd(create_socket(), STDIN_FILENO);
  
  	if (option_mask32 & OPT_circularlog)
-@@ -1089,6 +1189,7 @@
+@@ -1089,6 +1262,7 @@
  	} /* while (!bb_got_signal) */
  
  	timestamp_and_log_internal("syslogd exiting");
-+	syslog_close_fp_fd(G.logFile.fp,&(G.logFile.fd));    
++	syslog_close_all_fp_fd();   
  	remove_pidfile(CONFIG_PID_FILE_PATH "/syslogd.pid");
  	ipcsyslog_cleanup();
  	if (option_mask32 & OPT_kmsg)
-@@ -1097,11 +1198,45 @@
+@@ -1097,11 +1271,45 @@
  #undef recvbuf
  }
  
@@ -234,13 +317,14 @@
 +    }
 +}
 +
-+void syslog_get_uci_config(int* lynq_syslog_filesize, int* lynq_syslog_rotate, int* lynq_syslog_buffer_size)
++void syslog_get_uci_config(int* lynq_syslog_filesize, int* lynq_syslog_rotate, int* lynq_syslog_buffer_size,int* lynq_max_flush_interval)
 +{
 +	if(NULL != lynq_get_value && (NULL != lynq_set_value))
 +	{
 +	    syslog_get_uci_config_item("syslog_flie_size",lynq_syslog_filesize);
 +	    syslog_get_uci_config_item("syslog_flie_rotate",lynq_syslog_rotate); 
-+           syslog_get_uci_config_item("syslog_flie_buffer_size",lynq_syslog_buffer_size);         	
++        syslog_get_uci_config_item("syslog_flie_buffer_size",lynq_syslog_buffer_size);
++        syslog_get_uci_config_item("syslog_flie_max_flush_interval",lynq_max_flush_interval);
 +	}
 +}
 +
@@ -255,19 +339,18 @@
 +    int lynq_syslog_filesize = 80*1024*1024;
 +    int lynq_syslog_rotate = 10;
 +    const char *lynq_libpath_uci = "/lib64/liblynq-uci.so";
-+    int lynq_syslog_buffer_size = 8*1024;
 +    
  #if ENABLE_FEATURE_REMOTE_LOG
  	llist_t *remoteAddrList = NULL;
  #endif
-@@ -1157,6 +1292,14 @@
+@@ -1157,6 +1365,14 @@
  	//umask(0); - why??
  	write_pidfile(CONFIG_PID_FILE_PATH "/syslogd.pid");
  
 +    handle_uci = dlopen(lynq_libpath_uci,RTLD_NOW); 
 +    lynq_get_value = (int (*)(void))dlsym(handle_uci,"lynq_get_value");
 +    lynq_set_value = (int (*)(char *section, char *key, char *value))dlsym(handle_uci,"lynq_set_value");
-+    syslog_get_uci_config(&lynq_syslog_filesize, &lynq_syslog_rotate, &g_syslog_buffer_size);
++    syslog_get_uci_config(&lynq_syslog_filesize, &lynq_syslog_rotate, &g_syslog_buffer_size,&g_max_flush_interval);
 +
 +	G.logFileSize = lynq_syslog_filesize;
 +	G.logFileRotate = lynq_syslog_rotate;
@@ -275,7 +358,7 @@
  	do_syslogd();
  	/* return EXIT_SUCCESS; */
  }
-@@ -1171,3 +1314,6 @@
+@@ -1171,3 +1387,6 @@
  #undef OPTION_STR
  #undef OPTION_DECL
  #undef OPTION_PARAM
diff --git a/meta/meta-mediatek-ivt/recipes-core/busybox/busybox/ring_buf.patch b/meta/meta-mediatek-ivt/recipes-core/busybox/busybox/ring_buf.patch
index 968cb53..89b810b 100755
--- a/meta/meta-mediatek-ivt/recipes-core/busybox/busybox/ring_buf.patch
+++ b/meta/meta-mediatek-ivt/recipes-core/busybox/busybox/ring_buf.patch
@@ -22,20 +22,23 @@
  #define DEBUG 0
  
  /* MARK code is not very useful, is bloat, and broken:
-@@ -210,6 +217,7 @@
- 
- typedef struct logFile_t {
+@@ -212,6 +219,8 @@
  	const char *path;
-+	FILE * fp;
  	int fd;
  	time_t last_log_time;
++   	FILE * fp;
++    int will_flush_bytes;
  #if ENABLE_FEATURE_ROTATE_LOGFILE
-@@ -677,6 +685,79 @@
+ 	unsigned size;
+ 	uint8_t isRegular;
+@@ -677,6 +686,129 @@
  static void log_to_kmsg(int pri UNUSED_PARAM, const char *msg UNUSED_PARAM) {}
  #endif /* FEATURE_KMSG_SYSLOG */
  
 +int g_syslog_buffer_size=8*1024;
 +char g_syslog_buffer[16*1024];
++int g_max_flush_interval=0;
++
 +
 +int syslog_is_buffer_write()
 +{
@@ -51,15 +54,33 @@
 +
 +void syslog_close_fp_fd(FILE * fp, int* fd)
 +{
-+	if(syslog_is_buffer_write() && (*fd) > 1)
-+    {   
-+    	fclose(fp);	
-+    }
-+	else 
-+	{
-+		close(*fd);
-+	}
-+	(*fd) = -1;
++	if((*fd) > 1)
++    {
++        if(syslog_is_buffer_write())
++        {   
++        	fclose(fp);	
++        }
++    	else 
++    	{
++    		close(*fd);
++    	}    
++        (*fd) = -1;
++    }		
++}
++
++void syslog_close_all_fp_fd()
++{
++#if ENABLE_FEATURE_SYSLOGD_CFG	
++	logRule_t *rule;
++
++	for (rule = G.log_rules; rule; rule = rule->next) {		
++        if(rule->file!=NULL)
++        {
++            syslog_close_fp_fd(rule->file->fp,&(rule->file->fd));
++        }        
++	}			
++#endif
++    syslog_close_fp_fd(G.logFile.fp,&(G.logFile.fd));
 +}
 +
 +void syslog_get_fp_fd(const char * path, FILE** fp, int* fd)
@@ -95,22 +116,52 @@
 +	}
 +}
 +
-+int syslog_write(FILE* fp, int fd, char *msg, int len)
++void syslog_get_now_time(time_t* now)
 +{
++
++    time(now);
++}
++
++void syslog_write(FILE* fp, int fd, char *msg, int* len, time_t* last_log_time,int* will_flush_bytes)
++{
++	unsigned long interval;
++    time_t now;
 +	if(syslog_is_buffer_write() && fd > 1)
 +	{
-+	    return fwrite(msg,1,len,fp);
++	    *len = fwrite(msg,1,*len,fp);	 	
++        if(*len > 0 && g_max_flush_interval>0)
++        {          
++            (*will_flush_bytes)+=(*len);
++            syslog_get_now_time(&now);			
++            if((*will_flush_bytes) >=g_syslog_buffer_size)
++            {
++                (*will_flush_bytes)=(*will_flush_bytes)%g_syslog_buffer_size;             
++    
++                *last_log_time=now;
++            }
++            else
++            {
++                interval = difftime(now,*last_log_time);   
++
++                if(interval>=g_max_flush_interval)
++                {
++                    fflush(fp);
++                    *last_log_time=now;
++  				   (*will_flush_bytes) = 0;
++                }
++            }                      
++        }	
 +	}	
 +	else
 +	{
-+		return full_write(fd, msg, len);
++		*len =  full_write(fd, msg, *len);
 +	}
 +}
 +
  /* Print a message to the log file. */
  static void log_locally(time_t now, char *msg, logFile_t *log_file)
  {
-@@ -693,14 +774,24 @@
+@@ -693,14 +825,24 @@
  		 * This costs almost nothing since it happens
  		 * _at most_ once a second for each file, and happens
  		 * only when each file is actually written.
@@ -130,7 +181,7 @@
 +		    }   
 +			if(log_file->last_log_time != now) {
 +				log_file->last_log_time = now;
-+				close(log_file->fd);
++				syslog_close_fp_fd(log_file->fp,&(log_file->fd));                   
 +				goto reopen;				
 +			}					        
  		}
@@ -142,7 +193,7 @@
  	}
  	else if (log_file->fd == 1) {
  		/* We are logging to stdout: do nothing */
-@@ -710,10 +801,8 @@
+@@ -710,10 +852,8 @@
  			log_file->fd = 1;
  			/* log_file->isRegular = 0; - already is */
  		} else {
@@ -155,7 +206,21 @@
  			if (log_file->fd < 0) {
  				/* cannot open logfile? - print to /dev/console then */
  				int fd = device_open(DEV_CONSOLE, O_WRONLY | O_NOCTTY | O_NONBLOCK);
-@@ -759,6 +848,10 @@
+@@ -723,7 +863,12 @@
+ 				if (fd != 2)
+ 					close(fd);
+ 				return;
+-			}
++			}            
++            if(syslog_is_buffer_write())
++            {
++                syslog_get_now_time(&(log_file->last_log_time));                 
++                log_file->will_flush_bytes=0;
++            }            
+ #if ENABLE_FEATURE_ROTATE_LOGFILE
+ 			{
+ 				struct stat statf;
+@@ -759,6 +904,10 @@
  				rename(oldFile, newFile);
  			}
  			/* newFile == "f.0" now */
@@ -166,7 +231,7 @@
  			rename(log_file->path, newFile);
  		}
  
-@@ -776,15 +869,16 @@
+@@ -776,15 +925,18 @@
  		fl.l_type = F_UNLCK;
  		fcntl(log_file->fd, F_SETLKW, &fl);
  #endif
@@ -176,29 +241,47 @@
  	}
  /* TODO: what to do on write errors ("disk full")? */
 -	len = full_write(log_file->fd, msg, len);
-+	len = syslog_write(log_file->fp,log_file->fd,msg,len);	
++	syslog_write(log_file->fp,log_file->fd,msg,&len,&(log_file->last_log_time),&(log_file->will_flush_bytes));	
 +	
  	if (len > 0)
- 		log_file->size += len;
+-		log_file->size += len;
++    {   
++		log_file->size += len;        
++    }
  #else
 -	full_write(log_file->fd, msg, len);
-+	syslog_write(log_file->fp,log_file->fd,msg,len);	
++	syslog_write(log_file->fp,log_file->fd,msg,&len,&(log_file->last_log_time),&(log_file->will_flush_bytes));	
  #endif
  
  #ifdef SYSLOGD_WRLOCK
-@@ -974,6 +1068,11 @@
+@@ -974,6 +1126,26 @@
  }
  #endif
  
 +static void syslog_signal_handler(int signum) {    
 +	fflush_all();
++	if(syslog_is_buffer_write() && g_max_flush_interval > 0)
++	{
++		time(&(G.logFile.last_log_time));	
++	    G.logFile.will_flush_bytes =0;	
++#if ENABLE_FEATURE_SYSLOGD_CFG	
++    	logRule_t *rule;
++    	for (rule = G.log_rules; rule; rule = rule->next) {		
++            if(rule->file!=NULL)
++            {
++                time(&(rule->file->last_log_time));
++                rule->file->will_flush_bytes =0;	
++            }            
++    	}			
++#endif
++	}	
 +}
 +
 +
  static void do_syslogd(void) NORETURN;
  static void do_syslogd(void)
  {
-@@ -997,6 +1096,7 @@
+@@ -997,6 +1169,7 @@
  	signal(SIGALRM, do_mark);
  	alarm(G.markInterval);
  #endif
@@ -206,15 +289,15 @@
  	xmove_fd(create_socket(), STDIN_FILENO);
  
  	if (option_mask32 & OPT_circularlog)
-@@ -1089,6 +1189,7 @@
+@@ -1089,6 +1262,7 @@
  	} /* while (!bb_got_signal) */
  
  	timestamp_and_log_internal("syslogd exiting");
-+	syslog_close_fp_fd(G.logFile.fp,&(G.logFile.fd));    
++	syslog_close_all_fp_fd();   
  	remove_pidfile(CONFIG_PID_FILE_PATH "/syslogd.pid");
  	ipcsyslog_cleanup();
  	if (option_mask32 & OPT_kmsg)
-@@ -1097,11 +1198,45 @@
+@@ -1097,11 +1271,45 @@
  #undef recvbuf
  }
  
@@ -234,13 +317,14 @@
 +    }
 +}
 +
-+void syslog_get_uci_config(int* lynq_syslog_filesize, int* lynq_syslog_rotate, int* lynq_syslog_buffer_size)
++void syslog_get_uci_config(int* lynq_syslog_filesize, int* lynq_syslog_rotate, int* lynq_syslog_buffer_size,int* lynq_max_flush_interval)
 +{
 +	if(NULL != lynq_get_value && (NULL != lynq_set_value))
 +	{
 +	    syslog_get_uci_config_item("syslog_flie_size",lynq_syslog_filesize);
 +	    syslog_get_uci_config_item("syslog_flie_rotate",lynq_syslog_rotate); 
-+           syslog_get_uci_config_item("syslog_flie_buffer_size",lynq_syslog_buffer_size);         	
++        syslog_get_uci_config_item("syslog_flie_buffer_size",lynq_syslog_buffer_size);
++        syslog_get_uci_config_item("syslog_flie_max_flush_interval",lynq_max_flush_interval);
 +	}
 +}
 +
@@ -255,19 +339,18 @@
 +    int lynq_syslog_filesize = 80*1024*1024;
 +    int lynq_syslog_rotate = 10;
 +    const char *lynq_libpath_uci = "/lib64/liblynq-uci.so";
-+    int lynq_syslog_buffer_size = 8*1024;
 +    
  #if ENABLE_FEATURE_REMOTE_LOG
  	llist_t *remoteAddrList = NULL;
  #endif
-@@ -1157,6 +1292,14 @@
+@@ -1157,6 +1365,14 @@
  	//umask(0); - why??
  	write_pidfile(CONFIG_PID_FILE_PATH "/syslogd.pid");
  
 +    handle_uci = dlopen(lynq_libpath_uci,RTLD_NOW); 
 +    lynq_get_value = (int (*)(void))dlsym(handle_uci,"lynq_get_value");
 +    lynq_set_value = (int (*)(char *section, char *key, char *value))dlsym(handle_uci,"lynq_set_value");
-+    syslog_get_uci_config(&lynq_syslog_filesize, &lynq_syslog_rotate, &g_syslog_buffer_size);
++    syslog_get_uci_config(&lynq_syslog_filesize, &lynq_syslog_rotate, &g_syslog_buffer_size,&g_max_flush_interval);
 +
 +	G.logFileSize = lynq_syslog_filesize;
 +	G.logFileRotate = lynq_syslog_rotate;
@@ -275,7 +358,7 @@
  	do_syslogd();
  	/* return EXIT_SUCCESS; */
  }
-@@ -1171,3 +1314,6 @@
+@@ -1171,3 +1387,6 @@
  #undef OPTION_STR
  #undef OPTION_DECL
  #undef OPTION_PARAM