botsense  3.2.0
RoadNarrows Client-Server Proxied Services Framework
bsProxyRequest.c File Reference

BotSense bsProxy server-terminated requests. More...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "rnr/rnrconfig.h"
#include "rnr/log.h"
#include "rnr/new.h"
#include "botsense/BotSense.h"
#include "botsense/bsProxyModIF.h"
#include "botsense/bsProxyMsgs.h"
#include "bsProxy.h"
#include "version.h"

Go to the source code of this file.

Functions

static int ReqLoopback (BsProxyClientHnd_T hndClient, BsVConnHnd_T hndVConn, BsTid_T uTid, BsMsgId_T uMsgId, byte_t bufReq[], size_t uReqLen, bool_t bTrace)
 Service client's request to perform a loopback. More...
 
static int ReqSetLogging (BsProxyClientHnd_T hndClient, BsVConnHnd_T hndVConn, BsTid_T uTid, BsMsgId_T uMsgId, byte_t bufReq[], size_t uReqLen, bool_t bTrace)
 Service client's request to set the server's logging level. More...
 
static int ReqMsgTrace (BsProxyClientHnd_T hndClient, BsVConnHnd_T hndVConn, BsTid_T uTid, BsMsgId_T uMsgId, byte_t bufReq[], size_t uReqLen, bool_t bTrace)
 Service client's request to set server or client terminated message tracing. More...
 
static int ReqGetVersion (BsProxyClientHnd_T hndClient, BsVConnHnd_T hndVConn, BsTid_T uTid, BsMsgId_T uMsgId, byte_t bufReq[], size_t uReqLen, bool_t bTrace)
 Service client's request to get the server's version. More...
 
static int ReqDevOpen (BsProxyClientHnd_T hndClient, BsVConnHnd_T hndVConn, BsTid_T uTid, BsMsgId_T uMsgId, byte_t bufReq[], size_t uReqLen, bool_t bTrace)
 Service client's request to open a proxied device virtual connection. More...
 
static int ReqDevClose (BsProxyClientHnd_T hndClient, BsVConnHnd_T hndVConn, BsTid_T uTid, BsMsgId_T uMsgId, byte_t bufReq[], size_t uReqLen, bool_t bTrace)
 Service client's request to close a device virtual connection. More...
 
static int ReqGetVConnList (BsProxyClientHnd_T hndClient, BsVConnHnd_T hndVConn, BsTid_T uTid, BsMsgId_T uMsgId, byte_t bufReq[], size_t uReqLen, bool_t bTrace)
 Service client's request to get the list of all of the client's opened virtual connection handles. More...
 
static int ReqGetVConnInfo (BsProxyClientHnd_T hndClient, BsVConnHnd_T hndVConn, BsTid_T uTid, BsMsgId_T uMsgId, byte_t bufReq[], size_t uReqLen, bool_t bTrace)
 Service client's request to get a virtual connection's information. More...
 
int ServerRequest (BsProxyClientHnd_T hndClient, BsVConnHnd_T hndVConn, BsTid_T uTid, BsMsgId_T uMsgId, byte_t bufReq[], size_t uReqLen)
 Server service thread request handler. More...
 

Detailed Description

BotSense bsProxy server-terminated requests.

LastChangedDate
2010-08-20 11:36:38 -0600 (Fri, 20 Aug 2010)
Rev
568
Author
Robin Knight (robin.nosp@m..kni.nosp@m.ght@r.nosp@m.oadn.nosp@m.arrow.nosp@m.s.co.nosp@m.m)

Definition in file bsProxyRequest.c.

Function Documentation

static int ReqDevClose ( BsProxyClientHnd_T  hndClient,
BsVConnHnd_T  hndVConn,
BsTid_T  uTid,
BsMsgId_T  uMsgId,
byte_t  bufReq[],
size_t  uReqLen,
bool_t  bTrace 
)
static

Service client's request to close a device virtual connection.

Execution Context:
Server service thread.
Parameters
hndClient

Definition at line 394 of file bsProxyRequest.c.

References BS_ECODE_BAD_MSG, BS_ECODE_SERVER_BAD_CLIENT, BS_OK, BSPROXY_SEND_ERROR_RSP, BSPROXY_SEND_NMERROR_RSP, BsProxyUnpackReqDevClose(), ClientAcquire(), ClientRelease(), ClientSendOkRsp(), BsProxyClientCtl_T::m_uRefCnt, BsProxyReqDevClose_T::m_vconn, and VConnClose().

Referenced by ServerRequest().

