1bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
2bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *
3bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * Redistribution and use in source and binary forms, with or without
4bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * modification, are permitted provided that the following conditions are
5bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * met:
6bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *     * Redistributions of source code must retain the above copyright
7bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *       notice, this list of conditions and the following disclaimer.
8bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *     * Redistributions in binary form must reproduce the above
9bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *       copyright notice, this list of conditions and the following
10bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *       disclaimer in the documentation and/or other materials provided
11bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *       with the distribution.
12bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *     * Neither the name of The Linux Foundation, nor the names of its
13bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *       contributors may be used to endorse or promote products derived
14bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *       from this software without specific prior written permission.
15bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *
16bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo */
28bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
29bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*=====================================================================
30bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
31bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                     INCLUDE FILES FOR MODULE
32bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
33bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo======================================================================*/
34bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <stdio.h>
35bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <pthread.h>
36bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <errno.h>
37bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <string.h>
38bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <sys/select.h>
39bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <sys/time.h>
40bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <sys/types.h>
41bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <sys/stat.h>
42bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <fcntl.h>
43bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <sys/mman.h>
44bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <unistd.h>
45bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <stdlib.h>
46bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <assert.h>
47bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <loc_api_log.h>
48bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
49bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <rpc/rpc.h>
50bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
51bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Include RPC headers */
52bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include "rpc_inc/loc_api_rpc_glue.h"
53bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
54bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Callback init */
55bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include "rpc_inc/loc_apicb_appinit.h"
56bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
57bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Logging */
58bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define LOG_TAG "LocSvc_api_rpc_glue"
59bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define LOG_NDDEBUG 0
60bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#ifndef USE_GLIB
61bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <utils/Log.h>
62bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#endif /* USE_GLIB */
63bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
64bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Logging Improvement */
65bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include "log_util.h"
66bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include "platform_lib_includes.h"
67bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*Maximum number of Modem init*/
68bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define RPC_TRY_NUM 10
69bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
70bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*Maximum number of Modem init*/
71bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define RPC_TRY_NUM 10
72bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
73bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Uncomment to force ALOGD messages */
74bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo// #define ALOGD ALOGI
75bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
76bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*=====================================================================
77bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo     External declarations
78bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo======================================================================*/
79bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
80bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoCLIENT* loc_api_clnt = NULL;
81bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
82bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Callback ID and pointer */
83bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define LOC_API_CB_MAX_CLIENTS 16
84bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russotypedef struct
85bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
86bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    uint32 cb_id;                        /* same as rpc/types.h */
87bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_event_cb_f_type *cb_func;      /* callback func */
88bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_reset_notif_cb_f_type *rpc_cb; /* callback from RPC */
89bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    rpc_loc_client_handle_type handle; /* stores handle for client closing */
90bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    void* user;                        /* user's own data handle */
91bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} loc_glue_cb_entry_s_type;
92bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
93bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoloc_glue_cb_entry_s_type loc_glue_callback_table[LOC_API_CB_MAX_CLIENTS];
94bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
95bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define RPC_FUNC_VERSION_BASE(a,b) a ## b
96bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define RPC_FUNC_VERSION(a,b) RPC_FUNC_VERSION_BASE(a,b)
97bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
98bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define RPC_CALLBACK_FUNC_VERSION_BASE(a,v,b) a ## v ## b
99bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define RPC_CALLBACK_FUNC_VERSION(a,v,b) RPC_CALLBACK_FUNC_VERSION_BASE(a,v,b)
100bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
101bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define LOC_GLUE_CHECK_INIT(ret_type) \
102bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   if (loc_api_clnt == NULL) { EXIT_LOG_CALLFLOW(%d, RPC_LOC_API_RPC_FAILURE); return (ret_type) RPC_LOC_API_RPC_FAILURE; }
103bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
104bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define LOC_GLUE_CHECK_RESULT(stat, ret_type) \
105bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo  if (stat != RPC_SUCCESS) { \
106bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      LOC_LOGE("%s:%d] failure code %d", __func__, __LINE__, stat); \
107bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      return (ret_type)((stat == RPC_SUBSYSTEM_RESTART) ? \
108bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                        RPC_LOC_API_RPC_MODEM_RESTART : RPC_LOC_API_RPC_FAILURE); \
109bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo  }
110bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
111bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Callback functions */
112bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Returns 1 if successful */
113bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russobool_t rpc_loc_event_cb_f_type_svc(
114bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      rpc_loc_event_cb_f_type_args *argp,
115bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      rpc_loc_event_cb_f_type_rets *ret,
116bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      struct svc_req *req)
117bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
118bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    // The lower word of cd_id is the index
119bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int index = argp->cb_id & 0xFFFF;
120bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
121bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    /* Callback not registered, or unexpected ID (shouldn't happen) */
122bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if (index >= LOC_API_CB_MAX_CLIENTS || loc_glue_callback_table[index].cb_func == NULL)
123bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    {
124bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        LOC_LOGE("Warning: No callback handler %d.\n", index);
125bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        ret->loc_event_cb_f_type_result = 0;
126bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        return 1; /* simply return */
127bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
128bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
129bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    LOC_LOGV("proc: %x  prog: %x  vers: %x\n",
130bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo         (int) req->rq_proc,
131bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo         (int) req->rq_prog,
132bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo         (int) req->rq_vers);
133bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
134bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    LOC_LOGV("Callback received: %x (cb_id=%p handle=%d ret_ptr=%d)\n",
135bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo         (int) argp->loc_event,
136bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo               argp->cb_id,
137bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo         (int) argp->loc_handle,
138bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo         (int) ret);
139bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
140bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    /* Forward callback to real callback procedure */
141bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    rpc_loc_client_handle_type        loc_handle = argp->loc_handle;
142bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    rpc_loc_event_mask_type           loc_event  = argp->loc_event;
143bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    const rpc_loc_event_payload_u_type*  loc_event_payload =
144bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        (const rpc_loc_event_payload_u_type*) argp->loc_event_payload;
145bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
146bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    /* Gives control to synchronous call handler */
147bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_api_callback_process_sync_call(loc_handle, loc_event, loc_event_payload);
148bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
149bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int32 rc = (loc_glue_callback_table[index].cb_func)(loc_glue_callback_table[index].user,
150bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                                                        loc_handle, loc_event, loc_event_payload);
151bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
152bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    LOC_LOGV("cb_func=%p", loc_glue_callback_table[index].cb_func);
153bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
154bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ret->loc_event_cb_f_type_result = rc;
155bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
156bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return 1; /* ok */
157bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
158bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
159bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint loc_apicbprog_freeresult (SVCXPRT *transp, xdrproc_t xdr_result, caddr_t result)
160bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
161bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   xdr_free (xdr_result, result);
162bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
163bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   /*
164bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    * Insert additional freeing code here, if needed
165bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    */
166bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   // LOC_LOGD("***** loc_apicbprog_freeresult\n");
167bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
168bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   return 1;
169bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
170bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
171bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
172bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
173bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION rpc_loc_event_cb_f_type_<version>_svc (MACRO)
174bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
175bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
176bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   Callback function for Loc API
177bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
178bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
179bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   1 for success
180bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   0 for failure
181bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
182bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
183bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russobool_t RPC_CALLBACK_FUNC_VERSION(rpc_loc_event_cb_f_type_, RPC_LOC_EVENT_CB_F_TYPE_VERSION, _svc) (
184bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      rpc_loc_event_cb_f_type_args *argp,
185bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      rpc_loc_event_cb_f_type_rets *ret,
186bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      struct svc_req *req)
187bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
188bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   return rpc_loc_event_cb_f_type_svc(argp, ret, req);
189bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
190bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
191bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
192bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
193bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION loc_apicbprog_<version>_freeresult (MACRO)
194bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
195bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
196bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   Free up RPC data structure
197bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
198bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
199bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   1 for success
200bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   0 for failure
201bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
202bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
203bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define VERSION_CONCAT(MAJOR,MINOR) MAJOR##MINOR
204bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define loc_apicb_prog_VER_freeresult(M,N) \
205bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint RPC_CALLBACK_FUNC_VERSION(loc_apicbprog_, VERSION_CONCAT(M,N), _freeresult) \
206bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo(SVCXPRT *transp, xdrproc_t xdr_result, caddr_t result) \
207bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ \
208bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   return loc_apicbprog_freeresult(transp, xdr_result, result); \
209bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
210bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
211bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Define all of the possible minors */
212bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoloc_apicb_prog_VER_freeresult(RPC_LOC_API_API_MAJOR_NUM, 0001);
213bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoloc_apicb_prog_VER_freeresult(RPC_LOC_API_API_MAJOR_NUM, 0002);
214bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoloc_apicb_prog_VER_freeresult(RPC_LOC_API_API_MAJOR_NUM, 0003);
215bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoloc_apicb_prog_VER_freeresult(RPC_LOC_API_API_MAJOR_NUM, 0004);
216bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoloc_apicb_prog_VER_freeresult(RPC_LOC_API_API_MAJOR_NUM, 0005);
217bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoloc_apicb_prog_VER_freeresult(RPC_LOC_API_API_MAJOR_NUM, 0006);
218bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
219bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
220bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
221bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION rpc_loc_api_cb_null_<version>_svc (MACRO) [Patch for wrong RPCGEN stubs]
222bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
223bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
224bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   Null callback function for Loc API
225bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
226bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
227bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   1 for success
228bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
229bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
230bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define rpc_loc_api_cb_null_VER_svc(M,N) \
231bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russobool_t RPC_CALLBACK_FUNC_VERSION(rpc_loc_api_cb_null_, VERSION_CONCAT(M,N), _svc) ( \
232bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      void *a, int *b, struct svc_req *req) \
233bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ \
234bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   return 1; \
235bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
236bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
237bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Define all of the possible minors */
238bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russorpc_loc_api_cb_null_VER_svc(RPC_LOC_API_API_MAJOR_NUM, 0001);
239bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russorpc_loc_api_cb_null_VER_svc(RPC_LOC_API_API_MAJOR_NUM, 0002);
240bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russorpc_loc_api_cb_null_VER_svc(RPC_LOC_API_API_MAJOR_NUM, 0003);
241bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russorpc_loc_api_cb_null_VER_svc(RPC_LOC_API_API_MAJOR_NUM, 0004);
242bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russorpc_loc_api_cb_null_VER_svc(RPC_LOC_API_API_MAJOR_NUM, 0005);
243bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russorpc_loc_api_cb_null_VER_svc(RPC_LOC_API_API_MAJOR_NUM, 0006);
244bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
245bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void loc_api_glue_rpc_cb(CLIENT* client, enum rpc_reset_event event)
246bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
247bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int i;
248bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    for (i = 0; i < LOC_API_CB_MAX_CLIENTS; i++) {
249bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        if (NULL != loc_glue_callback_table[i].rpc_cb) {
250bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            loc_glue_callback_table[i].rpc_cb(loc_glue_callback_table[i].user, client, event);
251bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        }
252bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
253bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
254bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
255bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
256bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
257bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION loc_api_glue_init
258bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
259bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
260bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   Initiates the RPC client
261bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
262bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
263bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   1 for success
264bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   0 for failure
265bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
266bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
267bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint loc_api_glue_init(void)
268bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
269bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   if (loc_api_clnt == NULL)
270bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   {
271bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      /* Initialize data */
272bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      int i;
273bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      int pid = getpid();
274bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      for (i = 0; i < LOC_API_CB_MAX_CLIENTS; i++)
275bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      {
276bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo          loc_glue_callback_table[i].cb_id = i | (pid << 16);
277bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo          loc_glue_callback_table[i].cb_func = NULL;
278bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo          loc_glue_callback_table[i].handle = -1;
279bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo          loc_glue_callback_table[i].rpc_cb = NULL;
280bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo          loc_glue_callback_table[i].user = NULL;
281bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      }
282bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
283bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      /* Print msg */
284bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      LOC_LOGV("Trying to create RPC client...\n");
285bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      loc_api_clnt = clnt_create(NULL, LOC_APIPROG, LOC_APIVERS, NULL);
286bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      LOC_LOGV("Created loc_api_clnt ---- %x\n", (unsigned int)loc_api_clnt);
287bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
288bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      if (loc_api_clnt == NULL)
289bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      {
290bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo         LOC_LOGE("Error: cannot create RPC client.\n");
291bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo         return 0;
292bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      }
293bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
294bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      /* Init RPC callbacks */
295bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      loc_api_sync_call_init();
296bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
297bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      int rc = loc_apicb_app_init();
298bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      if (rc >= 0)
299bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      {
300bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo         LOC_LOGD("Loc API RPC client initialized.\n");
301bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo         clnt_register_reset_notification_cb(loc_api_clnt, loc_api_glue_rpc_cb);
302bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      }
303bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      else {
304bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo         LOC_LOGE("Loc API callback initialization failed.\n");
305bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo         return 0;
306bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      }
307bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   }
308bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
309bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   return 1;
310bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
311bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
312bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russorpc_loc_client_handle_type loc_open (
313bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    rpc_loc_event_mask_type       event_reg_mask,
314bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_event_cb_f_type           *event_callback,
315bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_reset_notif_cb_f_type     *rpc_cb,
316bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    void*                         userData
317bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo)
318bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
319bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int try_num = RPC_TRY_NUM;
320bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
321bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    LOC_GLUE_CHECK_INIT(rpc_loc_client_handle_type);
322bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
323bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    rpc_loc_client_handle_type ret_val;
324bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
325bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    rpc_loc_open_args args;
326bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    args.event_reg_mask = event_reg_mask;
327bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
328bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int i, j = LOC_API_CB_MAX_CLIENTS;
329bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    for (i = 0; i < LOC_API_CB_MAX_CLIENTS; i++)
330bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    {
331bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        if (loc_glue_callback_table[i].user == userData)
332bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        {
333bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            LOC_LOGW("Client already opened service (callback=%p)...\n",
334bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                  event_callback);
335bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            break;
336bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        } else if (j == LOC_API_CB_MAX_CLIENTS &&
337bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                   loc_glue_callback_table[i].user == NULL) {
338bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            j = i;
339bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        }
340bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
341bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
342bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if (i == LOC_API_CB_MAX_CLIENTS)
343bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    {
344bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        i = j;
345bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
346bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
347bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if (i == LOC_API_CB_MAX_CLIENTS)
348bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    {
349bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        LOC_LOGE("Too many clients opened at once...\n");
350bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        return RPC_LOC_CLIENT_HANDLE_INVALID;
351bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
352bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
353bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_glue_callback_table[i].cb_func = event_callback;
354bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_glue_callback_table[i].rpc_cb = rpc_cb;
355bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_glue_callback_table[i].user = userData;
356bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
357bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    args.event_callback = loc_glue_callback_table[i].cb_id;
358bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    LOC_LOGV("cb_id=%d, func=0x%x", i, (unsigned int) event_callback);
359bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
360bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    rpc_loc_open_rets rets;
361bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    enum clnt_stat stat = RPC_SUCCESS;
362bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
363bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG_CALLFLOW(%s, "loc client open");
364bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
365bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo     /*try more for rpc_loc_open_xx()*/
366bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
367bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    do
368bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    {
369bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        stat = RPC_FUNC_VERSION(rpc_loc_open_, RPC_LOC_OPEN_VERSION)(&args, &rets, loc_api_clnt);
370bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        ret_val = (rpc_loc_client_handle_type) rets.loc_open_result;
371bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        try_num--;
372bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
373bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }while( (RPC_SUCCESS != stat||0 > ret_val) && 0 != try_num );
374bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
375bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    LOC_GLUE_CHECK_RESULT(stat, int32);
376bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
377bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    /* save the handle in the table */
378bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_glue_callback_table[i].handle = (rpc_loc_client_handle_type) rets.loc_open_result;
379bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
380bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return ret_val;
381bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
382bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
383bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
384bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint32 loc_close
385bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo(
386bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      rpc_loc_client_handle_type handle
387bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo)
388bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
389bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
390bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    LOC_GLUE_CHECK_INIT(int32);
391bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
392bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int32 ret_val;
393bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
394bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    rpc_loc_close_args args;
395bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    args.handle = handle;
396bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
397bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    rpc_loc_close_rets rets;
398bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    enum clnt_stat stat = RPC_SUCCESS;
399bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
400bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG_CALLFLOW(%s, "loc client close");
401bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    stat = RPC_FUNC_VERSION(rpc_loc_close_, RPC_LOC_CLOSE_VERSION)(&args, &rets, loc_api_clnt);
402bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
403bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_clear(handle);
404bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
405bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    LOC_GLUE_CHECK_RESULT(stat, int32);
406bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ret_val = (int32) rets.loc_close_result;
407bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
408bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return ret_val;
409bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
410bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
411bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russovoid loc_clear(rpc_loc_client_handle_type handle) {
412bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    /* Clean the client's callback function in callback table */
413bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int i;
414bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    for (i = 0; i < LOC_API_CB_MAX_CLIENTS; i++)
415bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    {
416bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        if (loc_glue_callback_table[i].handle == handle)
417bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        {
418bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            /* Found the client */
419bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            loc_glue_callback_table[i].cb_func = NULL;
420bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            loc_glue_callback_table[i].rpc_cb = NULL;
421bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            loc_glue_callback_table[i].handle = -1;
422bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            loc_glue_callback_table[i].user = NULL;
423bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            break;
424bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        }
425bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
426bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
427bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if (i == LOC_API_CB_MAX_CLIENTS)
428bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    {
429bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        LOC_LOGW("Handle not found (handle=%d)...\n", (int) handle);
430bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
431bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
432bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
433bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint32 loc_start_fix
434bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo(
435bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      rpc_loc_client_handle_type handle
436bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo)
437bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
438bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
439bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    LOC_GLUE_CHECK_INIT(int32);
440bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
441bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int32 ret_val;
442bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
443bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    rpc_loc_start_fix_args args;
444bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    args.handle = handle;
445bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
446bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    rpc_loc_start_fix_rets rets;
447bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    enum clnt_stat stat = RPC_SUCCESS;
448bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
449bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG_CALLFLOW(%s, "loc start fix");
450bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    stat = RPC_FUNC_VERSION(rpc_loc_start_fix_, RPC_LOC_START_FIX_VERSION)(&args, &rets, loc_api_clnt);
451bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    LOC_GLUE_CHECK_RESULT(stat, int32);
452bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
453bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ret_val = (int32) rets.loc_start_fix_result;
454bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
455bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return ret_val;
456bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
457bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
458bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint32 loc_stop_fix
459bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo(
460bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      rpc_loc_client_handle_type handle
461bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo)
462bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
463bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
464bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    LOC_GLUE_CHECK_INIT(int32);
465bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
466bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int32 ret_val;
467bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
468bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    rpc_loc_stop_fix_args args;
469bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    args.handle = handle;
470bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
471bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    rpc_loc_stop_fix_rets rets;
472bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    enum clnt_stat stat = RPC_SUCCESS;
473bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
474bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG_CALLFLOW(%s, "loc stop fix");
475bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    stat = RPC_FUNC_VERSION(rpc_loc_stop_fix_, RPC_LOC_STOP_FIX_VERSION)(&args, &rets, loc_api_clnt);
476bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    LOC_GLUE_CHECK_RESULT(stat, int32);
477bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
478bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ret_val = (int32) rets.loc_stop_fix_result;
479bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
480bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return ret_val;
481bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
482bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
483bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint32 loc_ioctl
484bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo(
485bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      rpc_loc_client_handle_type           handle,
486bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      rpc_loc_ioctl_e_type                 ioctl_type,
487bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      rpc_loc_ioctl_data_u_type*           ioctl_data
488bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo)
489bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
490bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ENTRY_LOG();
491bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    LOC_GLUE_CHECK_INIT(int32);
492bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
493bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int32 ret_val;
494bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
495bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    rpc_loc_ioctl_args args;
496bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    args.handle = handle;
497bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    args.ioctl_data = ioctl_data;
498bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    args.ioctl_type = ioctl_type;
499bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if (ioctl_data != NULL)
500bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    {
501bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        /* Assign ioctl union discriminator */
502bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        ioctl_data->disc = ioctl_type;
503bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
504bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        /* In case the user hasn't filled in other disc fields,
505bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo           automatically fill them in here */
506bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        switch (ioctl_type)
507bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        {
508bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        case RPC_LOC_IOCTL_GET_API_VERSION:
509bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            break;
510bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        case RPC_LOC_IOCTL_SET_FIX_CRITERIA:
511bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            break;
512bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        case RPC_LOC_IOCTL_GET_FIX_CRITERIA:
513bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            break;
514bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        case RPC_LOC_IOCTL_INFORM_NI_USER_RESPONSE:
515bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            break;
516bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        case RPC_LOC_IOCTL_INJECT_PREDICTED_ORBITS_DATA:
517bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            break;
518bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        case RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_VALIDITY:
519bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            break;
520bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        case RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE:
521bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            break;
522bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        case RPC_LOC_IOCTL_SET_PREDICTED_ORBITS_DATA_AUTO_DOWNLOAD:
523bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            break;
524bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        case RPC_LOC_IOCTL_INJECT_UTC_TIME:
525bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            break;
526bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        case RPC_LOC_IOCTL_INJECT_RTC_VALUE:
527bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            break;
528bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        case RPC_LOC_IOCTL_INJECT_POSITION:
529bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            break;
530bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        case RPC_LOC_IOCTL_QUERY_ENGINE_STATE:
531bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            break;
532bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        case RPC_LOC_IOCTL_INFORM_SERVER_OPEN_STATUS:
533bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            break;
534bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        case RPC_LOC_IOCTL_INFORM_SERVER_CLOSE_STATUS:
535bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            break;
536bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        case RPC_LOC_IOCTL_SET_ENGINE_LOCK:
537bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            break;
538bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        case RPC_LOC_IOCTL_GET_ENGINE_LOCK:
539bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            break;
540bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        case RPC_LOC_IOCTL_SET_SBAS_CONFIG:
541bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            break;
542bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        case RPC_LOC_IOCTL_GET_SBAS_CONFIG:
543bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            break;
544bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        case RPC_LOC_IOCTL_SET_NMEA_TYPES:
545bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            break;
546bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        case RPC_LOC_IOCTL_GET_NMEA_TYPES:
547bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            break;
548bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        case RPC_LOC_IOCTL_SET_CDMA_PDE_SERVER_ADDR:
549bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        case RPC_LOC_IOCTL_SET_CDMA_MPC_SERVER_ADDR:
550bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        case RPC_LOC_IOCTL_SET_UMTS_SLP_SERVER_ADDR:
551bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        case RPC_LOC_IOCTL_SET_CUSTOM_PDE_SERVER_ADDR:
552bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            args.ioctl_data->rpc_loc_ioctl_data_u_type_u.server_addr.addr_info.disc =
553bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                args.ioctl_data->rpc_loc_ioctl_data_u_type_u.server_addr.addr_type;
554bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            break;
555bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        case RPC_LOC_IOCTL_GET_CDMA_PDE_SERVER_ADDR:
556bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        case RPC_LOC_IOCTL_GET_CDMA_MPC_SERVER_ADDR:
557bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        case RPC_LOC_IOCTL_GET_UMTS_SLP_SERVER_ADDR:
558bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        case RPC_LOC_IOCTL_GET_CUSTOM_PDE_SERVER_ADDR:
559bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            break;
560bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        case RPC_LOC_IOCTL_SET_ON_DEMAND_LPM:
561bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            break;
562bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        case RPC_LOC_IOCTL_GET_ON_DEMAND_LPM:
563bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            break;
564bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        case RPC_LOC_IOCTL_DELETE_ASSIST_DATA:
565bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            break;
566bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        default:
567bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo            break;
568bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        } /* switch */
569bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    } /* ioctl_data != NULL */
570bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
571bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    rpc_loc_ioctl_rets rets;
572bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    enum clnt_stat stat = RPC_SUCCESS;
573bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
574bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    EXIT_LOG_CALLFLOW(%s, loc_get_ioctl_type_name(ioctl_type));
575bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    stat = RPC_FUNC_VERSION(rpc_loc_ioctl_, RPC_LOC_IOCTL_VERSION)(&args, &rets, loc_api_clnt);
576bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    LOC_GLUE_CHECK_RESULT(stat, int32);
577bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
578bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ret_val = (int32) rets.loc_ioctl_result;
579bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
580bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return ret_val;
581bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
582bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
583bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Returns 0 if error */
584bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint32 loc_api_null(void)
585bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
586bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    LOC_GLUE_CHECK_INIT(int32);
587bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
588bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int32 rets;
589bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    enum clnt_stat stat = RPC_SUCCESS;
590bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
591bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    clnt_unregister_reset_notification_cb(loc_api_clnt);
592bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    stat = RPC_FUNC_VERSION(rpc_loc_api_null_, RPC_LOC_API_NULL_VERSION)(NULL, &rets, loc_api_clnt);
593bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    LOC_GLUE_CHECK_RESULT(stat, int32);
594bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
595bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return (int32) rets;
596bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
597bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
598bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
599bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
600bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION    loc_eng_ioctl
601bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
602bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
603bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   This function calls loc_ioctl and waits for the callback result before
604bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   returning back to the user.
605bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
606bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES
607bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   N/A
608bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
609bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
610bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   TRUE                 if successful
611bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   FALSE                if failed
612bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
613bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS
614bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   N/A
615bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
616bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
617bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint loc_eng_ioctl
618bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo(
619bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      rpc_loc_client_handle_type           handle,
620bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      rpc_loc_ioctl_e_type                 ioctl_type,
621bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      rpc_loc_ioctl_data_u_type*           ioctl_data_ptr,
622bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      uint32                               timeout_msec,
623bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo      rpc_loc_ioctl_callback_s_type       *cb_data_ptr
624bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo)
625bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
626bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int ret_val = RPC_LOC_API_SUCCESS;
627bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
628bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    ret_val = loc_api_sync_ioctl(handle, ioctl_type, ioctl_data_ptr, timeout_msec, cb_data_ptr);
629bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
630bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    LOC_LOGD("loc_eng_ioctl result: client = %d, ioctl_type = %s, returt %s\n",
631bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo             (int32) handle,
632bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo             loc_get_ioctl_type_name(ioctl_type),
633bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo             loc_get_ioctl_status_name(ret_val) );
634bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
635bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return ret_val;
636bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
637