bayonne-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Bayonne-devel] RPC calls on Bayonne


From: Michel Stam
Subject: [Bayonne-devel] RPC calls on Bayonne
Date: Wed, 10 Nov 2004 17:46:10 +0100
User-agent: Mozilla/5.0 (Linux) -- MSIE 6.0 SUCKS

Hello all,

I've been looking at Bayonne (1.2.11 release on a RedHat 7.3 platform using Dialogic SR5.1 SP1 and GlobalCall 3.0) as a platform for my employer for a little while now. As one of the requirements is the possibility of remote viewing of line activity from within some custom software, I started to look into the sunrpc module, since this would meet the requirements nicely. My first attempts with this failed miserably, though, as every RPC call to this module made Bayonne crash horribly (excepting the ping call which is available for all RPC services).

Looking further into the Bayonne source, I figured out that several pointers to strings were used uninitialized. The reason for this is probably that rpcgen does not translate string<32> into char [32] for some reason, but in char*. It may be logical, I'm fairly new to RPC programming here. I fixed this by allocating extra static strings in addition to those allocated for other return parameters.

Patch to make the RPC module work is attached and worked for me. As I worked up the patch for 1.2.11 and tested it there, I cannot tell if it will work on 1.2.12. Applying the patch on 1.2.12 seems to work flawlessly (no messages/rejects whatsoever), so I doubt that it will fail there.

Patch should be applied from within the bayonne-1.2.11 source directory.

Also attached is a utility to list the current line activity.
Compile instructions (execute from within bayonne-1.211/modules/sunrpc):
cc bayonne_cl.c bayonne_xdr.c rpc_calls.c -o rpc_calls

A dump of this utility can be seen in rpc_calls_dump.txt.

This also brings me to my question; The system displayed in this textfile displays the results as in tcp_mon_dump.txt text file when executing the 'calls' command from within the tcp_mon telnet module.

Notice the difference for line 29. The line appears idle from within the tcp_mon module, but the duration is counting. bayonne --status shows a nice row of '-', by the way.

Also note that the system correctly displays active inbound calls. The dumps provided are on an idle system.

Now the system has one physical trunk attached to a Dialogic D/600SC-2E1 board, with the first 15 of its lines configured for inbound only, the other 15 for outbound only.

Line 29 started counting from the first time I executed a script which may dial out on the trunk, using /usr/sbin/bayonne --control start outgoing <script>. This script determines whether it can dialout based on some information from a database, and may just hangup without calling at all. In this case the script has not dialed out at all yet, just executed a query to the database, then hang up (as the criteria to dial out were not met).

Is it possible that I made an error here? Or is something else going on?

If possible, I'd like to suggest some extra fields for the BAYONNE_PORT RPC function call (such as application name, call start date and time, or perhaps a way to retrieve the script symbols via RPC to provide flexibility). I can provide a patch for this too, but I'd like to work on this problem first before adding new features.

Cheers,

Michel Stam
*** modules/sunrpc/bayonne_rpc.h        Thu Feb  5 02:41:58 2004
--- modules/sunrpc/bayonne_rpc.h        Wed Nov 10 17:06:36 2004
***************
*** 40,47 ****
--- 40,50 ----
                int *members_val;
        } members;
  };
  typedef struct bayonne_conf bayonne_conf;
+ #define BAYONNE_POLICY_NAME_SZ 32
+ #define BAYONNE_POLICY_SCHED_SZ 32
+ #define BAYONNE_POLICY_NUMBER_SZ 16
  
  struct bayonne_policy {
        char *pol_name;
        char *pol_sched;
***************
*** 79,86 ****
--- 82,97 ----
        char node_ports;
        char node_stat[255];
  };
  typedef struct bayonne_node bayonne_node;
+ #define BAYONNE_PORT_CALLER_SZ 16
+ #define BAYONNE_PORT_DIALED_SZ 16
+ #define BAYONNE_PORT_NAME_SZ 64
+ #define BAYONNE_PORT_USER_SZ 32
+ #define BAYONNE_PORT_INFO_SZ 8
+ #define BAYONNE_PORT_LANG_SZ 32
+ #define BAYONNE_PORT_GID_SZ 64
+ #define BAYONNE_PORT_POLICY_SZ 32
  
  struct bayonne_port {
        char *port_caller;
        char *port_dialed;
***************
*** 125,132 ****
--- 136,144 ----
  };
  typedef struct bayonne_reserve bayonne_reserve;
  
  typedef char *argv_string;
+ #define BAYONNE_COMMAND_NAME_SZ 32
  
  struct bayonne_command {
        char *mod_name;
        struct {
***************
*** 134,141 ****
--- 146,154 ----
                argv_string *argv_val;
        } argv;
  };
  typedef struct bayonne_command bayonne_command;
+ #define BAYONNE_START_POLICY_SZ 32
  
  struct bayonne_start {
        int port;
        char *policy;
***************
*** 144,151 ****
--- 157,165 ----
                argv_string *argv_val;
        } argv;
  };
  typedef struct bayonne_start bayonne_start;
+ #define BAYONNE_REQUEST_POLICY_SZ 32
  
  struct bayonne_request {
        char *req_policy;
        int req_timeout;
***************
*** 154,161 ****
--- 168,181 ----
                argv_string *argv_val;
        } argv;
  };
  typedef struct bayonne_request bayonne_request;
+ #define BAYONNE_INFO_USER_SZ 32
+ #define BAYONNE_INFO_NODE_SZ 32
+ #define BAYONNE_INFO_VERSION_SZ 16
+ #define BAYONNE_INFO_DRIVER_SZ 16
+ #define BAYONNE_INFO_TOKEN_SZ 2
+ #define BAYONNE_INFO_POLICY_SZ 256
  
  struct bayonne_info {
        char *tgi_user;
        char *tgi_node;
*** modules/sunrpc/bayonne_rpc.x        Wed Aug  7 17:09:55 2002
--- modules/sunrpc/bayonne_rpc.x        Wed Nov 10 17:06:36 2004
***************
*** 26,38 ****
        int limit;
        int members<>;
  };
  
  struct bayonne_policy
  {
!       string pol_name<32>;
!       string pol_sched<32>;
!       string pol_number<16>;
        int pol_active;
        int max_incoming;
        int max_outgoing;
        long tot_incoming;
--- 26,41 ----
        int limit;
        int members<>;
  };
  