401 {
402  BsProxyReqDevClose_T msgReq;
403  BsProxyClientCtl_T *pClient;
404  int rc;
405 
406  //
407  // Unpack client request.
408  //
409  rc = BsProxyUnpackReqDevClose(bufReq, uReqLen, &msgReq, bTrace);
410 
411  if( rc < 0 )
412  {
413  BSPROXY_SEND_NMERROR_RSP(hndClient, hndVConn, uTid, rc, "MsgId=%u", uMsgId);
414  return -BS_ECODE_BAD_MSG;
415  }
416 
417  //
418  // Execute client request.
419  //
420 
421  //
422  // Acquire the client, locking it from other threads. If it cannot be
423  // acquired, the client has a bad connection or is disconnected and is (being)
424  // unregistered. Don't send response message.
425  //
426  if( (pClient = ClientAcquire(hndClient)) == NULL )
427  {
429  }
430 
431  if( (rc = VConnClose(hndClient, msgReq.m_vconn)) == BS_OK )
432  {
433  pClient->m_uRefCnt--;
434  }
435 
436  // Unlock the client. Response message may now be sent on this client.
437  ClientRelease(hndClient);
438 
439  if( rc < 0 )
440  {
441  BSPROXY_SEND_ERROR_RSP(hndClient, hndVConn, uTid, rc,
442  "VConn=%d", (int)msgReq.m_vconn);
443  return -rc;
444  }
445 
446  //
447  // Send server response.
448  //
449  return ClientSendOkRsp(hndClient, uTid);
450 }
BsProxyClientCtl_T * ClientAcquire(BsProxyClientHnd_T hndClient)
Acquire client, locking it from other threads.
#define BSPROXY_SEND_NMERROR_RSP(hndClient, hndVConn, uTid, nmecode, efmt,...)
Log NetMsgs (Un)Packing Error and Send Error Response.
Definition: bsProxy.h:348
void ClientRelease(BsProxyClientHnd_T hndClient)
Release the locked client.
#define BS_OK
not an error, success
Definition: BotSense.h:66
int VConnClose(BsProxyClientHnd_T hndClient, BsVConnHnd_T hndVConn)
Close the virtual connection.
Definition: bsProxyVConn.c:478
int ClientSendOkRsp(BsProxyClientHnd_T hndClient, BsTid_T uTid)
Send an ok response to the client.
#define BS_ECODE_BAD_MSG
bad message
Definition: BotSense.h:76
#define BSPROXY_SEND_ERROR_RSP(hndClient, hndVConn, uTid, ecode, efmt,...)
Log <b><i>BotSense</i></b> Error and Send Error Response.
Definition: bsProxy.h:330
uint_t m_uRefCnt
vconn ref count for this client
Definition: bsProxy.h:198
#define BS_ECODE_SERVER_BAD_CLIENT
server detected bad client
Definition: BotSense.h:91
byte_t m_vconn
vconn
Definition: bsProxyMsgs.h:216
INLINE_IN_H int BsProxyUnpackReqDevClose(byte_t buf[], size_t uMsgLen, BsProxyReqDevClose_T *pStruct, bool_t bTrace)
Unpack a BsProxyReqDevClose ITV message in big-endian byte order from the input buffer.
Definition: bsProxyMsgs.h:710
static int ReqDevOpen ( BsProxyClientHnd_T  hndClient,
BsVConnHnd_T  hndVConn,
BsTid_T  uTid,
BsMsgId_T  uMsgId,
byte_t  bufReq[],
size_t  uReqLen,
bool_t  bTrace 
)
static

Service client's request to open a proxied device virtual connection.

Execution Context:
Server service thread.
Parameters
hndClient

Definition at line 302 of file bsProxyRequest.c.

References BS_ECODE_BAD_MSG, BS_ECODE_SERVER_BAD_CLIENT, BSPROXY_SEND_ERROR_RSP, BSPROXY_SEND_NMERROR_RSP, BsProxyMsgIdRspDevOpen, BsProxyUnpackReqDevOpen(), ClientAcquire(), ClientRelease(), ClientSendServerRsp(), BsProxyReqDevOpen_T::m_argbuf, BsProxyReqDevOpen_T::m_count, BsProxyReqDevOpen_T::m_devname, BsProxyReqDevOpen_T::m_modname, BsProxyReqDevOpen_T::m_trace, BsProxyClientCtl_T::m_uRefCnt, BsProxyRspDevOpen_T::m_vconn, BsProxyReqDevOpen_T::u, and VConnOpenDev().

Referenced by ServerRequest().

