summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/proto-def.h68
-rw-r--r--src/config.c151
-rw-r--r--src/helper-api.c131
3 files changed, 159 insertions, 191 deletions
diff --git a/include/proto-def.h b/include/proto-def.h
index a030a27b..89b6e3d3 100644
--- a/include/proto-def.h
+++ b/include/proto-def.h
@@ -20,54 +20,54 @@
*/
// helper-api
-PUBLIC json_object* getPingTest(AFB_request *request);
-PUBLIC const char* getQueryValue (const AFB_request * request, const char *name);
-PUBLIC int getQueryAll(AFB_request * request, char *query, size_t len);
-PUBLIC AFB_PostHandle* getPostHandle (AFB_request *request);
-PUBLIC json_object* getPostFile (AFB_request *request, AFB_PostItem *item, char* destination) ;
-PUBLIC AFB_PostCtx* getPostContext (AFB_request *request);
-PUBLIC char* getPostPath (AFB_request *request);
+extern json_object* getPingTest(AFB_request *request);
+extern const char* getQueryValue (const AFB_request * request, const char *name);
+extern int getQueryAll(AFB_request * request, char *query, size_t len);
+extern AFB_PostHandle* getPostHandle (AFB_request *request);
+extern json_object* getPostFile (AFB_request *request, AFB_PostItem *item, char* destination) ;
+extern AFB_PostCtx* getPostContext (AFB_request *request);
+extern char* getPostPath (AFB_request *request);
+
+extern json_object *jsonNewMessage (AFB_error level, char* format, ...);
+extern json_object *jsonNewStatus (AFB_error level);
+extern json_object *jsonNewjtype (void);
+extern json_object *jsonNewMessage (AFB_error level, char* format, ...);
+extern void jsonDumpObject (json_object * jObject);
+
+extern char *configTime (void);
// rest-api
-PUBLIC void endPostRequest(AFB_PostHandle *posthandle);
-PUBLIC int doRestApi(struct MHD_Connection *connection, AFB_session *session, const char* url, const char *method
+extern void endPostRequest(AFB_PostHandle *posthandle);
+extern int doRestApi(struct MHD_Connection *connection, AFB_session *session, const char* url, const char *method
, const char *upload_data, size_t *upload_data_size, void **con_cls);
-void initPlugins (AFB_session *session);
+extern void initPlugins (AFB_session *session);
-typedef AFB_plugin* (*AFB_pluginCB)();
-PUBLIC AFB_plugin* pluginRegister ();
+extern AFB_plugin* pluginRegister ();
// Session handling
-PUBLIC AFB_error sessionCheckdir (AFB_session *session);
-PUBLIC json_object *sessionList (AFB_session *session, AFB_request *request);
-PUBLIC json_object *sessionToDisk (AFB_session *session, AFB_request *request, char *name,json_object *jsonSession);
-PUBLIC json_object *sessionFromDisk (AFB_session *session, AFB_request *request, char *name);
+extern AFB_error sessionCheckdir (AFB_session *session);
+extern json_object *sessionList (AFB_session *session, AFB_request *request);
+extern json_object *sessionToDisk (AFB_session *session, AFB_request *request, char *name,json_object *jsonSession);
+extern json_object *sessionFromDisk (AFB_session *session, AFB_request *request, char *name);
-PUBLIC AFB_error ctxTokenRefresh (AFB_clientCtx *clientCtx, AFB_request *request);
-PUBLIC AFB_error ctxTokenCreate (AFB_clientCtx *clientCtx, AFB_request *request);
-PUBLIC AFB_error ctxTokenCheck (AFB_clientCtx *clientCtx, AFB_request *request);
-PUBLIC AFB_error ctxTokenReset (AFB_clientCtx *clientCtx, AFB_request *request);
-PUBLIC AFB_clientCtx *ctxClientGet (AFB_request *request, int idx);
-PUBLIC void ctxStoreInit (int);
+extern AFB_error ctxTokenRefresh (AFB_clientCtx *clientCtx, AFB_request *request);
+extern AFB_error ctxTokenCreate (AFB_clientCtx *clientCtx, AFB_request *request);
+extern AFB_error ctxTokenCheck (AFB_clientCtx *clientCtx, AFB_request *request);
+extern AFB_error ctxTokenReset (AFB_clientCtx *clientCtx, AFB_request *request);
+extern AFB_clientCtx *ctxClientGet (AFB_request *request, int idx);
+extern void ctxStoreInit (int);
// Httpd server
-PUBLIC AFB_error httpdStart (AFB_session *session);
-PUBLIC AFB_error httpdLoop (AFB_session *session);
-PUBLIC void httpdStop (AFB_session *session);
+extern AFB_error httpdStart (AFB_session *session);
+extern AFB_error httpdLoop (AFB_session *session);
+extern void httpdStop (AFB_session *session);
// config management
-PUBLIC char *configTime (void);
-PUBLIC AFB_session *configInit (void);
-PUBLIC json_object *jsonNewMessage (AFB_error level, char* format, ...);
-PUBLIC json_object *jsonNewStatus (AFB_error level);
-PUBLIC json_object *jsonNewjtype (void);
-PUBLIC json_object *jsonNewMessage (AFB_error level, char* format, ...);
-PUBLIC void jsonDumpObject (json_object * jObject);
-PUBLIC AFB_error configLoadFile (AFB_session * session, AFB_config *cliconfig);
-PUBLIC void configStoreFile (AFB_session * session);
+extern AFB_session *configInit (void);
+extern AFB_error configLoadFile (AFB_session * session, AFB_config *cliconfig);
diff --git a/src/config.c b/src/config.c
index a64e131f..32336a7a 100644
--- a/src/config.c
+++ b/src/config.c
@@ -30,29 +30,6 @@
PUBLIC char *ERROR_LABEL[]=ERROR_LABEL_DEF;
-PUBLIC int verbose;
-STATIC AFB_errorT AFBerr [AFB_SUCCESS+1];
-STATIC json_object *jTypeStatic;
-
-/* ------------------------------------------------------------------------------
- * Get localtime and return in a string
- * ------------------------------------------------------------------------------ */
-
-PUBLIC char * configTime (void) {
- static char reqTime [26];
- time_t tt;
- struct tm *rt;
-
- /* Get actual Date and Time */
- time (&tt);
- rt = localtime (&tt);
-
- strftime (reqTime, sizeof (reqTime), "(%d-%b %H:%M)",rt);
-
- // return pointer on static data
- return (reqTime);
-}
-
// load config from disk and merge with CLI option
PUBLIC AFB_error configLoadFile (AFB_session * session, AFB_config *cliconfig) {
static char cacheTimeout [10];
@@ -229,129 +206,11 @@ PUBLIC AFB_error configLoadFile (AFB_session * session, AFB_config *cliconfig) {
return AFB_SUCCESS;
}
-// Save the config on disk
-PUBLIC void configStoreFile (AFB_session * session) {
- json_object * AFBConfig;
- time_t rawtime;
- struct tm * timeinfo;
- int err;
-
- AFBConfig = json_object_new_object();
-
- // add a timestamp and store session on disk
- time ( &rawtime ); timeinfo = localtime ( &rawtime );
- // A copy of the string is made and the memory is managed by the json_object
- json_object_object_add (AFBConfig, "jtype" , json_object_new_string (AFB_CONFIG_JTYPE));
- json_object_object_add (AFBConfig, "timestamp" , json_object_new_string (asctime (timeinfo)));
- json_object_object_add (AFBConfig, "rootdir" , json_object_new_string (session->config->rootdir));
- json_object_object_add (AFBConfig, "rootapi" , json_object_new_string (session->config->rootapi));
- json_object_object_add (AFBConfig, "rootbase" , json_object_new_string (session->config->rootbase));
- json_object_object_add (AFBConfig, "plugins" , json_object_new_string (session->config->ldpaths));
- json_object_object_add (AFBConfig, "sessiondir" , json_object_new_string (session->config->sessiondir));
- json_object_object_add (AFBConfig, "pidfile" , json_object_new_string (session->config->pidfile));
- json_object_object_add (AFBConfig, "setuid" , json_object_new_string (session->config->setuid));
- json_object_object_add (AFBConfig, "httpdPort" , json_object_new_int (session->config->httpdPort));
- json_object_object_add (AFBConfig, "localhostonly" , json_object_new_int (session->config->localhostOnly));
- json_object_object_add (AFBConfig, "cachetimeout" , json_object_new_int (session->config->cacheTimeout));
- json_object_object_add (AFBConfig, "apitimeout" , json_object_new_int (session->config->apiTimeout));
- json_object_object_add (AFBConfig, "cntxtimeout" , json_object_new_int (session->config->cntxTimeout));
-
- err = json_object_to_file (session->config->configfile, AFBConfig);
- json_object_put (AFBConfig); // decrease reference count to free the json object
- if (err < 0) {
- fprintf(stderr, "AFB: Fail to save config on disk [%s]\n ", session->config->configfile);
- }
-}
-
-
-PUBLIC AFB_session *configInit () {
-
- AFB_session *session;
- AFB_config *config;
- int idx, verbosesav;
-
-
- session = malloc (sizeof (AFB_session));
- memset (session,0, sizeof (AFB_session));
-
- // create config handle
- config = malloc (sizeof (AFB_config));
- memset (config,0, sizeof (AFB_config));
-
- // stack config handle into session
- session->config = config;
-
- jTypeStatic = json_object_new_string ("AFB_message");
-
- // initialise JSON constant messages and increase reference count to make them permanent
- verbosesav = verbose;
- verbose = 0; // run initialisation in silent mode
-
-
- for (idx = 0; idx <= AFB_SUCCESS; idx++) {
- AFBerr[idx].level = idx;
- AFBerr[idx].label = ERROR_LABEL [idx];
- AFBerr[idx].json = jsonNewMessage (idx, NULL);
- }
- verbose = verbosesav;
-
- return (session);
-}
-
-
-// get JSON object from error level and increase its reference count
-PUBLIC json_object *jsonNewStatus (AFB_error level) {
-
- json_object *target = AFBerr[level].json;
- json_object_get (target);
-
- return (target);
-}
-
-// get AFB object type with adequate usage count
-PUBLIC json_object *jsonNewjtype (void) {
- json_object_get (jTypeStatic); // increase reference count
- return (jTypeStatic);
-}
-// build an ERROR message and return it as a valid json object
-PUBLIC json_object *jsonNewMessage (AFB_error level, char* format, ...) {
- static int count = 0;
- json_object * AFBResponse;
- va_list args;
- char message [512];
-
- // 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", jsonNewjtype ());
- 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);
-}
-
-// Dump a message on stderr
-PUBLIC void jsonDumpObject (json_object * jObject) {
-
- if (verbose) {
- fprintf (stderr, "AFB:dump [%s]\n", json_object_to_json_string(jObject));
- }
+PUBLIC AFB_session *configInit ()
+{
+ AFB_session *session = calloc (1, sizeof (AFB_session));
+ session->config = calloc (1, sizeof (AFB_config));
+ return session;
}
diff --git a/src/helper-api.c b/src/helper-api.c
index b3763505..7684469b 100644
--- a/src/helper-api.c
+++ b/src/helper-api.c
@@ -30,8 +30,32 @@ typedef struct {
size_t len;
} queryHandleT;
+static AFB_errorT AFBerr [AFB_SUCCESS+1];
+static json_object *jTypeStatic;
+PUBLIC int verbose;
+
+/* ------------------------------------------------------------------------------
+ * Get localtime and return in a string
+ * ------------------------------------------------------------------------------ */
+
+PUBLIC char * configTime (void) {
+ static char reqTime [26];
+ time_t tt;
+ struct tm *rt;
+
+ /* Get actual Date and Time */
+ time (&tt);
+ rt = localtime (&tt);
+
+ strftime (reqTime, sizeof (reqTime), "(%d-%b %H:%M)",rt);
+
+ // return pointer on static data
+ return (reqTime);
+}
+
+
// Sample Generic Ping Debug API
-PUBLIC json_object* getPingTest(AFB_request *request) {
+json_object* getPingTest(AFB_request *request) {
static int pingcount = 0;
json_object *response;
char query [256];
@@ -53,14 +77,14 @@ PUBLIC json_object* getPingTest(AFB_request *request) {
// Helper to retrieve argument from connection
-PUBLIC const char* getQueryValue(const AFB_request * request, const char *name) {
+const char* getQueryValue(const AFB_request * request, const char *name) {
const char *value;
value = MHD_lookup_connection_value(request->connection, MHD_GET_ARGUMENT_KIND, name);
return (value);
}
-STATIC int getQueryCB (void*handle, enum MHD_ValueKind kind, const char *key, const char *value) {
+static int getQueryCB (void*handle, enum MHD_ValueKind kind, const char *key, const char *value) {
queryHandleT *query = (queryHandleT*)handle;
query->idx += snprintf (&query->msg[query->idx],query->len," %s: \'%s\',", key, value);
@@ -68,25 +92,25 @@ STATIC int getQueryCB (void*handle, enum MHD_ValueKind kind, const char *key, co
}
// Helper to retrieve argument from connection
-PUBLIC int getQueryAll(AFB_request * request, char *buffer, size_t len) {
+int 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;
+ query.msg = buffer;
+ query.len = len;
+ query.idx = 0;
MHD_get_connection_values (request->connection, MHD_GET_ARGUMENT_KIND, getQueryCB, &query);
return (len);
}
// Helper to retrieve POST handle
-PUBLIC AFB_PostHandle* getPostHandle (AFB_request *request) {
+AFB_PostHandle* getPostHandle (AFB_request *request) {
if (request->post == NULL) return (NULL);
return ((AFB_PostHandle*) request->post->data);
}
// Helper to retrieve POST file context
-PUBLIC AFB_PostCtx* getPostContext (AFB_request *request) {
+AFB_PostCtx* getPostContext (AFB_request *request) {
AFB_PostHandle* postHandle;
if (request->post == NULL) return (NULL);
@@ -96,7 +120,7 @@ PUBLIC AFB_PostCtx* getPostContext (AFB_request *request) {
return ((AFB_PostCtx*) postHandle->ctx);
}
-PUBLIC char* getPostPath (AFB_request *request) {
+char* getPostPath (AFB_request *request) {
AFB_PostHandle *postHandle = getPostHandle(request);
AFB_PostCtx *postFileCtx;
@@ -108,7 +132,7 @@ PUBLIC char* getPostPath (AFB_request *request) {
return (postFileCtx->path);
}
-PUBLIC json_object* getPostFile (AFB_request *request, AFB_PostItem *item, char* destination) {
+json_object* getPostFile (AFB_request *request, AFB_PostItem *item, char* destination) {
AFB_PostHandle *postHandle = getPostHandle(request);
AFB_PostCtx *postFileCtx;
@@ -216,3 +240,88 @@ ExitOnError:
request->errcode = MHD_HTTP_EXPECTATION_FAILED;
return NULL;
}
+
+
+
+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_SUCCESS; idx++) {
+ AFBerr[idx].level = idx;
+ AFBerr[idx].label = ERROR_LABEL [idx];
+ AFBerr[idx].json = jsonNewMessage (idx, NULL);
+ }
+ verbose = verbosesav;
+}
+
+
+
+// get JSON object from error level and increase its reference count
+struct json_object *jsonNewStatus (AFB_error level)
+{
+ jsoninit();
+ json_object *target = AFBerr[level].json;
+ json_object_get (target);
+
+ return (target);
+}
+
+// get AFB object type with adequate usage count
+struct json_object *jsonNewjtype (void)
+{
+ jsoninit();
+ json_object_get (jTypeStatic); // increase reference count
+ return (jTypeStatic);
+}
+
+// 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", jsonNewjtype ());
+ 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);
+}
+
+// Dump a message on stderr
+void jsonDumpObject (struct json_object * jObject) {
+
+ if (verbose) {
+ fprintf (stderr, "AFB:dump [%s]\n", json_object_to_json_string(jObject));
+ }
+}
+