1e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
234ee09551764b045fdc02df754157473125edf60Kevin Tang *
334ee09551764b045fdc02df754157473125edf60Kevin Tang * Redistribution and use in source and binary forms, with or without
434ee09551764b045fdc02df754157473125edf60Kevin Tang * modification, are permitted provided that the following conditions are
534ee09551764b045fdc02df754157473125edf60Kevin Tang * met:
634ee09551764b045fdc02df754157473125edf60Kevin Tang *     * Redistributions of source code must retain the above copyright
734ee09551764b045fdc02df754157473125edf60Kevin Tang *       notice, this list of conditions and the following disclaimer.
834ee09551764b045fdc02df754157473125edf60Kevin Tang *     * Redistributions in binary form must reproduce the above
934ee09551764b045fdc02df754157473125edf60Kevin Tang *       copyright notice, this list of conditions and the following
1034ee09551764b045fdc02df754157473125edf60Kevin Tang *       disclaimer in the documentation and/or other materials provided
1134ee09551764b045fdc02df754157473125edf60Kevin Tang *       with the distribution.
12e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo *     * Neither the name of The Linux Foundation, nor the names of its
1334ee09551764b045fdc02df754157473125edf60Kevin Tang *       contributors may be used to endorse or promote products derived
1434ee09551764b045fdc02df754157473125edf60Kevin Tang *       from this software without specific prior written permission.
1534ee09551764b045fdc02df754157473125edf60Kevin Tang *
1634ee09551764b045fdc02df754157473125edf60Kevin Tang * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
1734ee09551764b045fdc02df754157473125edf60Kevin Tang * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
1834ee09551764b045fdc02df754157473125edf60Kevin Tang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
1934ee09551764b045fdc02df754157473125edf60Kevin Tang * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
2034ee09551764b045fdc02df754157473125edf60Kevin Tang * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2134ee09551764b045fdc02df754157473125edf60Kevin Tang * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2234ee09551764b045fdc02df754157473125edf60Kevin Tang * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
2334ee09551764b045fdc02df754157473125edf60Kevin Tang * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
2434ee09551764b045fdc02df754157473125edf60Kevin Tang * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
2534ee09551764b045fdc02df754157473125edf60Kevin Tang * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
2634ee09551764b045fdc02df754157473125edf60Kevin Tang * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2734ee09551764b045fdc02df754157473125edf60Kevin Tang *
2834ee09551764b045fdc02df754157473125edf60Kevin Tang */
2934ee09551764b045fdc02df754157473125edf60Kevin Tang
3034ee09551764b045fdc02df754157473125edf60Kevin Tang#include <stdio.h>
3134ee09551764b045fdc02df754157473125edf60Kevin Tang#include <stdlib.h>
3234ee09551764b045fdc02df754157473125edf60Kevin Tang#include <linux/stat.h>
3334ee09551764b045fdc02df754157473125edf60Kevin Tang#include <fcntl.h>
3434ee09551764b045fdc02df754157473125edf60Kevin Tang#include <linux/types.h>
3534ee09551764b045fdc02df754157473125edf60Kevin Tang#include <unistd.h>
36e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <errno.h>
37e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <grp.h>
38e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <sys/stat.h>
3934ee09551764b045fdc02df754157473125edf60Kevin Tang
4034ee09551764b045fdc02df754157473125edf60Kevin Tang#include "log_util.h"
41e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include "platform_lib_includes.h"
4234ee09551764b045fdc02df754157473125edf60Kevin Tang#include "loc_eng_dmn_conn_glue_msg.h"
4334ee09551764b045fdc02df754157473125edf60Kevin Tang#include "loc_eng_dmn_conn_handler.h"
4434ee09551764b045fdc02df754157473125edf60Kevin Tang#include "loc_eng_dmn_conn.h"
45e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include "loc_eng_msg.h"
4634ee09551764b045fdc02df754157473125edf60Kevin Tang
4734ee09551764b045fdc02df754157473125edf60Kevin Tangstatic int loc_api_server_msgqid;
4834ee09551764b045fdc02df754157473125edf60Kevin Tangstatic int loc_api_resp_msgqid;
49e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russostatic int quipc_msgqid;
50e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russostatic int msapm_msgqid;
51e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russostatic int msapu_msgqid;
5234ee09551764b045fdc02df754157473125edf60Kevin Tang
5334ee09551764b045fdc02df754157473125edf60Kevin Tangstatic const char * global_loc_api_q_path = GPSONE_LOC_API_Q_PATH;
5434ee09551764b045fdc02df754157473125edf60Kevin Tangstatic const char * global_loc_api_resp_q_path = GPSONE_LOC_API_RESP_Q_PATH;
55e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russostatic const char * global_quipc_ctrl_q_path = QUIPC_CTRL_Q_PATH;
56e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russostatic const char * global_msapm_ctrl_q_path = MSAPM_CTRL_Q_PATH;
57e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russostatic const char * global_msapu_ctrl_q_path = MSAPU_CTRL_Q_PATH;
5834ee09551764b045fdc02df754157473125edf60Kevin Tang
5934ee09551764b045fdc02df754157473125edf60Kevin Tangstatic int loc_api_server_proc_init(void *context)
6034ee09551764b045fdc02df754157473125edf60Kevin Tang{
6134ee09551764b045fdc02df754157473125edf60Kevin Tang    loc_api_server_msgqid = loc_eng_dmn_conn_glue_msgget(global_loc_api_q_path, O_RDWR);
62e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    //change mode/group for the global_loc_api_q_path pipe
63e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    int result = chmod (global_loc_api_q_path, 0660);
64e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    if (result != 0)
65e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    {
66e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        LOC_LOGE("failed to change mode for %s, error = %s\n", global_loc_api_q_path, strerror(errno));
67e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    }
68e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
69e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    struct group * gps_group = getgrnam("gps");
70e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    if (gps_group != NULL)
71e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    {
72e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo       result = chown (global_loc_api_q_path, -1, gps_group->gr_gid);
73e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo       if (result != 0)
74e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo       {
75e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo          LOC_LOGE("chown for pipe failed, pipe %s, gid = %d, result = %d, error = %s\n",
76e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                   global_loc_api_q_path, gps_group->gr_gid, result, strerror(errno));
77e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo       }
78e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    }
79e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    else
80e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    {
81e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo       LOC_LOGE("getgrnam for gps failed, error code = %d\n",  errno);
82e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    }
83e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
8434ee09551764b045fdc02df754157473125edf60Kevin Tang    loc_api_resp_msgqid = loc_eng_dmn_conn_glue_msgget(global_loc_api_resp_q_path, O_RDWR);
8534ee09551764b045fdc02df754157473125edf60Kevin Tang
86e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    //change mode/group for the global_loc_api_resp_q_path pipe
87e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    result = chmod (global_loc_api_resp_q_path, 0660);
88e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    if (result != 0)
89e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    {
90e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        LOC_LOGE("failed to change mode for %s, error = %s\n", global_loc_api_resp_q_path, strerror(errno));
91e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    }
92e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
93e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    if (gps_group != NULL)
94e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    {
95e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo       result = chown (global_loc_api_resp_q_path, -1, gps_group->gr_gid);
96e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo       if (result != 0)
97e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo       {
98e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo          LOC_LOGE("chown for pipe failed, pipe %s, gid = %d, result = %d, error = %s\n",
99e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                   global_loc_api_resp_q_path,
100e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                   gps_group->gr_gid, result, strerror(errno));
101e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo       }
102e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    }
103e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
104e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    quipc_msgqid = loc_eng_dmn_conn_glue_msgget(global_quipc_ctrl_q_path, O_RDWR);
105e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    msapm_msgqid = loc_eng_dmn_conn_glue_msgget(global_msapm_ctrl_q_path , O_RDWR);
106e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    msapu_msgqid = loc_eng_dmn_conn_glue_msgget(global_msapu_ctrl_q_path , O_RDWR);
107e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
10834ee09551764b045fdc02df754157473125edf60Kevin Tang    LOC_LOGD("%s:%d] loc_api_server_msgqid = %d\n", __func__, __LINE__, loc_api_server_msgqid);
10934ee09551764b045fdc02df754157473125edf60Kevin Tang    return 0;
11034ee09551764b045fdc02df754157473125edf60Kevin Tang}
11134ee09551764b045fdc02df754157473125edf60Kevin Tang
11234ee09551764b045fdc02df754157473125edf60Kevin Tangstatic int loc_api_server_proc_pre(void *context)
11334ee09551764b045fdc02df754157473125edf60Kevin Tang{
11434ee09551764b045fdc02df754157473125edf60Kevin Tang    return 0;
11534ee09551764b045fdc02df754157473125edf60Kevin Tang}
11634ee09551764b045fdc02df754157473125edf60Kevin Tang
11734ee09551764b045fdc02df754157473125edf60Kevin Tangstatic int loc_api_server_proc(void *context)
11834ee09551764b045fdc02df754157473125edf60Kevin Tang{
11934ee09551764b045fdc02df754157473125edf60Kevin Tang    int length, sz;
12034ee09551764b045fdc02df754157473125edf60Kevin Tang    int result = 0;
12134ee09551764b045fdc02df754157473125edf60Kevin Tang    static int cnt = 0;
12234ee09551764b045fdc02df754157473125edf60Kevin Tang    struct ctrl_msgbuf * p_cmsgbuf;
12334ee09551764b045fdc02df754157473125edf60Kevin Tang    struct ctrl_msgbuf cmsg_resp;
12434ee09551764b045fdc02df754157473125edf60Kevin Tang
12534ee09551764b045fdc02df754157473125edf60Kevin Tang    sz = sizeof(struct ctrl_msgbuf) + 256;
12634ee09551764b045fdc02df754157473125edf60Kevin Tang    p_cmsgbuf = (struct ctrl_msgbuf *) malloc(sz);
12734ee09551764b045fdc02df754157473125edf60Kevin Tang
12834ee09551764b045fdc02df754157473125edf60Kevin Tang    if (!p_cmsgbuf) {
12934ee09551764b045fdc02df754157473125edf60Kevin Tang        LOC_LOGE("%s:%d] Out of memory\n", __func__, __LINE__);
13034ee09551764b045fdc02df754157473125edf60Kevin Tang        return -1;
13134ee09551764b045fdc02df754157473125edf60Kevin Tang    }
13234ee09551764b045fdc02df754157473125edf60Kevin Tang
13334ee09551764b045fdc02df754157473125edf60Kevin Tang    cnt ++;
13434ee09551764b045fdc02df754157473125edf60Kevin Tang    LOC_LOGD("%s:%d] %d listening on %s...\n", __func__, __LINE__, cnt, (char *) context);
13534ee09551764b045fdc02df754157473125edf60Kevin Tang    length = loc_eng_dmn_conn_glue_msgrcv(loc_api_server_msgqid, p_cmsgbuf, sz);
13634ee09551764b045fdc02df754157473125edf60Kevin Tang    if (length <= 0) {
137e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        free(p_cmsgbuf);
13834ee09551764b045fdc02df754157473125edf60Kevin Tang        LOC_LOGE("%s:%d] fail receiving msg from gpsone_daemon, retry later\n", __func__, __LINE__);
13934ee09551764b045fdc02df754157473125edf60Kevin Tang        usleep(1000);
1405cf20a0736f15de30eb88b6f499937f7d8f06e13Dante Russo        return -1;
14134ee09551764b045fdc02df754157473125edf60Kevin Tang    }
14234ee09551764b045fdc02df754157473125edf60Kevin Tang
14334ee09551764b045fdc02df754157473125edf60Kevin Tang    LOC_LOGD("%s:%d] received ctrl_type = %d\n", __func__, __LINE__, p_cmsgbuf->ctrl_type);
14434ee09551764b045fdc02df754157473125edf60Kevin Tang    switch(p_cmsgbuf->ctrl_type) {
14534ee09551764b045fdc02df754157473125edf60Kevin Tang        case GPSONE_LOC_API_IF_REQUEST:
14634ee09551764b045fdc02df754157473125edf60Kevin Tang            result = loc_eng_dmn_conn_loc_api_server_if_request_handler(p_cmsgbuf, length);
14734ee09551764b045fdc02df754157473125edf60Kevin Tang            break;
14834ee09551764b045fdc02df754157473125edf60Kevin Tang
14934ee09551764b045fdc02df754157473125edf60Kevin Tang        case GPSONE_LOC_API_IF_RELEASE:
15034ee09551764b045fdc02df754157473125edf60Kevin Tang            result = loc_eng_dmn_conn_loc_api_server_if_release_handler(p_cmsgbuf, length);
15134ee09551764b045fdc02df754157473125edf60Kevin Tang            break;
15234ee09551764b045fdc02df754157473125edf60Kevin Tang
15334ee09551764b045fdc02df754157473125edf60Kevin Tang        case GPSONE_UNBLOCK:
15434ee09551764b045fdc02df754157473125edf60Kevin Tang            LOC_LOGD("%s:%d] GPSONE_UNBLOCK\n", __func__, __LINE__);
15534ee09551764b045fdc02df754157473125edf60Kevin Tang            break;
15634ee09551764b045fdc02df754157473125edf60Kevin Tang
15734ee09551764b045fdc02df754157473125edf60Kevin Tang        default:
15834ee09551764b045fdc02df754157473125edf60Kevin Tang            LOC_LOGE("%s:%d] unsupported ctrl_type = %d\n",
15934ee09551764b045fdc02df754157473125edf60Kevin Tang                __func__, __LINE__, p_cmsgbuf->ctrl_type);
16034ee09551764b045fdc02df754157473125edf60Kevin Tang            break;
16134ee09551764b045fdc02df754157473125edf60Kevin Tang    }
16234ee09551764b045fdc02df754157473125edf60Kevin Tang
16334ee09551764b045fdc02df754157473125edf60Kevin Tang    free(p_cmsgbuf);
16434ee09551764b045fdc02df754157473125edf60Kevin Tang    return 0;
16534ee09551764b045fdc02df754157473125edf60Kevin Tang}
16634ee09551764b045fdc02df754157473125edf60Kevin Tang
16734ee09551764b045fdc02df754157473125edf60Kevin Tangstatic int loc_api_server_proc_post(void *context)
16834ee09551764b045fdc02df754157473125edf60Kevin Tang{
16934ee09551764b045fdc02df754157473125edf60Kevin Tang    LOC_LOGD("%s:%d]\n", __func__, __LINE__);
17034ee09551764b045fdc02df754157473125edf60Kevin Tang    loc_eng_dmn_conn_glue_msgremove( global_loc_api_q_path, loc_api_server_msgqid);
17134ee09551764b045fdc02df754157473125edf60Kevin Tang    loc_eng_dmn_conn_glue_msgremove( global_loc_api_resp_q_path, loc_api_resp_msgqid);
172e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    loc_eng_dmn_conn_glue_msgremove( global_quipc_ctrl_q_path, quipc_msgqid);
173e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    loc_eng_dmn_conn_glue_msgremove( global_msapm_ctrl_q_path, msapm_msgqid);
174e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    loc_eng_dmn_conn_glue_msgremove( global_msapu_ctrl_q_path, msapu_msgqid);
17534ee09551764b045fdc02df754157473125edf60Kevin Tang    return 0;
17634ee09551764b045fdc02df754157473125edf60Kevin Tang}
17734ee09551764b045fdc02df754157473125edf60Kevin Tang
17834ee09551764b045fdc02df754157473125edf60Kevin Tangstatic int loc_eng_dmn_conn_unblock_proc(void)
17934ee09551764b045fdc02df754157473125edf60Kevin Tang{
18034ee09551764b045fdc02df754157473125edf60Kevin Tang    struct ctrl_msgbuf cmsgbuf;
18134ee09551764b045fdc02df754157473125edf60Kevin Tang    cmsgbuf.ctrl_type = GPSONE_UNBLOCK;
18234ee09551764b045fdc02df754157473125edf60Kevin Tang    LOC_LOGD("%s:%d]\n", __func__, __LINE__);
18334ee09551764b045fdc02df754157473125edf60Kevin Tang    loc_eng_dmn_conn_glue_msgsnd(loc_api_server_msgqid, & cmsgbuf, sizeof(cmsgbuf));
18434ee09551764b045fdc02df754157473125edf60Kevin Tang    return 0;
18534ee09551764b045fdc02df754157473125edf60Kevin Tang}
18634ee09551764b045fdc02df754157473125edf60Kevin Tang
18734ee09551764b045fdc02df754157473125edf60Kevin Tangstatic struct loc_eng_dmn_conn_thelper thelper;
18834ee09551764b045fdc02df754157473125edf60Kevin Tang
18934ee09551764b045fdc02df754157473125edf60Kevin Tangint loc_eng_dmn_conn_loc_api_server_launch(thelper_create_thread   create_thread_cb,
19034ee09551764b045fdc02df754157473125edf60Kevin Tang    const char * loc_api_q_path, const char * resp_q_path, void *agps_handle)
19134ee09551764b045fdc02df754157473125edf60Kevin Tang{
19234ee09551764b045fdc02df754157473125edf60Kevin Tang    int result;
19334ee09551764b045fdc02df754157473125edf60Kevin Tang
19434ee09551764b045fdc02df754157473125edf60Kevin Tang    loc_api_handle = agps_handle;
19534ee09551764b045fdc02df754157473125edf60Kevin Tang
19634ee09551764b045fdc02df754157473125edf60Kevin Tang    if (loc_api_q_path) global_loc_api_q_path = loc_api_q_path;
19734ee09551764b045fdc02df754157473125edf60Kevin Tang    if (resp_q_path)    global_loc_api_resp_q_path = resp_q_path;
19834ee09551764b045fdc02df754157473125edf60Kevin Tang
19934ee09551764b045fdc02df754157473125edf60Kevin Tang    result = loc_eng_dmn_conn_launch_thelper( &thelper,
20034ee09551764b045fdc02df754157473125edf60Kevin Tang        loc_api_server_proc_init,
20134ee09551764b045fdc02df754157473125edf60Kevin Tang        loc_api_server_proc_pre,
20234ee09551764b045fdc02df754157473125edf60Kevin Tang        loc_api_server_proc,
20334ee09551764b045fdc02df754157473125edf60Kevin Tang        loc_api_server_proc_post,
20434ee09551764b045fdc02df754157473125edf60Kevin Tang        create_thread_cb,
20534ee09551764b045fdc02df754157473125edf60Kevin Tang        (char *) global_loc_api_q_path);
20634ee09551764b045fdc02df754157473125edf60Kevin Tang    if (result != 0) {
20734ee09551764b045fdc02df754157473125edf60Kevin Tang        LOC_LOGE("%s:%d]\n", __func__, __LINE__);
20834ee09551764b045fdc02df754157473125edf60Kevin Tang        return -1;
20934ee09551764b045fdc02df754157473125edf60Kevin Tang    }
21034ee09551764b045fdc02df754157473125edf60Kevin Tang    return 0;
21134ee09551764b045fdc02df754157473125edf60Kevin Tang}
21234ee09551764b045fdc02df754157473125edf60Kevin Tang
21334ee09551764b045fdc02df754157473125edf60Kevin Tangint loc_eng_dmn_conn_loc_api_server_unblock(void)
21434ee09551764b045fdc02df754157473125edf60Kevin Tang{
21534ee09551764b045fdc02df754157473125edf60Kevin Tang    loc_eng_dmn_conn_unblock_thelper(&thelper);
21634ee09551764b045fdc02df754157473125edf60Kevin Tang    loc_eng_dmn_conn_unblock_proc();
21734ee09551764b045fdc02df754157473125edf60Kevin Tang    return 0;
21834ee09551764b045fdc02df754157473125edf60Kevin Tang}
21934ee09551764b045fdc02df754157473125edf60Kevin Tang
22034ee09551764b045fdc02df754157473125edf60Kevin Tangint loc_eng_dmn_conn_loc_api_server_join(void)
22134ee09551764b045fdc02df754157473125edf60Kevin Tang{
22234ee09551764b045fdc02df754157473125edf60Kevin Tang    loc_eng_dmn_conn_join_thelper(&thelper);
22334ee09551764b045fdc02df754157473125edf60Kevin Tang    return 0;
22434ee09551764b045fdc02df754157473125edf60Kevin Tang}
22534ee09551764b045fdc02df754157473125edf60Kevin Tang
226e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russoint loc_eng_dmn_conn_loc_api_server_data_conn(int sender_id, int status) {
22734ee09551764b045fdc02df754157473125edf60Kevin Tang  struct ctrl_msgbuf cmsgbuf;
228e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo  LOC_LOGD("%s:%d] quipc_msgqid = %d\n", __func__, __LINE__, quipc_msgqid);
22934ee09551764b045fdc02df754157473125edf60Kevin Tang  cmsgbuf.ctrl_type = GPSONE_LOC_API_RESPONSE;
23034ee09551764b045fdc02df754157473125edf60Kevin Tang  cmsgbuf.cmsg.cmsg_response.result = status;
231e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo  switch (sender_id) {
232e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    case LOC_ENG_IF_REQUEST_SENDER_ID_QUIPC: {
233e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo      LOC_LOGD("%s:%d] sender_id = LOC_ENG_IF_REQUEST_SENDER_ID_QUIPC", __func__, __LINE__);
234e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo      if (loc_eng_dmn_conn_glue_msgsnd(quipc_msgqid, & cmsgbuf, sizeof(struct ctrl_msgbuf)) < 0) {
235e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        LOC_LOGD("%s:%d] error! conn_glue_msgsnd failed\n", __func__, __LINE__);
236e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        return -1;
237e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo      }
238e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo      break;
239e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    }
240e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    case LOC_ENG_IF_REQUEST_SENDER_ID_MSAPM: {
241e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo      LOC_LOGD("%s:%d] sender_id = LOC_ENG_IF_REQUEST_SENDER_ID_MSAPM", __func__, __LINE__);
242e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo      if (loc_eng_dmn_conn_glue_msgsnd(msapm_msgqid, & cmsgbuf, sizeof(struct ctrl_msgbuf)) < 0) {
243e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        LOC_LOGD("%s:%d] error! conn_glue_msgsnd failed\n", __func__, __LINE__);
244e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        return -1;
245e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo      }
246e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo      break;
247e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    }
248e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    case LOC_ENG_IF_REQUEST_SENDER_ID_MSAPU: {
249e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo      LOC_LOGD("%s:%d] sender_id = LOC_ENG_IF_REQUEST_SENDER_ID_MSAPU", __func__, __LINE__);
250e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo      if (loc_eng_dmn_conn_glue_msgsnd(msapu_msgqid, & cmsgbuf, sizeof(struct ctrl_msgbuf)) < 0) {
251e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        LOC_LOGD("%s:%d] error! conn_glue_msgsnd failed\n", __func__, __LINE__);
252e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        return -1;
253e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo      }
254e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo      break;
255e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    }
256e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    case LOC_ENG_IF_REQUEST_SENDER_ID_GPSONE_DAEMON: {
257e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo      LOC_LOGD("%s:%d] sender_id = LOC_ENG_IF_REQUEST_SENDER_ID_GPSONE_DAEMON", __func__, __LINE__);
258e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo      if (loc_eng_dmn_conn_glue_msgsnd(loc_api_resp_msgqid, & cmsgbuf, sizeof(struct ctrl_msgbuf)) < 0) {
259e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        LOC_LOGD("%s:%d] error! conn_glue_msgsnd failed\n", __func__, __LINE__);
260e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        return -1;
261e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo      }
262e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo      break;
263e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    }
264e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    default: {
265e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo      LOC_LOGD("%s:%d] invalid sender ID!", __func__, __LINE__);
266e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    }
26734ee09551764b045fdc02df754157473125edf60Kevin Tang  }
26834ee09551764b045fdc02df754157473125edf60Kevin Tang  return 0;
26934ee09551764b045fdc02df754157473125edf60Kevin Tang}
27034ee09551764b045fdc02df754157473125edf60Kevin Tang
271