309 {
310  static BsProxyMsgId_T uMsgIdRsp = BsProxyMsgIdRspDevOpen;
311 
312  BsProxyReqDevOpen_T msgReq;
313  BsProxyRspDevOpen_T msgRsp;
314  BsProxyClientCtl_T *pClient;
315  int n;
316  int rc;
317 
318  //
319  // Unpack client request.
320  //
321  rc = BsProxyUnpackReqDevOpen(bufReq, uReqLen, &msgReq, bTrace);
322 
323  if( rc < 0 )
324  {
325  BSPROXY_SEND_NMERROR_RSP(hndClient, hndVConn, uTid, rc, "MsgId=%u", uMsgId);
326  return -BS_ECODE_BAD_MSG;
327  }
328 
329  //
330  // Execute client request.
331  //
332 
333  //
334  // Acquire the client, locking it from other threads. If it cannot be
335  // acquired, the client has a bad connection or is disconnected and is
336  // (being) unregistered. Don't send response message.
337  //
338  if( (pClient = ClientAcquire(hndClient)) == NULL )
339  {
341  }
342 
343  //
344  // Open a new virtual connection.
345  //
346  n = VConnOpenDev(hndClient, msgReq.m_devname, msgReq.m_modname,
347  msgReq.m_argbuf.u.m_buf, (size_t)msgReq.m_argbuf.m_count,
348  msgReq.m_trace);
349 
350  if( n >= 0 )
351  {
352  pClient->m_uRefCnt++;
353  }
354 
355  // Unlock the client. Response message may now be sent on this client.
356  ClientRelease(hndClient);
357 
358  if( n < 0 )
359  {
360  BSPROXY_SEND_ERROR_RSP(hndClient, hndVConn, uTid, n,
361  "DevName=%s, ModName=%s", msgReq.m_devname, msgReq.m_modname);
362  return -n;
363  }
364 
365  //
366  // Fill in response.
367  //
368  msgRsp.m_vconn = (byte_t)n;
369 
370  //
371  // Send server response.
372  //
373  rc = ClientSendServerRsp(hndClient, uTid, uMsgIdRsp, &msgRsp);
374 
375  return rc;
376 }
BsProxyClientCtl_T * ClientAcquire(BsProxyClientHnd_T hndClient)
Acquire client, locking it from other threads.
int VConnOpenDev(BsProxyClientHnd_T hndClient, const char *sDevName, const char *sModName, byte_t argbuf[], size_t uArgLen, bool_t bTrace)
Open a virtual device connection.
Definition: bsProxyVConn.c:325
char m_modname[(NMFVAL_LEN_MAX_STRING)+1]
modname
Definition: bsProxyMsgs.h:179
#define BSPROXY_SEND_NMERROR_RSP(hndClient, hndVConn, uTid, nmecode, efmt,...)
Log NetMsgs (Un)Packing Error and Send Error Response.
Definition: bsProxy.h:348
void ClientRelease(BsProxyClientHnd_T hndClient)
Release the locked client.
bool_t m_trace
trace
Definition: bsProxyMsgs.h:176
size_t m_count
vector item count
Definition: bsProxyMsgs.h:183
#define BS_ECODE_BAD_MSG
bad message
Definition: BotSense.h:76
INLINE_IN_H int BsProxyUnpackReqDevOpen(byte_t buf[], size_t uMsgLen, BsProxyReqDevOpen_T *pStruct, bool_t bTrace)
Unpack a BsProxyReqDevOpen ITV message in big-endian byte order from the input buffer.
Definition: bsProxyMsgs.h:624
#define BSPROXY_SEND_ERROR_RSP(hndClient, hndVConn, uTid, ecode, efmt,...)
Log <b><i>BotSense</i></b> Error and Send Error Response.
Definition: bsProxy.h:330
uint_t m_uRefCnt
vconn ref count for this client
Definition: bsProxy.h:198
byte_t m_vconn
vconn
Definition: bsProxyMsgs.h:203
union BsProxyReqDevOpen_T::@10::@11 u
aligned vector items
struct BsProxyReqDevOpen_T::@10 m_argbuf
vector
BsProxyMsgId_T
Definition: bsProxyMsgs.h:35
#define BS_ECODE_SERVER_BAD_CLIENT
server detected bad client
Definition: BotSense.h:91
char m_devname[(NMFVAL_LEN_MAX_STRING)+1]
devname
Definition: bsProxyMsgs.h:177
int ClientSendServerRsp(BsProxyClientHnd_T hndClient, BsTid_T uTid, BsProxyMsgId_T uMsgId, void *pMsgRsp)
Send a server-terminated response message to client.
static int ReqGetVConnInfo ( BsProxyClientHnd_T  hndClient,
BsVConnHnd_T  hndVConn,
BsTid_T  uTid,
BsMsgId_T  uMsgId,
byte_t  bufReq[],
size_t  uReqLen,
bool_t  bTrace 
)
static

Service client's request to get a virtual connection's information.

Execution Context:
Server service thread.
Parameters
hndClient

Definition at line 530 of file bsProxyRequest.c.

References BS_ECODE_BAD_MSG, BSPROXY_RSPGETVCONNINFO_CLIENT_LEN, BSPROXY_RSPGETVCONNINFO_DEVURI_LEN, BSPROXY_RSPGETVCONNINFO_MODDATE_LEN, BSPROXY_RSPGETVCONNINFO_MODURI_LEN, BSPROXY_RSPGETVCONNINFO_MODVER_LEN, BSPROXY_SEND_NMERROR_RSP, BsProxyMsgIdRspGetVConnInfo, BsProxyUnpackReqGetVConnInfo(), ClientHasName(), ClientSendServerRsp(), BsModInfo_T::date, BsProxyRspGetVConnInfo_T::m_client, BsProxyRspGetVConnInfo_T::m_devuri, BsProxyModIF_T::m_fnModInfo, BsProxyVConn_T::m_hndVConn, BsProxyRspGetVConnInfo_T::m_moddate, BsProxyRspGetVConnInfo_T::m_moduri, BsProxyRspGetVConnInfo_T::m_modver, BsProxyVConn_T::m_pModIF, BsProxyVConn_T::m_pThCtl, BsProxyVConn_T::m_rd, BsProxyRspGetVConnInfo_T::m_rd, _bsproxy_th_ctl::m_sDevUri, BsProxyModIF_T::m_sModUri, BsProxyReqGetVConnInfo_T::m_vconn, BsProxyRspGetVConnInfo_T::m_vconn, VConnAcquire(), VConnRelease(), and BsModInfo_T::version.

Referenced by ServerRequest().