+ const BAYONNE_POLICY_NAME_SZ = 32;
+ const BAYONNE_POLICY_SCHED_SZ = 32;
+ const BAYONNE_POLICY_NUMBER_SZ = 16;
  struct bayonne_policy
  {
!       string pol_name<BAYONNE_POLICY_NAME_SZ>;
!       string pol_sched<BAYONNE_POLICY_SCHED_SZ>;
!       string pol_number<BAYONNE_POLICY_NUMBER_SZ>;
        int pol_active;
        int max_incoming;
        int max_outgoing;
        long tot_incoming;
***************
*** 59,76 ****
        char node_ports;
        char node_stat[255];
  };
  
  struct bayonne_port
  {
!       string port_caller<16>;
!       string port_dialed<16>;
!       string port_name<64>;
!       string port_user<32>;
!       string port_info<8>;
!       string port_lang<32>;
!       string port_gid<64>;
!       string port_policy<32>;
        long port_caps;
        long port_duration;
  };
  
--- 62,87 ----
        char node_ports;
        char node_stat[255];
  };
  
+ const BAYONNE_PORT_CALLER_SZ = 16;
+ const BAYONNE_PORT_DIALED_SZ = 16;
+ const BAYONNE_PORT_NAME_SZ = 64;
+ const BAYONNE_PORT_USER_SZ = 32;
+ const BAYONNE_PORT_INFO_SZ = 8;
+ const BAYONNE_PORT_LANG_SZ = 32;
+ const BAYONNE_PORT_GID_SZ = 64;
+ const BAYONNE_PORT_POLICY_SZ = 32;
  struct bayonne_port
  {
!       string port_caller<BAYONNE_PORT_CALLER_SZ>;
!       string port_dialed<BAYONNE_PORT_DIALED_SZ>;
!       string port_name<BAYONNE_PORT_NAME_SZ>;
!       string port_user<BAYONNE_PORT_USER_SZ>;
!       string port_info<BAYONNE_PORT_INFO_SZ>;
!       string port_lang<BAYONNE_PORT_LANG_SZ>;
!       string port_gid<BAYONNE_PORT_GID_SZ>;
!       string port_policy<BAYONNE_PORT_POLICY_SZ>;
        long port_caps;
        long port_duration;
  };
  
***************
*** 101,132 ****
  };
  
  typedef string argv_string<>;
  
  struct bayonne_command {
!       string mod_name<32>;
        argv_string argv<>;
  };
  
  struct bayonne_start {
        int port;
!       string policy<32>;
        argv_string argv<>;
  };
  
  struct bayonne_request {
!       string req_policy<32>;
        int req_timeout;
        argv_string argv<>;
  };
  
  struct bayonne_info {
!       string tgi_user<32>;
!       string tgi_node<32>;
!       string tgi_version<16>;
!       string tgi_driver<16>;
!       string tgi_token<2>;
!       string tgi_policy<256>;
        unsigned nodes;
        unsigned ports;
        unsigned used;
        unsigned mixers;
--- 112,152 ----
  };
  
  typedef string argv_string<>;
  
+ const BAYONNE_COMMAND_NAME_SZ = 32;
  struct bayonne_command {
!       string mod_name<BAYONNE_COMMAND_NAME_SZ>;
        argv_string argv<>;
  };
  
+ const BAYONNE_START_POLICY_SZ = 32;
  struct bayonne_start {
        int port;
!       string policy<BAYONNE_START_POLICY_SZ>;
        argv_string argv<>;
  };
  
+ const BAYONNE_REQUEST_POLICY_SZ = 32;
  struct bayonne_request {
!       string req_policy<BAYONNE_REQUEST_POLICY_SZ>;
        int req_timeout;
        argv_string argv<>;
  };
  
+ const BAYONNE_INFO_USER_SZ = 32;
+ const BAYONNE_INFO_NODE_SZ = 32;
+ const BAYONNE_INFO_VERSION_SZ = 16;
+ const BAYONNE_INFO_DRIVER_SZ = 16;
+ const BAYONNE_INFO_TOKEN_SZ = 2;
+ const BAYONNE_INFO_POLICY_SZ = 256;
  struct bayonne_info {
!       string tgi_user<BAYONNE_INFO_USER_SZ>;
!       string tgi_node<BAYONNE_INFO_NODE_SZ>;
!       string tgi_version<BAYONNE_INFO_VERSION_SZ>;
!       string tgi_driver<BAYONNE_INFO_DRIVER_SZ>;
!       string tgi_token<BAYONNE_INFO_TOKEN_SZ>;
!       string tgi_policy<BAYONNE_INFO_POLICY_SZ>;
        unsigned nodes;
        unsigned ports;
        unsigned used;
        unsigned mixers;
*** modules/sunrpc/bayonne_svc.c        Wed Aug  7 17:09:55 2002
--- modules/sunrpc/bayonne_svc.c        Wed Nov 10 17:06:37 2004
***************
*** 187,203 ****
                svcerr_noproc (transp);
                return;
        }
        memset ((char *)&argument, 0, sizeof (argument));
!       if (!svc_getargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) 
&argument)) {
                svcerr_decode (transp);
                return;
        }
        result = (*local)((char *)&argument, rqstp);
!       if (result != NULL && !svc_sendreply(transp, (xdrproc_t) _xdr_result, 
result)) {
                svcerr_systemerr (transp);
        }
