projects
/
lttng-tools.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Tests: regression testing for lttng-relayd --group-output-by-*
[lttng-tools.git]
/
src
/
bin
/
lttng-relayd
/
main.c
diff --git
a/src/bin/lttng-relayd/main.c
b/src/bin/lttng-relayd/main.c
index 2836c489ce9647325dc5a8da7d25d18ba0c684b1..e7c5b6c52d28dfcd1fa80fdf925c8d5317f45b27 100644
(file)
--- a/
src/bin/lttng-relayd/main.c
+++ b/
src/bin/lttng-relayd/main.c
@@
-96,8
+96,9
@@
enum relay_connection_status {
};
/* command line options */
};
/* command line options */
-char *opt_output_path;
+char *opt_output_path
, *opt_working_directory
;
static int opt_daemon, opt_background, opt_print_version;
static int opt_daemon, opt_background, opt_print_version;
+enum relay_group_output_by opt_group_output_by = RELAYD_GROUP_OUTPUT_BY_UNKNOWN;
/*
* We need to wait for listener and live listener threads, as well as
/*
* We need to wait for listener and live listener threads, as well as
@@
-184,6
+185,9
@@
static struct option long_options[] = {
{ "verbose", 0, 0, 'v', },
{ "config", 1, 0, 'f' },
{ "version", 0, 0, 'V' },
{ "verbose", 0, 0, 'v', },
{ "config", 1, 0, 'f' },
{ "version", 0, 0, 'V' },
+ { "working-directory", 1, 0, 'w', },
+ { "group-output-by-session", 0, 0, 's', },
+ { "group-output-by-host", 0, 0, 'p', },
{ NULL, 0, 0, 0, },
};
{ NULL, 0, 0, 0, },
};
@@
-311,6
+315,20
@@
static int set_option(int opt, const char *arg, const char *optname)
}
}
break;
}
}
break;
+ case 'w':
+ if (lttng_is_setuid_setgid()) {
+ WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.",
+ "-w, --working-directory");
+ } else {
+ ret = asprintf(&opt_working_directory, "%s", arg);
+ if (ret < 0) {
+ ret = -errno;
+ PERROR("asprintf opt_working_directory");
+ goto end;
+ }
+ }
+ break;
+
case 'v':
/* Verbose level can increase using multiple -v */
if (arg) {
case 'v':
/* Verbose level can increase using multiple -v */
if (arg) {
@@
-322,6
+340,20
@@
static int set_option(int opt, const char *arg, const char *optname)
}
}
break;
}
}
break;
+ case 's':
+ if (opt_group_output_by != RELAYD_GROUP_OUTPUT_BY_UNKNOWN) {
+ ERR("Cannot set --group-output-by-session, another --group-output-by argument is present");
+ exit(EXIT_FAILURE);
+ }
+ opt_group_output_by = RELAYD_GROUP_OUTPUT_BY_SESSION;
+ break;
+ case 'p':
+ if (opt_group_output_by != RELAYD_GROUP_OUTPUT_BY_UNKNOWN) {
+ ERR("Cannot set --group-output-by-host, another --group-output-by argument is present");
+ exit(EXIT_FAILURE);
+ }
+ opt_group_output_by = RELAYD_GROUP_OUTPUT_BY_HOST;
+ break;
default:
/* Unknown option or other error.
* Error is printed by getopt, just return */
default:
/* Unknown option or other error.
* Error is printed by getopt, just return */
@@
-391,6
+423,23
@@
end:
return ret;
}
return ret;
}
+static int parse_env_options(void)
+{
+ int ret = 0;
+ char *value = NULL;
+
+ value = lttng_secure_getenv(DEFAULT_LTTNG_RELAYD_WORKING_DIRECTORY_ENV);
+ if (value) {
+ opt_working_directory = strdup(value);
+ if (!opt_working_directory) {
+ ERR("Failed to allocate working directory string (\"%s\")",
+ value);
+ ret = -1;
+ }
+ }
+ return ret;
+}
+
static int set_options(int argc, char **argv)
{
int c, ret = 0, option_index = 0, retval = 0;
static int set_options(int argc, char **argv)
{
int c, ret = 0, option_index = 0, retval = 0;
@@
-509,6
+558,10
@@
static int set_options(int argc, char **argv)
}
}
}
}
+ if (opt_group_output_by == RELAYD_GROUP_OUTPUT_BY_UNKNOWN) {
+ opt_group_output_by = RELAYD_GROUP_OUTPUT_BY_HOST;
+ }
+
exit:
free(optstring);
return retval;
exit:
free(optstring);
return retval;
@@
-541,8
+594,8
@@
static void relayd_cleanup(void)
if (sessions_ht)
lttng_ht_destroy(sessions_ht);
if (sessions_ht)
lttng_ht_destroy(sessions_ht);
- /* free the dynamically allocated opt_output_path */
free(opt_output_path);
free(opt_output_path);
+ free(opt_working_directory);
/* Close thread quit pipes */
utils_close_pipe(thread_quit_pipe);
/* Close thread quit pipes */
utils_close_pipe(thread_quit_pipe);
@@
-3671,7
+3724,17
@@
int main(int argc, char **argv)
int ret = 0, retval = 0;
void *status;
int ret = 0, retval = 0;
void *status;
- /* Parse arguments */
+ /* Parse environment variables */
+ ret = parse_env_options();
+ if (ret) {
+ retval = -1;
+ goto exit_options;
+ }
+
+ /*
+ * Parse arguments.
+ * Command line arguments overwrite environment.
+ */
progname = argv[0];
if (set_options(argc, argv)) {
retval = -1;
progname = argv[0];
if (set_options(argc, argv)) {
retval = -1;
@@
-3729,6
+3792,14
@@
int main(int argc, char **argv)
}
}
}
}
+ if (opt_working_directory) {
+ ret = utils_change_working_directory(opt_working_directory);
+ if (ret) {
+ /* All errors are already logged. */
+ goto exit_options;
+ }
+ }
+
sessiond_trace_chunk_registry = sessiond_trace_chunk_registry_create();
if (!sessiond_trace_chunk_registry) {
ERR("Failed to initialize session daemon trace chunk registry");
sessiond_trace_chunk_registry = sessiond_trace_chunk_registry_create();
if (!sessiond_trace_chunk_registry) {
ERR("Failed to initialize session daemon trace chunk registry");
This page took
0.026938 seconds
and
5
git commands to generate.