537 {
538  static BsProxyMsgId_T uMsgIdRsp = BsProxyMsgIdRspGetVConnInfo;
539 
542  BsProxyVConn_T *pVConn;
543  const BsModInfo_T *pModInfo;
544  int rc;
545 
546  //
547  // Unpack client request.
548  //
549  rc = BsProxyUnpackReqGetVConnInfo(bufReq, uReqLen, &msgReq, bTrace);
550 
551  if( rc < 0 )
552  {
553  BSPROXY_SEND_NMERROR_RSP(hndClient, hndVConn, uTid, rc, "MsgId=%u", uMsgId);
554  return -BS_ECODE_BAD_MSG;
555  }
556 
557  //
558  // Execute client request.
559  //
560 
561  if( (pVConn = VConnAcquire(msgReq.m_vconn)) != NULL )
562  {
563  msgRsp.m_vconn = (byte_t)pVConn->m_hndVConn;
564  msgRsp.m_rd = pVConn->m_rd;
565  strcpy_s(msgRsp.m_client, BSPROXY_RSPGETVCONNINFO_CLIENT_LEN+1,
566  ClientHasName(hndClient));
567  strcpy_s(msgRsp.m_devuri, BSPROXY_RSPGETVCONNINFO_DEVURI_LEN+1,
568  pVConn->m_pThCtl->m_sDevUri);
569  strcpy_s(msgRsp.m_moduri, BSPROXY_RSPGETVCONNINFO_MODURI_LEN+1,
570  pVConn->m_pModIF->m_sModUri);
571 
572  pModInfo = pVConn->m_pModIF->m_fnModInfo();
573 
574  strcpy_s(msgRsp.m_modver, BSPROXY_RSPGETVCONNINFO_MODVER_LEN+1,
575  pModInfo->version);
577  pModInfo->date);
578 
579  VConnRelease(msgReq.m_vconn);
580  }
581 
582  //
583  // Send server response.
584  //
585  rc = ClientSendServerRsp(hndClient, uTid, uMsgIdRsp, &msgRsp);
586 
587  return rc;
588 }
#define BSPROXY_RSPGETVCONNINFO_MODURI_LEN
Definition: bsProxyMsgs.h:266
int m_rd
module resource descriptor
Definition: bsProxy.h:227
void VConnRelease(BsVConnHnd_T hndVConn)
Release the locked virtual client.
Definition: bsProxyVConn.c:585
#define BSPROXY_RSPGETVCONNINFO_CLIENT_LEN
Definition: bsProxyMsgs.h:260
#define BSPROXY_SEND_NMERROR_RSP(hndClient, hndVConn, uTid, nmecode, efmt,...)
Log NetMsgs (Un)Packing Error and Send Error Response.
Definition: bsProxy.h:348
BsProxyThCtl_T * m_pThCtl
service thread
Definition: bsProxy.h:225
RspGetVConnInfo.
Definition: bsProxyMsgs.h:52
INLINE_IN_H int BsProxyUnpackReqGetVConnInfo(byte_t buf[], size_t uMsgLen, BsProxyReqGetVConnInfo_T *pStruct, bool_t bTrace)
Unpack a BsProxyReqGetVConnInfo ITV message in big-endian byte order from the input buffer...
Definition: bsProxyMsgs.h:796
BsModInfoFunc_P m_fnModInfo
static info
Definition: bsProxy.h:131
#define BSPROXY_RSPGETVCONNINFO_DEVURI_LEN
Definition: bsProxyMsgs.h:263
#define BS_ECODE_BAD_MSG
bad message
Definition: BotSense.h:76
BsProxyVConn_T * VConnAcquire(BsVConnHnd_T hndVConn)
Acquire virtual connection, locking it from other threads.
Definition: bsProxyVConn.c:552
char m_devuri[(NMFVAL_LEN_MAX_STRING)+1]
devuri
Definition: bsProxyMsgs.h:283
const char * date
version date
Definition: bsProxyModIF.h:124
Standard bsProxy static interface module information structure type.
Definition: bsProxyModIF.h:119
const char * m_sModUri
module Uniform Resource Id
Definition: bsProxy.h:122
BsProxyMsgId_T
Definition: bsProxyMsgs.h:35
BsVConnHnd_T m_hndVConn
self reference
Definition: bsProxy.h:223
char m_client[(NMFVAL_LEN_MAX_STRING)+1]
client
Definition: bsProxyMsgs.h:281
#define BSPROXY_RSPGETVCONNINFO_MODDATE_LEN
Definition: bsProxyMsgs.h:272
const char * version
dotted version x.y.z[-app[-a.b.c]]
Definition: bsProxyModIF.h:123
#define BSPROXY_RSPGETVCONNINFO_MODVER_LEN
Definition: bsProxyMsgs.h:269
char m_modver[(NMFVAL_LEN_MAX_STRING)+1]
modver
Definition: bsProxyMsgs.h:287
INLINE_IN_H const char * ClientHasName(BsProxyClientHnd_T hndClient)
Get the <b><i>BotSense</i></b> client official name.
Definition: bsProxy.h:588
const char * m_sDevUri
proxied device URI or server
Definition: bsProxy.h:150
BsProxyModIF_T * m_pModIF
interface module I/F
Definition: bsProxy.h:226
char m_moduri[(NMFVAL_LEN_MAX_STRING)+1]
moduri
Definition: bsProxyMsgs.h:285
int ClientSendServerRsp(BsProxyClientHnd_T hndClient, BsTid_T uTid, BsProxyMsgId_T uMsgId, void *pMsgRsp)
Send a server-terminated response message to client.
char m_moddate[(NMFVAL_LEN_MAX_STRING)+1]
moddate
Definition: bsProxyMsgs.h:289
static int ReqGetVConnList ( BsProxyClientHnd_T  hndClient,
BsVConnHnd_T  hndVConn,
BsTid_T  uTid,
BsMsgId_T  uMsgId,
byte_t  bufReq[],
size_t  uReqLen,
bool_t  bTrace 
)
static

