* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#define _GNU_SOURCE
#define _LGPL_SOURCE
#include <fcntl.h>
#include <getopt.h>
#include <unistd.h>
#include <sys/mman.h>
#include <assert.h>
-#include <config.h>
#include <urcu/compiler.h>
#include <ulimit.h>
#include <common/defaults.h>
#include <common/common.h>
-#include <common/consumer.h>
-#include <common/consumer-timer.h>
+#include <common/consumer/consumer.h>
+#include <common/consumer/consumer-timer.h>
#include <common/compat/poll.h>
+#include <common/compat/getenv.h>
#include <common/sessiond-comm/sessiond-comm.h>
#include <common/utils.h>
return;
}
- lttng_consumer_should_exit(ctx);
+ if (ctx) {
+ lttng_consumer_should_exit(ctx);
+ }
}
/*
}
break;
case 'c':
- snprintf(command_sock_path, PATH_MAX, "%s", optarg);
+ if (lttng_is_setuid_setgid()) {
+ WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
+ "-c, --consumerd-cmd-sock");
+ } else {
+ snprintf(command_sock_path, PATH_MAX, "%s", optarg);
+ }
break;
case 'e':
- snprintf(error_sock_path, PATH_MAX, "%s", optarg);
+ if (lttng_is_setuid_setgid()) {
+ WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
+ "-e, --consumerd-err-sock");
+ } else {
+ snprintf(error_sock_path, PATH_MAX, "%s", optarg);
+ }
break;
case 'd':
opt_daemon = 1;
break;
case 'g':
- tracing_group_name = optarg;
+ if (lttng_is_setuid_setgid()) {
+ WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
+ "-g, --group");
+ } else {
+ tracing_group_name = optarg;
+ }
break;
case 'h':
usage(stdout);
{
int ret = 0, retval = 0;
void *status;
+ struct lttng_consumer_local_data *tmp_ctx;
if (set_signal_handler()) {
retval = -1;
set_ulimit();
}
+ if (run_as_create_worker(argv[0]) < 0) {
+ goto exit_init_data;
+ }
+
/* create the consumer instance with and assign the callbacks */
ctx = lttng_consumer_create(opt_type, lttng_consumer_read_subbuffer,
NULL, lttng_consumer_on_recv_stream, NULL);
exit_health_pipe:
exit_init_data:
- lttng_consumer_destroy(ctx);
+ tmp_ctx = ctx;
+ ctx = NULL;
+ cmm_barrier(); /* Clear ctx for signal handler. */
+ lttng_consumer_destroy(tmp_ctx);
lttng_consumer_cleanup();
if (health_consumerd) {
health_app_destroy(health_consumerd);
}
-exit_health_consumerd_cleanup:
+ /* Ensure all prior call_rcu are done. */
+ rcu_barrier();
-exit_options:
+ run_as_destroy_worker();
+exit_health_consumerd_cleanup:
+exit_options:
exit_set_signal_handler:
+
if (!retval) {
exit(EXIT_SUCCESS);
} else {