refactored verbosity
authorJosé Bollo <jose.bollo@iot.bzh>
Tue, 5 Apr 2016 08:07:55 +0000 (10:07 +0200)
committerJosé Bollo <jose.bollo@iot.bzh>
Tue, 5 Apr 2016 08:07:55 +0000 (10:07 +0200)
Change-Id: Ibbf6645fbf1149687be9a7475773685cfb06b514
Signed-off-by: José Bollo <jose.bollo@iot.bzh>
12 files changed:
include/afb-plugin.h
plugins/afm-main-plugin/afm-main-plugin.c
src/CMakeLists.txt
src/afb-apis.c
src/afb-hreq.c
src/helper-api.c [deleted file]
src/http-svc.c
src/local-def.h
src/main.c
src/proto-def.h
src/verbose.c [new file with mode: 0644]
src/verbose.h [new file with mode: 0644]

index f2f4d6e..88938e3 100644 (file)
@@ -72,7 +72,7 @@ typedef struct AFB_plugin AFB_plugin;
 
 struct AFB_interface
 {
-       int verbose;
+       int verbosity;
        enum AFB_Mode mode;
 };
 
index fbf5b59..d86e926 100644 (file)
@@ -73,7 +73,7 @@ static struct json_object *embed(const char *tag, struct json_object *obj)
 static void embed_call_void(struct afb_req request, const char *method)
 {
        struct json_object *obj = jbus_call_sj_sync(jbus, method, "true");
-       if (interface->verbose)
+       if (interface->verbosity)
                fprintf(stderr, "(afm-main-plugin) %s(true) -> %s\n", method, obj ? json_object_to_json_string(obj) : "NULL");
        if (obj == NULL) {
                afb_req_fail(request, "failed", "framework daemon failure");
@@ -101,7 +101,7 @@ static void call_appid(struct afb_req request, const char *method)
                return;
        }
        obj = jbus_call_sj_sync(jbus, method, sid);
-       if (interface->verbose)
+       if (interface->verbosity)
                fprintf(stderr, "(afm-main-plugin) %s(%s) -> %s\n", method, sid, obj ? json_object_to_json_string(obj) : "NULL");
        free(sid);
        if (obj == NULL) {
@@ -120,7 +120,7 @@ static void call_runid(struct afb_req request, const char *method)
                return;
        }
        obj = jbus_call_sj_sync(jbus, method, id);
-       if (interface->verbose)
+       if (interface->verbosity)
                fprintf(stderr, "(afm-main-plugin) %s(%s) -> %s\n", method, id,
                                obj ? json_object_to_json_string(obj) : "NULL");
        if (obj == NULL) {
@@ -171,7 +171,7 @@ static void start(struct afb_req request)
 
        /* calls the service */
        obj = jbus_call_sj_sync(jbus, _start_, query);
-       if (interface->verbose)
+       if (interface->verbosity)
                fprintf(stderr, "(afm-main-plugin) start(%s) -> %s\n", query, obj ? json_object_to_json_string(obj) : "NULL");
        free(query);
 
@@ -234,7 +234,7 @@ static void install(struct afb_req request)
        }
 
        obj = jbus_call_sj_sync(jbus, _install_, query);
-       if (interface->verbose)
+       if (interface->verbosity)
                fprintf(stderr, "(afm-main-plugin) install(%s) -> %s\n", query, obj ? json_object_to_json_string(obj) : "NULL");
        free(query);
 
index 9ddb511..7e02578 100644 (file)
@@ -8,7 +8,7 @@ ADD_LIBRARY(src OBJECT
        afb-hreq.c
        afb-websock.c
        websock.c
-       helper-api.c)
+       verbose.c)
 
 INCLUDE_DIRECTORIES(${include_dirs})
 
index 735649c..7634dca 100644 (file)
@@ -43,6 +43,7 @@
 #include "afb-req-itf.h"
 #include "session.h"
 #include "afb-apis.h"
+#include "verbose.h"
 
 struct api_desc {
        struct AFB_plugin *plugin;      /* descriptor */
@@ -97,7 +98,7 @@ int afb_apis_add_plugin(const char *path)
                fprintf(stderr, "[%s] not an AFB plugin, continuing...\n", path);
                goto error2;
        }
-       if (verbose)
+       if (verbosity)
                fprintf(stderr, "[%s] is a valid AFB plugin\n", path);
 
        /* allocates enough memory */
@@ -114,7 +115,7 @@ int afb_apis_add_plugin(const char *path)
                fprintf(stderr, "ERROR: plugin [%s] memory missing. continuing...\n", path);
                goto error2;
        }
