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