14035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
24035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *
34035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * Redistribution and use in source and binary forms, with or without
44035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * modification, are permitted provided that the following conditions are
54035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * met:
64035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *     * Redistributions of source code must retain the above copyright
74035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *       notice, this list of conditions and the following disclaimer.
84035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *     * Redistributions in binary form must reproduce the above
94035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *       copyright notice, this list of conditions and the following
104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *       disclaimer in the documentation and/or other materials provided
114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *       with the distribution.
124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *     * Neither the name of The Linux Foundation, nor the names of its
134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *       contributors may be used to endorse or promote products derived
144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *       from this software without specific prior written permission.
154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *
164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *
284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin */
294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <stdio.h>
314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <stdlib.h>
324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <linux/stat.h>
334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <fcntl.h>
344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <linux/types.h>
354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <unistd.h>
364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <errno.h>
374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <grp.h>
384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <sys/stat.h>
394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include "log_util.h"
414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include "platform_lib_includes.h"
424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include "loc_eng_dmn_conn_glue_msg.h"
434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include "loc_eng_dmn_conn_handler.h"
444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include "loc_eng_dmn_conn.h"
454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include "loc_eng_msg.h"
464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinstatic int loc_api_server_msgqid;
484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinstatic int loc_api_resp_msgqid;
494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinstatic int quipc_msgqid;
504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinstatic int msapm_msgqid;
514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinstatic int msapu_msgqid;
524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinstatic const char * global_loc_api_q_path = GPSONE_LOC_API_Q_PATH;
544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinstatic const char * global_loc_api_resp_q_path = GPSONE_LOC_API_RESP_Q_PATH;
554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinstatic const char * global_quipc_ctrl_q_path = QUIPC_CTRL_Q_PATH;
564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinstatic const char * global_msapm_ctrl_q_path = MSAPM_CTRL_Q_PATH;
574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinstatic const char * global_msapu_ctrl_q_path = MSAPU_CTRL_Q_PATH;
584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinstatic int loc_api_server_proc_init(void *context)
604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    loc_api_server_msgqid = loc_eng_dmn_conn_glue_msgget(global_loc_api_q_path, O_RDWR);
624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    //change mode/group for the global_loc_api_q_path pipe
634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    int result = chmod (global_loc_api_q_path, 0660);
644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (result != 0)
654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    {
664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        LOC_LOGE("failed to change mode for %s, error = %s\n", global_loc_api_q_path, strerror(errno));
674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    struct group * gps_group = getgrnam("gps");
704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (gps_group != NULL)
714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    {
724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin       result = chown (global_loc_api_q_path, -1, gps_group->gr_gid);
734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin       if (result != 0)
744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin       {
754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin          LOC_LOGE("chown for pipe failed, pipe %s, gid = %d, result = %d, error = %s\n",
764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                   global_loc_api_q_path, gps_group->gr_gid, result, strerror(errno));
774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin       }
784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    else
804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    {
814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin       LOC_LOGE("getgrnam for gps failed, error code = %d\n",  errno);
824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    loc_api_resp_msgqid = loc_eng_dmn_conn_glue_msgget(global_loc_api_resp_q_path, O_RDWR);
854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    //change mode/group for the global_loc_api_resp_q_path pipe
874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    result = chmod (global_loc_api_resp_q_path, 0660);
884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (result != 0)
894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    {
904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        LOC_LOGE("failed to change mode for %s, error = %s\n", global_loc_api_resp_q_path, strerror(errno));
914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (gps_group != NULL)
944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    {
954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin       result = chown (global_loc_api_resp_q_path, -1, gps_group->gr_gid);
964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin       if (result != 0)
974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin       {
984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin          LOC_LOGE("chown for pipe failed, pipe %s, gid = %d, result = %d, error = %s\n",
994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                   global_loc_api_resp_q_path,
1004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                   gps_group->gr_gid, result, strerror(errno));
1014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin       }
1024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
1034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    quipc_msgqid = loc_eng_dmn_conn_glue_msgget(global_quipc_ctrl_q_path, O_RDWR);
1054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    msapm_msgqid = loc_eng_dmn_conn_glue_msgget(global_msapm_ctrl_q_path , O_RDWR);
1064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    msapu_msgqid = loc_eng_dmn_conn_glue_msgget(global_msapu_ctrl_q_path , O_RDWR);
1074035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LOC_LOGD("%s:%d] loc_api_server_msgqid = %d\n", __func__, __LINE__, loc_api_server_msgqid);
1094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return 0;
1104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
1114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinstatic int loc_api_server_proc_pre(void *context)
1134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
1144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return 0;
1154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
1164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinstatic int loc_api_server_proc(void *context)
1184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
1194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    int length, sz;
1204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    int result = 0;
1214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    static int cnt = 0;
1224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    struct ctrl_msgbuf * p_cmsgbuf;
1234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    struct ctrl_msgbuf cmsg_resp;
1244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    sz = sizeof(struct ctrl_msgbuf) + 256;
1264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    p_cmsgbuf = (struct ctrl_msgbuf *) malloc(sz);
1274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (!p_cmsgbuf) {
1294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        LOC_LOGE("%s:%d] Out of memory\n", __func__, __LINE__);
1304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        return -1;
1314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
1324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    cnt ++;
1344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LOC_LOGD("%s:%d] %d listening on %s...\n", __func__, __LINE__, cnt, (char *) context);
1354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    length = loc_eng_dmn_conn_glue_msgrcv(loc_api_server_msgqid, p_cmsgbuf, sz);
1364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (length <= 0) {
1374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        free(p_cmsgbuf);
1384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        LOC_LOGE("%s:%d] fail receiving msg from gpsone_daemon, retry later\n", __func__, __LINE__);
1394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        usleep(1000);
1404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        return -1;
1414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
1424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LOC_LOGD("%s:%d] received ctrl_type = %d\n", __func__, __LINE__, p_cmsgbuf->ctrl_type);
1444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    switch(p_cmsgbuf->ctrl_type) {
1454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        case GPSONE_LOC_API_IF_REQUEST:
1464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            result = loc_eng_dmn_conn_loc_api_server_if_request_handler(p_cmsgbuf, length);
1474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            break;
1484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        case GPSONE_LOC_API_IF_RELEASE:
1504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            result = loc_eng_dmn_conn_loc_api_server_if_release_handler(p_cmsgbuf, length);
1514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            break;
1524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        case GPSONE_UNBLOCK:
1544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            LOC_LOGD("%s:%d] GPSONE_UNBLOCK\n", __func__, __LINE__);
1554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            break;
1564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        default:
1584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            LOC_LOGE("%s:%d] unsupported ctrl_type = %d\n",
1594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                __func__, __LINE__, p_cmsgbuf->ctrl_type);
1604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            break;
1614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
1624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    free(p_cmsgbuf);
1644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return 0;
1654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
1664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinstatic int loc_api_server_proc_post(void *context)
1684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
1694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LOC_LOGD("%s:%d]\n", __func__, __LINE__);
1704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    loc_eng_dmn_conn_glue_msgremove( global_loc_api_q_path, loc_api_server_msgqid);
1714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    loc_eng_dmn_conn_glue_msgremove( global_loc_api_resp_q_path, loc_api_resp_msgqid);
1724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    loc_eng_dmn_conn_glue_msgremove( global_quipc_ctrl_q_path, quipc_msgqid);
1734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    loc_eng_dmn_conn_glue_msgremove( global_msapm_ctrl_q_path, msapm_msgqid);
1744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    loc_eng_dmn_conn_glue_msgremove( global_msapu_ctrl_q_path, msapu_msgqid);
1754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return 0;
1764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
1774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinstatic int loc_eng_dmn_conn_unblock_proc(void)
1794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
1804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    struct ctrl_msgbuf cmsgbuf;
1814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    cmsgbuf.ctrl_type = GPSONE_UNBLOCK;
1824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LOC_LOGD("%s:%d]\n", __func__, __LINE__);
1834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    loc_eng_dmn_conn_glue_msgsnd(loc_api_server_msgqid, & cmsgbuf, sizeof(cmsgbuf));
1844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return 0;
1854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
1864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinstatic struct loc_eng_dmn_conn_thelper thelper;
1884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinint loc_eng_dmn_conn_loc_api_server_launch(thelper_create_thread   create_thread_cb,
1904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    const char * loc_api_q_path, const char * resp_q_path, void *agps_handle)
1914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
1924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    int result;
1934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    loc_api_handle = agps_handle;
1954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (loc_api_q_path) global_loc_api_q_path = loc_api_q_path;
1974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (resp_q_path)    global_loc_api_resp_q_path = resp_q_path;
1984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    result = loc_eng_dmn_conn_launch_thelper( &thelper,
2004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        loc_api_server_proc_init,
2014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        loc_api_server_proc_pre,
2024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        loc_api_server_proc,
2034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        loc_api_server_proc_post,
2044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        create_thread_cb,
2054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        (char *) global_loc_api_q_path);
2064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (result != 0) {
2074035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        LOC_LOGE("%s:%d]\n", __func__, __LINE__);
2084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        return -1;
2094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
2104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return 0;
2114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
2124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
2134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinint loc_eng_dmn_conn_loc_api_server_unblock(void)
2144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
2154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    loc_eng_dmn_conn_unblock_thelper(&thelper);
2164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    loc_eng_dmn_conn_unblock_proc();
2174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return 0;
2184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
2194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
2204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinint loc_eng_dmn_conn_loc_api_server_join(void)
2214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
2224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    loc_eng_dmn_conn_join_thelper(&thelper);
2234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return 0;
2244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
2254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
2264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinint loc_eng_dmn_conn_loc_api_server_data_conn(int sender_id, int status) {
2274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin  struct ctrl_msgbuf cmsgbuf;
2284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin  LOC_LOGD("%s:%d] quipc_msgqid = %d\n", __func__, __LINE__, quipc_msgqid);
2294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin  cmsgbuf.ctrl_type = GPSONE_LOC_API_RESPONSE;
2304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin  cmsgbuf.cmsg.cmsg_response.result = status;
2314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin  switch (sender_id) {
2324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case LOC_ENG_IF_REQUEST_SENDER_ID_QUIPC: {
2334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin      LOC_LOGD("%s:%d] sender_id = LOC_ENG_IF_REQUEST_SENDER_ID_QUIPC", __func__, __LINE__);
2344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin      if (loc_eng_dmn_conn_glue_msgsnd(quipc_msgqid, & cmsgbuf, sizeof(struct ctrl_msgbuf)) < 0) {
2354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        LOC_LOGD("%s:%d] error! conn_glue_msgsnd failed\n", __func__, __LINE__);
2364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        return -1;
2374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin      }
2384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin      break;
2394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
2404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case LOC_ENG_IF_REQUEST_SENDER_ID_MSAPM: {
2414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin      LOC_LOGD("%s:%d] sender_id = LOC_ENG_IF_REQUEST_SENDER_ID_MSAPM", __func__, __LINE__);
2424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin      if (loc_eng_dmn_conn_glue_msgsnd(msapm_msgqid, & cmsgbuf, sizeof(struct ctrl_msgbuf)) < 0) {
2434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        LOC_LOGD("%s:%d] error! conn_glue_msgsnd failed\n", __func__, __LINE__);
2444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        return -1;
2454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin      }
2464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin      break;
2474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
2484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case LOC_ENG_IF_REQUEST_SENDER_ID_MSAPU: {
2494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin      LOC_LOGD("%s:%d] sender_id = LOC_ENG_IF_REQUEST_SENDER_ID_MSAPU", __func__, __LINE__);
2504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin      if (loc_eng_dmn_conn_glue_msgsnd(msapu_msgqid, & cmsgbuf, sizeof(struct ctrl_msgbuf)) < 0) {
2514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        LOC_LOGD("%s:%d] error! conn_glue_msgsnd failed\n", __func__, __LINE__);
2524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        return -1;
2534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin      }
2544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin      break;
2554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
2564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    case LOC_ENG_IF_REQUEST_SENDER_ID_GPSONE_DAEMON: {
2574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin      LOC_LOGD("%s:%d] sender_id = LOC_ENG_IF_REQUEST_SENDER_ID_GPSONE_DAEMON", __func__, __LINE__);
2584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin      if (loc_eng_dmn_conn_glue_msgsnd(loc_api_resp_msgqid, & cmsgbuf, sizeof(struct ctrl_msgbuf)) < 0) {
2594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        LOC_LOGD("%s:%d] error! conn_glue_msgsnd failed\n", __func__, __LINE__);
2604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        return -1;
2614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin      }
2624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin      break;
2634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
2644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    default: {
2654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin      LOC_LOGD("%s:%d] invalid sender ID!", __func__, __LINE__);
2664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
2674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin  }
2684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin  return 0;
2694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
2704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
271