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