Service client's request to get the list of all of the client's opened virtual connection handles.

Execution Context:
Server service thread.
Parameters
hndClient

Definition at line 469 of file bsProxyRequest.c.

References BSPROXY_VCONN_MOD_MAX, BSPROXY_VCONN_MOD_MIN, BsProxyMsgIdRspGetVConnList, ClientSendServerRsp(), BsProxyRspGetVConnList_T::m_count, BsProxyVConn_T::m_hndClient, BsProxyRspGetVConnList_T::m_vconn, BsProxyRspGetVConnList_T::u, VConnAcquire(), and VConnRelease().

Referenced by ServerRequest().

476 {
477  static BsProxyMsgId_T uMsgIdRsp = BsProxyMsgIdRspGetVConnList;
478 
480  BsProxyVConn_T *pVConn;
481  int n, i;
482  int rc;
483 
484  //
485  // Execute client request.
486  //
487 
488  //
489  // Loop through the device virtual connections.
490  //
491  for(i=0, n=BSPROXY_VCONN_MOD_MIN; n<=BSPROXY_VCONN_MOD_MAX; ++n)
492  {
493  if( (pVConn = VConnAcquire(n)) != NULL )
494  {
495  // pointers point to the same client allocated object
496  if( pVConn->m_hndClient == hndClient )
497  {
498  msgRsp.m_vconn.u.m_buf[i++] = (byte_t)n;
499  }
500  VConnRelease(n);
501  }
502  }
503 
504  msgRsp.m_vconn.m_count = (size_t)i;
505 
506  //
507  // Send server response.
508  //
509  rc = ClientSendServerRsp(hndClient, uTid, uMsgIdRsp, &msgRsp);
510 
511  return rc;
512 }
void VConnRelease(BsVConnHnd_T hndVConn)
Release the locked virtual client.
Definition: bsProxyVConn.c:585
union BsProxyRspGetVConnList_T::@12::@13 u
aligned vector items
#define BSPROXY_VCONN_MOD_MIN
minimum module-specific handle value
Definition: BotSense.h:141
struct BsProxyRspGetVConnList_T::@12 m_vconn
vector
#define BSPROXY_VCONN_MOD_MAX
maximum module-specific handle value
Definition: BotSense.h:142
BsProxyVConn_T * VConnAcquire(BsVConnHnd_T hndVConn)
Acquire virtual connection, locking it from other threads.
Definition: bsProxyVConn.c:552
RspGetVConnList.
Definition: bsProxyMsgs.h:50
BsProxyClientHnd_T m_hndClient
proxied client handle
Definition: bsProxy.h:224
size_t m_count
vector item count
Definition: bsProxyMsgs.h:231
BsProxyMsgId_T
Definition: bsProxyMsgs.h:35
int ClientSendServerRsp(BsProxyClientHnd_T hndClient, BsTid_T uTid, BsProxyMsgId_T uMsgId, void *pMsgRsp)
Send a server-terminated response message to client.
static int ReqGetVersion ( BsProxyClientHnd_T  hndClient,
BsVConnHnd_T  hndVConn,
BsTid_T  uTid,
BsMsgId_T  uMsgId,
byte_t  bufReq[],
size_t  uReqLen,
bool_t  bTrace 
)
static

Service client's request to get the server's version.

Execution Context:
Server service thread.
Parameters
hndClient

Definition at line 261 of file bsProxyRequest.c.

References BSPROXY_RSPGETVERSION_VERSION_LEN, BsProxyMsgIdRspGetVersion, ClientSendServerRsp(), BsProxyRspGetVersion_T::m_version, PKG_TIMESTAMP, and PKG_VERSION.

Referenced by ServerRequest().

268 {
269  static BsProxyMsgId_T uMsgIdRsp = BsProxyMsgIdRspGetVersion;
270 
271  BsProxyRspGetVersion_T msgRsp;
272  int rc;
273 
274  // Get the version strings.
275  sprintf_s(msgRsp.m_version, BSPROXY_RSPGETVERSION_VERSION_LEN+1,
276  "bsProxy %s %s", PKG_VERSION, PKG_TIMESTAMP);
277 
278  //
279  // Send server response.
280  //
281  rc = ClientSendServerRsp(hndClient, uTid, uMsgIdRsp, &msgRsp);
282 
283  return rc;
284 }
#define BSPROXY_RSPGETVERSION_VERSION_LEN
Definition: bsProxyMsgs.h:132
#define PKG_VERSION
Definition: version.h:24
char m_version[(NMFVAL_LEN_MAX_STRING)+1]
version
Definition: bsProxyMsgs.h:139
BsProxyMsgId_T
Definition: bsProxyMsgs.h:35
#define PKG_TIMESTAMP
Definition: version.h:27
int ClientSendServerRsp(BsProxyClientHnd_T hndClient, BsTid_T uTid, BsProxyMsgId_T uMsgId, void *pMsgRsp)
Send a server-terminated response message to client.
static int ReqLoopback ( BsProxyClientHnd_T  hndClient,
BsVConnHnd_T  hndVConn,
BsTid_T  uTid,
BsMsgId_T  uMsgId,
byte_t  bufReq[],
size_t  uReqLen,
bool_t  bTrace 
)
static

Service client's request to perform a loopback.