!       if (!svc_freeargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) 
&argument)) {
                fprintf (stderr, "%s", "unable to free arguments");
                exit (1);
        }
        return;
--- 187,203 ----
                svcerr_noproc (transp);
                return;
        }
        memset ((char *)&argument, 0, sizeof (argument));
!       if (!svc_getargs (transp, _xdr_argument, (caddr_t) &argument)) {
                svcerr_decode (transp);
                return;
        }
        result = (*local)((char *)&argument, rqstp);
!       if (result != NULL && !svc_sendreply(transp, _xdr_result, result)) {
                svcerr_systemerr (transp);
        }
!       if (!svc_freeargs (transp, _xdr_argument, (caddr_t) &argument)) {
                fprintf (stderr, "%s", "unable to free arguments");
                exit (1);
        }
        return;
*** modules/sunrpc/bayonne_xdr.c        Wed Aug  7 17:09:55 2002
--- modules/sunrpc/bayonne_xdr.c        Wed Nov 10 17:06:39 2004
***************
*** 43,55 ****
        register int32_t *buf;
  
  
        if (xdrs->x_op == XDR_ENCODE) {
!                if (!xdr_string (xdrs, &objp->pol_name, 32))
                         return FALSE;
!                if (!xdr_string (xdrs, &objp->pol_sched, 32))
                         return FALSE;
!                if (!xdr_string (xdrs, &objp->pol_number, 16))
                         return FALSE;
                buf = XDR_INLINE (xdrs, 6 * BYTES_PER_XDR_UNIT);
                if (buf == NULL) {
                         if (!xdr_int (xdrs, &objp->pol_active))
--- 43,55 ----
        register int32_t *buf;
  
  
        if (xdrs->x_op == XDR_ENCODE) {
!                if (!xdr_string (xdrs, &objp->pol_name, 
BAYONNE_POLICY_NAME_SZ))
                         return FALSE;
!                if (!xdr_string (xdrs, &objp->pol_sched, 
BAYONNE_POLICY_SCHED_SZ))
                         return FALSE;
!                if (!xdr_string (xdrs, &objp->pol_number, 
BAYONNE_POLICY_NUMBER_SZ))
                         return FALSE;
                buf = XDR_INLINE (xdrs, 6 * BYTES_PER_XDR_UNIT);
                if (buf == NULL) {
                         if (!xdr_int (xdrs, &objp->pol_active))
***************
*** 77,89 ****
                        sizeof (int), (xdrproc_t) xdr_int))
                         return FALSE;
                return TRUE;
        } else if (xdrs->x_op == XDR_DECODE) {
!                if (!xdr_string (xdrs, &objp->pol_name, 32))
                         return FALSE;
!                if (!xdr_string (xdrs, &objp->pol_sched, 32))
                         return FALSE;
!                if (!xdr_string (xdrs, &objp->pol_number, 16))
                         return FALSE;
                buf = XDR_INLINE (xdrs, 6 * BYTES_PER_XDR_UNIT);
                if (buf == NULL) {
                         if (!xdr_int (xdrs, &objp->pol_active))
--- 77,89 ----
                        sizeof (int), (xdrproc_t) xdr_int))
                         return FALSE;
                return TRUE;
        } else if (xdrs->x_op == XDR_DECODE) {
!                if (!xdr_string (xdrs, &objp->pol_name, 
BAYONNE_POLICY_NAME_SZ))
                         return FALSE;
!                if (!xdr_string (xdrs, &objp->pol_sched, 
BAYONNE_POLICY_SCHED_SZ))
                         return FALSE;
!                if (!xdr_string (xdrs, &objp->pol_number, 
BAYONNE_POLICY_NUMBER_SZ))
                         return FALSE;
                buf = XDR_INLINE (xdrs, 6 * BYTES_PER_XDR_UNIT);
                if (buf == NULL) {
                         if (!xdr_int (xdrs, &objp->pol_active))
***************
*** 112,124 ****
                         return FALSE;
         return TRUE;
        }
  
!        if (!xdr_string (xdrs, &objp->pol_name, 32))
                 return FALSE;
!        if (!xdr_string (xdrs, &objp->pol_sched, 32))
                 return FALSE;
!        if (!xdr_string (xdrs, &objp->pol_number, 16))
                 return FALSE;
         if (!xdr_int (xdrs, &objp->pol_active))
                 return FALSE;
         if (!xdr_int (xdrs, &objp->max_incoming))
--- 112,124 ----
                         return FALSE;
         return TRUE;
        }
  
!        if (!xdr_string (xdrs, &objp->pol_name, BAYONNE_POLICY_NAME_SZ))
                 return FALSE;
!        if (!xdr_string (xdrs, &objp->pol_sched, BAYONNE_POLICY_SCHED_SZ))
                 return FALSE;
!        if (!xdr_string (xdrs, &objp->pol_number, BAYONNE_POLICY_NUMBER_SZ))
                 return FALSE;
         if (!xdr_int (xdrs, &objp->pol_active))
                 return FALSE;
         if (!xdr_int (xdrs, &objp->max_incoming))
