[Feature] add GA346 baseline version

Change-Id: Ic62933698569507dcf98240cdf5d9931ae34348f
diff --git a/src/connectivity/gps/2.0/gpslog/gpslog.c b/src/connectivity/gps/2.0/gpslog/gpslog.c
new file mode 100644
index 0000000..be845ad
--- /dev/null
+++ b/src/connectivity/gps/2.0/gpslog/gpslog.c
@@ -0,0 +1,277 @@
+#include <stdio.h>   /* Standard input/output definitions */

+#include <stdbool.h>   /* Standard bool true/false definitions */

+#include <string.h>  /* String function definitions */

+#include <unistd.h>  /* UNIX standard function definitions */

+#include <fcntl.h>   /* File control definitions */

+#include <errno.h>   /* Error number definitions */

+#include <termios.h> /* POSIX terminal control definitions */

+#include <time.h>

+#include <pthread.h>

+#include <stdlib.h>

+#include <signal.h>

+#include <netdb.h>

+#include <sys/types.h>

+#include <sys/wait.h>

+#include <sys/socket.h>

+#include <sys/epoll.h>

+#include <netinet/in.h>

+#include <arpa/inet.h>

+

+#include <strings.h>

+#include <semaphore.h>

+

+#include "gpslog_log.h"

+#include "gpslog_utility.h"

+#include "gpslog_socket_utils.h"

+#include "gpslog_socket_data_coder.h"

+

+#define GPSLOG_UDP_ADDR "mtk_lbs_log_v2s"

+

+#define PRINT_TITLE(...)   { printf("\E[0;30;43m"); printf(__VA_ARGS__); printf("\E[0m"); fflush(stdout); }

+#define PRINT_RAW(...)   { printf(__VA_ARGS__); fflush(stdout);}

+

+#define GPSLOG_INTERFACE_BUFF_SIZE (80*1024)

+#define GPSLOG_PATH_SIZE (256)

+

+typedef enum {

+    GPSLOG_OPEN_LOG = 0,

+    GPSLOG_CLOSE_LOG = 1,

+    GPSLOG_WRITE_LOG = 2,

+} gpslog_msg_id;

+

+typedef struct {

+    char*           sock_addr;

+}log_db;

+

+log_db gpslog_db;

+

+typedef struct {

+    bool     (*create_logfile)(const char* path);

+    bool     (*write_logdata)(char* data, int len);

+    bool     (*close_logfile)();

+} gpslog_inf;

+

+static bool gpslog_handle_open_logfile(const char* file_name) {

+    time_t tm;

+    struct tm *p = NULL;

+    char full_file_name[256] = {0};

+

+    if (time(&tm)==((time_t)-1)) {

+        LOGE("time()  fail(%s)!!\r\n", strerror(errno));

+    }

+    p = localtime(&tm);

+

+    if(p == NULL) {

+        LOGE("Get localtime fail:[%s]%d", strerror(errno), errno);

+        return false;

+    }

+

+    snprintf(full_file_name, sizeof(full_file_name), "%s_%04d_%02d%02d_%02d%02d%02d", file_name,

+    1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday,

+    p->tm_hour, p->tm_min, p->tm_sec);

+

+    PRINT_RAW("\r\n==============GPSLog start, %s=============\r\n", full_file_name);

+    return true;

+}

+

+static bool gpslog_handle_write_logdata(char* data, int len) {

+    //PRINT_RAW("%s", data);

+    if(write(STDOUT_FILENO, data, len) != len) {

+        LOGW("STDOUT print fail:[le:%d][%s]", len, data);

+        return false;

+    }

+    return true;

+}

+

+static bool gpslog_handle_close_logfile() {

+    PRINT_RAW("\r\n==============GPSLog end=============\r\n");

+    return true;

+}

+

+static gpslog_inf gpslog_handler_interface = {

+    gpslog_handle_open_logfile,

+    gpslog_handle_write_logdata,

+    gpslog_handle_close_logfile

+};

+

+char gpslog_buff[GPSLOG_INTERFACE_BUFF_SIZE] = {0};

+

