/* timestamp */
static struct json_object *timestamp(const struct afb_hookid *hookid)
{
+#if JSON_C_MAJOR_VERSION > 0 || JSON_C_MINOR_VERSION >= 12
char ts[50];
snprintf(ts, sizeof ts, "%llu.%06lu",
(long unsigned)((hookid->time.tv_nsec + 500) / 1000));
return json_object_new_double_s(0.0f, ts); /* the real value isn't used */
-#if 0
- return json_object_new_string(ts);
- return json_object_new_double_s(0f, ts); /* the real value isn't used */
+#else
+ return json_object_new_double((double)hookid->time.tv_sec +
+ (double)hookid->time.tv_nsec * .000000001);
#endif
}
static void hook_xreq_get_client_info(void *closure, const struct afb_hookid *hookid, const struct afb_xreq *xreq, struct json_object *result)
{
- hook_xreq(closure, hookid, xreq, "get_client_info", "{so}",
+ hook_xreq(closure, hookid, xreq, "get_client_info", "{sO}",
"result", result);
}
static void hook_api_rootdir_get_fd(void *closure, const struct afb_hookid *hookid, const struct afb_export *export, int result)
{
- char path[PATH_MAX];
+ char path[PATH_MAX], proc[100];
+ const char *key, *val;
+ ssize_t s;
if (result >= 0) {
- sprintf(path, "/proc/self/fd/%d", result);
- readlink(path, path, sizeof path);
+ snprintf(proc, sizeof proc, "/proc/self/fd/%d", result);
+ s = readlink(proc, path, sizeof path);
+ path[s < 0 ? 0 : s >= sizeof path ? sizeof path - 1 : s] = 0;
+ key = "path";
+ val = path;
+ } else {
+ key = "error";
+ val = strerror(errno);
}
- hook_api(closure, hookid, export, "rootdir_get_fd", "{ss}",
- result < 0 ? "path" : "error",
- result < 0 ? strerror(errno) : path);
+ hook_api(closure, hookid, export, "rootdir_get_fd", "{ss}", key, val);
}
static void hook_api_rootdir_open_locale(void *closure, const struct afb_hookid *hookid, const struct afb_export *export, const char *filename, int flags, const char *locale, int result)
{
- char path[PATH_MAX];
+ char path[PATH_MAX], proc[100];
+ const char *key, *val;
+ ssize_t s;
if (result >= 0) {
- sprintf(path, "/proc/self/fd/%d", result);
- readlink(path, path, sizeof path);
+ snprintf(proc, sizeof proc, "/proc/self/fd/%d", result);
+ s = readlink(proc, path, sizeof path);
+ path[s < 0 ? 0 : s >= sizeof path ? sizeof path - 1 : s] = 0;
+ key = "path";
+ val = path;
+ } else {
+ key = "error";
+ val = strerror(errno);
}
hook_api(closure, hookid, export, "rootdir_open_locale", "{ss si ss* ss}",
"file", filename,
"flags", flags,
"locale", locale,
- result < 0 ? "path" : "error",
- result < 0 ? strerror(errno) : path);
+ key, val);
}
static void hook_api_queue_job(void *closure, const struct afb_hookid *hookid, const struct afb_export *export, void (*callback)(int signum, void *arg), void *argument, void *group, int timeout, int result)
}
/* drop traces */
-extern int afb_trace_drop(afb_req_t req, struct json_object *args, struct afb_trace *trace)
+int afb_trace_drop(afb_req_t req, struct json_object *args, struct afb_trace *trace)
{
int rc;
struct context context;