[Feature][T8TSK-274][syslog]  syslog 4k/8k/16k buffer
       Affected branch: unknown
       Affected module: unknown
       Is it affected on both ZXIC and MTK: only GSW
       Self-test: Yes
       Doc Update: No

Change-Id: I18c774e5367335b01ec7f00ed549ef3219e8368d
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 d45f497..968cb53 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
@@ -1,71 +1,273 @@
 --- busybox-1.29.3/sysklogd/syslogd.c	2018-07-02 19:23:06.000000000 +0800
 +++ busybox-1.29.3/sysklogd/syslogdnew.c	2022-09-29 13:47:26.318538618 +0800
-@@ -165,6 +165,8 @@
+@@ -165,6 +165,7 @@
  
  #include <sys/un.h>
  #include <sys/uio.h>
 +#include <dlfcn.h>
-+
  
  #if ENABLE_FEATURE_REMOTE_LOG
  #include <netinet/in.h>
-@@ -176,6 +178,10 @@
+@@ -176,7 +177,13 @@
  #include <sys/shm.h>
  #endif
  
++#include <unistd.h>
+ 
 +#define ENABLE_FEATURE_SYSLOGD_CFG 1
 +#define ENABLE_FEATURE_ROTATE_LOGFILE 1
++
 +int (*lynq_get_value)(char *file, char *section, char *key, char *tmp);
 +int (*lynq_set_value)(char *section, char *key, char *value);
- 
  #define DEBUG 0
  
