Initialize apiStatus field in all NameServer devctl calls
[ipc/ipcdev.git] / qnx / src / ipc3x_dev / ti / syslink / utils / hlos / knl / Qnx / Nameserver_devctl.c
1 /*
2  *  @file   Nameserver_devctl.c
3  *
4  *  @brief      OS-specific implementation of NameServer driver for Qnx
5  *
6  *
7  *  ============================================================================
8  *
9  *  Copyright (c) 2008-2015, Texas Instruments Incorporated
10  *
11  *  Redistribution and use in source and binary forms, with or without
12  *  modification, are permitted provided that the following conditions
13  *  are met:
14  *
15  *  *  Redistributions of source code must retain the above copyright
16  *     notice, this list of conditions and the following disclaimer.
17  *
18  *  *  Redistributions in binary form must reproduce the above copyright
19  *     notice, this list of conditions and the following disclaimer in the
20  *     documentation and/or other materials provided with the distribution.
21  *
22  *  *  Neither the name of Texas Instruments Incorporated nor the names of
23  *     its contributors may be used to endorse or promote products derived
24  *     from this software without specific prior written permission.
25  *
26  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
27  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
28  *  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29  *  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
30  *  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31  *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32  *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
33  *  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
34  *  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
35  *  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
36  *  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37  *  Contact information for paper mail:
38  *  Texas Instruments
39  *  Post Office Box 655303
40  *  Dallas, Texas 75265
41  *  Contact information:
42  *  http://www-k.ext.ti.com/sc/technical-support/product-information-centers.htm?
43  *  DCMP=TIHomeTracking&HQS=Other+OT+home_d_contact
44  *  ============================================================================
45  *
46  */
48 /* Standard headers */
49 #include <ti/syslink/Std.h>
51 /* OSAL & Utils headers */
52 #include <ti/syslink/utils/List.h>
53 #include <ti/syslink/utils/Trace.h>
54 #include <ti/syslink/utils/Memory.h>
56 /* QNX specific header include */
57 #include <ti/syslink/build/Qnx/resmgr/proto.h>
58 #include <ti/syslink/build/Qnx/resmgr/dcmd_syslink.h>
60 /* Module specific header files */
61 #include <ti/ipc/NameServer.h>
62 #include <ti/syslink/inc/NameServerDrvDefs.h>
64 /* Function prototypes */
65 int ipc_nameserver_add(resmgr_context_t *ctp, io_devctl_t *msg,
66     ipc_ocb_t *ocb);
67 int ipc_nameserver_get(resmgr_context_t *ctp, io_devctl_t *msg,
68     ipc_ocb_t *ocb);
69 int ipc_nameserver_adduint32(resmgr_context_t *ctp, io_devctl_t *msg,
70     ipc_ocb_t *ocb);
71 int ipc_nameserver_getuint32(resmgr_context_t *ctp, io_devctl_t *msg,
72     ipc_ocb_t *ocb);
73 int ipc_nameserver_remove(resmgr_context_t *ctp, io_devctl_t *msg,
74     ipc_ocb_t *ocb);
75 int ipc_nameserver_removeentry(resmgr_context_t *ctp, io_devctl_t *msg,
76     ipc_ocb_t *ocb);
77 int ipc_nameserver_params_init(resmgr_context_t *ctp, io_devctl_t *msg,
78     ipc_ocb_t *ocb);
79 int ipc_nameserver_create(resmgr_context_t *ctp, io_devctl_t *msg,
80     ipc_ocb_t *ocb);
81 int ipc_nameserver_delete(resmgr_context_t *ctp, io_devctl_t *msg,
82     ipc_ocb_t *ocb);
83 int ipc_nameserver_setup(resmgr_context_t *ctp, io_devctl_t *msg,
84     ipc_ocb_t *ocb);
85 int ipc_nameserver_destroy(resmgr_context_t *ctp, io_devctl_t *msg,
86     ipc_ocb_t *ocb);
88 /**
89  * Handler for devctl() messages for MultiProc module.
90  *
91  * Handles special devctl() messages that we export for control.
92  *
93  * \param ctp   Thread's associated context information.
94  * \param msg   The actual devctl() message.
95  * \param ocb   OCB associated with client's session.
96  *
97  * \return POSIX errno value.
98  *
99  * \retval EOK      Success.
100  * \retval ENOTSUP  Unsupported devctl().
101  */
102 int ipc_nameserver_devctl(resmgr_context_t *ctp, io_devctl_t *msg,
103     ipc_ocb_t *ocb)
106     switch (msg->i.dcmd)
107     {
108       case DCMD_NAMESERVER_ADD:
109       {
110           return ipc_nameserver_add( ctp, msg, ocb);
111       }
112       break;
114       case DCMD_NAMESERVER_GET:
115       {
116           return ipc_nameserver_get( ctp, msg, ocb);
117       }
118       break;
119       case DCMD_NAMESERVER_ADDUINT32:
120       {
121           return ipc_nameserver_adduint32( ctp, msg, ocb);
122       }
123       break;
125       case DCMD_NAMESERVER_GETUINT32:
126       {
127           return ipc_nameserver_getuint32( ctp, msg, ocb);
128       }
129       break;
131       case DCMD_NAMESERVER_REMOVE:
132       {
133           return ipc_nameserver_remove( ctp, msg, ocb);
134       }
135       break;
137       case DCMD_NAMESERVER_REMOVEENTRY:
138       {
139           return ipc_nameserver_removeentry( ctp, msg, ocb);
140       }
141       break;
143       case DCMD_NAMESERVER_PARAMS_INIT:
144       {
145           return ipc_nameserver_params_init( ctp, msg, ocb);
146       }
147       break;
149       case DCMD_NAMESERVER_CREATE:
150       {
151           return ipc_nameserver_create( ctp, msg, ocb);
152       }
153       break;
155       case DCMD_NAMESERVER_DELETE:
156       {
157           return ipc_nameserver_delete( ctp, msg, ocb);
158       }
159       break;
161       case DCMD_NAMESERVER_SETUP:
162       {
163           return ipc_nameserver_setup( ctp, msg, ocb);
164       }
165       break;
167       case DCMD_NAMESERVER_DESTROY:
168       {
169           return ipc_nameserver_destroy( ctp, msg, ocb);
170       }
171       break;
173       default:
174           fprintf( stderr, "Invalid DEVCTL for nameserver 0x%x\n", msg->i.dcmd);
175           break;
177     }
179     return (_RESMGR_PTR (ctp, &msg->o, sizeof(msg->o) +
180         sizeof(NameServerDrv_CmdArgs)));
183 /**
184  * Handler for nameserver add API.
185  *
186  * \param ctp   Thread's associated context information.
187  * \param msg   The actual devctl() message.
188  * \param ocb   OCB associated with client's session.
189  *
190  * \return POSIX errno value.
191  *
192  * \retval EOK      Success.
193  * \retval ENOTSUP  Unsupported devctl().
194  */
195 int ipc_nameserver_add(resmgr_context_t *ctp, io_devctl_t *msg,
196     ipc_ocb_t *ocb)
198     NameServerDrv_CmdArgs *     cargs = (NameServerDrv_CmdArgs *)
199         (_DEVCTL_DATA (msg->i));
200     NameServerDrv_CmdArgs *     out  = (NameServerDrv_CmdArgs *)
201         (_DEVCTL_DATA (msg->o));
202     String name = (String)(cargs+1);
203     Ptr buf = (Ptr)((sizeof(char) * cargs->args.add.nameLen) + (char *)(name));
204     Ptr entry;
206     GT_assert (curTrace, (name != NULL));
208     entry = NameServer_add(cargs->args.add.handle,
209                            name,
210                            buf,
211                            cargs->args.add.len);
212     GT_assert (curTrace, (entry != NULL));
214     out->args.add.entry = entry;
215     if (entry) {
216         out->apiStatus = NameServer_S_SUCCESS;
217     }
218     else {
219         out->apiStatus = NameServer_E_FAIL;
220     }
222     return (_RESMGR_PTR (ctp, &msg->o, sizeof(msg->o) +
223         sizeof(NameServerDrv_CmdArgs)));
226 /**
227  * Handler for nameserver get  API.
228  *
229  * \param ctp   Thread's associated context information.
230  * \param msg   The actual devctl() message.
231  * \param ocb   OCB associated with client's session.
232  *
233  * \return POSIX errno value.
234  *
235  * \retval EOK      Success.
236  * \retval ENOTSUP  Unsupported devctl().
237  */
238 int ipc_nameserver_get(resmgr_context_t *ctp, io_devctl_t *msg,
239     ipc_ocb_t *ocb)
241     NameServerDrv_CmdArgs *     cargs = (NameServerDrv_CmdArgs *)
242         (_DEVCTL_DATA (msg->i));
243     NameServerDrv_CmdArgs *     out  = (NameServerDrv_CmdArgs *)
244         (_DEVCTL_DATA (msg->o));
246     char * buf = (char *)(cargs + 1);
247     char * name  = (char *)(buf + (sizeof(char) * cargs->args.get.len));
248     UInt16 * procId = NULL;
250     if (cargs->args.get.procLen > 0) {
251         procId = (UInt16 *)(name + (sizeof(char) * cargs->args.get.nameLen));
252     }
254     out->apiStatus = NameServer_get(cargs->args.get.handle,
255                              (String)name,
256                              (Ptr)buf,
257                              &cargs->args.get.len,
258                              procId);
260     SETIOV(&ctp->iov[0], &msg->o, sizeof(msg->o) +
261         sizeof(NameServerDrv_CmdArgs));
262     SETIOV(&ctp->iov[1], (Ptr)buf, cargs->args.get.len);
264     return _RESMGR_NPARTS(2);
267 /**
268  * Handler for nameserver addunit32 API.
269  *
270  * \param ctp   Thread's associated context information.
271  * \param msg   The actual devctl() message.
272  * \param ocb   OCB associated with client's session.
273  *
274  * \return POSIX errno value.
275  *
276  * \retval EOK      Success.
277  * \retval ENOTSUP  Unsupported devctl().
278  */
279 int ipc_nameserver_adduint32(resmgr_context_t *ctp, io_devctl_t *msg,
280     ipc_ocb_t *ocb)
282     NameServerDrv_CmdArgs *     cargs = (NameServerDrv_CmdArgs *)
283         (_DEVCTL_DATA (msg->i));
284     NameServerDrv_CmdArgs *     out  = (NameServerDrv_CmdArgs *)
285         (_DEVCTL_DATA (msg->o));
286     String name = (String)(cargs+1);
288     Ptr    entry;
290     GT_assert (curTrace, (name != NULL));
292     entry = NameServer_addUInt32 (cargs->args.addUInt32.handle,
293                                   name,
294                                   cargs->args.addUInt32.value);
295     GT_assert (curTrace, (entry != NULL));
297     out->args.addUInt32.entry = entry;
298     if (entry) {
299         out->apiStatus = NameServer_S_SUCCESS;
300     }
301     else {
302         out->apiStatus = NameServer_E_FAIL;
303     }
305     return (_RESMGR_PTR (ctp, &msg->o, sizeof(msg->o) +
306         sizeof(NameServerDrv_CmdArgs)));
309 /**
310  * Handler for nameserver get  API.
311  *
312  * \param ctp   Thread's associated context information.
313  * \param msg   The actual devctl() message.
314  * \param ocb   OCB associated with client's session.
315  *
316  * \return POSIX errno value.
317  *
318  * \retval EOK      Success.
319  * \retval ENOTSUP  Unsupported devctl().
320  */
321 int ipc_nameserver_getuint32(resmgr_context_t *ctp, io_devctl_t *msg,
322     ipc_ocb_t *ocb)
324     UInt32                      value;
325     NameServerDrv_CmdArgs *     cargs = (NameServerDrv_CmdArgs *)
326         (_DEVCTL_DATA (msg->i));
327     NameServerDrv_CmdArgs *     out  = (NameServerDrv_CmdArgs *)
328         (_DEVCTL_DATA (msg->o));
330     char * name  = (char *)(cargs + 1);
331     UInt16 * procId = NULL;
334     if (cargs->args.getUInt32.procId[0] != (UInt16)-1) {
335         procId = (UInt16 *)(name + (sizeof(char) * strlen(name)));
336     }
338     out->apiStatus = NameServer_getUInt32 (cargs->args.getUInt32.handle,
339                              (String)name,
340                              (Ptr)&value,
341                              procId);
343     out->args.getUInt32.value = value;
345     /* Do not assert. This can return NameServer_E_NOTFOUND
346      * as a valid runtime failure.
347      */
349     return (_RESMGR_PTR (ctp, &msg->o, sizeof(msg->o) +
350         sizeof(NameServerDrv_CmdArgs)));
353 /**
354  * Handler for nameserver remove API.
355  *
356  * \param ctp   Thread's associated context information.
357  * \param msg   The actual devctl() message.
358  * \param ocb   OCB associated with client's session.
359  *
360  * \return POSIX errno value.
361  *
362  * \retval EOK      Success.
363  * \retval ENOTSUP  Unsupported devctl().
364  */
365 int ipc_nameserver_remove(resmgr_context_t *ctp, io_devctl_t *msg,
366     ipc_ocb_t *ocb)
368     NameServerDrv_CmdArgs * cargs = (NameServerDrv_CmdArgs *)
369         (_DEVCTL_DATA (msg->i));
370     NameServerDrv_CmdArgs *     out  = (NameServerDrv_CmdArgs *) (_DEVCTL_DATA (msg->o));
371     String name = (String)(cargs+1);
373     out->apiStatus = NameServer_remove (cargs->args.remove.handle, name);
375     return (_RESMGR_PTR (ctp, &msg->o, sizeof(msg->o) +
376         sizeof(NameServerDrv_CmdArgs)));
379 /**
380  * Handler for nameserver remove entry API.
381  *
382  * \param ctp   Thread's associated context information.
383  * \param msg   The actual devctl() message.
384  * \param ocb   OCB associated with client's session.
385  *
386  * \return POSIX errno value.
387  *
388  * \retval EOK      Success.
389  * \retval ENOTSUP  Unsupported devctl().
390  */
391 int ipc_nameserver_removeentry(resmgr_context_t *ctp, io_devctl_t *msg,
392     ipc_ocb_t *ocb)
394     NameServerDrv_CmdArgs *     cargs = (NameServerDrv_CmdArgs *)
395         (_DEVCTL_DATA (msg->i));
396     NameServerDrv_CmdArgs *     out  = (NameServerDrv_CmdArgs *)
397         (_DEVCTL_DATA (msg->o));
399     out->apiStatus = NameServer_removeEntry (cargs->args.removeEntry.handle,
400                                     cargs->args.removeEntry.entry);
402     return (_RESMGR_PTR (ctp, &msg->o, sizeof(msg->o) +
403         sizeof(NameServerDrv_CmdArgs)));
406 /**
407  * Handler for nameserver params init API.
408  *
409  * \param ctp   Thread's associated context information.
410  * \param msg   The actual devctl() message.
411  * \param ocb   OCB associated with client's session.
412  *
413  * \return POSIX errno value.
414  *
415  * \retval EOK      Success.
416  * \retval ENOTSUP  Unsupported devctl().
417  */
418 int ipc_nameserver_params_init(resmgr_context_t *ctp, io_devctl_t *msg,
419     ipc_ocb_t *ocb)
421     NameServerDrv_CmdArgs *     cargs = (NameServerDrv_CmdArgs *)
422         (_DEVCTL_DATA (msg->i));
423     NameServerDrv_CmdArgs *     out  = (NameServerDrv_CmdArgs *)
424         (_DEVCTL_DATA (msg->o));
426     NameServer_Params *params = (NameServer_Params *)(cargs+1);
428     NameServer_Params_init (params);
430     SETIOV(&ctp->iov[0], &msg->o, sizeof(msg->o) +
431         sizeof(NameServerDrv_CmdArgs));
432     SETIOV(&ctp->iov[1], params, sizeof(NameServer_Params));
434     out->apiStatus = NameServer_S_SUCCESS;
436     return _RESMGR_NPARTS(2);
439 /**
440  * Handler for nameserver create API.
441  *
442  * \param ctp   Thread's associated context information.
443  * \param msg   The actual devctl() message.
444  * \param ocb   OCB associated with client's session.
445  *
446  * \return POSIX errno value.
447  *
448  * \retval EOK      Success.
449  * \retval ENOTSUP  Unsupported devctl().
450  */
451 int ipc_nameserver_create(resmgr_context_t *ctp, io_devctl_t *msg,
452     ipc_ocb_t *ocb)
454     NameServerDrv_CmdArgs *     cargs = (NameServerDrv_CmdArgs *)
455         (_DEVCTL_DATA (msg->i));
456     NameServerDrv_CmdArgs *     out  = (NameServerDrv_CmdArgs *)
457         (_DEVCTL_DATA (msg->o));
458     NameServer_Params *         params = (NameServer_Params *)(cargs+1);
459     String name = (String)(params+1);
461     out->args.create.handle = NameServer_create (name, params);
462     if (out->args.create.handle) {
463         out->apiStatus = NameServer_S_SUCCESS;
464     }
465     else {
466         out->apiStatus = NameServer_E_FAIL;
467     }
469     GT_assert (curTrace, (out->args.create.handle != NULL));
471     return (_RESMGR_PTR (ctp, &msg->o, sizeof(msg->o) +
472         sizeof(NameServerDrv_CmdArgs)));
475 /**
476  * Handler for nameserver delete API.
477  *
478  * \param ctp   Thread's associated context information.
479  * \param msg   The actual devctl() message.
480  * \param ocb   OCB associated with client's session.
481  *
482  * \return POSIX errno value.
483  *
484  * \retval EOK      Success.
485  * \retval ENOTSUP  Unsupported devctl().
486  */
487 int ipc_nameserver_delete(resmgr_context_t *ctp, io_devctl_t *msg,
488     ipc_ocb_t *ocb)
490     NameServerDrv_CmdArgs * cargs = (NameServerDrv_CmdArgs *)
491         (_DEVCTL_DATA (msg->i));
492     NameServerDrv_CmdArgs * out  = (NameServerDrv_CmdArgs *)
493         (_DEVCTL_DATA (msg->o));
495     out->apiStatus = NameServer_delete (&(cargs->args.delete.handle));
496     GT_assert (curTrace, (out->apiStatus >= 0));
498     return (_RESMGR_PTR (ctp, &msg->o, sizeof(msg->o) +
499         sizeof(NameServerDrv_CmdArgs)));
502 /**
503  * Handler for nameserver setup  API.
504  *
505  * \param ctp   Thread's associated context information.
506  * \param msg   The actual devctl() message.
507  * \param ocb   OCB associated with client's session.
508  *
509  * \return POSIX errno value.
510  *
511  * \retval EOK      Success.
512  * \retval ENOTSUP  Unsupported devctl().
513  */
514 int ipc_nameserver_setup(resmgr_context_t *ctp, io_devctl_t *msg,
515     ipc_ocb_t *ocb)
517     NameServerDrv_CmdArgs * out  = (NameServerDrv_CmdArgs *)
518         (_DEVCTL_DATA (msg->o));
520     out->apiStatus = NameServer_setup ();
521     GT_assert (curTrace, (out->apiStatus >= 0));
523     return (_RESMGR_PTR (ctp, &msg->o, sizeof(msg->o) +
524         sizeof(NameServerDrv_CmdArgs)));
527 /**
528  * Handler for nameserver destroy API.
529  *
530  * \param ctp   Thread's associated context information.
531  * \param msg   The actual devctl() message.
532  * \param ocb   OCB associated with client's session.
533  *
534  * \return POSIX errno value.
535  *
536  * \retval EOK      Success.
537  * \retval ENOTSUP  Unsupported devctl().
538  */
539 int ipc_nameserver_destroy(resmgr_context_t *ctp, io_devctl_t *msg,
540     ipc_ocb_t *ocb)
542     NameServerDrv_CmdArgs * out  = (NameServerDrv_CmdArgs *)
543         (_DEVCTL_DATA (msg->o));
545     out->apiStatus = NameServer_destroy ();
546     GT_assert (curTrace, (out->apiStatus >= 0));
548     return (_RESMGR_PTR (ctp, &msg->o, sizeof(msg->o) +
549         sizeof(NameServerDrv_CmdArgs)));