[Feature][T8TSK-342] modem log , 8k write to file

Only Configure: No
Affected branch: master
Affected module: Log
Is it affected on both ZXIC and MTK: MTK
Self-test: Yes
Doc Update: No

Change-Id: Ib8bb057eac228c63908964c32129cfd032ae0697
diff --git a/common_src/lib/libdlta/LICENSE b/common_src/lib/libdlta/LICENSE
new file mode 100755
index 0000000..605b7ea
--- /dev/null
+++ b/common_src/lib/libdlta/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("MobileTek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to MobileTek Inc. and/or its licensors. Without
+the prior written permission of MobileTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MobileTek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+MobileTek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MobileTek SOFTWARE")
+RECEIVED FROM MobileTek AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MobileTek EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES MobileTek PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE MobileTek SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MobileTek
+SOFTWARE. MobileTek SHALL ALSO NOT BE RESPONSIBLE FOR ANY MobileTek SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MobileTek'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MobileTek SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MobileTek'S OPTION, TO REVISE OR REPLACE THE
+MobileTek SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MobileTek FOR SUCH MobileTek SOFTWARE AT ISSUE.
diff --git a/common_src/lib/libdlta/Makefile b/common_src/lib/libdlta/Makefile
new file mode 100644
index 0000000..758c213
--- /dev/null
+++ b/common_src/lib/libdlta/Makefile
@@ -0,0 +1,21 @@
+TARGET  := libdlta.so
+SOURCES := libdlta.c
+OBJECTS := $(SOURCES:.c=.o)
+
+GET_LOCAL_DIR = $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))
+
+.PHONY: all clean install
+
+all: $(TARGET)
+
+$(TARGET): $(OBJECTS)
+	${CC} ${CFLAGS} -shared -fPIC -o ${TARGET} ${SOURCES}
+
+clean:
+	$(RM) $(OBJECTS) $(TARGET)
+
+install: $(TARGET)
+	install -d ${DESTDIR}${LIBDIR}
+	install -d ${DESTDIR}${INCDIR}
+	install -m 755 ${TARGET} $(DESTDIR)${LIBDIR}/${TARGET}
+	install -m 444 *.h $(DESTDIR)${INCDIR}/
diff --git a/common_src/lib/libdlta/libdlta.c b/common_src/lib/libdlta/libdlta.c
new file mode 100755
index 0000000..6878f89
--- /dev/null
+++ b/common_src/lib/libdlta/libdlta.c
@@ -0,0 +1,137 @@
+#include <stdio.h>

+#include <stdlib.h>

+#include <string.h>

+#include <sys/stat.h>

+#include <sys/types.h>

+#include <errno.h>

+

+

+#define MAX_LOG_FILES 9

+#define LOG_BUFFER_SIZE 8192 // 8KB

+#define MAX_BUFFER_SIZE  (16*1024)

+static FILE *current_log_file = NULL;

+static char log_buffer[LOG_BUFFER_SIZE];

+static int log_buffer_index = 0;

+static char current_header[8192];

+static int current_header_len = 0;

+

+

+#define  LOG_PATH "/var/log/mtklog/mdlog2/"

+

+void libdlta_init(const char *name, const char *desc)

+{

+   

+    memset(log_buffer, 0, LOG_BUFFER_SIZE);

+    log_buffer_index = 0;

+    memset(current_header, 0, sizeof(current_header));

+    current_header_len = 0;

+    int result = -1;

+    struct stat st = {0};

+    if(stat(LOG_PATH, &st) == -1)

+    {

+        result = system("mkdir -p " LOG_PATH );

+        if(result == 0) 

+        {

+            printf("Directory created successfully.\n");

+        }

+        else 

+        {

+            printf("Failed to create directory. Error code: %d\n", result);

+        }

+    }

+    return ;

+    

+}

+

+

+void libdlta_deinit(void)

+{

+  

+    if (current_log_file != NULL)

+    {

+        if (log_buffer_index > 0)

+        {

+            fwrite(log_buffer, 1, log_buffer_index, current_log_file);

+        }

+        fclose(current_log_file);

+        current_log_file = NULL;

+    }

+    memset(log_buffer,0, LOG_BUFFER_SIZE);

+    log_buffer_index = 0;

+    return;

+}

+

+void rotate_logs(void)

+{

+    char old_name[256]; 

+    char new_name[256];

+

+    snprintf(new_name, sizeof(new_name), "%smdlog_%d.muxz", LOG_PATH, MAX_LOG_FILES - 1);

+    remove(new_name);

+

+    for (int i = MAX_LOG_FILES - 1; i > 0; i--)

+    {

+        snprintf(old_name, sizeof(old_name), "%smdlog_%d.muxz", LOG_PATH, i - 1);

+        snprintf(new_name, sizeof(new_name), "%smdlog_%d.muxz", LOG_PATH, i);

+        rename(old_name, new_name); 

+    }

+}

+

+void open_new_log_file(const char *header_buf, unsigned int header_len)

+{

+

+    static char buffer[MAX_BUFFER_SIZE] = {0};

+    rotate_logs();

+    current_log_file = fopen(LOG_PATH"mdlog_0.muxz", "a+");

+    if (current_log_file == NULL)

+    {

+        perror("Failed to open new log file");

+        return;

+    }

+

+    if (setvbuf(current_log_file, buffer, _IOFBF, LOG_BUFFER_SIZE) != 0)

+    {

+        perror("Failed to set buffer for log file");

+    }

+    

+    fwrite(header_buf, 1, header_len, current_log_file);

+    if(header_len <= sizeof(current_header))

+    {

+        memcpy(current_header, header_buf, header_len);

+        current_header_len = header_len;

+    }

+    

+}

+

+

+void libdlta_sendlog(const char *header_buf, unsigned int header_len, const char *log_buf, unsigned int log_len)

+{

+    

+    if (current_log_file == NULL || header_len != current_header_len || memcmp(header_buf, current_header, header_len) != 0)

+    {

+        if (current_log_file != NULL)

+        {

+            

+            libdlta_deinit();

+        }

+        open_new_log_file(header_buf, header_len);

+    }

+    

+   

+    if (log_len + log_buffer_index > LOG_BUFFER_SIZE)

+    {

+        fwrite(log_buffer, 1, log_buffer_index, current_log_file);

+        log_buffer_index = 0;

+    }

+

+    if (log_len < LOG_BUFFER_SIZE)

+    {

+        memcpy(log_buffer + log_buffer_index, log_buf, log_len);

+        log_buffer_index += log_len;

+    }

+    else

+    {

+        fwrite(log_buf, 1, log_len, current_log_file);

+    }

+    

+}

diff --git a/common_src/lib/libdlta/libdlta.h b/common_src/lib/libdlta/libdlta.h
new file mode 100644
index 0000000..fa5456f
--- /dev/null
+++ b/common_src/lib/libdlta/libdlta.h
@@ -0,0 +1,3 @@
+void libdlta_sendlog(const char *header_buf, unsigned int header_len, const char *log_buf, unsigned int log_len);
+void libdlta_init(const char *name, const char *desc);
+void libdlta_deinit(void);