+static bool gpslog_hdlr(int fd, log_db* database, gpslog_inf* hdlr) {

+    int offset = 0;

+

+    gpslog_msg_id cmd;

+    int ptype;

+    int log_type;

+    int read_len = 0;

+    bool ret = true;

+

+    if (NULL == database) {

+       LOGE("gpslog_hdlr, database not valid");

+       return false;

+    }

+

+    if (NULL == hdlr) {

+       LOGE("[%s]gpslog_hdlr, hdlr not valid", database->sock_addr);

+       return false;

+    }

+

+    if (fd < 0) {

+       LOGE("[%s]gpslog_hdlr, fd not valid", database->sock_addr);

+       return false;

+    }

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

+    read_len = gpslog_safe_recv(fd, gpslog_buff, sizeof(gpslog_buff)-1);

+    if (read_len <= 0) {

+        LOGE("[%s]gpslog_hdlr() gpslog_safe_recv() failed read_len=%d", database->sock_addr, read_len);

+        return false;

+    }

+    ptype = gpslog_socket_get_int(gpslog_buff, &offset);

+    UNUSED(ptype);

+    cmd = gpslog_socket_get_int(gpslog_buff, &offset);

+    log_type = gpslog_socket_get_int(gpslog_buff, &offset);

+    UNUSED(log_type);

+

+    switch (cmd) {

+    case GPSLOG_OPEN_LOG: {

+        if (hdlr->create_logfile) {

+            char path[GPSLOG_PATH_SIZE] = {0};

+            //gpslog_socket_get_string(gpslog_buff, &offset, path, sizeof(path));

+            sprintf(path, "GPSHostLog");

+            if (!hdlr->create_logfile(path)) {

+                LOGE("[%s]gpslog_hdlr() create_logfile fail", database->sock_addr);

+            }

+        } else {

+            LOGE("[%s]gpslog_hdlr() create_logfile is NULL", database->sock_addr);

+            ret = false;

+        }

+        break;

+    }

+

+    case GPSLOG_WRITE_LOG: {

+        if (hdlr->write_logdata) {

+            unsigned int len_logdata = gpslog_socket_get_int(gpslog_buff, &offset);

+            if (len_logdata <= GPSLOG_INTERFACE_BUFF_SIZE) {

+                if (!hdlr->write_logdata(gpslog_buff+offset, len_logdata)) {

+                    LOGE("[%s]gpslog_hdlr() write_logdata fail", database->sock_addr);

+                }

+            } else {

+                LOGE("[%s]gpslog_hdlr() len_logdata:%u overflow", database->sock_addr, len_logdata);

+                ret = false;

+            }

+        } else {

+            LOGE("[%s]gpslog_hdlr() write_logdata is NULL", database->sock_addr);

+            ret = false;

+        }

+        break;

+    }

+

+    case GPSLOG_CLOSE_LOG: {

+        if (hdlr->close_logfile) {

+            if (!hdlr->close_logfile()) {

+                LOGE("[%s]gpslog_hdlr() close_logfile fail", database->sock_addr);

+            }

+        } else {

+            LOGE("[%s]gpslog_hdlr() close_logfile is NULL", database->sock_addr);

+            ret = false;

+        }

+        break;

+    }

+

+    default: {

+        LOGE("[%s]gpslog_hdlr() unknown cmd=%d", database->sock_addr, cmd);

+        ret = false;

+        break;

+    }

+    }

+

+    return ret;

+}

+

+static void* gpslog_write_thread(void *database)

+{

+    #define EPOLL_MAX_NUM 4

+    int fd = -1;

+    int i = 0;

+    int n = 0;

+    int epfd = epoll_create(EPOLL_MAX_NUM);

+    struct epoll_event events[EPOLL_MAX_NUM];

+    log_db* data = (log_db*)database;

+

+    if (NULL == data) {

+        LOGE("gpslog_write_thread exit, database not valid");

+        return 0;

+    }

+

+    LOGD("[%s]gpslog_write_thread created", data->sock_addr);

+

+    if (-1 == epfd) {

+        LOGE("[%s]gpslog_write_thread epoll_create failure, reason=[%s]", data->sock_addr, strerror(errno));

+        return 0;

+    }

+

+    //fd = gpslog_socket_bind_udp(data->sock_addr);

+    fd = gpslog_socket_server_bind_local(data->sock_addr, SOCK_NS_ABSTRACT);

+

+    if (fd < 0) {

+        LOGE("[%s]gpslog_write_thread create fd failed, reason=[%s]", data->sock_addr, strerror(errno));

+        return 0;

+    }

+

+    if (gpslog_epoll_add_fd(epfd, fd) == -1) {

+        LOGE("[%s]gpslog_write_thread failed for fd_hal failed, reason=[%s]", data->sock_addr, strerror(errno));

+        return 0;

+    }

+

+    while (1) {

+        n = epoll_wait(epfd, events, EPOLL_MAX_NUM , -1);

+        if (-1 == n) {

+            if (errno == EINTR) {

+                continue;

+            } else {

+                LOGE("[%s]gpslog_write_thread epoll_wait failure reason=[%s]", data->sock_addr, strerror(errno));

+                return 0;

+            }

+        }

+        for (i = 0; i < n; i++) {

+            if (events[i].data.fd == fd) {

+                if (events[i].events & EPOLLIN) {

+                    if (!gpslog_hdlr(fd, data, &gpslog_handler_interface)) {

+                        LOGE("[%s]gpslog_hdlr failure reason=[%s]", data->sock_addr, strerror(errno));

+                    }

+                }

+            } else {

+                LOGE("[%s]mnld_main_thread() unknown fd=%d", data->sock_addr, events[i].data.fd);

+            }

+        }

+    }

+    LOGE("[%s]gpslog_write_thread exit", data->sock_addr);

+    return 0;

+}

+

+static void gpslog_database_init() {

+    memset(&gpslog_db, 0x0, sizeof(gpslog_db));

+

+    //GPS LOG config

+    gpslog_db.sock_addr  = GPSLOG_UDP_ADDR;

+}

+

+int gpslog_init() {

+    pthread_t pthread_gps;

+

+    LOGD("gpslog_init");

+    gpslog_database_init();

+

+    pthread_create(&pthread_gps, NULL, gpslog_write_thread, (char*)(&gpslog_db));

+    return 0;

+}

+

+int main(void) {

+    LOGD("LBS debug daemon begin running");

+    if (gpslog_init() != 0) {

+        LOGE("gpslog_init error, exit");

+        return -1;

+    }

+

+    gpslog_block_here();

+    return 0;

+}