+ .hook_evt_addref = hook_evt_addref,
+ .hook_evt_unref = hook_evt_unref
+};
+
+/*******************************************************************************/
+/***** trace the sessions *****/
+/*******************************************************************************/
+
+static struct flag session_flags[] = { /* must be sorted by names */
+ { "addref", afb_hook_flag_session_addref },
+ { "all", afb_hook_flags_session_all },
+ { "close", afb_hook_flag_session_close },
+ { "common", afb_hook_flags_session_common },
+ { "create", afb_hook_flag_session_create },
+ { "destroy", afb_hook_flag_session_destroy },
+ { "renew", afb_hook_flag_session_renew },
+ { "unref", afb_hook_flag_session_unref },
+};
+
+/* get the session value for flag of 'name' */
+static int get_session_flag(const char *name)
+{
+ return get_flag(name, session_flags, (int)(sizeof session_flags / sizeof *session_flags));
+}
+
+static void hook_session(void *closure, const struct afb_hookid *hookid, struct afb_session *session, const char *action, const char *format, ...)
+{
+ va_list ap;
+
+ va_start(ap, format);
+ emit(closure, hookid, "session", "{ss ss}", format, ap,
+ "uuid", session,
+ "action", action);
+ va_end(ap);
+}
+
+static void hook_session_create(void *closure, const struct afb_hookid *hookid, struct afb_session *session)
+{
+ hook_session(closure, hookid, session, "create", "{ss}", "token", afb_session_token(session));
+}
+
+static void hook_session_close(void *closure, const struct afb_hookid *hookid, struct afb_session *session)
+{
+ hook_session(closure, hookid, session, "close", NULL);
+}
+
+static void hook_session_destroy(void *closure, const struct afb_hookid *hookid, struct afb_session *session)
+{
+ hook_session(closure, hookid, session, "destroy", NULL);
+}
+
+static void hook_session_renew(void *closure, const struct afb_hookid *hookid, struct afb_session *session)
+{
+ hook_session(closure, hookid, session, "renew", "{ss}", "token", afb_session_token(session));
+}
+
+static void hook_session_addref(void *closure, const struct afb_hookid *hookid, struct afb_session *session)
+{
+ hook_session(closure, hookid, session, "addref", NULL);
+}
+
+static void hook_session_unref(void *closure, const struct afb_hookid *hookid, struct afb_session *session)
+{
+ hook_session(closure, hookid, session, "unref", NULL);
+}
+
+static struct afb_hook_session_itf hook_session_itf = {
+ .hook_session_create = hook_session_create,
+ .hook_session_close = hook_session_close,
+ .hook_session_destroy = hook_session_destroy,
+ .hook_session_renew = hook_session_renew,
+ .hook_session_addref = hook_session_addref,
+ .hook_session_unref = hook_session_unref