Execution Context:
Server service thread.
Parameters
hndClient

Definition at line 85 of file bsProxyRequest.c.

References BS_ECODE_BAD_MSG, BSPROXY_REQLOOPBACK_CDATA_LEN, BSPROXY_RSPLOOPBACK_CDATA_LEN, BSPROXY_SEND_NMERROR_RSP, BsProxyMsgIdRspLoopback, BsProxyUnpackReqLoopback(), ClientHasName(), ClientSendServerRsp(), BsProxyReqLoopback_T::m_cdata, and BsProxyRspLoopback_T::m_cdata.

Referenced by ServerRequest().

92 {
93  static BsProxyMsgId_T uMsgIdRsp = BsProxyMsgIdRspLoopback;
94 
95  BsProxyReqLoopback_T msgReq;
96  BsProxyRspLoopback_T msgRsp;
97  int rc;
98 
99  //
100  // Unpack client request.
101  //
102  rc = BsProxyUnpackReqLoopback(bufReq, uReqLen, &msgReq, bTrace);
103 
104  if( rc < 0 )
105  {
106  BSPROXY_SEND_NMERROR_RSP(hndClient, hndVConn, uTid, rc, "MsgId=%u", uMsgId);
107  return -BS_ECODE_BAD_MSG;
108  }
109 
110  //
111  // Execute client request.
112  //
114 
115  // print to standard error
116  fprintf(stderr, "%s: %s\n", ClientHasName(hndClient), msgReq.m_cdata);
117 
118  //
119  // Fill in response.
120  //
121  strcpy_s(msgRsp.m_cdata, BSPROXY_RSPLOOPBACK_CDATA_LEN+1, msgReq.m_cdata);
122 
123  //
124  // Send server response.
125  //
126  rc = ClientSendServerRsp(hndClient, uTid, uMsgIdRsp, &msgRsp);
127 
128  return rc;
129 }
char m_cdata[(NMFVAL_LEN_MAX_STRING)+1]
cdata
Definition: bsProxyMsgs.h:109
#define BSPROXY_SEND_NMERROR_RSP(hndClient, hndVConn, uTid, nmecode, efmt,...)
Log NetMsgs (Un)Packing Error and Send Error Response.
Definition: bsProxy.h:348
char m_cdata[(NMFVAL_LEN_MAX_STRING)+1]
cdata
Definition: bsProxyMsgs.h:92
INLINE_IN_H int BsProxyUnpackReqLoopback(byte_t buf[], size_t uMsgLen, BsProxyReqLoopback_T *pStruct, bool_t bTrace)
Unpack a BsProxyReqLoopback ITV message in big-endian byte order from the input buffer.
Definition: bsProxyMsgs.h:409
#define BS_ECODE_BAD_MSG
bad message
Definition: BotSense.h:76
BsProxyMsgId_T
Definition: bsProxyMsgs.h:35
#define BSPROXY_RSPLOOPBACK_CDATA_LEN
Definition: bsProxyMsgs.h:102
#define BSPROXY_REQLOOPBACK_CDATA_LEN
Definition: bsProxyMsgs.h:85
INLINE_IN_H const char * ClientHasName(BsProxyClientHnd_T hndClient)
Get the <b><i>BotSense</i></b> client official name.
Definition: bsProxy.h:588
int ClientSendServerRsp(BsProxyClientHnd_T hndClient, BsTid_T uTid, BsProxyMsgId_T uMsgId, void *pMsgRsp)
Send a server-terminated response message to client.
static int ReqMsgTrace ( BsProxyClientHnd_T  hndClient,
BsVConnHnd_T  hndVConn,
BsTid_T  uTid,
BsMsgId_T  uMsgId,
byte_t  bufReq[],
size_t  uReqLen,
bool_t  bTrace 
)
static

Service client's request to set server or client terminated message tracing.

Execution Context:
Server service thread.
Parameters
hndClient

Definition at line 197 of file bsProxyRequest.c.

References BS_ECODE_BAD_MSG, BS_ECODE_NO_VCONN, BSPROXY_SEND_ERROR_RSP, BSPROXY_SEND_NMERROR_RSP, BSPROXY_VCONN_SERVER, BsProxyUnpackReqMsgTrace(), ClientSendOkRsp(), ClientSetTraceState(), BsProxyModIF_T::m_fnModTrace, BsProxyVConn_T::m_pModIF, BsProxyReqMsgTrace_T::m_trace, BsProxyReqMsgTrace_T::m_vconn, VConnAcquire(), and VConnRelease().

Referenced by ServerRequest().