***************
*** 224,246 ****
  xdr_bayonne_port (XDR *xdrs, bayonne_port *objp)
  {
        register int32_t *buf;
  
!        if (!xdr_string (xdrs, &objp->port_caller, 16))
                 return FALSE;
!        if (!xdr_string (xdrs, &objp->port_dialed, 16))
                 return FALSE;
!        if (!xdr_string (xdrs, &objp->port_name, 64))
                 return FALSE;
!        if (!xdr_string (xdrs, &objp->port_user, 32))
                 return FALSE;
!        if (!xdr_string (xdrs, &objp->port_info, 8))
                 return FALSE;
!        if (!xdr_string (xdrs, &objp->port_lang, 32))
                 return FALSE;
!        if (!xdr_string (xdrs, &objp->port_gid, 64))
                 return FALSE;
!        if (!xdr_string (xdrs, &objp->port_policy, 32))
                 return FALSE;
         if (!xdr_long (xdrs, &objp->port_caps))
                 return FALSE;
         if (!xdr_long (xdrs, &objp->port_duration))
--- 224,246 ----
  xdr_bayonne_port (XDR *xdrs, bayonne_port *objp)
  {
        register int32_t *buf;
  
!        if (!xdr_string (xdrs, &objp->port_caller, BAYONNE_PORT_CALLER_SZ))
                 return FALSE;
!        if (!xdr_string (xdrs, &objp->port_dialed, BAYONNE_PORT_DIALED_SZ))
                 return FALSE;
!        if (!xdr_string (xdrs, &objp->port_name, BAYONNE_PORT_NAME_SZ))
                 return FALSE;
!        if (!xdr_string (xdrs, &objp->port_user, BAYONNE_PORT_USER_SZ))
                 return FALSE;
!        if (!xdr_string (xdrs, &objp->port_info, BAYONNE_PORT_INFO_SZ))
                 return FALSE;
!        if (!xdr_string (xdrs, &objp->port_lang, BAYONNE_PORT_LANG_SZ))
                 return FALSE;
!        if (!xdr_string (xdrs, &objp->port_gid, BAYONNE_PORT_GID_SZ))
                 return FALSE;
!        if (!xdr_string (xdrs, &objp->port_policy, BAYONNE_PORT_POLICY_SZ))
                 return FALSE;
         if (!xdr_long (xdrs, &objp->port_caps))
                 return FALSE;
         if (!xdr_long (xdrs, &objp->port_duration))
***************
*** 341,349 ****
  xdr_bayonne_command (XDR *xdrs, bayonne_command *objp)
  {
        register int32_t *buf;
  
!        if (!xdr_string (xdrs, &objp->mod_name, 32))
                 return FALSE;
         if (!xdr_array (xdrs, (char **)&objp->argv.argv_val, (u_int *) 
&objp->argv.argv_len, ~0,
                sizeof (argv_string), (xdrproc_t) xdr_argv_string))
                 return FALSE;
--- 341,349 ----
  xdr_bayonne_command (XDR *xdrs, bayonne_command *objp)
  {
        register int32_t *buf;
  
!        if (!xdr_string (xdrs, &objp->mod_name, BAYONNE_COMMAND_NAME_SZ))
                 return FALSE;
         if (!xdr_array (xdrs, (char **)&objp->argv.argv_val, (u_int *) 
&objp->argv.argv_len, ~0,
                sizeof (argv_string), (xdrproc_t) xdr_argv_string))
                 return FALSE;
***************
*** 356,364 ****
        register int32_t *buf;
  
         if (!xdr_int (xdrs, &objp->port))
                 return FALSE;
!        if (!xdr_string (xdrs, &objp->policy, 32))
                 return FALSE;
         if (!xdr_array (xdrs, (char **)&objp->argv.argv_val, (u_int *) 
&objp->argv.argv_len, ~0,
                sizeof (argv_string), (xdrproc_t) xdr_argv_string))
                 return FALSE;
--- 356,364 ----
        register int32_t *buf;
  
         if (!xdr_int (xdrs, &objp->port))
                 return FALSE;
!        if (!xdr_string (xdrs, &objp->policy, BAYONNE_START_POLICY_SZ))
                 return FALSE;
         if (!xdr_array (xdrs, (char **)&objp->argv.argv_val, (u_int *) 
&objp->argv.argv_len, ~0,
                sizeof (argv_string), (xdrproc_t) xdr_argv_string))
                 return FALSE;
***************
*** 369,377 ****
  xdr_bayonne_request (XDR *xdrs, bayonne_request *objp)
  {
        register int32_t *buf;
  
!        if (!xdr_string (xdrs, &objp->req_policy, 32))
                 return FALSE;
         if (!xdr_int (xdrs, &objp->req_timeout))
                 return FALSE;
         if (!xdr_array (xdrs, (char **)&objp->argv.argv_val, (u_int *) 
&objp->argv.argv_len, ~0,
--- 369,377 ----
  xdr_bayonne_request (XDR *xdrs, bayonne_request *objp)
  {
        register int32_t *buf;
  
!        if (!xdr_string (xdrs, &objp->req_policy, BAYONNE_REQUEST_POLICY_SZ))
                 return FALSE;
         if (!xdr_int (xdrs, &objp->req_timeout))
                 return FALSE;
         if (!xdr_array (xdrs, (char **)&objp->argv.argv_val, (u_int *) 
&objp->argv.argv_len, ~0,
***************
*** 386,404 ****
        register int32_t *buf;
  
  
        if (xdrs->x_op == XDR_ENCODE) {
!                if (!xdr_string (xdrs, &objp->tgi_user, 32))
                         return FALSE;
!                if (!xdr_string (xdrs, &objp->tgi_node, 32))
                         return FALSE;
!                if (!xdr_string (xdrs, &objp->tgi_version, 16))
                         return FALSE;
!                if (!xdr_string (xdrs, &objp->tgi_driver, 16))
                         return FALSE;
!                if (!xdr_string (xdrs, &objp->tgi_token, 2))
                         return FALSE;
!                if (!xdr_string (xdrs, &objp->tgi_policy, 256))
                         return FALSE;
                buf = XDR_INLINE (xdrs, 7 * BYTES_PER_XDR_UNIT);
                if (buf == NULL) {
                         if (!xdr_u_int (xdrs, &objp->nodes))
--- 386,404 ----
        register int32_t *buf;
  
  
        if (xdrs->x_op == XDR_ENCODE) {
!                if (!xdr_string (xdrs, &objp->tgi_user, BAYONNE_INFO_USER_SZ))
                         return FALSE;
!                if (!xdr_string (xdrs, &objp->tgi_node, BAYONNE_INFO_NODE_SZ))
                         return FALSE;
!                if (!xdr_string (xdrs, &objp->tgi_version, 
BAYONNE_INFO_VERSION_SZ))
                         return FALSE;
!                if (!xdr_string (xdrs, &objp->tgi_driver, 
BAYONNE_INFO_DRIVER_SZ))
                         return FALSE;
!                if (!xdr_string (xdrs, &objp->tgi_token, 
BAYONNE_INFO_TOKEN_SZ))
                         return FALSE;
!                if (!xdr_string (xdrs, &objp->tgi_policy, 
BAYONNE_INFO_POLICY_SZ))
                         return FALSE;
                buf = XDR_INLINE (xdrs, 7 * BYTES_PER_XDR_UNIT);
                if (buf == NULL) {
                         if (!xdr_u_int (xdrs, &objp->nodes))
***************
*** 425,443 ****
                        IXDR_PUT_LONG(buf, objp->gid);
                }
                return TRUE;
        } else if (xdrs->x_op == XDR_DECODE) {
!                if (!xdr_string (xdrs, &objp->tgi_user, 32))
                         return FALSE;
!                if (!xdr_string (xdrs, &objp->tgi_node, 32))
                         return FALSE;
!                if (!xdr_string (xdrs, &objp->tgi_version, 16))
                         return FALSE;
!                if (!xdr_string (xdrs, &objp->tgi_driver, 16))
                         return FALSE;
!                if (!xdr_string (xdrs, &objp->tgi_token, 2))
                         return FALSE;
!                if (!xdr_string (xdrs, &objp->tgi_policy, 256))
                         return FALSE;
                buf = XDR_INLINE (xdrs, 7 * BYTES_PER_XDR_UNIT);
                if (buf == NULL) {
                         if (!xdr_u_int (xdrs, &objp->nodes))
--- 425,443 ----
                        IXDR_PUT_LONG(buf, objp->gid);
                }
                return TRUE;
        } else if (xdrs->x_op == XDR_DECODE) {
!                if (!xdr_string (xdrs, &objp->tgi_user, BAYONNE_INFO_USER_SZ))
                         return FALSE;
!                if (!xdr_string (xdrs, &objp->tgi_node, BAYONNE_INFO_NODE_SZ))
                         return FALSE;
!                if (!xdr_string (xdrs, &objp->tgi_version, 
BAYONNE_INFO_VERSION_SZ))
                         return FALSE;
!                if (!xdr_string (xdrs, &objp->tgi_driver, 
BAYONNE_INFO_DRIVER_SZ))
                         return FALSE;
!                if (!xdr_string (xdrs, &objp->tgi_token, 
BAYONNE_INFO_TOKEN_SZ))
                         return FALSE;
!                if (!xdr_string (xdrs, &objp->tgi_policy, 
BAYONNE_INFO_POLICY_SZ))
                         return FALSE;
                buf = XDR_INLINE (xdrs, 7 * BYTES_PER_XDR_UNIT);
                if (buf == NULL) {
                         if (!xdr_u_int (xdrs, &objp->nodes))
***************
*** 465,483 ****
                }
         return TRUE;
        }
  
!        if (!xdr_string (xdrs, &objp->tgi_user, 32))
                 return FALSE;
!        if (!xdr_string (xdrs, &objp->tgi_node, 32))
                 return FALSE;
!        if (!xdr_string (xdrs, &objp->tgi_version, 16))
                 return FALSE;
!        if (!xdr_string (xdrs, &objp->tgi_driver, 16))
                 return FALSE;
!        if (!xdr_string (xdrs, &objp->tgi_token, 2))
                 return FALSE;
!        if (!xdr_string (xdrs, &objp->tgi_policy, 256))
                 return FALSE;
         if (!xdr_u_int (xdrs, &objp->nodes))
                 return FALSE;
         if (!xdr_u_int (xdrs, &objp->ports))
--- 465,483 ----
                }
         return TRUE;
        }
  
!        if (!xdr_string (xdrs, &objp->tgi_user, BAYONNE_INFO_USER_SZ))
                 return FALSE;
!        if (!xdr_string (xdrs, &objp->tgi_node, BAYONNE_INFO_NODE_SZ))
                 return FALSE;
!        if (!xdr_string (xdrs, &objp->tgi_version, BAYONNE_INFO_VERSION_SZ))
                 return FALSE;
!        if (!xdr_string (xdrs, &objp->tgi_driver, BAYONNE_INFO_DRIVER_SZ))
                 return FALSE;
!        if (!xdr_string (xdrs, &objp->tgi_token, BAYONNE_INFO_TOKEN_SZ))
                 return FALSE;
!        if (!xdr_string (xdrs, &objp->tgi_policy, BAYONNE_INFO_POLICY_SZ))
                 return FALSE;
         if (!xdr_u_int (xdrs, &objp->nodes))
                 return FALSE;
         if (!xdr_u_int (xdrs, &objp->ports))
*** modules/sunrpc/calls.cpp    Wed Aug  7 14:26:41 2002
--- modules/sunrpc/calls.cpp    Wed Nov 10 17:06:38 2004
***************
*** 140,154 ****
  bayonne_info *bayonne_query_1_svc(void *, struct svc_req *reqsvc)
  {
        TrunkGroup *grp = getGroup("*");
        static bayonne_info info;
        if(grp)
!               strcpy(info.tgi_policy, grp->getLast("groups"));
!       strcpy(info.tgi_node, keyserver.getNode());
!       strcpy(info.tgi_user, keyserver.getLast("user"));
!       strcpy(info.tgi_token , keyserver.getToken());
!       strcpy(info.tgi_driver, plugins.getDriverName());
!       strcpy(info.tgi_version, getenv("SERVER_VERSION"));
        info.ports = driver->getTrunkCount();
        info.used = driver->getTrunkUsed();
        info.mixers = driver->getMixers();
        info.conferences = driver->getGroups();
--- 140,175 ----
  bayonne_info *bayonne_query_1_svc(void *, struct svc_req *reqsvc)
  {
        TrunkGroup *grp = getGroup("*");
        static bayonne_info info;
+       static char tgi_user[ BAYONNE_INFO_USER_SZ ];
+       static char tgi_node[ BAYONNE_INFO_NODE_SZ ];
+       static char tgi_version[ BAYONNE_INFO_VERSION_SZ ];
+       static char tgi_driver[ BAYONNE_INFO_DRIVER_SZ ];
+       static char tgi_token[ BAYONNE_INFO_TOKEN_SZ ];
+       static char tgi_policy[ BAYONNE_INFO_POLICY_SZ ];
+ 
+       memset( ( void *) &info, 0, sizeof ( bayonne_info ) );
+       memset( ( void *) tgi_user, 0, BAYONNE_INFO_USER_SZ );
+       memset( ( void *) tgi_node, 0, BAYONNE_INFO_NODE_SZ );
+       memset( ( void *) tgi_version, 0, BAYONNE_INFO_VERSION_SZ );
+       memset( ( void *) tgi_driver, 0, BAYONNE_INFO_DRIVER_SZ );
+       memset( ( void *) tgi_token, 0, BAYONNE_INFO_TOKEN_SZ );
+       memset( ( void *) tgi_policy, 0, BAYONNE_INFO_POLICY_SZ );
+       info.tgi_policy = tgi_policy;
+       info.tgi_node = tgi_node;
+       info.tgi_user = tgi_user;
+       info.tgi_token = tgi_token;
+       info.tgi_driver = tgi_driver;
+       info.tgi_version = tgi_version;
+       
        if(grp)
!        strncpy(info.tgi_policy, grp->getLast("groups"), 
BAYONNE_INFO_POLICY_SZ );
!       strncpy(info.tgi_node, keyserver.getNode(), BAYONNE_INFO_NODE_SZ );
!       strncpy(info.tgi_user, keyserver.getLast("user"), BAYONNE_INFO_USER_SZ 
);
!       strncpy(info.tgi_token , keyserver.getToken(), BAYONNE_INFO_TOKEN_SZ );
!       strncpy(info.tgi_driver, plugins.getDriverName(), 
BAYONNE_INFO_DRIVER_SZ );
!       strncpy(info.tgi_version, getenv("SERVER_VERSION"), 
BAYONNE_INFO_VERSION_SZ );
        info.ports = driver->getTrunkCount();
        info.used = driver->getTrunkUsed();
        info.mixers = driver->getMixers();
        info.conferences = driver->getGroups();
***************
*** 362,396 ****
  }
  
  bayonne_policy *bayonne_policy_1_svc(char **name, struct svc_req *req)
  {
!       static char schedule[32];
        static bayonne_policy policy;
        static int *ports = NULL;
        TrunkGroup *pol = getGroup(*name);
        int count = driver->getTrunkCount();
        int id;
  
        if(!ports)
                ports = new int[count];
  
        policy.pol_members = 0;
        policy.pol_ports.pol_ports_len = 0;
        policy.pol_ports.pol_ports_val = ports;
-       policy.pol_sched = "";
-       policy.pol_name = "";
-       policy.pol_number = "";
        policy.pol_active = 0;
        policy.max_incoming = policy.max_outgoing = 0;
        policy.tot_incoming = policy.tot_outgoing = 0;
  
        if(!pol)
                return &policy;
  
!       pol->getSchedule(schedule);
!       policy.pol_sched = schedule;
!       policy.pol_name = (char *)pol->getLast("name");
!       policy.pol_number = (char *)pol->getLast("number");
  
        for(id = 0; id < count; ++id)
        {
                if(driver->getTrunkGroup(id) != pol)
--- 383,423 ----
  }
  
  bayonne_policy *bayonne_policy_1_svc(char **name, struct svc_req *req)
  {
!       static char pol_name[ BAYONNE_POLICY_NAME_SZ ];
!       static char pol_sched[ BAYONNE_POLICY_SCHED_SZ ];
!       static char pol_number[ BAYONNE_POLICY_NUMBER_SZ ];
        static bayonne_policy policy;
        static int *ports = NULL;
        TrunkGroup *pol = getGroup(*name);
        int count = driver->getTrunkCount();
        int id;
  
+       memset( ( void *) &policy, 0, sizeof ( bayonne_policy ) );
+       memset( ( void *) pol_name, 0, BAYONNE_POLICY_NAME_SZ );
+       memset( ( void *) pol_sched, 0, BAYONNE_POLICY_SCHED_SZ );
+       memset( ( void *) pol_number, 0, BAYONNE_POLICY_NUMBER_SZ );
+       policy.pol_name = pol_name;
+       policy.pol_sched = pol_sched;
+       policy.pol_number = pol_number;
+ 
        if(!ports)
                ports = new int[count];
  
        policy.pol_members = 0;
        policy.pol_ports.pol_ports_len = 0;
        policy.pol_ports.pol_ports_val = ports;
        policy.pol_active = 0;
        policy.max_incoming = policy.max_outgoing = 0;
        policy.tot_incoming = policy.tot_outgoing = 0;
  
        if(!pol)
                return &policy;
  
!       pol->getSchedule( policy.pol_sched );
!       strncpy( policy.pol_name, (char *)pol->getLast("name"), 
BAYONNE_POLICY_NAME_SZ );
!       strncpy( policy.pol_number, (char *)pol->getLast("number"), 
BAYONNE_POLICY_NUMBER_SZ );
  
        for(id = 0; id < count; ++id)
        {
                if(driver->getTrunkGroup(id) != pol)
***************
*** 408,463 ****
  }
  bayonne_port *bayonne_port_1_svc(int *id, struct svc_req *req)
  {
        static bayonne_port port;
        Trunk *trunk = driver->getTrunkPort(*id);
        char *cp;
        
!       port.port_caller = "";
!       port.port_dialed = "";
!       port.port_name = "";
!       port.port_user = "";
!       port.port_info = "";
!       port.port_lang = "";
!       port.port_gid = "";
!       port.port_policy = "";
        port.port_caps = 0;
        port.port_duration = 0;
  
        if(!trunk)
                return &port;
  
        cp = trunk->getSymbol(SYM_CALLER);
        if(cp)
!               port.port_caller = cp;
  
        cp = trunk->getSymbol(SYM_DIALED);
        if(cp)
!               port.port_dialed = cp;
  
        cp = trunk->getSymbol(SYM_NAME);
        if(cp)
!               port.port_name = cp;
  
        cp = trunk->getSymbol(SYM_USER);
        if(cp)
!               port.port_user = cp;
  
        cp = trunk->getSymbol(SYM_INFODIGITS);
        if(cp)
!               port.port_info = cp;
  
        cp = trunk->getSymbol(SYM_LANGUAGE);
        if(cp)
!               port.port_lang = cp;
  
        cp = trunk->getSymbol(SYM_GID);
        if(cp)
!               port.port_gid = cp;
  
        cp = trunk->getSymbol(SYM_POLICY);
        if(cp)
!               port.port_policy = cp;
  
        cp = trunk->getSymbol(SYM_DURATION);
        if(cp)
                port.port_duration = atol(cp);
--- 435,507 ----
  }
  bayonne_port *bayonne_port_1_svc(int *id, struct svc_req *req)
  {
        static bayonne_port port;
+       static char port_caller[ BAYONNE_PORT_CALLER_SZ ];
+       static char port_dialed[ BAYONNE_PORT_DIALED_SZ ];
+       static char port_name[ BAYONNE_PORT_NAME_SZ ];
+       static char port_user[ BAYONNE_PORT_USER_SZ ];
+       static char port_info[ BAYONNE_PORT_INFO_SZ ];
+       static char port_lang[ BAYONNE_PORT_LANG_SZ ];
+       static char port_gid[ BAYONNE_PORT_GID_SZ ];
+       static char port_policy[ BAYONNE_PORT_POLICY_SZ ];
        Trunk *trunk = driver->getTrunkPort(*id);
        char *cp;
        
!       memset( ( void *) &port, 0, sizeof ( bayonne_port ) );
!       memset( ( void *) port_caller, 0, BAYONNE_PORT_CALLER_SZ );
!       memset( ( void *) port_dialed, 0, BAYONNE_PORT_CALLER_SZ );
!       memset( ( void *) port_name, 0, BAYONNE_PORT_NAME_SZ );
!       memset( ( void *) port_user, 0, BAYONNE_PORT_USER_SZ );
!       memset( ( void *) port_info, 0, BAYONNE_PORT_INFO_SZ );
!       memset( ( void *) port_lang, 0, BAYONNE_PORT_LANG_SZ );
!       memset( ( void *) port_gid, 0, BAYONNE_PORT_GID_SZ );
!       memset( ( void *) port_policy, 0, BAYONNE_PORT_POLICY_SZ );
!       port.port_caller = port_caller;
!       port.port_dialed = port_dialed;
!       port.port_name = port_name;
!       port.port_user = port_user;
!       port.port_info = port_info;
!       port.port_lang = port_lang;
!       port.port_gid = port_gid;
!       port.port_policy = port_policy;
        port.port_caps = 0;
        port.port_duration = 0;
  
        if(!trunk)
                return &port;
  
        cp = trunk->getSymbol(SYM_CALLER);
        if(cp)
!               strncpy( port.port_caller, cp, BAYONNE_PORT_CALLER_SZ );
  
        cp = trunk->getSymbol(SYM_DIALED);
        if(cp)
!               strncpy( port.port_dialed, cp, BAYONNE_PORT_DIALED_SZ );
  
        cp = trunk->getSymbol(SYM_NAME);
        if(cp)
!               strncpy( port.port_name, cp, BAYONNE_PORT_NAME_SZ );
  
        cp = trunk->getSymbol(SYM_USER);
        if(cp)
!               strncpy( port.port_user, cp, BAYONNE_PORT_USER_SZ );
  
        cp = trunk->getSymbol(SYM_INFODIGITS);
        if(cp)
!               strncpy( port.port_info, cp, BAYONNE_PORT_INFO_SZ );
  
        cp = trunk->getSymbol(SYM_LANGUAGE);
        if(cp)
!               strncpy( port.port_lang, cp, BAYONNE_PORT_LANG_SZ );
  
        cp = trunk->getSymbol(SYM_GID);
        if(cp)
!               strncpy( port.port_gid, cp, BAYONNE_PORT_GID_SZ );
  
        cp = trunk->getSymbol(SYM_POLICY);
        if(cp)
!               strncpy( port.port_policy, cp, BAYONNE_PORT_POLICY_SZ );
  
        cp = trunk->getSymbol(SYM_DURATION);
        if(cp)
                port.port_duration = atol(cp);
#include <stdio.h>
#include <rpc/rpc.h>
#include <sys/time.h>
#include "bayonne_rpc.h"

int main( int argc, char *argv[] )
{
        CLIENT*                 pcliConnection;
        struct timeval          stvTimeout;
        bayonne_port*           pbpResult;
        int                     iCount;

        stvTimeout.tv_sec =  23;
        stvTimeout.tv_usec = 0;
        pcliConnection = NULL;
        pcliConnection = clnt_create( "localhost", BAYONNE_PROGRAM, 
BAYONNE_VERSION, "udp" );

        if ( pcliConnection == NULL )
        {
                printf( "CLNT_CREATE %s\n", clnt_spcreateerror( "" ) );
                exit( 1 );
        }

        if ( !clnt_control( pcliConnection, CLSET_TIMEOUT, ( char *) 
&stvTimeout ) )
        {
                printf( "CLNT_CONTROL: %s\n", clnt_sperror( pcliConnection, "" 
) );
                clnt_destroy( pcliConnection );
                exit( 1 );
        }

        printf( "%-4.4s %-16.16s %-16.16s %-8.8s %-8.8s %-8.8s %-8.8s %-16.16s 
%-6.6s %-12.12s %-8.8s\n",
                "Port",
                "ANI",
                "DNIS",
                "Name",
                "User",
                "Info",
                "Language",
                "GUID",
                "Policy",
                "Capabilities",
                "Duration" );
        printf( "%-4.4s %-16.16s %-16.16s %-8.8s %-8.8s %-8.8s %-8.8s %-16.16s 
%-6.6s %-12.12s %-8.8s\n",
                "----",
                "---",
                "----",
                "----",
                "----",
                "----",
                "--------",
                "----",
                "------",
                "------------",
                "--------" );
        for ( iCount = 0; iCount < 60; iCount ++ )
        {
                pbpResult = bayonne_port_1( &iCount, pcliConnection );
                if ( pbpResult == NULL )
                {
                        printf( "RPC CALL: %s\n", clnt_sperror( pcliConnection, 
"" ) );
                        clnt_destroy( pcliConnection );
                        exit( 1 );
                }

                printf( "%-4.1i %-16.16s %-16.16s %-8.8s %-8.8s %-8.8s %-8.8s 
%-16.16s %-6.6s %12.1li %8.1li\n",
                        iCount,
                        pbpResult->port_caller,
                        pbpResult->port_dialed,
                        pbpResult->port_name,
                        pbpResult->port_user,
                        pbpResult->port_info,
                        pbpResult->port_lang,
                        pbpResult->port_gid,
                        pbpResult->port_policy,
                        pbpResult->port_caps,
                        pbpResult->port_duration );
        }

        printf( "%s", "\n" );

        clnt_destroy( pcliConnection );
        exit( 0 );
}
Port ANI              DNIS             Name     User     Info     Language GUID 
            Policy Capabilities Duration
---- ---              ----             ----     ----     ----     -------- ---- 
            ------ ------------ --------
0                                               root                            
                              3        0
1                                               root                            
                              3        0
2                                               root                            
                              3        0
3                                               root                            
                              3        0
4                                               root                            
                              3        0
5                                               root                            
                              3        0
6                                               root                            
                              3        0
7                                               root                            
                              3        0
8                                               root                            
                              3        0
9                                               root                            
                              3        0
10                                              root                            
                              3        0
11                                              root                            
                              3        0
12                                              root                            
                              3        0
13                                              root                            
                              3        0
14                                              root                            
                              3        0
15                                              root                            
                              3        0
16                                              root                            
                              3        0
17                                              root                            
                              3        0
18                                              root                            
                              3        0
19                                              root                            
                              3        0
20                                              root                            
                              3        0
21                                              root                            
                              3        0
22                                              root                            
                              3        0
23                                              root                            
                              3        0
24                                              root                            
                              3        0
25                                              root                            
                              3        0
26                                              root                            
                              3        0
27                                              root                            
                              3        0
28                                              root                            
                              3        0
29                                              root                            
                              3     5420
30                                              root                            
                              3        0
31                                              root                            
                              3        0
32                                              root                            
                              3        0
33                                              root                            
                              3        0
34                                              root                            
                              3        0
35                                              root                            
                              3        0
36                                              root                            
                              3        0
37                                              root                            
                              3        0
38                                              root                            
                              3        0
39                                              root                            
                              3        0
40                                              root                            
                              3        0
41                                              root                            
                              3        0
42                                              root                            
                              3        0
43                                              root                            
                              3        0
44                                              root                            
                              3        0
45                                              root                            
                              3        0
46                                              root                            
                              3        0
47                                              root                            
                              3        0
48                                              root                            
                              3        0
49                                              root                            
                              3        0
50                                              root                            
                              3        0
51                                              root                            
                              3        0
52                                              root                            
                              3        0
53                                              root                            
                              3        0
54                                              root                            
                              3        0
55                                              root                            
                              3        0
56                                              root                            
                              3        0
57                                              root                            
                              3        0
58                                              root                            
                              3        0
59                                              root                            
                              3        0

nl# calls
*: dx(0) idle
*: dx(1) idle
*: dx(2) idle
*: dx(3) idle
*: dx(4) idle
*: dx(5) idle
*: dx(6) idle
*: dx(7) idle
*: dx(8) idle
*: dx(9) idle
*: dx(10) idle
*: dx(11) idle
*: dx(12) idle
*: dx(13) idle
*: dx(14) idle
*: dx(15) idle
outgoing: dx(16) idle
outgoing: dx(17) idle
outgoing: dx(18) idle
outgoing: dx(19) idle
outgoing: dx(20) idle
outgoing: dx(21) idle
outgoing: dx(22) idle
outgoing: dx(23) idle
outgoing: dx(24) idle
outgoing: dx(25) idle
outgoing: dx(26) idle
outgoing: dx(27) idle
outgoing: dx(28) idle
outgoing: dx(29) idle
*: dx(30) idle
*: dx(31) idle
*: dx(32) idle
*: dx(33) idle
*: dx(34) idle
*: dx(35) idle
*: dx(36) idle
*: dx(37) idle
*: dx(38) idle
*: dx(39) idle
*: dx(40) idle
*: dx(41) idle
*: dx(42) idle
*: dx(43) idle
*: dx(44) idle
*: dx(45) idle
*: dx(46) idle
*: dx(47) idle
*: dx(48) idle
*: dx(49) idle
*: dx(50) idle
*: dx(51) idle
*: dx(52) idle
*: dx(53) idle
*: dx(54) idle
*: dx(55) idle
*: dx(56) idle
*: dx(57) idle
*: dx(58) idle
*: dx(59) idle
END/command

reply via email to

[Prev in Thread] Current Thread [Next in Thread]