-@@ -1102,6 +1113,13 @@
+ /* MARK code is not very useful, is bloat, and broken:
+@@ -210,6 +217,7 @@
+ 
+ typedef struct logFile_t {
+ 	const char *path;
++	FILE * fp;
+ 	int fd;
+ 	time_t last_log_time;
+ #if ENABLE_FEATURE_ROTATE_LOGFILE
+@@ -677,6 +685,79 @@
+ 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 syslog_is_buffer_write()
++{
++	if(g_syslog_buffer_size>0 && g_syslog_buffer_size<= 16*1024)
++	{
++		return true;
++	}
++	else 
++	{
++		return false;
++	}
++}
++
++void syslog_close_fp_fd(FILE * fp, int* fd)
++{
++	if(syslog_is_buffer_write() && (*fd) > 1)
++    {   
++    	fclose(fp);	
++    }
++	else 
++	{
++		close(*fd);
++	}
++	(*fd) = -1;
++}
++
++void syslog_get_fp_fd(const char * path, FILE** fp, int* fd)
++{
++	if(syslog_is_buffer_write())
++	{
++		*fp = fopen(path, "a+");
++		if(*fp!=NULL)
++		{
++			*fd=fileno(*fp);
++			if(setvbuf(*fp,g_syslog_buffer,_IOFBF,g_syslog_buffer_size)!=0)
++			{
++				fclose(*fp);
++				*fd=-1;
++			}    
++            else
++            {
++                int flags = fcntl(*fd, F_GETFL, 0);
++                flags |= O_NONBLOCK;
++                fcntl(*fd, F_SETFL, flags);
++            }            
++		}
++		else
++		{
++			*fd=-1;
++		}            
++	}
++	else
++	{
++	 	*fd = open(path, O_WRONLY | O_CREAT
++		| O_NOCTTY | O_APPEND | O_NONBLOCK,
++		0666);
++	}
++}
++
++int syslog_write(FILE* fp, int fd, char *msg, int len)
++{
++	if(syslog_is_buffer_write() && fd > 1)
++	{
++	    return fwrite(msg,1,len,fp);
++	}	
++	else
++	{
++		return 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 @@
+ 		 * This costs almost nothing since it happens
+ 		 * _at most_ once a second for each file, and happens
+ 		 * only when each file is actually written.
+-		 */
+-		if (!now)
+-			now = time(NULL);
+-		if (log_file->last_log_time != now) {
+-			log_file->last_log_time = now;
+-			close(log_file->fd);
+-			goto reopen;
++		 */		
++		if(!syslog_is_buffer_write())
++		{
++			if (!now)
++		    {
++				now = time(NULL);
++		    }   
++			if(log_file->last_log_time != now) {
++				log_file->last_log_time = now;
++				close(log_file->fd);
++				goto reopen;				
++			}					        
+ 		}
++		else if (access(log_file->path, F_OK) != 0)
++		{
++			syslog_close_fp_fd(log_file->fp,&(log_file->fd));   
++			goto reopen;
++		}		
+ 	}
+ 	else if (log_file->fd == 1) {
+ 		/* We are logging to stdout: do nothing */
+@@ -710,10 +801,8 @@
+ 			log_file->fd = 1;
+ 			/* log_file->isRegular = 0; - already is */
+ 		} else {
+- reopen:
+-			log_file->fd = open(log_file->path, O_WRONLY | O_CREAT
+-					| O_NOCTTY | O_APPEND | O_NONBLOCK,
+-					0666);
++ reopen:    syslog_get_fp_fd(log_file->path, &(log_file->fp), &(log_file->fd));
++			
+ 			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 @@
+ 				rename(oldFile, newFile);
+ 			}
+ 			/* newFile == "f.0" now */
++			if(syslog_is_buffer_write() && log_file->fd > 1)
++			{
++				fflush(log_file->fp);
++			}			
+ 			rename(log_file->path, newFile);
+ 		}
+ 
+@@ -776,15 +869,16 @@
+ 		fl.l_type = F_UNLCK;
+ 		fcntl(log_file->fd, F_SETLKW, &fl);
+ #endif
+-		close(log_file->fd);
++        syslog_close_fp_fd(log_file->fp,&(log_file->fd));        
+ 		goto reopen;
+ 	}
+ /* 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);	
++	
+ 	if (len > 0)
+ 		log_file->size += len;
+ #else
+-	full_write(log_file->fd, msg, len);
++	syslog_write(log_file->fp,log_file->fd,msg,len);	
+ #endif
+ 
+ #ifdef SYSLOGD_WRLOCK
+@@ -974,6 +1068,11 @@
+ }
+ #endif
+ 
++static void syslog_signal_handler(int signum) {    
++	fflush_all();
++}
++
++
+ static void do_syslogd(void) NORETURN;
+ static void do_syslogd(void)
+ {
+@@ -997,6 +1096,7 @@
+ 	signal(SIGALRM, do_mark);
+ 	alarm(G.markInterval);
+ #endif
++    signal(SIGUSR1, syslog_signal_handler); 
+ 	xmove_fd(create_socket(), STDIN_FILENO);
+ 
+ 	if (option_mask32 & OPT_circularlog)
+@@ -1089,6 +1189,7 @@
+ 	} /* while (!bb_got_signal) */
+ 
+ 	timestamp_and_log_internal("syslogd exiting");
++	syslog_close_fp_fd(G.logFile.fp,&(G.logFile.fd));    
+ 	remove_pidfile(CONFIG_PID_FILE_PATH "/syslogd.pid");
+ 	ipcsyslog_cleanup();
+ 	if (option_mask32 & OPT_kmsg)
+@@ -1097,11 +1198,45 @@
+ #undef recvbuf
+ }
+ 
++void syslog_get_uci_config_item(char* query_string, int* value)
++{
++    char get_propty_log_data[64];
++    memset(get_propty_log_data,0,64);
++    if(0 == lynq_get_value("lynq_uci","lynq_log",query_string,get_propty_log_data))
++    {
++        *value = atoi(get_propty_log_data);
++        printf("%s :%d\n",query_string,*value);
++    }
++    else
++    {            
++        snprintf(get_propty_log_data,sizeof(get_propty_log_data),"%d",*value);
++        lynq_set_value("lynq_log",query_string, get_propty_log_data);
++    }
++}
++
++void syslog_get_uci_config(int* lynq_syslog_filesize, int* lynq_syslog_rotate, int* lynq_syslog_buffer_size)
++{
++	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);         	
++	}
++}
++
+ int syslogd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+ int syslogd_main(int argc UNUSED_PARAM, char **argv)
  {
  	int opts;
  	char OPTION_DECL;
 +    
 +    void *handle_uci;
-+    static char get_propty_log_data[64] = {0};
++
 +    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 +1175,38 @@
+@@ -1157,6 +1292,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");
-+    if(NULL != lynq_get_value && (NULL != lynq_set_value))
-+    {
-+        memset(get_propty_log_data,0,64);
-+        if(0 == lynq_get_value("lynq_uci","lynq_log","syslog_flie_size",get_propty_log_data))
-+        {
-+            lynq_syslog_filesize = atoi(get_propty_log_data);
-+            printf("lynq_syslog_filesize:%d\n",lynq_syslog_filesize);
-+        }
-+        else
-+        {		     
-+            snprintf(get_propty_log_data,sizeof(get_propty_log_data),"%d",lynq_syslog_filesize);
-+            lynq_set_value("lynq_log","syslog_flie_size", get_propty_log_data);
-+        }
-+        memset(get_propty_log_data,0,64);
-+        if(0 == lynq_get_value("lynq_uci","lynq_log","syslog_flie_rotate",get_propty_log_data))
-+        {
-+            lynq_syslog_rotate = atoi(get_propty_log_data);
-+            printf("lynq_syslog_rotate:%d\n",lynq_syslog_rotate);
-+        }
-+        else
-+        {		     
-+            snprintf(get_propty_log_data,sizeof(get_propty_log_data),"%d",lynq_syslog_rotate);
-+            lynq_set_value("lynq_log","syslog_flie_rotate", get_propty_log_data);
-+        }
-+    }
++    syslog_get_uci_config(&lynq_syslog_filesize, &lynq_syslog_rotate, &g_syslog_buffer_size);
 +
 +	G.logFileSize = lynq_syslog_filesize;
 +	G.logFileRotate = lynq_syslog_rotate;
@@ -73,3 +275,10 @@
  	do_syslogd();
  	/* return EXIT_SUCCESS; */
  }