-       interface->verbose = 0;
+       interface->verbosity = 0;
        interface->mode = AFB_MODE_LOCAL;
 
        /* init the plugin */
@@ -151,7 +152,7 @@ int afb_apis_add_plugin(const char *path)
        }
 
        /* record the plugin */
-       if (verbose)
+       if (verbosity)
                fprintf(stderr, "Loading plugin[%lu] prefix=[%s] info=%s\n", (unsigned long)apis_count, plugin->prefix, plugin->info);
        apis = &apis_array[apis_count];
        apis->plugin = plugin;
@@ -184,7 +185,7 @@ static int adddirs(char path[PATH_MAX], size_t end)
                fprintf(stderr, "ERROR in scanning plugin directory %s, %m\n", path);
                return -1;
        }
-       if (verbose)
+       if (verbosity)
                fprintf(stderr, "Scanning dir=[%s] for plugins\n", path);
 
        /* scan each entry */
index 16c235a..b4fe292 100644 (file)
@@ -32,6 +32,7 @@
 #include "afb-req-itf.h"
 #include "afb-hreq.h"
 #include "session.h"
+#include "verbose.h"
 
 #define SIZE_RESPONSE_BUFFER   8000
 
@@ -269,7 +270,7 @@ int afb_hreq_reply_file_if_exist(struct afb_hreq *hreq, int dirfd, const char *f
        if (inm && 0 == strcmp(inm, etag)) {
                /* etag ok, return NOT MODIFIED */
                close(fd);
-               if (verbose)
+               if (verbosity)
                        fprintf(stderr, "Not Modified: [%s]\n", filename);
                response = MHD_create_response_from_buffer(0, empty_string, MHD_RESPMEM_PERSISTENT);
                status = MHD_HTTP_NOT_MODIFIED;
@@ -319,7 +320,7 @@ int afb_hreq_redirect_to(struct afb_hreq *hreq, const char *url)
        MHD_add_response_header(response, MHD_HTTP_HEADER_LOCATION, url);
        MHD_queue_response(hreq->connection, MHD_HTTP_MOVED_PERMANENTLY, response);
        MHD_destroy_response(response);
-       if (verbose)
+       if (verbosity)
                fprintf(stderr, "redirect from [%s] to [%s]\n", hreq->url, url);
        return 1;
 }
diff --git a/src/helper-api.c b/src/helper-api.c
deleted file mode 100644 (file)
index 9d1ec0b..0000000
+++ /dev/null
@@ -1,312 +0,0 @@
-/*
- * Copyright (C) 2015 "IoT.bzh"
- * Author "Fulup Ar Foll"
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- * 
- */
-
-#define _GNU_SOURCE
-
-#include <stdio.h>
-#include <stdarg.h>
-#include <string.h>
-
-/*
-#include <dirent.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-*/
-
-#include "local-def.h"
-#include "afb-req-itf.h"
-
-// handle to hold queryAll values
-typedef struct {
-     char    *msg;
-     size_t  idx;
-     size_t  len;
-} queryHandleT;
-
-// Error code are requested through function to manage json usage count
-typedef struct {
-  int   level;
-  const char* label;
-  json_object *json;
-} AFB_errorT;
-
-static AFB_errorT   AFBerr [AFB_UNAUTH+1];
-static json_object *jTypeStatic;
-
-PUBLIC int verbose;
-
-static const char *ERROR_LABEL[] = {"false", "true", "fatal", "fail", "warning", "empty", "success", "done", "unauth"};
-
-
-// Helper to retrieve argument from  connection
-const char* getQueryValue(const AFB_request * request, const char *name) {
-    return afb_req_argument(*request->areq, name);
-}
-
-static int getQueryCB (queryHandleT *query, struct afb_arg arg) {
-    if (query->idx >= query->len)
-       return 0;
-    query->idx += (unsigned)snprintf (&query->msg[query->idx], query->len-query->idx, " %s: %s\'%s\',", arg.name, arg.is_file?"FILE=":"", arg.value);
-    return 1; /* continue to iterate */
-}
-
-// Helper to retrieve argument from  connection
-size_t getQueryAll(AFB_request * request, char *buffer, size_t len) {
-    queryHandleT query;
-    buffer[0] = '\0'; // start with an empty string
-    query.msg = buffer;
-    query.len = len;
-    query.idx = 0;
-
-    afb_req_iterate(*request->areq, (void*)getQueryCB, &query);
-    buffer[len-1] = 0;
-    return query.idx >= len ? len - 1 : query.idx;
-}
-
-#if 0
-char* getPostPath (AFB_request *request) {
-    AFB_PostHandle *postHandle = getPostHandle(request);
-    AFB_PostCtx *postFileCtx;
-    
-    if (postHandle == NULL) return NULL;
-    
-    postFileCtx = (AFB_PostCtx*) postHandle->ctx;
-    if (postFileCtx == NULL) return NULL;
-  
-    return (postFileCtx->path);
-}
-
-json_object* getPostFile (AFB_request *request, AFB_PostItem *item, char* destination) {
-
-    AFB_PostHandle *postHandle = getPostHandle(request);
-    AFB_PostCtx *postFileCtx;
-    char filepath[512];
-    ssize_t len;
-            
-    // This is called after PostForm and then after DonePostForm
-    if (item == NULL) {
-        json_object* jresp;
-        postFileCtx = (AFB_PostCtx*) postHandle->ctx;
-        
-        // No Post Application Context [something really bad happen]
-        if (postFileCtx == NULL) {
-            request->errcode = MHD_HTTP_EXPECTATION_FAILED;
-            return(jsonNewMessage(AFB_FAIL,"Error: PostForm no PostContext to free\n"));          
-        }
-        
-        // We have a context but last Xform iteration fail or application set a message
-        if (request->jresp != NULL) {
-            jresp = request->jresp;  // retrieve previous error from postCtx
-        } else jresp = jsonNewMessage(AFB_SUCCESS,"getPostFile Post Request done");
-        
-        // Error or not let's free all resources
-        close(postFileCtx->fd);
-        free (postFileCtx->path);
-        free (postFileCtx);
-        return (jresp);  
-    }
-#if defined(PLEASE_FIX_ME_THE_ERROR_IS_postFileCtx_NOT_INITIALIZED)
-    // Make sure it's a valid PostForm request
-    if (!request->post && request->post->type != AFB_POST_FORM) {
-        postFileCtx->jresp= jsonNewMessage(AFB_FAIL,"This is not a valid PostForm request\n");
-        goto ExitOnError;
-    } 
-    
-    // Check this is a file element
-    if (item->filename == NULL) {
-        postFileCtx->jresp= jsonNewMessage(AFB_FAIL,"No Filename attached to key=%s\n", item->key);
-        goto ExitOnError;
-    }
-    
-    // Check we got something in buffer
-    if (item->len <= 0) {       
-        postFileCtx->jresp= jsonNewMessage(AFB_FAIL,"Buffer size NULL key=%s]\n", item->key);
-        goto ExitOnError;
-    }
-#endif
-    // Extract Application Context from posthandle [NULL == 1st iteration]    
-    postFileCtx = (AFB_PostCtx*) postHandle->ctx;
-
-    // This is the 1st Item iteration let's open output file and allocate necessary resources
-    if (postFileCtx == NULL)  {
-        DIR* destDir;
-        
-        // Create an application specific context
-        postFileCtx = calloc (1, sizeof(AFB_PostCtx)); // May place anything here until post->completeCB handle resources liberation
-        
-        // attach application to postHandle
-        postHandle->ctx = (void*) postFileCtx;   // May place anything here until post->completeCB handle resources liberation  
-        
-        // Build destination directory full path
-        if (destination[0] != '/') {
-           strncpy (filepath, request->config->sessiondir, sizeof(filepath)); 
-           strncat (filepath, "/", sizeof(filepath));
-           strncat (filepath, destination, sizeof(filepath)); 
-        } else strncpy (filepath, destination, sizeof(filepath));
-
-        
-        // make sure destination directory exist
-        destDir = opendir (filepath);
-        if (destDir == NULL) {
-          if (mkdir(filepath,O_RDWR | S_IRWXU | S_IRGRP) < 0) {
-            postFileCtx->jresp= jsonNewMessage(AFB_FAIL,"Fail to Create destination directory=[%s] error=%s\n", filepath, strerror(errno));
-            goto ExitOnError;
-          }
-        } else closedir (destDir);
-        
-        strncat (filepath, "/", sizeof(filepath));
-        strncat (filepath, item->filename, sizeof(filepath));  
-
-        postFileCtx->path = strdup (filepath);       
-        if (verbose) fprintf(stderr, "getPostFile path=%s\n", filepath);
-       
-        if((postFileCtx->fd = open(filepath, O_RDWR |O_CREAT, S_IRWXU|S_IRGRP)) <= 0) {
-            postFileCtx->jresp= jsonNewMessage(AFB_FAIL,"Fail to Create destination File=[%s] error=%s\n", filepath, strerror(errno));
-            goto ExitOnError;
-        } 
-    } else {     
-        // reuse existing application context
-        postFileCtx = (AFB_PostCtx*) postHandle->ctx;  
-    } 
-
-    // Check we successfully wrote full buffer
-    len = write (postFileCtx->fd, item->data, item->len);
-    if ((ssize_t)item->len != len) {
-        postFileCtx->jresp= jsonNewMessage(AFB_FAIL,"Fail to write file [%s] at [%s] error=\n", item->filename, strerror(errno));
-        goto ExitOnError;
-    }
-  
-    // every intermediary iteration should return Success & NULL
-    request->errcode = MHD_HTTP_OK;
-    return NULL;
-    
-ExitOnError:    
-    request->errcode = MHD_HTTP_EXPECTATION_FAILED;
-    return NULL;
-}
-
-#endif
-
-static void jsoninit()
-{
-  int idx, verbosesav;
-
-  if (jTypeStatic)
-       return;
-
-  // initialise JSON constant messages and increase reference count to make them permanent
-  verbosesav = verbose;
-  verbose = 0;  // run initialisation in silent mode
-  jTypeStatic = json_object_new_string ("AFB_message");
-  for (idx = 0; idx <= AFB_UNAUTH; idx++) {
-     AFBerr[idx].level = idx;
-     AFBerr[idx].label = ERROR_LABEL [idx];
-     AFBerr[idx].json  = jsonNewMessage (idx, NULL);
-  }
-  verbose = verbosesav;
-}
-
-
-// build an ERROR message and return it as a valid json object
-json_object *json_add_status (json_object *obj, const char *status, const char *info)
-{
-       if (obj == NULL)
-               obj = json_object_new_object();
-       json_object_object_add(obj, "status", json_object_new_string(status));
-       if (info)
-               json_object_object_add(obj, "info", json_object_new_string(info));
-       return obj;
-}
-
-// build an ERROR message and return it as a valid json object
-json_object *json_add_status_v (json_object *obj, const char *status, const char *info, va_list args)
-{
-       char *message;
-       if (info == NULL || vasprintf(&message, info, args) < 0)
-               message = NULL;
-       obj = json_add_status(obj, status, message);
-       free(message);
-       return obj;
-}
-
-
-// build an ERROR message and return it as a valid json object
-json_object *json_add_status_f (json_object *obj, const char *status, const char *info, ...)
-{
-       va_list args;
-       va_start(args, info);
-       obj = json_add_status_v(obj, status, info, args);
-       va_end(args);
-       return obj;
-}
-
-
-
-// build an ERROR message and return it as a valid json object
-struct json_object *jsonNewMessage (AFB_error level, char* format, ...) {
-   static int count = 0;
-   json_object * AFBResponse;
-   va_list args;
-   char message [512];
-
-  jsoninit();
-
-   // format message
-   if (format != NULL) {
-       va_start(args, format);
-       vsnprintf (message, sizeof (message), format, args);
-       va_end(args);
-   }
-
-   AFBResponse = json_object_new_object();
-   json_object_object_add (AFBResponse, "jtype", json_object_get (jTypeStatic));
-   json_object_object_add (AFBResponse, "status" , json_object_new_string (ERROR_LABEL[level]));
-   if (format != NULL) {
-        json_object_object_add (AFBResponse, "info"   , json_object_new_string (message));
-   }
-   if (verbose) {
-        fprintf (stderr, "AFB:%-6s [%3d]: ", AFBerr [level].label, count++);
-        if (format != NULL) {
-            fprintf (stderr, "%s", message);
-        } else {
-            fprintf (stderr, "No Message");
-        }
-        fprintf (stderr, "\n");
-   }
-
-   return (AFBResponse);
-}
-
-#if 0
-{
-  jtype: "AFB_message"
-  request:
-    {
-      prefix: "",
-      api: "",
-      status: "", /* exist, fail, empty, null, processed */
-      info: "",
-      uuid: "",
-      token: "",
-      timeout: ""
-    }
-  response: ...
-}
-#endif
-
index c767de7..b36d5f7 100644 (file)
@@ -32,6 +32,7 @@
 #include "afb-websock.h"
 #include "afb-apis.h"
 #include "afb-req-itf.h"
+#include "verbose.h"
 
 #define JSON_CONTENT  "application/json"
 #define FORM_CONTENT  MHD_HTTP_POST_ENCODING_MULTIPART_FORMDATA
@@ -380,7 +381,7 @@ static int new_client_handler(void *cls, const struct sockaddr *addr, socklen_t
 static int init_lib_magic (AFB_session *session)
 {
        /* MAGIC_MIME tells magic to return a mime of the file, but you can specify different things */
-       if (verbose)
+       if (verbosity)
                printf("Loading mimetype default magic database\n");
 
        session->magic = magic_open(MAGIC_MIME_TYPE);
@@ -436,7 +437,7 @@ AFB_error httpdStart(AFB_session * session)
        init_lib_magic (session);
 #endif
 
-       if (verbose) {
+       if (verbosity) {
                printf("AFB:notice Waiting port=%d rootdir=%s\n", session->config->httpdPort, session->config->rootdir);
                printf("AFB:notice Browser URL= http:/*localhost:%d\n", session->config->httpdPort);
        }
@@ -472,10 +473,10 @@ AFB_error httpdLoop(AFB_session * session)
        pfd.fd = info->listen_fd;
        pfd.events = POLLIN;
 
-       if (verbose)
+       if (verbosity)
                fprintf(stderr, "AFB:notice entering httpd waiting loop\n");
        while (TRUE) {
-               if (verbose)
+               if (verbosity)
                        fprintf(stderr, "AFB:notice httpd alive [%d]\n", count++);
                poll(&pfd, 1, 15000);   /* 15 seconds (as above timeout when starting) */
                MHD_run(session->httpd);
index 39ae318..3298322 100644 (file)
@@ -53,8 +53,6 @@
 
 #define AUDIO_BUFFER "/tmp/buf"
 
-extern int verbose;  // this is the only global variable
-
 // prebuild json error are constructed in helper-api.c
 typedef enum  { AFB_FALSE, AFB_TRUE, AFB_FATAL, AFB_FAIL, AFB_WARNING, AFB_EMPTY, AFB_SUCCESS, AFB_DONE, AFB_UNAUTH} AFB_error;
 
index 95b5a65..37183e7 100644 (file)
@@ -32,6 +32,7 @@
 #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"
@@ -255,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:
@@ -276,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:
@@ -300,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 {
@@ -581,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);
 
@@ -605,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);
 
 }
index e2190eb..b549a62 100644 (file)
 
 */
 
-// helper-api
-extern const char* getQueryValue (const AFB_request * request, const char *name);
-extern size_t getQueryAll(AFB_request * request, char *query, size_t len);
-/*
-extern json_object* getPostFile (AFB_request *request, AFB_PostItem *item, char* destination) ;
-extern char* getPostPath (AFB_request *request);
-*/
-
-extern json_object *jsonNewMessage (AFB_error level, char* format, ...);
-
 
 // Httpd server
 extern AFB_error httpdStart          (AFB_session *session);
diff --git a/src/verbose.c b/src/verbose.c
new file mode 100644 (file)
index 0000000..7e46a33
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ Copyright 2015 IoT.bzh
+
+ author: José Bollo <jose.bollo@iot.bzh>
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+#include "verbose.h"
+
+#if !defined(NDEBUG)
+int verbosity = 1;
+#else
+void verbose_error(const char *file, int line)
+{
+       syslog(LOG_ERR, "error file %s line %d", file, line);
+}
+#endif
+
diff --git a/src/verbose.h b/src/verbose.h
new file mode 100644 (file)
index 0000000..7b32a66
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ Copyright 2015 IoT.bzh
+
+ author: José Bollo <jose.bollo@iot.bzh>
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+#if !defined(NDEBUG)
+#include <syslog.h>
+extern int verbosity;
+#define LOGUSER(app) openlog(app,LOG_PERROR,LOG_USER)
+#define LOGAUTH(app) openlog(app,LOG_PERROR,LOG_AUTH)
+#define ERROR(...)   syslog(LOG_ERR,__VA_ARGS__)
+#define WARNING(...) do{if(verbosity)syslog(LOG_WARNING,__VA_ARGS__);}while(0)
+#define NOTICE(...)  do{if(verbosity)syslog(LOG_NOTICE,__VA_ARGS__);}while(0)
+#define INFO(...)    do{if(verbosity>1)syslog(LOG_INFO,__VA_ARGS__);}while(0)
+#define DEBUG(...)   do{if(verbosity>2)syslog(LOG_DEBUG,__VA_ARGS__);}while(0)
+#else
+#include <syslog.h>
+#define LOGUSER(app) openlog(app,LOG_PERROR,LOG_USER)
+#define LOGAUTH(app) openlog(app,LOG_PERROR,LOG_AUTH)
+extern void verbose_error(const char *file, int line);
+#define ERROR(...)   verbose_error(__FILE__,__LINE__)
+#define WARNING(...) do{/*nothing*/}while(0)
+#define NOTICE(...)  do{/*nothing*/}while(0)
+#define INFO(...)    do{/*nothing*/}while(0)
+#define DEBUG(...)   do{/*nothing*/}while(0)
+#endif