refactored verbosity
[src/app-framework-binder.git] / src / main.c
index f73cfac..37183e7 100644 (file)
  * limitations under the License.
  */
 
-#include <syslog.h>
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <string.h>
+#include <getopt.h>
 #include <setjmp.h>
 #include <signal.h>
-#include <getopt.h>
-#include <pwd.h>
+#include <syslog.h>
+#include <fcntl.h>
 #include <sys/stat.h>
 #include <sys/types.h>
 
+#include "afb-plugin.h"
+
 #include "local-def.h"
+#include "afb-apis.h"
+#include "session.h"
+#include "verbose.h"
 
 #if !defined(PLUGIN_INSTALL_DIR)
 #error "you should define PLUGIN_INSTALL_DIR"
@@ -248,7 +256,7 @@ static void parse_arguments(int argc, char *argv[], AFB_session *session)
     switch (optc)
     {
      case SET_VERBOSE:
-       verbose = 1;
+       verbosity++;
        break;
 
     case SET_TCP_PORT:
@@ -269,19 +277,19 @@ static void parse_arguments(int argc, char *argv[], AFB_session *session)
     case SET_ROOT_DIR:
        if (optarg == 0) goto needValueForOption;
        session->config->rootdir   = optarg;
-       if (verbose) fprintf(stderr, "Forcing Rootdir=%s\n",session->config->rootdir);
+       if (verbosity) fprintf(stderr, "Forcing Rootdir=%s\n",session->config->rootdir);
        break;       
        
     case SET_ROOT_BASE:
        if (optarg == 0) goto needValueForOption;
        session->config->rootbase   = optarg;
-       if (verbose) fprintf(stderr, "Forcing Rootbase=%s\n",session->config->rootbase);
+       if (verbosity) fprintf(stderr, "Forcing Rootbase=%s\n",session->config->rootbase);
        break;
 
     case SET_ROOT_API:
        if (optarg == 0) goto needValueForOption;
        session->config->rootapi   = optarg;
-       if (verbose) fprintf(stderr, "Forcing Rootapi=%s\n",session->config->rootapi);
+       if (verbosity) fprintf(stderr, "Forcing Rootapi=%s\n",session->config->rootapi);
        break;
        
     case SET_ALIAS:
@@ -293,7 +301,7 @@ static void parse_arguments(int argc, char *argv[], AFB_session *session)
             } else {
               aliasdir[aliascount].path = optarg;
               aliasdir[aliascount].len  = strlen(aliasdir[aliascount].url);
-              if (verbose) fprintf(stderr, "Alias url=%s path=%s\n", aliasdir[aliascount].url, aliasdir[aliascount].path);
+              if (verbosity) fprintf(stderr, "Alias url=%s path=%s\n", aliasdir[aliascount].url, aliasdir[aliascount].path);
               aliascount++;
             }
        } else {
@@ -414,6 +422,36 @@ void signalQuit (int signum) {
 }
 
 
+/*----------------------------------------------------------
+ | Error signals
+ |
+ +--------------------------------------------------------- */
+__thread sigjmp_buf *error_handler;
+static void signalError(int signum)
+{
+       sigset_t sigset;
+
+       // unlock signal to allow a new signal to come
+       if (error_handler != NULL) {
+               sigemptyset(&sigset);
+               sigaddset(&sigset, signum);
+               sigprocmask(SIG_UNBLOCK, &sigset, 0);
+               longjmp(*error_handler, signum);
+       }
+}
+
+static void install_error_handlers()
+{
+       int i, signals[] = { SIGALRM, SIGSEGV, SIGFPE, 0 };
+
+       for (i = 0; signals[i] != 0; i++) {
+               if (signal(signals[i], signalError) == SIG_ERR) {
+                       fprintf(stderr, "Signal handler error\n");
+                       exit(1);
+               }
+       }
+}
+
 /*----------------------------------------------------------
  | listenLoop
  |   Main listening HTTP loop
@@ -503,8 +541,6 @@ int main(int argc, char *argv[])  {
   on_exit(closeSession, session);
   parse_arguments(argc, argv, session);
 
-  initPlugins(session);
-
   // ------------------ sanity check ----------------------------------------
   if  ((session->background) && (session->foreground)) {
     fprintf (stderr, "ERR: cannot select foreground & background at the same time\n");
@@ -515,6 +551,13 @@ int main(int argc, char *argv[])  {
      exit (1);
   }
 
+  if (session->config->ldpaths) 
+    afb_apis_add_pathset(session->config->ldpaths);
+
+  ctxStoreInit(CTX_NBCLIENTS, session->config->cntxTimeout, afb_apis_count(), session->config->token);
+
+  install_error_handlers();
+
   // ------------------ Some useful default values -------------------------
   if  ((session->background == 0) && (session->foreground == 0)) session->foreground=1;
 
@@ -539,19 +582,19 @@ int main(int argc, char *argv[])  {
        exit (1);
   }
 #endif
-  if (verbose) fprintf (stderr, "AFB: notice Init config done\n");
+  if (verbosity) fprintf (stderr, "AFB: notice Init config done\n");
 
   // ---- run in foreground mode --------------------
   if (session->foreground) {
 
-        if (verbose) fprintf (stderr,"AFB: notice Foreground mode\n");
+        if (verbosity) fprintf (stderr,"AFB: notice Foreground mode\n");
 
   } // end foreground
 
   // --------- run in background mode -----------
   if (session->background) {
 
-      if (verbose) printf ("AFB: Entering background mode\n");
+      if (verbosity) printf ("AFB: Entering background mode\n");
 
       daemonize(session);
 
@@ -563,7 +606,7 @@ int main(int argc, char *argv[])  {
 
 
   listenLoop(session);
-  if (verbose) printf ("\n---- Application Framework Binder Normal End ------\n");
+  if (verbosity) printf ("\n---- Application Framework Binder Normal End ------\n");
   exit(0);
 
 }