204 {
205  BsProxyReqMsgTrace_T msgReq;
206  BsProxyVConn_T *pVConn;
207  int rc;
208 
209  //
210  // Unpack client request.
211  //
212  rc = BsProxyUnpackReqMsgTrace(bufReq, uReqLen, &msgReq, bTrace);
213 
214  if( rc < 0 )
215  {
216  BSPROXY_SEND_NMERROR_RSP(hndClient, hndVConn, uTid, rc, "MsgId=%u", uMsgId);
217  return -BS_ECODE_BAD_MSG;
218  }
219 
220  //
221  // Execute client request.
222  //
223  if( msgReq.m_vconn == BSPROXY_VCONN_SERVER )
224  {
225  ClientSetTraceState(hndClient, msgReq.m_trace);
226  }
227  else if( (pVConn = VConnAcquire(msgReq.m_vconn)) == NULL )
228  {
229  BSPROXY_SEND_ERROR_RSP(hndClient, hndVConn, uTid, BS_ECODE_NO_VCONN,
230  "VConn=%d", msgReq.m_vconn);
231  return -BS_ECODE_NO_VCONN;
232  }
233  else
234  {
235  pVConn->m_pModIF->m_fnModTrace(msgReq.m_vconn, msgReq.m_trace);
236  VConnRelease(msgReq.m_vconn);
237  }
238 
239  //
240  // Send server response.
241  //
242  return ClientSendOkRsp(hndClient, uTid);
243 }
INLINE_IN_H int BsProxyUnpackReqMsgTrace(byte_t buf[], size_t uMsgLen, BsProxyReqMsgTrace_T *pStruct, bool_t bTrace)
Unpack a BsProxyReqMsgTrace ITV message in big-endian byte order from the input buffer.
Definition: bsProxyMsgs.h:581
void VConnRelease(BsVConnHnd_T hndVConn)
Release the locked virtual client.
Definition: bsProxyVConn.c:585
bool_t m_trace
trace
Definition: bsProxyMsgs.h:154
#define BSPROXY_SEND_NMERROR_RSP(hndClient, hndVConn, uTid, nmecode, efmt,...)
Log NetMsgs (Un)Packing Error and Send Error Response.
Definition: bsProxy.h:348
#define BSPROXY_VCONN_SERVER
handle for server-terminated msgs
Definition: BotSense.h:140
int ClientSendOkRsp(BsProxyClientHnd_T hndClient, BsTid_T uTid)
Send an ok response to the client.
#define BS_ECODE_BAD_MSG
bad message
Definition: BotSense.h:76
BsProxyVConn_T * VConnAcquire(BsVConnHnd_T hndVConn)
Acquire virtual connection, locking it from other threads.
Definition: bsProxyVConn.c:552
#define BSPROXY_SEND_ERROR_RSP(hndClient, hndVConn, uTid, ecode, efmt,...)
Log <b><i>BotSense</i></b> Error and Send Error Response.
Definition: bsProxy.h:330
BsModTraceFunc_P m_fnModTrace
tracing
Definition: bsProxy.h:130
#define BS_ECODE_NO_VCONN
virtual connection not found
Definition: BotSense.h:80
INLINE_IN_H void ClientSetTraceState(BsProxyClientHnd_T hndClient, bool_t bTrace)
Set the <b><i>BotSense</i></b> client&#39;s server-terminated message trace state.
Definition: bsProxy.h:617
byte_t m_vconn
vconn
Definition: bsProxyMsgs.h:153
BsProxyModIF_T * m_pModIF
interface module I/F
Definition: bsProxy.h:226
static int ReqSetLogging ( BsProxyClientHnd_T  hndClient,
BsVConnHnd_T  hndVConn,
BsTid_T  uTid,
BsMsgId_T  uMsgId,
byte_t  bufReq[],
size_t  uReqLen,
bool_t  bTrace 
)
static

Service client's request to set the server's logging level.

Execution Context:
Server service thread.
Parameters
hndClient

Definition at line 147 of file bsProxyRequest.c.

References BS_ECODE_BAD_MSG, BSPROXY_SEND_NMERROR_RSP, BsProxyUnpackReqSetLogging(), ClientSendOkRsp(), and BsProxyReqSetLogging_T::m_level.

Referenced by ServerRequest().

154 {
155  BsProxyReqSetLogging_T msgReq;
156  int rc;
157 
158  //
159  // Unpack client request.
160  //
161  rc = BsProxyUnpackReqSetLogging(bufReq, uReqLen, &msgReq, bTrace);
162 
163  if( rc < 0 )
164  {
165  BSPROXY_SEND_NMERROR_RSP(hndClient, hndVConn, uTid, rc, "MsgId=%u", uMsgId);
166  return -BS_ECODE_BAD_MSG;
167  }
168 
169  //
170  // Execute client request.
171  //
172  LOG_SET_THRESHOLD(msgReq.m_level);
173 
174  //
175  // Send server response.
176  //
177  return ClientSendOkRsp(hndClient, uTid);
178 }
INLINE_IN_H int BsProxyUnpackReqSetLogging(byte_t buf[], size_t uMsgLen, BsProxyReqSetLogging_T *pStruct, bool_t bTrace)
Unpack a BsProxyReqSetLogging ITV message in big-endian byte order from the input buffer...
Definition: bsProxyMsgs.h:495
#define BSPROXY_SEND_NMERROR_RSP(hndClient, hndVConn, uTid, nmecode, efmt,...)
Log NetMsgs (Un)Packing Error and Send Error Response.
Definition: bsProxy.h:348
int ClientSendOkRsp(BsProxyClientHnd_T hndClient, BsTid_T uTid)
Send an ok response to the client.
#define BS_ECODE_BAD_MSG
bad message
Definition: BotSense.h:76
int ServerRequest ( BsProxyClientHnd_T  hndClient,
BsVConnHnd_T  hndVConn,
BsTid_T  uTid,
BsMsgId_T  uMsgId,
byte_t  bufReq[],
size_t  uReqLen 
)

Server service thread request handler.

Execution Context:
Server service thread.
Parameters
hndClient

Definition at line 610 of file bsProxyRequest.c.