+@@ -1171,3 +1314,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 d45f497..968cb53 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
@@ -1,71 +1,273 @@
 --- busybox-1.29.3/sysklogd/syslogd.c	2018-07-02 19:23:06.000000000 +0800
 +++ busybox-1.29.3/sysklogd/syslogdnew.c	2022-09-29 13:47:26.318538618 +0800
-@@ -165,6 +165,8 @@
+@@ -165,6 +165,7 @@
  
  #include <sys/un.h>
  #include <sys/uio.h>
 +#include <dlfcn.h>
-+
  
  #if ENABLE_FEATURE_REMOTE_LOG
  #include <netinet/in.h>
-@@ -176,6 +178,10 @@
+@@ -176,7 +177,13 @@
  #include <sys/shm.h>
  #endif
  
++#include <unistd.h>
+ 
 +#define ENABLE_FEATURE_SYSLOGD_CFG 1
 +#define ENABLE_FEATURE_ROTATE_LOGFILE 1
++
 +int (*lynq_get_value)(char *file, char *section, char *key, char *tmp);
 +int (*lynq_set_value)(char *section, char *key, char *value);
- 
  #define DEBUG 0
  
-@@ -1102,6 +1113,13 @@
+ /* MARK code is not very useful, is bloat, and broken:
+@@ -210,6 +217,7 @@
+ 
+ typedef struct logFile_t {
+ 	const char *path;
++	FILE * fp;
+ 	int fd;
+ 	time_t last_log_time;
+ #if ENABLE_FEATURE_ROTATE_LOGFILE
+@@ -677,6 +685,79 @@
+ 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 syslog_is_buffer_write()
++{
++	if(g_syslog_buffer_size>0 && g_syslog_buffer_size<= 16*1024)
++	{
++		return true;
++	}
++	else 
++	{
++		return false;
++	}
++}
++
++void syslog_close_fp_fd(FILE * fp, int* fd)
++{
++	if(syslog_is_buffer_write() && (*fd) > 1)
++    {   
++    	fclose(fp);	
++    }
++	else 
++	{
++		close(*fd);
++	}
++	(*fd) = -1;
++}
++
++void syslog_get_fp_fd(const char * path, FILE** fp, int* fd)
++{
++	if(syslog_is_buffer_write())
++	{
++		*fp = fopen(path, "a+");
++		if(*fp!=NULL)
++		{
++			*fd=fileno(*fp);
++			if(setvbuf(*fp,g_syslog_buffer,_IOFBF,g_syslog_buffer_size)!=0)
++			{
++				fclose(*fp);
++				*fd=-1;
++			}    
++            else
++            {
++                int flags = fcntl(*fd, F_GETFL, 0);
++                flags |= O_NONBLOCK;
++                fcntl(*fd, F_SETFL, flags);
++            }            
++		}
++		else
++		{
++			*fd=-1;
++		}            
++	}
++	else
++	{
++	 	*fd = open(path, O_WRONLY | O_CREAT
++		| O_NOCTTY | O_APPEND | O_NONBLOCK,
++		0666);
++	}
++}
++
++int syslog_write(FILE* fp, int fd, char *msg, int len)
++{
++	if(syslog_is_buffer_write() && fd > 1)
++	{
++	    return fwrite(msg,1,len,fp);
++	}	
++	else
++	{
++		return 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 @@
+ 		 * This costs almost nothing since it happens
+ 		 * _at most_ once a second for each file, and happens
+ 		 * only when each file is actually written.
+-		 */
+-		if (!now)
+-			now = time(NULL);
+-		if (log_file->last_log_time != now) {
+-			log_file->last_log_time = now;
+-			close(log_file->fd);
+-			goto reopen;
++		 */		
++		if(!syslog_is_buffer_write())
++		{
++			if (!now)
++		    {
++				now = time(NULL);
++		    }   
++			if(log_file->last_log_time != now) {
++				log_file->last_log_time = now;
++				close(log_file->fd);
++				goto reopen;				
++			}					        
+ 		}
++		else if (access(log_file->path, F_OK) != 0)
++		{
++			syslog_close_fp_fd(log_file->fp,&(log_file->fd));   
++			goto reopen;
++		}		
+ 	}
+ 	else if (log_file->fd == 1) {
+ 		/* We are logging to stdout: do nothing */
+@@ -710,10 +801,8 @@
+ 			log_file->fd = 1;
+ 			/* log_file->isRegular = 0; - already is */
+ 		} else {
+- reopen:
+-			log_file->fd = open(log_file->path, O_WRONLY | O_CREAT
+-					| O_NOCTTY | O_APPEND | O_NONBLOCK,
+-					0666);
++ reopen:    syslog_get_fp_fd(log_file->path, &(log_file->fp), &(log_file->fd));
++			
+ 			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 @@
+ 				rename(oldFile, newFile);
+ 			}
+ 			/* newFile == "f.0" now */
++			if(syslog_is_buffer_write() && log_file->fd > 1)
++			{
++				fflush(log_file->fp);
++			}			
+ 			rename(log_file->path, newFile);
+ 		}
+ 
+@@ -776,15 +869,16 @@
+ 		fl.l_type = F_UNLCK;
+ 		fcntl(log_file->fd, F_SETLKW, &fl);
+ #endif
+-		close(log_file->fd);
++        syslog_close_fp_fd(log_file->fp,&(log_file->fd));        
+ 		goto reopen;
+ 	}
+ /* 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);	
++	
+ 	if (len > 0)
+ 		log_file->size += len;
+ #else
+-	full_write(log_file->fd, msg, len);
++	syslog_write(log_file->fp,log_file->fd,msg,len);	
+ #endif
+ 
+ #ifdef SYSLOGD_WRLOCK
+@@ -974,6 +1068,11 @@
+ }
+ #endif
+ 
++static void syslog_signal_handler(int signum) {    
++	fflush_all();
++}
++
++
+ static void do_syslogd(void) NORETURN;
+ static void do_syslogd(void)
+ {
+@@ -997,6 +1096,7 @@
+ 	signal(SIGALRM, do_mark);
+ 	alarm(G.markInterval);
+ #endif
++    signal(SIGUSR1, syslog_signal_handler); 
+ 	xmove_fd(create_socket(), STDIN_FILENO);
+ 
+ 	if (option_mask32 & OPT_circularlog)
+@@ -1089,6 +1189,7 @@
+ 	} /* while (!bb_got_signal) */
+ 
+ 	timestamp_and_log_internal("syslogd exiting");
++	syslog_close_fp_fd(G.logFile.fp,&(G.logFile.fd));    
+ 	remove_pidfile(CONFIG_PID_FILE_PATH "/syslogd.pid");
+ 	ipcsyslog_cleanup();
+ 	if (option_mask32 & OPT_kmsg)
+@@ -1097,11 +1198,45 @@
+ #undef recvbuf
+ }
+ 
++void syslog_get_uci_config_item(char* query_string, int* value)
++{
++    char get_propty_log_data[64];
++    memset(get_propty_log_data,0,64);
++    if(0 == lynq_get_value("lynq_uci","lynq_log",query_string,get_propty_log_data))
++    {
++        *value = atoi(get_propty_log_data);
++        printf("%s :%d\n",query_string,*value);
++    }
++    else
++    {            
++        snprintf(get_propty_log_data,sizeof(get_propty_log_data),"%d",*value);
++        lynq_set_value("lynq_log",query_string, get_propty_log_data);
++    }
++}
++
++void syslog_get_uci_config(int* lynq_syslog_filesize, int* lynq_syslog_rotate, int* lynq_syslog_buffer_size)
++{
++	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);         	
++	}
++}
++
+ int syslogd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+ int syslogd_main(int argc UNUSED_PARAM, char **argv)
  {
  	int opts;
  	char OPTION_DECL;
 +    
 +    void *handle_uci;
-+    static char get_propty_log_data[64] = {0};
++
 +    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 +1175,38 @@
+@@ -1157,6 +1292,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");
-+    if(NULL != lynq_get_value && (NULL != lynq_set_value))
-+    {
-+        memset(get_propty_log_data,0,64);
-+        if(0 == lynq_get_value("lynq_uci","lynq_log","syslog_flie_size",get_propty_log_data))
-+        {
-+            lynq_syslog_filesize = atoi(get_propty_log_data);
-+            printf("lynq_syslog_filesize:%d\n",lynq_syslog_filesize);
-+        }
-+        else
-+        {		     
-+            snprintf(get_propty_log_data,sizeof(get_propty_log_data),"%d",lynq_syslog_filesize);
-+            lynq_set_value("lynq_log","syslog_flie_size", get_propty_log_data);
-+        }
-+        memset(get_propty_log_data,0,64);
-+        if(0 == lynq_get_value("lynq_uci","lynq_log","syslog_flie_rotate",get_propty_log_data))
-+        {
-+            lynq_syslog_rotate = atoi(get_propty_log_data);
-+            printf("lynq_syslog_rotate:%d\n",lynq_syslog_rotate);
-+        }
-+        else
-+        {		     
-+            snprintf(get_propty_log_data,sizeof(get_propty_log_data),"%d",lynq_syslog_rotate);
-+            lynq_set_value("lynq_log","syslog_flie_rotate", get_propty_log_data);
-+        }
-+    }
++    syslog_get_uci_config(&lynq_syslog_filesize, &lynq_syslog_rotate, &g_syslog_buffer_size);
 +
 +	G.logFileSize = lynq_syslog_filesize;
 +	G.logFileRotate = lynq_syslog_rotate;
@@ -73,3 +275,10 @@
  	do_syslogd();
  	/* return EXIT_SUCCESS; */
  }
+@@ -1171,3 +1314,6 @@
+ #undef OPTION_STR
+ #undef OPTION_DECL
+ #undef OPTION_PARAM
++
++
++