134ee09551764b045fdc02df754157473125edf60Kevin Tang/****************************************************************************** 234ee09551764b045fdc02df754157473125edf60Kevin Tang @file loc_api_rpc_glue.c 334ee09551764b045fdc02df754157473125edf60Kevin Tang @brief Android Loc API glue code using rpcgen. 434ee09551764b045fdc02df754157473125edf60Kevin Tang 534ee09551764b045fdc02df754157473125edf60Kevin Tang DESCRIPTION 634ee09551764b045fdc02df754157473125edf60Kevin Tang Loc API glue code for Android 734ee09551764b045fdc02df754157473125edf60Kevin Tang 834ee09551764b045fdc02df754157473125edf60Kevin Tang ----------------------------------------------------------------------------- 934ee09551764b045fdc02df754157473125edf60Kevin TangCopyright (c) 2009, QUALCOMM USA, INC. 1034ee09551764b045fdc02df754157473125edf60Kevin Tang 1134ee09551764b045fdc02df754157473125edf60Kevin TangAll rights reserved. 1234ee09551764b045fdc02df754157473125edf60Kevin Tang 1334ee09551764b045fdc02df754157473125edf60Kevin TangRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1434ee09551764b045fdc02df754157473125edf60Kevin Tang 1534ee09551764b045fdc02df754157473125edf60Kevin Tang� Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 1634ee09551764b045fdc02df754157473125edf60Kevin Tang 1734ee09551764b045fdc02df754157473125edf60Kevin Tang� Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 1834ee09551764b045fdc02df754157473125edf60Kevin Tang 1934ee09551764b045fdc02df754157473125edf60Kevin Tang� Neither the name of the QUALCOMM USA, INC. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. 2034ee09551764b045fdc02df754157473125edf60Kevin Tang 2134ee09551764b045fdc02df754157473125edf60Kevin TangTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2234ee09551764b045fdc02df754157473125edf60Kevin Tang ----------------------------------------------------------------------------- 2334ee09551764b045fdc02df754157473125edf60Kevin Tang ******************************************************************************/ 2434ee09551764b045fdc02df754157473125edf60Kevin Tang/*===================================================================== 2534ee09551764b045fdc02df754157473125edf60Kevin Tang EDIT HISTORY FOR MODULE 2634ee09551764b045fdc02df754157473125edf60Kevin Tang 2734ee09551764b045fdc02df754157473125edf60Kevin Tang This section contains comments describing changes made to the module. 2834ee09551764b045fdc02df754157473125edf60Kevin Tang Notice that changes are listed in reverse chronological order. 2934ee09551764b045fdc02df754157473125edf60Kevin Tang 3034ee09551764b045fdc02df754157473125edf60Kevin Tangwhen who what, where, why 3134ee09551764b045fdc02df754157473125edf60Kevin Tang-------- --- ------------------------------------------------------- 3234ee09551764b045fdc02df754157473125edf60Kevin Tang03/05/2009 dx Initial version 3334ee09551764b045fdc02df754157473125edf60Kevin Tang 3434ee09551764b045fdc02df754157473125edf60Kevin Tang======================================================================*/ 3534ee09551764b045fdc02df754157473125edf60Kevin Tang/*===================================================================== 3634ee09551764b045fdc02df754157473125edf60Kevin Tang 3734ee09551764b045fdc02df754157473125edf60Kevin Tang INCLUDE FILES FOR MODULE 3834ee09551764b045fdc02df754157473125edf60Kevin Tang 3934ee09551764b045fdc02df754157473125edf60Kevin Tang======================================================================*/ 4034ee09551764b045fdc02df754157473125edf60Kevin Tang//#define LOG_NDDEBUG 0 4134ee09551764b045fdc02df754157473125edf60Kevin Tang 4234ee09551764b045fdc02df754157473125edf60Kevin Tang#include <stdio.h> 4334ee09551764b045fdc02df754157473125edf60Kevin Tang#include <pthread.h> 4434ee09551764b045fdc02df754157473125edf60Kevin Tang#include <errno.h> 4534ee09551764b045fdc02df754157473125edf60Kevin Tang#include <string.h> 4634ee09551764b045fdc02df754157473125edf60Kevin Tang#include <sys/select.h> 4734ee09551764b045fdc02df754157473125edf60Kevin Tang#include <sys/time.h> 4834ee09551764b045fdc02df754157473125edf60Kevin Tang#include <sys/types.h> 4934ee09551764b045fdc02df754157473125edf60Kevin Tang#include <sys/stat.h> 5034ee09551764b045fdc02df754157473125edf60Kevin Tang#include <fcntl.h> 5134ee09551764b045fdc02df754157473125edf60Kevin Tang#include <sys/mman.h> 5234ee09551764b045fdc02df754157473125edf60Kevin Tang#include <unistd.h> 5334ee09551764b045fdc02df754157473125edf60Kevin Tang#include <stdlib.h> 5434ee09551764b045fdc02df754157473125edf60Kevin Tang#include <assert.h> 5534ee09551764b045fdc02df754157473125edf60Kevin Tang 5634ee09551764b045fdc02df754157473125edf60Kevin Tang#include <rpc/rpc.h> 5734ee09551764b045fdc02df754157473125edf60Kevin Tang#include <rpc/clnt.h> 5834ee09551764b045fdc02df754157473125edf60Kevin Tang 5934ee09551764b045fdc02df754157473125edf60Kevin Tang/* Include RPC headers */ 6034ee09551764b045fdc02df754157473125edf60Kevin Tang#include "loc_api_rpc_glue.h" 6134ee09551764b045fdc02df754157473125edf60Kevin Tang 6234ee09551764b045fdc02df754157473125edf60Kevin Tang/* Callback init */ 6334ee09551764b045fdc02df754157473125edf60Kevin Tang#include "loc_apicb_appinit.h" 6434ee09551764b045fdc02df754157473125edf60Kevin Tang 6534ee09551764b045fdc02df754157473125edf60Kevin Tang/* Logging */ 6634ee09551764b045fdc02df754157473125edf60Kevin Tang#define LOG_TAG "lib_api_rpc_glue" 6734ee09551764b045fdc02df754157473125edf60Kevin Tang#include <utils/Log.h> 6834ee09551764b045fdc02df754157473125edf60Kevin Tang 6934ee09551764b045fdc02df754157473125edf60Kevin Tang/* Comment this out to enable logging */ 7034ee09551764b045fdc02df754157473125edf60Kevin Tang#undef LOGD 7134ee09551764b045fdc02df754157473125edf60Kevin Tang#define LOGD(...) {} 7234ee09551764b045fdc02df754157473125edf60Kevin Tang 7334ee09551764b045fdc02df754157473125edf60Kevin Tang/*===================================================================== 7434ee09551764b045fdc02df754157473125edf60Kevin Tang External declarations 7534ee09551764b045fdc02df754157473125edf60Kevin Tang======================================================================*/ 7634ee09551764b045fdc02df754157473125edf60Kevin Tang 7734ee09551764b045fdc02df754157473125edf60Kevin TangCLIENT* loc_api_clnt = NULL; 7834ee09551764b045fdc02df754157473125edf60Kevin Tang 7934ee09551764b045fdc02df754157473125edf60Kevin Tang/* Callback ID and pointer */ 8034ee09551764b045fdc02df754157473125edf60Kevin Tang#define LOC_API_CB_ID 1 8134ee09551764b045fdc02df754157473125edf60Kevin Tangloc_event_cb_f_type *loc_api_saved_cb = NULL; /* the only callback of Loc API client */ 8234ee09551764b045fdc02df754157473125edf60Kevin Tang 8334ee09551764b045fdc02df754157473125edf60Kevin Tang#define RPC_FUNC_VERSION_BASE(a,b) a ## b 8434ee09551764b045fdc02df754157473125edf60Kevin Tang#define RPC_FUNC_VERSION(a,b) RPC_FUNC_VERSION_BASE(a,b) 8534ee09551764b045fdc02df754157473125edf60Kevin Tang 8634ee09551764b045fdc02df754157473125edf60Kevin Tang#define LOC_GLUE_CHECK_INIT(ret_type) \ 8734ee09551764b045fdc02df754157473125edf60Kevin Tang if (loc_api_clnt == NULL) { return (ret_type) RPC_LOC_API_RPC_FAILURE; } 8834ee09551764b045fdc02df754157473125edf60Kevin Tang 8934ee09551764b045fdc02df754157473125edf60Kevin Tang#define LOC_GLUE_CHECK_RESULT(stat, ret_type) \ 9034ee09551764b045fdc02df754157473125edf60Kevin Tang if (stat != RPC_SUCCESS) { return (ret_type) RPC_LOC_API_RPC_FAILURE; } 9134ee09551764b045fdc02df754157473125edf60Kevin Tang 9234ee09551764b045fdc02df754157473125edf60Kevin Tang/* Callback functions */ 9334ee09551764b045fdc02df754157473125edf60Kevin Tang/* Returns 1 if successful */ 9434ee09551764b045fdc02df754157473125edf60Kevin Tangbool_t rpc_loc_event_cb_f_type_0x00040001_svc( 9534ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_event_cb_f_type_args *argp, 9634ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_event_cb_f_type_rets *ret, 9734ee09551764b045fdc02df754157473125edf60Kevin Tang struct svc_req *req) 9834ee09551764b045fdc02df754157473125edf60Kevin Tang{ 9934ee09551764b045fdc02df754157473125edf60Kevin Tang /* Callback not registered, or unexpected ID (shouldn't happen) */ 10034ee09551764b045fdc02df754157473125edf60Kevin Tang if (loc_api_saved_cb == NULL || argp->cb_id != LOC_API_CB_ID) 10134ee09551764b045fdc02df754157473125edf60Kevin Tang { 10234ee09551764b045fdc02df754157473125edf60Kevin Tang LOGD("Warning: No callback handler.\n"); 10334ee09551764b045fdc02df754157473125edf60Kevin Tang ret->loc_event_cb_f_type_result = 0; 10434ee09551764b045fdc02df754157473125edf60Kevin Tang return 1; /* simply return */ 10534ee09551764b045fdc02df754157473125edf60Kevin Tang } 10634ee09551764b045fdc02df754157473125edf60Kevin Tang 10734ee09551764b045fdc02df754157473125edf60Kevin Tang LOGD("proc: %x prog: %x vers: %x\n", 10834ee09551764b045fdc02df754157473125edf60Kevin Tang (int) req->rq_proc, 10934ee09551764b045fdc02df754157473125edf60Kevin Tang (int) req->rq_prog, 11034ee09551764b045fdc02df754157473125edf60Kevin Tang (int) req->rq_vers); 11134ee09551764b045fdc02df754157473125edf60Kevin Tang 11234ee09551764b045fdc02df754157473125edf60Kevin Tang LOGD("Callback received: %x (handle=%d ret_ptr=%d)\n", 11334ee09551764b045fdc02df754157473125edf60Kevin Tang (int) argp->loc_event, 11434ee09551764b045fdc02df754157473125edf60Kevin Tang (int) argp->loc_handle, 11534ee09551764b045fdc02df754157473125edf60Kevin Tang (int) ret); 11634ee09551764b045fdc02df754157473125edf60Kevin Tang 11734ee09551764b045fdc02df754157473125edf60Kevin Tang /* Forward callback to real callback procedure */ 11834ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_client_handle_type loc_handle = argp->loc_handle; 11934ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_event_mask_type loc_event = argp->loc_event; 12034ee09551764b045fdc02df754157473125edf60Kevin Tang const rpc_loc_event_payload_u_type* loc_event_payload = 12134ee09551764b045fdc02df754157473125edf60Kevin Tang (const rpc_loc_event_payload_u_type*) argp->loc_event_payload; 12234ee09551764b045fdc02df754157473125edf60Kevin Tang 12334ee09551764b045fdc02df754157473125edf60Kevin Tang int32 rc = loc_api_saved_cb(loc_handle, loc_event, loc_event_payload); 12434ee09551764b045fdc02df754157473125edf60Kevin Tang ret->loc_event_cb_f_type_result = rc; 12534ee09551764b045fdc02df754157473125edf60Kevin Tang 12634ee09551764b045fdc02df754157473125edf60Kevin Tang return 1; /* ok */ 12734ee09551764b045fdc02df754157473125edf60Kevin Tang} 12834ee09551764b045fdc02df754157473125edf60Kevin Tang 12934ee09551764b045fdc02df754157473125edf60Kevin Tangint loc_apicbprog_freeresult (SVCXPRT *transp, xdrproc_t xdr_result, caddr_t result) 13034ee09551764b045fdc02df754157473125edf60Kevin Tang{ 13134ee09551764b045fdc02df754157473125edf60Kevin Tang xdr_free (xdr_result, result); 13234ee09551764b045fdc02df754157473125edf60Kevin Tang 13334ee09551764b045fdc02df754157473125edf60Kevin Tang /* 13434ee09551764b045fdc02df754157473125edf60Kevin Tang * Insert additional freeing code here, if needed 13534ee09551764b045fdc02df754157473125edf60Kevin Tang */ 13634ee09551764b045fdc02df754157473125edf60Kevin Tang // LOGD("***** loc_apicbprog_freeresult\n"); 13734ee09551764b045fdc02df754157473125edf60Kevin Tang 13834ee09551764b045fdc02df754157473125edf60Kevin Tang return 1; 13934ee09551764b045fdc02df754157473125edf60Kevin Tang} 14034ee09551764b045fdc02df754157473125edf60Kevin Tang 14134ee09551764b045fdc02df754157473125edf60Kevin Tangint loc_apicbprog_0x00040001_freeresult (SVCXPRT *transp, xdrproc_t xdr_result, caddr_t result) 14234ee09551764b045fdc02df754157473125edf60Kevin Tang{ 14334ee09551764b045fdc02df754157473125edf60Kevin Tang return loc_apicbprog_freeresult (transp, xdr_result, result); 14434ee09551764b045fdc02df754157473125edf60Kevin Tang} 14534ee09551764b045fdc02df754157473125edf60Kevin Tang 14634ee09551764b045fdc02df754157473125edf60Kevin Tang/*=========================================================================== 14734ee09551764b045fdc02df754157473125edf60Kevin Tang 14834ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION loc_api_glue_init 14934ee09551764b045fdc02df754157473125edf60Kevin Tang 15034ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION 15134ee09551764b045fdc02df754157473125edf60Kevin Tang Initiates the RPC client 15234ee09551764b045fdc02df754157473125edf60Kevin Tang 15334ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE 15434ee09551764b045fdc02df754157473125edf60Kevin Tang 1 for success 15534ee09551764b045fdc02df754157473125edf60Kevin Tang 0 for failure 15634ee09551764b045fdc02df754157473125edf60Kevin Tang 15734ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/ 15834ee09551764b045fdc02df754157473125edf60Kevin Tangint loc_api_glue_init(void) 15934ee09551764b045fdc02df754157473125edf60Kevin Tang{ 16034ee09551764b045fdc02df754157473125edf60Kevin Tang if (loc_api_clnt == NULL) 16134ee09551764b045fdc02df754157473125edf60Kevin Tang { 16234ee09551764b045fdc02df754157473125edf60Kevin Tang /* Print msg */ 16334ee09551764b045fdc02df754157473125edf60Kevin Tang LOGD("Trying to create RPC client...\n"); 16434ee09551764b045fdc02df754157473125edf60Kevin Tang loc_api_clnt = clnt_create(NULL, LOC_APIPROG, LOC_APIVERS, NULL); 16534ee09551764b045fdc02df754157473125edf60Kevin Tang LOGD("Created loc_api_clnt ---- %x\n", (unsigned int)loc_api_clnt); 16634ee09551764b045fdc02df754157473125edf60Kevin Tang 16734ee09551764b045fdc02df754157473125edf60Kevin Tang if (loc_api_clnt == NULL) 16834ee09551764b045fdc02df754157473125edf60Kevin Tang { 16934ee09551764b045fdc02df754157473125edf60Kevin Tang fprintf(stderr, "Error: cannot create RPC client.\n"); 17034ee09551764b045fdc02df754157473125edf60Kevin Tang return 0; 17134ee09551764b045fdc02df754157473125edf60Kevin Tang } 17234ee09551764b045fdc02df754157473125edf60Kevin Tang 17334ee09551764b045fdc02df754157473125edf60Kevin Tang /* Init RPC callbacks */ 17434ee09551764b045fdc02df754157473125edf60Kevin Tang int rc = loc_apicb_app_init(); 17534ee09551764b045fdc02df754157473125edf60Kevin Tang if (rc >= 0) 17634ee09551764b045fdc02df754157473125edf60Kevin Tang { 17734ee09551764b045fdc02df754157473125edf60Kevin Tang LOGD("Loc API callback initialized.\n"); 17834ee09551764b045fdc02df754157473125edf60Kevin Tang } else { 17934ee09551764b045fdc02df754157473125edf60Kevin Tang fprintf(stderr, "Loc API callback initialization failed.\n"); 18034ee09551764b045fdc02df754157473125edf60Kevin Tang return 0; 18134ee09551764b045fdc02df754157473125edf60Kevin Tang } 18234ee09551764b045fdc02df754157473125edf60Kevin Tang } 18334ee09551764b045fdc02df754157473125edf60Kevin Tang 18434ee09551764b045fdc02df754157473125edf60Kevin Tang return 1; 18534ee09551764b045fdc02df754157473125edf60Kevin Tang} 18634ee09551764b045fdc02df754157473125edf60Kevin Tang 18734ee09551764b045fdc02df754157473125edf60Kevin Tangrpc_loc_client_handle_type loc_open ( 18834ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_event_mask_type event_reg_mask, 18934ee09551764b045fdc02df754157473125edf60Kevin Tang loc_event_cb_f_type *event_callback 19034ee09551764b045fdc02df754157473125edf60Kevin Tang ) 19134ee09551764b045fdc02df754157473125edf60Kevin Tang{ 19234ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_GLUE_CHECK_INIT(rpc_loc_client_handle_type); 19334ee09551764b045fdc02df754157473125edf60Kevin Tang 19434ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_open_args args; 19534ee09551764b045fdc02df754157473125edf60Kevin Tang args.event_reg_mask = event_reg_mask; 19634ee09551764b045fdc02df754157473125edf60Kevin Tang args.event_callback = LOC_API_CB_ID; 19734ee09551764b045fdc02df754157473125edf60Kevin Tang loc_api_saved_cb = event_callback; 19834ee09551764b045fdc02df754157473125edf60Kevin Tang 19934ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_open_rets rets; 20034ee09551764b045fdc02df754157473125edf60Kevin Tang enum clnt_stat stat = RPC_SUCCESS; 20134ee09551764b045fdc02df754157473125edf60Kevin Tang 20234ee09551764b045fdc02df754157473125edf60Kevin Tang stat = RPC_FUNC_VERSION(rpc_loc_open_, /* LOC_APIVERS */ 0x00040001)(&args, &rets, loc_api_clnt); 20334ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_GLUE_CHECK_RESULT(stat, int32); 20434ee09551764b045fdc02df754157473125edf60Kevin Tang 20534ee09551764b045fdc02df754157473125edf60Kevin Tang return (rpc_loc_client_handle_type) rets.loc_open_result; 20634ee09551764b045fdc02df754157473125edf60Kevin Tang} 20734ee09551764b045fdc02df754157473125edf60Kevin Tang 20834ee09551764b045fdc02df754157473125edf60Kevin Tangint32 loc_close(rpc_loc_client_handle_type handle) 20934ee09551764b045fdc02df754157473125edf60Kevin Tang{ 21034ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_GLUE_CHECK_INIT(int32); 21134ee09551764b045fdc02df754157473125edf60Kevin Tang 21234ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_close_args args; 21334ee09551764b045fdc02df754157473125edf60Kevin Tang args.handle = handle; 21434ee09551764b045fdc02df754157473125edf60Kevin Tang 21534ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_close_rets rets; 21634ee09551764b045fdc02df754157473125edf60Kevin Tang enum clnt_stat stat = RPC_SUCCESS; 21734ee09551764b045fdc02df754157473125edf60Kevin Tang 21834ee09551764b045fdc02df754157473125edf60Kevin Tang stat = RPC_FUNC_VERSION(rpc_loc_close_, /* LOC_APIVERS */ 0x00040001)(&args, &rets, loc_api_clnt); 21934ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_GLUE_CHECK_RESULT(stat, int32); 22034ee09551764b045fdc02df754157473125edf60Kevin Tang 22134ee09551764b045fdc02df754157473125edf60Kevin Tang return (int32) rets.loc_close_result; 22234ee09551764b045fdc02df754157473125edf60Kevin Tang} 22334ee09551764b045fdc02df754157473125edf60Kevin Tang 22434ee09551764b045fdc02df754157473125edf60Kevin Tangint32 loc_start_fix(rpc_loc_client_handle_type handle) 22534ee09551764b045fdc02df754157473125edf60Kevin Tang{ 22634ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_GLUE_CHECK_INIT(int32); 22734ee09551764b045fdc02df754157473125edf60Kevin Tang 22834ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_start_fix_args args; 22934ee09551764b045fdc02df754157473125edf60Kevin Tang args.handle = handle; 23034ee09551764b045fdc02df754157473125edf60Kevin Tang 23134ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_start_fix_rets rets; 23234ee09551764b045fdc02df754157473125edf60Kevin Tang enum clnt_stat stat = RPC_SUCCESS; 23334ee09551764b045fdc02df754157473125edf60Kevin Tang 23434ee09551764b045fdc02df754157473125edf60Kevin Tang stat = RPC_FUNC_VERSION(rpc_loc_start_fix_, /* LOC_APIVERS */ 0x00040001)(&args, &rets, loc_api_clnt); 23534ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_GLUE_CHECK_RESULT(stat, int32); 23634ee09551764b045fdc02df754157473125edf60Kevin Tang 23734ee09551764b045fdc02df754157473125edf60Kevin Tang return (int32) rets.loc_start_fix_result; 23834ee09551764b045fdc02df754157473125edf60Kevin Tang} 23934ee09551764b045fdc02df754157473125edf60Kevin Tang 24034ee09551764b045fdc02df754157473125edf60Kevin Tangint32 loc_stop_fix(rpc_loc_client_handle_type handle) 24134ee09551764b045fdc02df754157473125edf60Kevin Tang{ 24234ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_GLUE_CHECK_INIT(int32); 24334ee09551764b045fdc02df754157473125edf60Kevin Tang 24434ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_stop_fix_args args; 24534ee09551764b045fdc02df754157473125edf60Kevin Tang args.handle = handle; 24634ee09551764b045fdc02df754157473125edf60Kevin Tang 24734ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_stop_fix_rets rets; 24834ee09551764b045fdc02df754157473125edf60Kevin Tang enum clnt_stat stat = RPC_SUCCESS; 24934ee09551764b045fdc02df754157473125edf60Kevin Tang 25034ee09551764b045fdc02df754157473125edf60Kevin Tang stat = RPC_FUNC_VERSION(rpc_loc_stop_fix_, /* LOC_APIVERS */ 0x00040001)(&args, &rets, loc_api_clnt); 25134ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_GLUE_CHECK_RESULT(stat, int32); 25234ee09551764b045fdc02df754157473125edf60Kevin Tang 25334ee09551764b045fdc02df754157473125edf60Kevin Tang return (int32) rets.loc_stop_fix_result; 25434ee09551764b045fdc02df754157473125edf60Kevin Tang} 25534ee09551764b045fdc02df754157473125edf60Kevin Tang 25634ee09551764b045fdc02df754157473125edf60Kevin Tangint32 loc_ioctl( 25734ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_client_handle_type handle, 25834ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_ioctl_e_type ioctl_type, 25934ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_ioctl_data_u_type* ioctl_data 26034ee09551764b045fdc02df754157473125edf60Kevin Tang ) 26134ee09551764b045fdc02df754157473125edf60Kevin Tang{ 26234ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_GLUE_CHECK_INIT(int32); 26334ee09551764b045fdc02df754157473125edf60Kevin Tang 26434ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_ioctl_args args; 26534ee09551764b045fdc02df754157473125edf60Kevin Tang args.handle = handle; 26634ee09551764b045fdc02df754157473125edf60Kevin Tang args.ioctl_data = ioctl_data; 26734ee09551764b045fdc02df754157473125edf60Kevin Tang args.ioctl_type = ioctl_type; 26834ee09551764b045fdc02df754157473125edf60Kevin Tang if (ioctl_data != NULL) 26934ee09551764b045fdc02df754157473125edf60Kevin Tang { 27034ee09551764b045fdc02df754157473125edf60Kevin Tang /* Assign ioctl union discriminator */ 27134ee09551764b045fdc02df754157473125edf60Kevin Tang ioctl_data->disc = ioctl_type; 27234ee09551764b045fdc02df754157473125edf60Kevin Tang 27334ee09551764b045fdc02df754157473125edf60Kevin Tang /* In case the user hasn't filled in other disc fields, 27434ee09551764b045fdc02df754157473125edf60Kevin Tang automatically fill them in here */ 27534ee09551764b045fdc02df754157473125edf60Kevin Tang switch (ioctl_type) 27634ee09551764b045fdc02df754157473125edf60Kevin Tang { 27734ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_IOCTL_GET_API_VERSION: 27834ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_IOCTL_SET_FIX_CRITERIA: 27934ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_IOCTL_GET_FIX_CRITERIA: 28034ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_IOCTL_INFORM_NI_USER_RESPONSE: 28134ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_IOCTL_INJECT_PREDICTED_ORBITS_DATA: 28234ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_VALIDITY: 28334ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE: 28434ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_IOCTL_SET_PREDICTED_ORBITS_DATA_AUTO_DOWNLOAD: 28534ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_IOCTL_INJECT_UTC_TIME: 28634ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_IOCTL_INJECT_RTC_VALUE: 28734ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_IOCTL_INJECT_POSITION: 28834ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_IOCTL_QUERY_ENGINE_STATE: 28934ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_IOCTL_INFORM_SERVER_OPEN_STATUS: 29034ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_IOCTL_INFORM_SERVER_CLOSE_STATUS: 29134ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_IOCTL_SET_ENGINE_LOCK: 29234ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_IOCTL_GET_ENGINE_LOCK: 29334ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_IOCTL_SET_SBAS_CONFIG: 29434ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_IOCTL_GET_SBAS_CONFIG: 29534ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_IOCTL_SET_NMEA_TYPES: 29634ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_IOCTL_GET_NMEA_TYPES: 29734ee09551764b045fdc02df754157473125edf60Kevin Tang break; 29834ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_IOCTL_SET_CDMA_PDE_SERVER_ADDR: 29934ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_IOCTL_SET_CDMA_MPC_SERVER_ADDR: 30034ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_IOCTL_SET_UMTS_SLP_SERVER_ADDR: 30134ee09551764b045fdc02df754157473125edf60Kevin Tang args.ioctl_data->rpc_loc_ioctl_data_u_type_u.server_addr.addr_info.disc = 30234ee09551764b045fdc02df754157473125edf60Kevin Tang args.ioctl_data->rpc_loc_ioctl_data_u_type_u.server_addr.addr_type; 30334ee09551764b045fdc02df754157473125edf60Kevin Tang break; 30434ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_IOCTL_GET_CDMA_PDE_SERVER_ADDR: 30534ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_IOCTL_GET_CDMA_MPC_SERVER_ADDR: 30634ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_IOCTL_GET_UMTS_SLP_SERVER_ADDR: 30734ee09551764b045fdc02df754157473125edf60Kevin Tang break; 30834ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_IOCTL_SET_ON_DEMAND_LPM: 30934ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_IOCTL_GET_ON_DEMAND_LPM: 31034ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_IOCTL_DELETE_ASSIST_DATA: 31134ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_IOCTL_SET_CUSTOM_PDE_SERVER_ADDR: 31234ee09551764b045fdc02df754157473125edf60Kevin Tang case RPC_LOC_IOCTL_GET_CUSTOM_PDE_SERVER_ADDR: 31334ee09551764b045fdc02df754157473125edf60Kevin Tang default: 31434ee09551764b045fdc02df754157473125edf60Kevin Tang break; 31534ee09551764b045fdc02df754157473125edf60Kevin Tang } /* switch */ 31634ee09551764b045fdc02df754157473125edf60Kevin Tang } /* ioctl_data != NULL */ 31734ee09551764b045fdc02df754157473125edf60Kevin Tang 31834ee09551764b045fdc02df754157473125edf60Kevin Tang rpc_loc_ioctl_rets rets; 31934ee09551764b045fdc02df754157473125edf60Kevin Tang enum clnt_stat stat = RPC_SUCCESS; 32034ee09551764b045fdc02df754157473125edf60Kevin Tang 32134ee09551764b045fdc02df754157473125edf60Kevin Tang stat = RPC_FUNC_VERSION(rpc_loc_ioctl_, /* LOC_APIVERS */ 0x00040001)(&args, &rets, loc_api_clnt); 32234ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_GLUE_CHECK_RESULT(stat, int32); 32334ee09551764b045fdc02df754157473125edf60Kevin Tang 32434ee09551764b045fdc02df754157473125edf60Kevin Tang return (int32) rets.loc_ioctl_result; 32534ee09551764b045fdc02df754157473125edf60Kevin Tang} 32634ee09551764b045fdc02df754157473125edf60Kevin Tang 32734ee09551764b045fdc02df754157473125edf60Kevin Tang/* Returns 0 if error */ 32834ee09551764b045fdc02df754157473125edf60Kevin Tangint32 loc_api_null(void) 32934ee09551764b045fdc02df754157473125edf60Kevin Tang{ 33034ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_GLUE_CHECK_INIT(int32); 33134ee09551764b045fdc02df754157473125edf60Kevin Tang 33234ee09551764b045fdc02df754157473125edf60Kevin Tang int32 rets; 33334ee09551764b045fdc02df754157473125edf60Kevin Tang enum clnt_stat stat = RPC_SUCCESS; 33434ee09551764b045fdc02df754157473125edf60Kevin Tang 33534ee09551764b045fdc02df754157473125edf60Kevin Tang stat = RPC_FUNC_VERSION(rpc_loc_api_null_, LOC_APIVERS)(NULL, &rets, loc_api_clnt); 33634ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_GLUE_CHECK_RESULT(stat, int32); 33734ee09551764b045fdc02df754157473125edf60Kevin Tang 33834ee09551764b045fdc02df754157473125edf60Kevin Tang return (int32) rets; 33934ee09551764b045fdc02df754157473125edf60Kevin Tang} 340