File 0006-Reflect-provider-information-in-ps-via-argv.patch of Package sblim-sfcb

From 48cd38bd8ca5de5a524a9cb44f3939415e754bf9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Klaus=20K=C3=A4mpf?= <kkaempf@suse.de>
Date: Thu, 8 Mar 2012 14:34:41 +0100
Subject: [PATCH] Reflect provider information in 'ps' via argv

This patch changes the argv[] buffer to contain provider information
(provider name, location and class name) making it easier to debug
misbehaving providers.
Set
  argvDebug: true
in sfcb.cfg to enable this.
---
 control.c       |    1 +
 providerDrv.c   |   39 +++++++++++++++++++++++++++++++++++++++
 sfcBroker.c     |    6 ++++++
 sfcb.cfg.pre.in |    5 +++++
 4 files changed, 51 insertions(+), 0 deletions(-)

diff -wruN -x '*~' ../orig-sblim-sfcb-1.3.14/control.c ./control.c
--- ../orig-sblim-sfcb-1.3.14/control.c	2012-03-30 19:56:41.000000000 +0200
+++ ./control.c	2012-04-03 09:30:45.000000000 +0200
@@ -61,6 +61,7 @@
 // { property, type, value}
 // Type: 0=string, 1=num, 2=bool, 3=unstripped string
 Control init[] = {
+   {"argvDebug",        2, "false"},
    {"httpPort",         1, "5988"},
    {"enableHttp",       2, "true"},
    {"enableUds",        2, "true"},
diff -wruN -x '*~' ../orig-sblim-sfcb-1.3.14/providerDrv.c ./providerDrv.c
--- ../orig-sblim-sfcb-1.3.14/providerDrv.c	2012-03-31 01:15:00.000000000 +0200
+++ ./providerDrv.c	2012-04-03 09:30:45.000000000 +0200
@@ -894,6 +894,42 @@
    _SFCB_RETURN(-1);
 }
 
+static int *origArgcPtr;
+static char ***origArgvPtr;
+void passOrigArgPtrs(int *argc, char ***argv)
+{
+  origArgcPtr = argc;
+  origArgvPtr = argv;
+}
+
+/* Reflect provider in argv (restartArgv) for 'ps'
+ * if argvDebug=true in sfcb.conf
+ */
+  
+void providerStarted(ProviderInfo * info)
+{
+  char **argv;
+  char *ptr;
+
+  if (origArgvPtr == NULL)
+    return; /* disabled in conf */
+
+  argv = *origArgvPtr;
+  ptr = argv[0];
+  
+  argv[0] = strcpy(ptr,"sfcbd "); ptr += (strlen(argv[0]));
+  argv[1] = strcpy(ptr,"provider:"); ptr += (strlen(argv[1]));
+  argv[2] = strcpy(ptr,info->providerName); ptr += (strlen(argv[2]));
+  argv[3] = strcpy(ptr," -class:"); ptr += (strlen(argv[3]));
+  argv[4] = strcpy(ptr,info->className); ptr += (strlen(argv[4]));
+  argv[5] = strcpy(ptr," -location:"); ptr += (strlen(argv[5]));
+  argv[6] = strcpy(ptr,info->location); ptr += (strlen(argv[6]));
+//  *origArgvPtr = argv;
+  *origArgcPtr = 7;
+
+  fprintf(stderr, "Provider %s started for %s from %s\n", info->providerName, info->className, info->location);
+}
+
 // I think we should break this function into two subfunctions:
 // something like isLoaded() and doForkProvider()
 int forkProvider(ProviderInfo * info, OperationHdr * req, char **msg)
@@ -946,6 +982,8 @@
       BinRequestContext binCtx;
       BinResponseHdr *resp;
 
+      providerStarted(info);
+
       memset(&binCtx,0,sizeof(BinRequestContext));
       sreq.className = setCharsMsgSegment(info->className);
       sreq.libName = setCharsMsgSegment(info->location);
diff -wruN -x '*~' ../orig-sblim-sfcb-1.3.14/sfcb.cfg.pre.in ./sfcb.cfg.pre.in
--- ../orig-sblim-sfcb-1.3.14/sfcb.cfg.pre.in	2012-03-29 17:39:33.000000000 +0200
+++ ./sfcb.cfg.pre.in	2012-04-03 09:30:45.000000000 +0200
@@ -11,6 +11,11 @@
 ## Use '#' at the start of a line to comment
 ## 
 
+##--- Debug ---
+## Show provider information via argv, viewable in 'ps' output
+## Default: false
+argvDebug: true
+
 ##------------------------------------- HTTP ----------------------------------
 ## Enable HTTP. 
 ## Default is true. If HTTPS is configured, default is false.
diff -wruN -x '*~' ../orig-sblim-sfcb-1.3.14/sfcBroker.c ./sfcBroker.c
--- ../orig-sblim-sfcb-1.3.14/sfcBroker.c	2012-03-05 20:12:09.000000000 +0100
+++ ./sfcBroker.c	2012-04-03 09:30:45.000000000 +0200
@@ -556,6 +556,8 @@
     exit(0);
 }
 
+extern void passOrigArgPtrs(int *argc, char ***argv);
+
 int main(int argc, char *argv[])
 {
    int c, i;
@@ -565,6 +567,7 @@
    int enableUds=0;
 #endif
    int enableHttp=0,enableHttps=0,useChunking=0,doBa=0,enableInterOp=0,httpLocalOnly=0;
+   int argvDebug = 0;
    int syslogLevel=LOG_ERR;
    long dSockets,sSockets,pSockets;
    char *pauseStr;
@@ -731,6 +734,9 @@
      printf("--- Provider pausing for: %s\n",pauseStr);
    }
       
+   if (getControlBool("argvDebug", &argvDebug) == 0)
+       passOrigArgPtrs(&argc, &argv);
+
    if (getControlBool("enableHttp", &enableHttp))
       enableHttp=1;