summaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorJosé Bollo <jose.bollo@iot.bzh>2017-05-29 15:54:30 +0200
committerJosé Bollo <jose.bollo@iot.bzh>2017-05-29 15:54:30 +0200
commitdb01090e1f869965c07b12d9480fa6f3d2e7b1b0 (patch)
tree523e4b00bf591c56f671b5b610f6284b8ce64fbd /include
parent6f1126ae2c585afc34d0bb06f3763e3a82ee3d37 (diff)
Add vfail and vsuccess interfaces
This now factorizes code needed to asprintf the arguments in an allocated string. But the most interesting effect is the ability to handle va_list of arguments. It can be used for library of tools. Change-Id: I4ba74c9984786f07abe0c7e53d7ef79dca863735 Signed-off-by: José Bollo <jose.bollo@iot.bzh>
Diffstat (limited to 'include')
-rw-r--r--include/afb/afb-daemon-common.h2
-rw-r--r--include/afb/afb-req-itf.h54
-rw-r--r--include/afb/afb-service-v2.h1
3 files changed, 30 insertions, 27 deletions
diff --git a/include/afb/afb-daemon-common.h b/include/afb/afb-daemon-common.h
index 7b241492..e8e1817e 100644
--- a/include/afb/afb-daemon-common.h
+++ b/include/afb/afb-daemon-common.h
@@ -17,6 +17,8 @@
#pragma once
+#include <stdarg.h>
+
/* declaration of features of libsystemd */
struct sd_event;
struct sd_bus;
diff --git a/include/afb/afb-req-itf.h b/include/afb/afb-req-itf.h
index 34d73dd2..65f2bfe6 100644
--- a/include/afb/afb-req-itf.h
+++ b/include/afb/afb-req-itf.h
@@ -17,13 +17,7 @@
#pragma once
-#if !defined(_GNU_SOURCE)
-# error "_GNU_SOURCE must be defined for using vasprintf"
-#endif
-
-#include <stdlib.h>
#include <stdarg.h>
-#include <stdio.h>
#include "afb-event-itf.h"
@@ -56,8 +50,8 @@ struct afb_req_itf {
void (*success)(void *closure, struct json_object *obj, const char *info);
void (*fail)(void *closure, const char *status, const char *info);
- /*legacy raw */void (*spare1)(void *closure);
- /*legacy send*/void (*spare2)(void *closure);
+ void (*vsuccess)(void *closure, struct json_object *obj, const char *fmt, va_list args);
+ void (*vfail)(void *closure, const char *status, const char *fmt, va_list args);
void *(*context_get)(void *closure);
void (*context_set)(void *closure, void *value, void (*free_value)(void*));
@@ -166,16 +160,26 @@ static inline void afb_req_success(struct afb_req req, struct json_object *obj,
* Thus, in the case where 'obj' should remain available after
* the function returns, the function 'json_object_get' shall be used.
*/
+static inline void afb_req_success_f(struct afb_req req, struct json_object *obj, const char *info, ...) __attribute__((format(printf, 3, 4)));
static inline void afb_req_success_f(struct afb_req req, struct json_object *obj, const char *info, ...)
{
- char *message;
va_list args;
va_start(args, info);
- if (info == NULL || vasprintf(&message, info, args) < 0)
- message = NULL;
+ req.itf->vsuccess(req.closure, obj, info, args);
va_end(args);
- afb_req_success(req, obj, message);
- free(message);
+}
+
+/*
+ * Same as 'afb_req_success_f' but the arguments to the format 'info'
+ * are given as a variable argument list instance.
+ *
+ * For convenience, the function calls 'json_object_put' for 'obj'.
+ * Thus, in the case where 'obj' should remain available after
+ * the function returns, the function 'json_object_get' shall be used.
+ */
+static inline void afb_req_success_v(struct afb_req req, struct json_object *obj, const char *info, va_list args)
+{
+ req.itf->vsuccess(req.closure, obj, info, args);
}
/*
@@ -186,10 +190,6 @@ static inline void afb_req_success_f(struct afb_req req, struct json_object *obj
* Note that calling afb_req_fail("success", info) is equivalent
* to call afb_req_success(NULL, info). Thus even if possible it
* is strongly recommanded to NEVER use "success" for status.
- *
- * For convenience, the function calls 'json_object_put' for 'obj'.
- * Thus, in the case where 'obj' should remain available after
- * the function returns, the function 'json_object_get' shall be used.
*/
static inline void afb_req_fail(struct afb_req req, const char *status, const char *info)
{
@@ -199,21 +199,23 @@ static inline void afb_req_fail(struct afb_req req, const char *status, const ch
/*
* Same as 'afb_req_fail' but the 'info' is a formatting
* string followed by arguments.
- *
- * For convenience, the function calls 'json_object_put' for 'obj'.
- * Thus, in the case where 'obj' should remain available after
- * the function returns, the function 'json_object_get' shall be used.
*/
+static inline void afb_req_fail_f(struct afb_req req, const char *status, const char *info, ...) __attribute__((format(printf, 3, 4)));
static inline void afb_req_fail_f(struct afb_req req, const char *status, const char *info, ...)
{
- char *message;
va_list args;
va_start(args, info);
- if (info == NULL || vasprintf(&message, info, args) < 0)
- message = NULL;
+ req.itf->vfail(req.closure, status, info, args);
va_end(args);
- afb_req_fail(req, status, message);
- free(message);
+}
+
+/*
+ * Same as 'afb_req_fail_f' but the arguments to the format 'info'
+ * are given as a variable argument list instance.
+ */
+static inline void afb_req_fail_v(struct afb_req req, const char *status, const char *info, va_list args)
+{
+ req.itf->vfail(req.closure, status, info, args);
}
/*
diff --git a/include/afb/afb-service-v2.h b/include/afb/afb-service-v2.h
index 2d138350..5c0d3bd8 100644
--- a/include/afb/afb-service-v2.h
+++ b/include/afb/afb-service-v2.h
@@ -56,7 +56,6 @@ static inline void afb_service_call_v2(
* Thus, in the case where 'args' should remain available after
* the function returns, the function 'json_object_get' shall be used.
*
- * @param service The service as received during initialisation
* @param api The api name of the method to call
* @param verb The verb name of the method to call
* @param args The arguments to pass to the method