afb-config.c
afb-context.c
afb-cred.c
+ afb-debug.c
afb-ditf.c
afb-evt.c
afb-hook.c
--- /dev/null
+/*
+ Copyright 2017 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 "afb-debug.h"
+
+#if defined(AFB_INSERT_DEBUG_FEATURES)
+
+#define _GNU_SOURCE
+#include <stdlib.h>
+#include <string.h>
+#include <signal.h>
+
+#include "verbose.h"
+
+static char key_env_break[] = "AFB_DEBUG_BREAK";
+static char key_env_wait[] = "AFB_DEBUG_WAIT";
+static char separs[] = ", \t\n";
+
+static int has_key(const char *key, const char *list)
+{
+ if (list && key) {
+ list += strspn(list, separs);
+ while (*list) {
+ size_t s = strcspn(list, separs);
+ if (!strncasecmp(list, key, s) && !key[s])
+ return 1;
+ list += s;
+ list += strspn(list, separs);
+ }
+ }
+ return 0;
+}
+
+static void handler(int signum)
+{
+}
+
+void afb_debug(const char *key)
+{
+ enum { None, Break, Wait } action;
+
+ if (has_key(key, secure_getenv(key_env_break)))
+ action = Break;
+ else if (has_key(key, secure_getenv(key_env_wait)))
+ action = Wait;
+ else
+ action = None;
+
+ if (action != None) {
+ const char *a = action == Break ? "BREAK" : "WAIT";
+ struct sigaction sa, psa;
+ sigset_t ss;
+
+ NOTICE("DEBUG %s before %s", a, key);
+ memset(&sa, 0, sizeof sa);
+ sa.sa_handler = handler;
+ sigaction(SIGINT, &sa, &psa);
+ if (action == Break) {
+ raise(SIGINT);
+ } else {
+ sigemptyset(&ss);
+ sigaddset(&ss, SIGINT);
+ sigwaitinfo(&ss, NULL);
+ }
+ sigaction(SIGINT, &psa, NULL);
+ NOTICE("DEBUG %s after %s", a, key);
+ }
+}
+
+#endif
+
--- /dev/null
+/*
+ Copyright 2017 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.
+*/
+
+#pragma once
+
+#if defined(AGL_DEVEL) && !defined(AFB_INSERT_DEBUG_FEATURES)
+# define AFB_INSERT_DEBUG_FEATURES
+#endif
+
+#if defined(AFB_INSERT_DEBUG_FEATURES)
+extern void afb_debug(const char *key);
+#else
+#define afb_debug(x) ((void)0)
+#endif
#include "afb-monitor.h"
#include "afb-hook.h"
#include "sd-fds.h"
+#include "afb-debug.h"
/*
if SELF_PGROUP == 0 the launched command is the group leader
{
struct afb_hsrv *hsrv;
+ afb_debug("start-entry");
+
if (signum) {
ERROR("start aborted: received signal %s", strsignal(signum));
exit(1);
afb_hook_create_evt(NULL, config->traceevt, NULL, NULL);
/* load bindings */
+ afb_debug("start-load");
apiset_start_list(config->dbus_clients, afb_api_dbus_add_client, "the afb-dbus client");
apiset_start_list(config->ws_clients, afb_api_ws_add_client, "the afb-websocket client");
apiset_start_list(config->ldpaths, afb_api_so_add_pathset, "the binding path set");
DEBUG("Init config done");
/* start the services */
+ afb_debug("start-start");
if (afb_apiset_start_all_services(main_apiset, 1) < 0)
goto error;
/* start the HTTP server */
+ afb_debug("start-http");
if (!config->noHttpd) {
hsrv = start_http_server();
if (hsrv == NULL)
}
/* run the startup calls */
+ afb_debug("start-call");
run_startup_calls();
/* run the command */
+ afb_debug("start-exec");
if (execute_command() < 0)
goto error;
int main(int argc, char *argv[])
{
+ afb_debug("main-entry");
+
// let's run this program with a low priority
nice(20);
// ------------- Build session handler & init config -------
config = afb_config_parse_arguments(argc, argv);
+ afb_debug("main-args");
+
// --------- run -----------
if (config->background) {
// --------- in background mode -----------
/* set the daemon environment */
setup_daemon();
+ afb_debug("main-start");
+
/* enter job processing */
jobs_start(3, 0, 50, start);
WARNING("hoops returned from jobs_enter! [report bug]");