botsense  3.2.0
RoadNarrows Client-Server Proxied Services Framework
bsNullServer.c
Go to the documentation of this file.
1 ////////////////////////////////////////////////////////////////////////////////
2 //
3 // Package: BotSense
4 // Module: bsNull
5 // Library: libbsserver_null
6 // File: bsNullServer.c
7 //
8 /*! \file
9  *
10  * $LastChangedDate: 2010-09-13 10:25:05 -0600 (Mon, 13 Sep 2010) $
11  * $Rev: 581 $
12  *
13  * \brief \h_botsense bsProxy server plug-in DLL /dev/null device module.
14  *
15  * \author Robin Knight (robin.knight@roadnarrows.com)
16  *
17  * \copyright
18  * \h_copy 2010-2017. RoadNarrows LLC.\n
19  * http://www.roadnarrows.com\n
20  * All Rights Reserved
21  */
22 // Permission is hereby granted, without written agreement and without
23 // license or royalty fees, to use, copy, modify, and distribute this
24 // software and its documentation for any purpose, provided that
25 // (1) The above copyright notice and the following two paragraphs
26 // appear in all copies of the source code and (2) redistributions
27 // including binaries reproduces these notices in the supporting
28 // documentation. Substantial modifications to this software may be
29 // copyrighted by their authors and need not follow the licensing terms
30 // described here, provided that the new terms are clearly indicated in
31 // all files where they apply.
32 //
33 // IN NO EVENT SHALL THE AUTHOR, ROADNARROWS LLC, OR ANY MEMBERS/EMPLOYEES
34 // OF ROADNARROW LLC OR DISTRIBUTORS OF THIS SOFTWARE BE LIABLE TO ANY
35 // PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
36 // DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION,
37 // EVEN IF THE AUTHORS OR ANY OF THE ABOVE PARTIES HAVE BEEN ADVISED OF
38 // THE POSSIBILITY OF SUCH DAMAGE.
39 //
40 // THE AUTHOR AND ROADNARROWS LLC SPECIFICALLY DISCLAIM ANY WARRANTIES,
41 // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
42 // FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN
43 // "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO
44 // PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
45 //
46 ////////////////////////////////////////////////////////////////////////////////
47 
48 #include <sys/types.h>
49 #include <sys/stat.h>
50 #include <fcntl.h>
51 #include <unistd.h>
52 #include <stdio.h>
53 #include <string.h>
54 #include <errno.h>
55 
56 #include "rnr/rnrconfig.h"
57 #include "rnr/log.h"
58 #include "rnr/new.h"
59 #include "rnr/netmsgs.h"
60 
61 #include "botsense/BotSense.h"
62 #include "botsense/libBotSense.h"
63 #include "botsense/bsProxyModIF.h"
64 #include "botsense/bsNull.h"
65 #include "botsense/bsNullMsgs.h"
66 
67 
68 // ---------------------------------------------------------------------------
69 // Private Interface
70 // ---------------------------------------------------------------------------
71 
72 /*!
73  * \brief Module static information.
74  */
76 {
78  .brief = "The /dev/null proxied device.",
79  .version = "1.0.0",
80  .date = "2010.07.21",
81  .maintainer = "RaodNarrows LLC",
82  .license = "(C) 2010 RoadNarrows LLC. All rights reserved."
83 };
84 
85 
86 /*!
87  * \ingroup bsmod_null_srv
88  * \defgroup bsmod_null_srv_tunes Default Tunables
89  *
90  * \h_botsense DevNull Interface Module Tunables
91  *
92  * \note These can be overriden in the configuration XML file.
93  *
94  * \{
95  */
96 
97 /*!
98  * \brief Maximum number of module supported simultaneous virtual connections.
99  */
100 #define BSMOD_MAX_HANDLES BSPROXY_VCONN_MOD_NUMOF
101 
102 /*! \} */
103 
104 /*!
105  * \brief Module resource control block structure type.
106  */
107 typedef struct
108 {
109  int m_fd; ///< /dev/null open file descriptor
110  bool_t m_bTrace; ///< do [not] trace messages
111 } BsModCtlBlk_T;
112 
113 static const char *BsModUri; ///< module canonical name
114 static const BsModProxyCb_T *BsModCallbacks; ///< module to bsProxy callbacks
115 static BsModRsrcTbl_T *BsModRsrcTbl; ///< module resource table
116 
117 /*!
118  * \brief Allocate a new resource control block.
119  *
120  * \param fd File descriptor.
121  * \param bTrace Do [not] trace messages.
122  *
123  * \return Pointer to new allocated control block.
124  */
125 static BsModCtlBlk_T *bsModCtlBlkNew(int fd, bool_t bTrace)
126 {
127  BsModCtlBlk_T *pCtlBlk;
128 
129  pCtlBlk = NEW(BsModCtlBlk_T);
130 
131  pCtlBlk->m_fd = fd;
132  pCtlBlk->m_bTrace = bTrace;
133 
134  return pCtlBlk;
135 }
136 
137 /*!
138  * \brief Delete an allocated resource control block.
139  *
140  * \param pCtlBlk Pointer to allocated control block.
141  */
142 static void bsModCtlBlkDelete(BsModCtlBlk_T *pCtlBlk)
143 {
144  if( pCtlBlk != NULL )
145  {
146  delete(pCtlBlk);
147  }
148 }
149 
150 /*!
151  * \brief Service a /dev/null write request.
152  *
153  * \note A module-specific request service must send a response.
154  *
155  * \param hndVConn Virtual connection handle.
156  * \param uTid Request-Response transaction id.
157  * \param uMsgIdReq Request message id.
158  * \param bufReq Packed request message buffer.
159  * \param uReqLen Size of request in buffer (number of bytes).
160  *
161  * \copydoc doc_return_std
162  */
163 static int bsModNullReqWrite(BsVConnHnd_T hndVConn,
164  BsTid_T uTid,
165  BsMsgId_T uMsgIdReq,
166  byte_t bufReq[],
167  size_t uReqLen)
168 {
169  static BsNullMsgId_T uMsgIdRsp = BsNullMsgIdRspWrite;
170 
171  BsModCtlBlk_T *pCtlBlk; // resource control block
172  BsNullReqWrite_T msgReq; // request message
173  BsNullRspWrite_T msgRsp; // response message
174  byte_t bufRsp[BSPROXY_MSG_MAX_LEN]; // req/rsp buffer
175  int n; // number of bytes/return code
176 
177  //
178  // Parameter checks
179  //
180  if( !BSMOD_IS_VCONN_HANDLE(hndVConn) )
181  {
182  BSMOD_SEND_ERROR_RSP(BsModCallbacks, hndVConn, uTid, BS_ECODE_BAD_VCONN_HND,
183  "Module vconn handle out-of-range.");
184  return -BS_ECODE_BAD_VCONN_HND; \
185  }
186 
187  // retrieve the resource control block
188  pCtlBlk = (BsModCtlBlk_T *)BSMOD_RSRC(BsModRsrcTbl, hndVConn);
189 
190  if( pCtlBlk == NULL )
191  {
192  BSMOD_SEND_ERROR_RSP(BsModCallbacks, hndVConn, uTid, BS_ECODE_NO_VCONN,
193  "No resources for virtual connection found.");
194  return -BS_ECODE_NO_VCONN;
195  }
196 
197  //
198  // Unpack client request.
199  //
200  n = BsNullUnpackReqWrite(bufReq, uReqLen, &msgReq, pCtlBlk->m_bTrace);
201 
202  // check unpacking return code
203  if( n < 0 )
204  {
205  BSMOD_SEND_NMERROR_RSP(BsModCallbacks, hndVConn, uTid, n,
206  "MsgId=%u", uMsgIdReq);
207  return -BS_ECODE_BAD_MSG;
208  }
209 
210  //
211  // Execute client request.
212  //
213  n = write(pCtlBlk->m_fd, msgReq.m_writebuf.u.m_buf,
214  (size_t)msgReq.m_writebuf.m_count);
215 
216  // check operation return code
217  if( n < 0 )
218  {
219  BSMOD_SEND_SYSERROR_RSP(BsModCallbacks, hndVConn, uTid,
220  "write(fd=%d, ...).", pCtlBlk->m_fd);
221  return -BS_ECODE_SYS;
222  }
223 
224  LOGDIAG3("VConn=%d: %d=write(fd=%d, buf=%p, count=%zu).",
225  hndVConn, n, pCtlBlk->m_fd, msgReq.m_writebuf.u.m_buf,
226  (size_t)msgReq.m_writebuf.m_count);
227 
228  //
229  // Pack server response.
230  //
231  msgRsp.m_byteswritten = (byte_t)n;
232 
233  // pack
234  n = BsNullPackRspWrite(&msgRsp, BSPROXY_BUF_BODY(bufRsp), pCtlBlk->m_bTrace);
235 
236  // check packing return code
237  if( n < 0 )
238  {
239  BSMOD_SEND_NMERROR_RSP(BsModCallbacks, hndVConn, uTid, n,
240  "MsgId=%u", uMsgIdRsp);
241  return -BS_ECODE_BAD_MSG;
242  }
243 
244  //
245  // Send response.
246  //
247  BsModCallbacks->m_cbSendRsp(hndVConn, uTid, uMsgIdRsp, bufRsp, (size_t)n);
248 
249  return BS_OK;
250 }
251 
252 
253 // ---------------------------------------------------------------------------
254 // Exported Interface
255 // ---------------------------------------------------------------------------
256 
257 /*!
258  * \brief Initialize /dev/null module.
259  *
260  * Called once after module is loaded.
261  *
262  * \param sModUri Expanded, canonical module path name.
263  * \param pCallbacks Pointer to a set of module -> bsProxy core callback
264  * functions.
265  *
266  * \copydoc doc_return_std
267  */
268 int bsModInit(const char *sModUri, const BsModProxyCb_T *pCallbacks)
269 {
270  BsModUri = new_strdup(sModUri);
271 
272  // save bsProxy server callbacks
273  BsModCallbacks = pCallbacks;
274 
275  // create module resource table
276  BsModRsrcTbl = BsModCallbacks->m_cbModRsrcTblNew(BSMOD_MAX_HANDLES);
277 
278  return BS_OK;
279 }
280 
281 /*!
282  * \brief Exit /dev/null module.
283  *
284  * Called once prior to module being unloaded.
285  *
286  * All open /dev/null devices will be closed.
287  */
288 void bsModExit()
289 {
290  int index;
291  BsModCtlBlk_T *pCtlBlk;
292 
293  // free all module virtual connnection resources.
294  for(index=0; index<BSMOD_MAX_HANDLES; ++index)
295  {
296  if( (pCtlBlk = (BsModCtlBlk_T *)BsModRsrcTbl->m_vecRsrc[index]) != NULL )
297  {
298  if( pCtlBlk->m_fd >= 0 )
299  {
300  close(pCtlBlk->m_fd);
301  }
302  bsModCtlBlkDelete(pCtlBlk);
303  }
304  }
305 
306  // free resource table
307  BsModCallbacks->m_cbModRsrcTblDelete(BsModRsrcTbl);
308 
309  delete((char *)BsModUri);
310 }
311 
312 /*!
313  * \brief Open an /dev/null device and associate with the given handle.
314  *
315  * Subsequent calls to the module use the given handle to associate the
316  * specific module-device instance.
317  *
318  * The argument buffer contains packed message arguements specific to the
319  * device and module. For this /dev/null module, there are now additional
320  * arguments.
321  *
322  * \note
323  * It is the responsibile of the client to ensure consistency if more than
324  * one virtual connection is established.
325  *
326  * \param hndVConn Virtual connection handle.
327  * \param bTrace Do [not] enable message tracing on this handle.
328  * \param sDevUri Device URI.
329  * \param argbuf Packed specific open configuration arguments submessage.
330  * \param uArgSize Size of packed argumets in buffer (number of bytes).
331  *
332  * \return
333  * On success, returns a unique resource descriptor \h_ge 0 which is typically
334  * an opened file descriptor or socket descriptor, but can be module defined.\n
335  * \copydoc doc_return_ecode
336  */
337 int bsModOpen(BsVConnHnd_T hndVConn,
338  bool_t bTrace,
339  const char *sDevUri,
340  byte_t argbuf[],
341  size_t uArgSize)
342 {
343  BsModCtlBlk_T *pCtlBlk;
344  int fd;
345 
346  // Check if handle is in valid range.
347  BSMOD_TRY_VCONN_HND_RANGE(hndVConn);
348 
349  // Check if resources are available.
350  if( BSMOD_RSRC_INUSE_COUNT(BsModRsrcTbl) >= BSMOD_MAX_HANDLES )
351  {
353  "InUseCount=%u: No more resources available.",
354  BSMOD_RSRC_INUSE_COUNT(BsModRsrcTbl));
355  return -BS_ECODE_NO_RSRC;
356  }
357 
358  // Check if the handle in this module's resource table is not already in-use.
359  else if( BSMOD_RSRC_IS_INUSE(BsModRsrcTbl, hndVConn) )
360  {
361  BSMOD_LOG_ERROR(hndVConn, BS_ECODE_BUSY,
362  "Module virtual connection handle already in use");
363  return -BS_ECODE_BUSY;
364  }
365 
366  // open device
367  fd = open(sDevUri, O_WRONLY);
368 
369  if( fd < 0 )
370  {
371  BSMOD_LOG_SYSERROR(hndVConn, "open(%s,...).", sDevUri);
372  return -BS_ECODE_SYS;
373  }
374 
375  // allocate a new control block and initialize
376  pCtlBlk = bsModCtlBlkNew(fd, bTrace);
377 
378  // add to module resource table
379  BsModCallbacks->m_cbModRsrcAdd(BsModRsrcTbl, hndVConn, pCtlBlk);
380 
381  LOGDIAG2("VConn=%d: %d=open(dev=%s, ...).", hndVConn, fd, sDevUri);
382 
383  return fd;
384 }
385 
386 /*!
387  * \brief Close the /dev/null device and disassociate virtual connection handle.
388  *
389  * The actual device and resources are only cleared if this is the last
390  * virtual connection reference to this device.
391  *
392  * \param hndVConn Virtual connection handle.
393  *
394  * \return
395  * \copydoc doc_return_std
396  */
398 {
399  BsModCtlBlk_T *pCtlBlk;
400 
401  // check if handle is in valid range
402  BSMOD_TRY_VCONN_HND_RANGE(hndVConn);
403 
404  // check is resouce is in-use (i.e. opened)
405  if( !BSMOD_RSRC_IS_INUSE(BsModRsrcTbl, hndVConn) )
406  {
408  "Resources for virtual connection not found.");
409  return -BS_ECODE_NO_VCONN;
410  }
411 
412  // remove from module's resource table
413  pCtlBlk = (BsModCtlBlk_T *)BsModCallbacks->m_cbModRsrcRemove(BsModRsrcTbl,
414  hndVConn);
415 
416  if( pCtlBlk == NULL )
417  {
418  BSMOD_LOG_ERROR(hndVConn, BS_ECODE_INTERNAL, "No module resource found.");
419  return -BS_ECODE_INTERNAL;
420  }
421 
422  if( pCtlBlk->m_fd >= 0 )
423  {
424  close(pCtlBlk->m_fd);
425  LOGDIAG2("VConn=%d: close(fd=%d).", hndVConn, pCtlBlk->m_fd);
426  }
427 
428  bsModCtlBlkDelete(pCtlBlk);
429 
430  return BS_OK;
431 }
432 
433 /*!
434  * \brief Service an /dev/null request.
435  *
436  * \note A module-specific request service must send a response.
437  *
438  * \param hndVConn Virtual connection handle.
439  * \param uTid Request-Response transaction id.
440  * \param uMsgIdReq Request message id.
441  * \param bufReq Packed request message buffer.
442  * \param uReqLen Size of request in buffer (number of bytes).
443  *
444  * \copydoc doc_return_std
445  */
447  BsTid_T uTid,
448  BsMsgId_T uMsgIdReq,
449  byte_t bufReq[],
450  size_t uReqLen)
451 {
452  BsModCtlBlk_T *pCtlBlk;
453 
454  // check if handle is in valid range
455  if( !BSMOD_IS_VCONN_HANDLE(hndVConn) )
456  {
457  BSMOD_SEND_ERROR_RSP(BsModCallbacks, hndVConn, uTid, BS_ECODE_BAD_VCONN_HND,
458  "Module vconn handle out-of-range.");
459  return -BS_ECODE_BAD_VCONN_HND; \
460  }
461 
462  // retrieve resource control block
463  pCtlBlk = (BsModCtlBlk_T *)BSMOD_RSRC(BsModRsrcTbl, hndVConn);
464 
465  // check resource
466  if( pCtlBlk == NULL )
467  {
468  BSMOD_SEND_ERROR_RSP(BsModCallbacks, hndVConn, uTid, BS_ECODE_NO_VCONN,
469  "No resources for virtual connection found.");
470  return -BS_ECODE_NO_VCONN;
471  }
472 
473  switch( uMsgIdReq )
474  {
475  case BsNullMsgIdReqWrite:
476  return bsModNullReqWrite(hndVConn, uTid, uMsgIdReq, bufReq, uReqLen);
477  default:
478  BSMOD_SEND_ERROR_RSP(BsModCallbacks, hndVConn, uTid, BS_ECODE_UNKNOWN_REQ,
479  "MsgId=%u.", uMsgIdReq);
480  return -BS_ECODE_UNKNOWN_REQ;
481  }
482 }
483 
484 /*!
485  * \brief Enable/disable message tracing on handle.
486  *
487  * \param hndVConn Virtual connection handle.
488  * \param bTrace Do [not] enable message tracing on this handle.
489  *
490  * \copydoc doc_return_std
491  */
492 int bsModTrace(BsVConnHnd_T hndVConn, bool_t bTrace)
493 {
494  BsModCtlBlk_T *pCtlBlk;
495 
496  // check if handle is in valid range
497  if( !BSMOD_IS_VCONN_HANDLE(hndVConn) )
498  {
500  "Module vconn handle out-of-range.");
501  return -BS_ECODE_BAD_VCONN_HND;
502  }
503 
504  // retrieve resource control block
505  pCtlBlk = (BsModCtlBlk_T *)BSMOD_RSRC(BsModRsrcTbl, hndVConn);
506 
507  // check resource
508  if( pCtlBlk == NULL )
509  {
511  "No resources for virtual connection found.");
512  return -BS_ECODE_NO_VCONN;
513  }
514 
515  pCtlBlk->m_bTrace = bTrace;
516 
517  return BS_OK;
518 }
519 
520 /*!
521  * \brief Query for the static module information.
522  *
523  * \return
524  * Pointer to module static information.
525  */
527 {
528  return &BsModInfo;
529 }
uint_t BsMsgId_T
client message id type [0-64k].
Definition: BotSense.h:188
#define BSMOD_LOG_ERROR(hndVConn, ecode, efmt,...)
Log Interface Module Error.
Definition: bsProxyModIF.h:405
static const BsModProxyCb_T * BsModCallbacks
module to bsProxy callbacks
Definition: bsNullServer.c:114
#define BS_ECODE_UNKNOWN_REQ
unknown request
Definition: BotSense.h:81
Useful indirect indexing of handle to resource instance structure.
Definition: bsProxyModIF.h:136
#define BSMOD_RSRC_IS_INUSE(pRsrcTbl, hndVConn)
Test if the resource table resource handle slot is in-use.
Definition: bsProxyModIF.h:169
int bsModRequest(BsVConnHnd_T hndVConn, BsTid_T uTid, BsMsgId_T uMsgIdReq, byte_t bufReq[], size_t uReqLen)
Service an /dev/null request.
Definition: bsNullServer.c:446
int bsModClose(BsVConnHnd_T hndVConn)
Close the /dev/null device and disassociate virtual connection handle.
Definition: bsNullServer.c:397
void(* m_cbModRsrcTblDelete)(BsModRsrcTbl_T *pRsrcTbl)
Delete an allocated resource table.
Definition: bsProxyModIF.h:294
static BsModCtlBlk_T * bsModCtlBlkNew(int fd, bool_t bTrace)
Allocate a new resource control block.
Definition: bsNullServer.c:125
uint_t BsTid_T
client transaction id type [0-255].
Definition: BotSense.h:172
#define BSMOD_LOG_SYSERROR(hndVConn, efmt,...)
Log Interface Module System Error.
Definition: bsProxyModIF.h:431
union BsNullReqWrite_T::@8::@9 u
aligned vector items
Module resource control block structure type.
Definition: bsI2CServer.c:103
bool_t m_bTrace
do [not] trace messages
Definition: bsI2CServer.c:108
INLINE_IN_H int BsNullUnpackReqWrite(byte_t buf[], size_t uMsgLen, BsNullReqWrite_T *pStruct, bool_t bTrace)
Unpack a BsNullReqWrite ITV message in big-endian byte order from the input buffer.
Definition: bsNullMsgs.h:159
#define BSMOD_IS_VCONN_HANDLE(hndVConn)
Test if the handle is in the valid module virtual connection range.
Definition: bsProxyModIF.h:149
<b><i>BotSense</i></b> bsProxy client library /dev/null interface.
int(* m_cbModRsrcAdd)(BsModRsrcTbl_T *pRsrcTbl, BsVConnHnd_T hndVConn, void *pRsrc)
Add a new resource to the resource table.
Definition: bsProxyModIF.h:305
#define BS_OK
not an error, success
Definition: BotSense.h:66
#define BS_ECODE_BAD_VCONN_HND
bad virtual connection handle
Definition: BotSense.h:79
#define BS_ECODE_SYS
system (errno) error
Definition: BotSense.h:92
const char * mod_name
module load name sans OS dependent substrings
Definition: bsProxyModIF.h:121
static BsModRsrcTbl_T * BsModRsrcTbl
module resource table
Definition: bsNullServer.c:115
#define BSMOD_TRY_VCONN_HND_RANGE(hndVConn)
Check if handle is within the range of module handles.
Definition: bsProxyModIF.h:499
Interface Module callbacks to bsProxy services type.
Definition: bsProxyModIF.h:235
<b><i>BotSense</i></b> client library declarations.
#define BS_ECODE_BAD_MSG
bad message
Definition: BotSense.h:76
#define BS_NULL_SERVER_MOD
server plugin dll module
Definition: bsNull.h:57
int bsModTrace(BsVConnHnd_T hndVConn, bool_t bTrace)
Enable/disable message tracing on handle.
Definition: bsNullServer.c:492
#define BSMOD_RSRC_INUSE_COUNT(pRsrcTbl)
Get the resouce table current in-use count.
Definition: bsProxyModIF.h:208
#define BSMOD_MAX_HANDLES
Maximum number of module supported simultaneous virtual connections.
Definition: bsNullServer.c:100
void(* m_cbSendRsp)(BsVConnHnd_T hndVConn, BsTid_T uTid, BsMsgId_T uMsgId, byte_t bufRsp[], size_t uRspLen)
Send module-specific repsonse callback function.
Definition: bsProxyModIF.h:246
static const char * BsModUri
module canonical name
Definition: bsNullServer.c:113
INLINE_IN_H int BsNullPackRspWrite(BsNullRspWrite_T *pStruct, byte_t buf[], size_t bufSize, bool_t bTrace)
Pack a BsNullRspWrite ITV message in big-endian byte order into the output buffer.
Definition: bsNullMsgs.h:181
const BsModInfo_T * bsModInfo()
Query for the static module information.
Definition: bsNullServer.c:526
int bsModOpen(BsVConnHnd_T hndVConn, bool_t bTrace, const char *sDevUri, byte_t argbuf[], size_t uArgSize)
Open an /dev/null device and associate with the given handle.
Definition: bsNullServer.c:337
#define BS_ECODE_NO_RSRC
no resource available
Definition: BotSense.h:85
#define BSMOD_RSRC(pRsrcTbl, hndVConn)
Get the resource given the handle.
Definition: bsProxyModIF.h:196
Standard bsProxy static interface module information structure type.
Definition: bsProxyModIF.h:119
void bsModExit()
Exit /dev/null module.
Definition: bsNullServer.c:288
void *(* m_cbModRsrcRemove)(BsModRsrcTbl_T *pRsrcTbl, BsVConnHnd_T hndVConn)
Remove a resource from the resource table.
Definition: bsProxyModIF.h:320
#define BSMOD_SEND_NMERROR_RSP(pCb, hndVConn, uTid, nmecode, efmt,...)
Log NetMsgs (Un)Packing Error and Send Error Response.
Definition: bsProxyModIF.h:464
<b><i>BotSense</i></b> bsProxy Dynamically Linked Library module interface.
BsModRsrcTbl_T *(* m_cbModRsrcTblNew)(int nMaxResources)
Allocatae a new module resource table of fixed size.
Definition: bsProxyModIF.h:284
struct BsNullReqWrite_T::@8 m_writebuf
vector
byte_t m_byteswritten
byteswritten
Definition: bsNullMsgs.h:83
static void bsModCtlBlkDelete(BsModCtlBlk_T *pCtlBlk)
Delete an allocated resource control block.
Definition: bsNullServer.c:142
#define BS_ECODE_INTERNAL
internal error (bug)
Definition: BotSense.h:93
#define BSPROXY_BUF_BODY(buf)
Convenience macro to produce a buffer (offset, size) 2-tuple.
Definition: BotSense.h:272
BsNullMsgId_T
Definition: bsNullMsgs.h:35
#define BS_ECODE_NO_VCONN
virtual connection not found
Definition: BotSense.h:80
#define BSMOD_SEND_SYSERROR_RSP(pCb, hndVConn, uTid, efmt,...)
Log System Error and Send Error Response.
Definition: bsProxyModIF.h:481
#define BSPROXY_MSG_MAX_LEN
total message maximum length
Definition: BotSense.h:259
void ** m_vecRsrc
vecRsrc[index] -> rsrc
Definition: bsProxyModIF.h:139
int bsModInit(const char *sModUri, const BsModProxyCb_T *pCallbacks)
Initialize /dev/null module.
Definition: bsNullServer.c:268
#define BSMOD_SEND_ERROR_RSP(pCb, hndVConn, uTid, ecode, efmt,...)
Log <b><i>BotSense</i></b> Error and Send Error Response.
Definition: bsProxyModIF.h:447
#define BS_ECODE_BUSY
resource busy
Definition: BotSense.h:86
<b><i>BotSense</i></b> package top-level, unifying header declarations.
size_t m_count
vector item count
Definition: bsNullMsgs.h:63
BotSense bsProxy server - client /dev/null NetMsgs XML Definition.
int BsVConnHnd_T
virtual connection handle type
Definition: BotSense.h:151
static int bsModNullReqWrite(BsVConnHnd_T hndVConn, BsTid_T uTid, BsMsgId_T uMsgIdReq, byte_t bufReq[], size_t uReqLen)
Service a /dev/null write request.
Definition: bsNullServer.c:163
int m_fd
/dev/null open file descriptor
Definition: bsNullServer.c:109
static BsModInfo_T BsModInfo
Module static information.
Definition: bsNullServer.c:75