References BS_ECODE_UNKNOWN_REQ, BSPROXY_SEND_ERROR_RSP, BsProxyMsgIdReqDevClose, BsProxyMsgIdReqDevOpen, BsProxyMsgIdReqGetVConnInfo, BsProxyMsgIdReqGetVConnList, BsProxyMsgIdReqGetVersion, BsProxyMsgIdReqLoopback, BsProxyMsgIdReqMsgTrace, BsProxyMsgIdReqSetLogging, ClientGetTraceState(), ReqDevClose(), ReqDevOpen(), ReqGetVConnInfo(), ReqGetVConnList(), ReqGetVersion(), ReqLoopback(), ReqMsgTrace(), and ReqSetLogging().

Referenced by ClientSetTraceState(), and ThCreateServerThread().

617 {
618  bool_t bServerTrace = ClientGetTraceState(hndClient);
619 
620  switch( uMsgId )
621  {
623  return ReqLoopback(hndClient, hndVConn, uTid, uMsgId, bufReq, uReqLen,
624  bServerTrace);
625 
627  return ReqSetLogging(hndClient, hndVConn, uTid, uMsgId, bufReq, uReqLen,
628  bServerTrace);
629 
631  return ReqMsgTrace(hndClient, hndVConn, uTid, uMsgId, bufReq, uReqLen,
632  bServerTrace);
633 
635  return ReqGetVersion(hndClient, hndVConn, uTid, uMsgId, bufReq, uReqLen,
636  bServerTrace);
637 
639  return ReqDevOpen(hndClient, hndVConn, uTid, uMsgId, bufReq, uReqLen,
640  bServerTrace);
641 
643  return ReqDevClose(hndClient, hndVConn, uTid, uMsgId, bufReq, uReqLen,
644  bServerTrace);
645 
647  return ReqGetVConnList(hndClient, hndVConn, uTid, uMsgId, bufReq, uReqLen,
648  bServerTrace);
649 
651  return ReqGetVConnInfo(hndClient, hndVConn, uTid, uMsgId, bufReq, uReqLen,
652  bServerTrace);
653 
654  default:
655  BSPROXY_SEND_ERROR_RSP(hndClient, hndVConn, uTid, BS_ECODE_UNKNOWN_REQ,
656  "MsgId=%u", uMsgId);
657  return -BS_ECODE_UNKNOWN_REQ;
658  }
659 }
#define BS_ECODE_UNKNOWN_REQ
unknown request
Definition: BotSense.h:81
static int ReqMsgTrace(BsProxyClientHnd_T hndClient, BsVConnHnd_T hndVConn, BsTid_T uTid, BsMsgId_T uMsgId, byte_t bufReq[], size_t uReqLen, bool_t bTrace)
Service client&#39;s request to set server or client terminated message tracing.
static int ReqGetVersion(BsProxyClientHnd_T hndClient, BsVConnHnd_T hndVConn, BsTid_T uTid, BsMsgId_T uMsgId, byte_t bufReq[], size_t uReqLen, bool_t bTrace)
Service client&#39;s request to get the server&#39;s version.
static int ReqGetVConnInfo(BsProxyClientHnd_T hndClient, BsVConnHnd_T hndVConn, BsTid_T uTid, BsMsgId_T uMsgId, byte_t bufReq[], size_t uReqLen, bool_t bTrace)
Service client&#39;s request to get a virtual connection&#39;s information.
static int ReqGetVConnList(BsProxyClientHnd_T hndClient, BsVConnHnd_T hndVConn, BsTid_T uTid, BsMsgId_T uMsgId, byte_t bufReq[], size_t uReqLen, bool_t bTrace)
Service client&#39;s request to get the list of all of the client&#39;s opened virtual connection handles...
ReqGetVConnInfo.
Definition: bsProxyMsgs.h:51
static int ReqSetLogging(BsProxyClientHnd_T hndClient, BsVConnHnd_T hndVConn, BsTid_T uTid, BsMsgId_T uMsgId, byte_t bufReq[], size_t uReqLen, bool_t bTrace)
Service client&#39;s request to set the server&#39;s logging level.
static int ReqDevClose(BsProxyClientHnd_T hndClient, BsVConnHnd_T hndVConn, BsTid_T uTid, BsMsgId_T uMsgId, byte_t bufReq[], size_t uReqLen, bool_t bTrace)
Service client&#39;s request to close a device virtual connection.
static int ReqDevOpen(BsProxyClientHnd_T hndClient, BsVConnHnd_T hndVConn, BsTid_T uTid, BsMsgId_T uMsgId, byte_t bufReq[], size_t uReqLen, bool_t bTrace)
Service client&#39;s request to open a proxied device virtual connection.
static int ReqLoopback(BsProxyClientHnd_T hndClient, BsVConnHnd_T hndVConn, BsTid_T uTid, BsMsgId_T uMsgId, byte_t bufReq[], size_t uReqLen, bool_t bTrace)
Service client&#39;s request to perform a loopback.
INLINE_IN_H bool_t ClientGetTraceState(BsProxyClientHnd_T hndClient)
Get the <b><i>BotSense</i></b> client&#39;s server-terminated message trace state.
Definition: bsProxy.h:602
#define BSPROXY_SEND_ERROR_RSP(hndClient, hndVConn, uTid, ecode, efmt,...)
Log <b><i>BotSense</i></b> Error and Send Error Response.
Definition: bsProxy.h:330
ReqGetVConnList.
Definition: bsProxyMsgs.h:49