From f66e964a2e0c75f5e1a55fbcc963b1c5e2b4519d Mon Sep 17 00:00:00 2001 From: Jonathan Rajotte Date: Tue, 12 Mar 2019 14:30:31 -0400 Subject: [PATCH 01/16] Fix tests: the tree origin can be a symlink itself MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Problem: The base tree is defined as "/tmp/.....XXXXXX". On systems where "/tmp/" is itself a symlink utils_expand_path will expand the tree origin itself. For example on a base core-image-minimal Yocto build /tmp is a symlink to "/var/tmp", which is a symlink to "/var/volatile". utils_expand_path will return something like this for the symlink test: "/var/volative/.....XXXXXX/...." which is the valid result. Solution: Simply use realpath on the tree_origin and use this path to perform the test validation. This work was performed in the effort to support yocto fully and be able to run the test suite to detect problem as early as possible. Signed-off-by: Jonathan Rajotte Signed-off-by: Jérémie Galarneau --- tests/unit/test_utils_expand_path.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/tests/unit/test_utils_expand_path.c b/tests/unit/test_utils_expand_path.c index d5cab002e..d047c207d 100644 --- a/tests/unit/test_utils_expand_path.c +++ b/tests/unit/test_utils_expand_path.c @@ -281,8 +281,8 @@ error: static void test_utils_expand_path(void) { char *result; - char name[100], tmppath[PATH_MAX]; - int i; + char name[100], tmppath[PATH_MAX], real_tree_origin[PATH_MAX]; + int i, treelen; /* Test valid cases */ for (i = 0; i < num_valid_tests; i++) { @@ -295,14 +295,24 @@ static void test_utils_expand_path(void) free(result); } + /* + * Get the realpath for the tree_origin since it can itself be a + * symlink. + */ + result = realpath(tree_origin, real_tree_origin); + if (!result) { + fail("realpath failed."); + return; + } + /* Test symlink tree cases */ - int treelen = strlen(tree_origin) + 1; + treelen = strlen(real_tree_origin) + 1; for (i = 0; i < num_symlink_tests; i++) { sprintf(name, "symlink tree test case: [tmppath/]%s", symlink_tests_inputs[i].input); snprintf(tmppath, PATH_MAX, "%s/%s", - tree_origin, symlink_tests_inputs[i].input); + real_tree_origin, symlink_tests_inputs[i].input); result = utils_expand_path(tmppath); ok(result != NULL && strcmp(result + treelen, symlink_tests_inputs[i].expected_result) == 0, name); -- 2.34.1 From b67cdb8c808af540b7c0062e756170238057c6f3 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=A9mie=20Galarneau?= Date: Thu, 28 Mar 2019 11:18:38 -0400 Subject: [PATCH 02/16] Fix tests: snapshot size validation failure runs too many test cases MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The snapshot max size test is reported as both passing and failing when the test case fails. Signed-off-by: Jérémie Galarneau --- tests/regression/tools/snapshots/ust_test | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/regression/tools/snapshots/ust_test b/tests/regression/tools/snapshots/ust_test index 1e01eb21e..7540be2d4 100755 --- a/tests/regression/tools/snapshots/ust_test +++ b/tests/regression/tools/snapshots/ust_test @@ -337,10 +337,10 @@ function test_ust_local_snapshot_max_size () if [ "$sum_size_tracefiles" -gt "$max_size" ]; then fail "Tracefiles size sum validation" diag "Tracefiles size sum: $sum_size_tracefiles Expected max: $max_size" + else + pass "Tracefiles size sum validation" fi - pass "Tracefiles size sum validation" - stop_lttng_tracing_ok $SESSION_NAME destroy_lttng_session_ok $SESSION_NAME -- 2.34.1 From c0c907993a56462d8b2ac86b5f03628588eef7b2 Mon Sep 17 00:00:00 2001 From: Michael Jeanson Date: Wed, 13 Mar 2019 17:50:55 -0400 Subject: [PATCH 03/16] tap-driver.sh: flush stdout after each test result MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This is useful in a CI system where stdout is fully buffered and you look at the console output to see which test is hanging. Signed-off-by: Michael Jeanson Signed-off-by: Jérémie Galarneau --- config/tap-driver.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config/tap-driver.sh b/config/tap-driver.sh index 32521614d..65037ab65 100755 --- a/config/tap-driver.sh +++ b/config/tap-driver.sh @@ -275,6 +275,9 @@ function report(result, details) msg = msg " " details # Output on console might be colorized. print decorate_result(result) msg + # Flush stdout after each test result, this is useful when stdout + # is buffered, for example in a CI system. + fflush() # Log the result in the log file too, to help debugging (this is # especially true when said result is a TAP error or "Bail out!"). print result msg | "cat >&3"; -- 2.34.1 From f667fbd7f8b9512f9943edb2597c226fcc424ee9 Mon Sep 17 00:00:00 2001 From: Michael Jeanson Date: Tue, 19 Mar 2019 16:56:03 -0400 Subject: [PATCH 04/16] Fix tests: link libpause_consumer on liblttng-ctl MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This preload test library uses symbols from liblttng-ctl which are resolved when preloaded by GLIBC but not by MUSL. Signed-off-by: Michael Jeanson Signed-off-by: Jérémie Galarneau --- tests/regression/tools/notification/Makefile.am | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/regression/tools/notification/Makefile.am b/tests/regression/tools/notification/Makefile.am index 33e95886d..b869bdb1d 100644 --- a/tests/regression/tools/notification/Makefile.am +++ b/tests/regression/tools/notification/Makefile.am @@ -20,7 +20,10 @@ FORCE_SHARED_LIB_OPTIONS = -module -shared -avoid-version \ -rpath $(abs_builddir) libpause_consumer_la_SOURCES = consumer_testpoints.c -libpause_consumer_la_LIBADD = $(top_builddir)/src/common/libcommon.la $(DL_LIBS) +libpause_consumer_la_LIBADD = \ + $(top_builddir)/src/common/libcommon.la \ + $(top_builddir)/src/lib/lttng-ctl/liblttng-ctl.la \ + $(DL_LIBS) libpause_consumer_la_LDFLAGS = $(FORCE_SHARED_LIB_OPTIONS) noinst_LTLIBRARIES = libpause_consumer.la -- 2.34.1 From d6a6a6091a565905b7b50b9b6d8ec5b0d02f605a Mon Sep 17 00:00:00 2001 From: Yannick Lamarre Date: Tue, 26 Mar 2019 15:53:06 -0400 Subject: [PATCH 05/16] Fix: Properly sanitize input parameter MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The lttng client uses the sizeof the containing buffer, defined as LTTNG_SYMBOL_NAME_LEN, for input string sanitation instead of libc defined macro NAME_MAX. lttng-enable_channel improperly verified user input and wrongly discarded valid input in case NAME_MAX was less than the sizeof the containing buffer for the channel's name. This patch also fixes potential buffer overflow caused by an improperly bounded strcpy in the case where NAME_MAX would have been greater than LTTNG_SYMBOL_NAME_LEN. Signed-off-by: Yannick Lamarre Signed-off-by: Jérémie Galarneau --- src/bin/lttng/commands/enable_channels.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/lttng/commands/enable_channels.c b/src/bin/lttng/commands/enable_channels.c index b4e2942c3..3a7f9fd06 100644 --- a/src/bin/lttng/commands/enable_channels.c +++ b/src/bin/lttng/commands/enable_channels.c @@ -244,7 +244,7 @@ static int enable_channel(char *session_name) void *extended_ptr; /* Validate channel name's length */ - if (strlen(channel_name) >= NAME_MAX) { + if (strlen(channel_name) >= sizeof(chan_opts.name)) { ERR("Channel name is too long (max. %zu characters)", sizeof(chan_opts.name) - 1); error = 1; -- 2.34.1 From 5da3fc8579a9f93ea4767729a107784bf2d034ae Mon Sep 17 00:00:00 2001 From: Jonathan Rajotte Date: Mon, 25 Mar 2019 14:49:39 -0400 Subject: [PATCH 06/16] Tests: check for lttng-modules presence MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jonathan Rajotte Signed-off-by: Jérémie Galarneau --- tests/regression/tools/notification/test_notification_kernel | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/regression/tools/notification/test_notification_kernel b/tests/regression/tools/notification/test_notification_kernel index 6d7f256ae..e7368df26 100755 --- a/tests/regression/tools/notification/test_notification_kernel +++ b/tests/regression/tools/notification/test_notification_kernel @@ -108,6 +108,7 @@ function kernel_test } if [ "$(id -u)" == "0" ]; then + validate_lttng_modules_present kernel_test else # Kernel tests are skipped. -- 2.34.1 From db3db2cb1720052b5e2e8b3d77b130719e28865a Mon Sep 17 00:00:00 2001 From: Michael Jeanson Date: Wed, 20 Mar 2019 17:49:00 -0400 Subject: [PATCH 07/16] Fix: skip test when ust doesn't have perf support MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Michael Jeanson Signed-off-by: Jérémie Galarneau --- tests/regression/ust/test_event_perf | 43 +++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/tests/regression/ust/test_event_perf b/tests/regression/ust/test_event_perf index 4e665e65e..9b1dea3eb 100755 --- a/tests/regression/ust/test_event_perf +++ b/tests/regression/ust/test_event_perf @@ -41,6 +41,29 @@ function enable_ust_lttng_event_per_chan() ok $? "Enable event $event_name for session $sess_name in channel $chan_name" } +function add_context_ust_skip_ok() +{ + local session_name=$1 + local channel_name=$2 + local context_name=$3 + local skip_num=$4 + + local ret + + "$TESTDIR/../src/bin/lttng/$LTTNG_BIN" add-context -u \ + -s "$session_name" -c "$channel_name" \ + -t "$context_name" 1>"$OUTPUT_DEST" 2>"$ERROR_OUTPUT_DEST" + ret=$? + + if [ "$ret" == "4" ]; then + skip 0 "Current UST lib doesn't implement '$context_name' context" "$skip_num" + else + ok $ret "Add context command for type: $context_name" + fi + + return $ret +} + # Only test parsing of the enabling by raw ID function test_parsing_raw() { @@ -54,7 +77,7 @@ function test_parsing_raw() enable_ust_lttng_event_per_chan $SESSION_NAME $EVENT_NAME $CHAN_NAME - add_context_ust_ok $SESSION_NAME $CHAN_NAME "perf:thread:raw:r0110:test" + add_context_ust_skip_ok $SESSION_NAME $CHAN_NAME "perf:thread:raw:r0110:test" 1 add_context_ust_fail $SESSION_NAME $CHAN_NAME "perf:thread:raw:rZZZ:test" add_context_ust_fail $SESSION_NAME $CHAN_NAME "perf:thread:raw:b0110:test" add_context_ust_fail $SESSION_NAME $CHAN_NAME "perf:thread:raw:r0110:" @@ -76,24 +99,30 @@ function test_event_basic() SESSION_NAME="ust_event_basic" CHAN_NAME="mychan" + local ret + create_lttng_session_ok $SESSION_NAME $TRACE_PATH enable_ust_lttng_channel_ok $SESSION_NAME $CHAN_NAME enable_ust_lttng_event_per_chan $SESSION_NAME $EVENT_NAME $CHAN_NAME - add_context_ust_ok $SESSION_NAME $CHAN_NAME "perf:thread:page-fault" + add_context_ust_skip_ok $SESSION_NAME $CHAN_NAME "perf:thread:page-fault" 4 + ret=$? - start_lttng_tracing_ok + if [ "$ret" != "4" ]; then + start_lttng_tracing_ok - $TESTAPP_BIN $NR_ITER $NR_USEC_WAIT >/dev/null 2>&1 + $TESTAPP_BIN $NR_ITER $NR_USEC_WAIT >/dev/null 2>&1 - stop_lttng_tracing_ok + stop_lttng_tracing_ok + + validate_trace "perf_thread_page_fault" "$TRACE_PATH" + fi destroy_lttng_session_ok $SESSION_NAME - validate_trace "perf_thread_page_fault" $TRACE_PATH - rm -rf $TRACE_PATH + rm -rf "$TRACE_PATH" } # MUST set TESTDIR before calling those functions -- 2.34.1 From 50f18732b52893da800d92def7d31c6dd170f6bf Mon Sep 17 00:00:00 2001 From: Michael Jeanson Date: Tue, 12 Feb 2019 11:51:05 -0500 Subject: [PATCH 08/16] Add kernel namespace contexts Signed-off-by: Michael Jeanson --- include/lttng/event.h | 7 +++++++ src/bin/lttng-sessiond/context.c | 21 +++++++++++++++++++ src/bin/lttng-sessiond/save.c | 21 +++++++++++++++++++ src/bin/lttng/commands/add_context.c | 14 +++++++++++++ src/common/config/config-session-abi.h | 7 +++++++ src/common/config/session-config.c | 28 ++++++++++++++++++++++++++ src/common/lttng-kernel.h | 7 +++++++ 7 files changed, 105 insertions(+) diff --git a/include/lttng/event.h b/include/lttng/event.h index 0f75245c9..35c8d96f5 100644 --- a/include/lttng/event.h +++ b/include/lttng/event.h @@ -146,6 +146,13 @@ enum lttng_event_context_type { LTTNG_EVENT_CONTEXT_MIGRATABLE = 19, LTTNG_EVENT_CONTEXT_CALLSTACK_KERNEL = 20, LTTNG_EVENT_CONTEXT_CALLSTACK_USER = 21, /* Supported on x86_32 and x86_64 only. */ + LTTNG_EVENT_CONTEXT_CGROUP_NS = 22, + LTTNG_EVENT_CONTEXT_IPC_NS = 23, + LTTNG_EVENT_CONTEXT_MNT_NS = 24, + LTTNG_EVENT_CONTEXT_NET_NS = 25, + LTTNG_EVENT_CONTEXT_PID_NS = 26, + LTTNG_EVENT_CONTEXT_USER_NS = 27, + LTTNG_EVENT_CONTEXT_UTS_NS = 28, }; enum lttng_event_field_type { diff --git a/src/bin/lttng-sessiond/context.c b/src/bin/lttng-sessiond/context.c index 3861d22c1..6f7847b0d 100644 --- a/src/bin/lttng-sessiond/context.c +++ b/src/bin/lttng-sessiond/context.c @@ -266,6 +266,27 @@ int context_kernel_add(struct ltt_kernel_session *ksession, case LTTNG_EVENT_CONTEXT_CALLSTACK_USER: kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_CALLSTACK_USER; break; + case LTTNG_EVENT_CONTEXT_CGROUP_NS: + kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_CGROUP_NS; + break; + case LTTNG_EVENT_CONTEXT_IPC_NS: + kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_IPC_NS; + break; + case LTTNG_EVENT_CONTEXT_MNT_NS: + kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_MNT_NS; + break; + case LTTNG_EVENT_CONTEXT_NET_NS: + kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_NET_NS; + break; + case LTTNG_EVENT_CONTEXT_PID_NS: + kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_PID_NS; + break; + case LTTNG_EVENT_CONTEXT_USER_NS: + kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_USER_NS; + break; + case LTTNG_EVENT_CONTEXT_UTS_NS: + kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_UTS_NS; + break; default: ret = LTTNG_ERR_KERN_CONTEXT_FAIL; goto error; diff --git a/src/bin/lttng-sessiond/save.c b/src/bin/lttng-sessiond/save.c index 00cdd9364..a29d4c833 100644 --- a/src/bin/lttng-sessiond/save.c +++ b/src/bin/lttng-sessiond/save.c @@ -294,6 +294,27 @@ const char *get_kernel_context_type_string( case LTTNG_KERNEL_CONTEXT_CALLSTACK_KERNEL: context_type_string = config_event_context_callstack_kernel; break; + case LTTNG_KERNEL_CONTEXT_CGROUP_NS: + context_type_string = config_event_context_cgroup_ns; + break; + case LTTNG_KERNEL_CONTEXT_IPC_NS: + context_type_string = config_event_context_ipc_ns; + break; + case LTTNG_KERNEL_CONTEXT_MNT_NS: + context_type_string = config_event_context_mnt_ns; + break; + case LTTNG_KERNEL_CONTEXT_NET_NS: + context_type_string = config_event_context_net_ns; + break; + case LTTNG_KERNEL_CONTEXT_PID_NS: + context_type_string = config_event_context_pid_ns; + break; + case LTTNG_KERNEL_CONTEXT_USER_NS: + context_type_string = config_event_context_user_ns; + break; + case LTTNG_KERNEL_CONTEXT_UTS_NS: + context_type_string = config_event_context_uts_ns; + break; default: context_type_string = NULL; } diff --git a/src/bin/lttng/commands/add_context.c b/src/bin/lttng/commands/add_context.c index 7aef4d50f..a9ef0ddad 100644 --- a/src/bin/lttng/commands/add_context.c +++ b/src/bin/lttng/commands/add_context.c @@ -86,6 +86,13 @@ enum context_type { CONTEXT_MIGRATABLE = 19, CONTEXT_CALLSTACK_KERNEL = 20, CONTEXT_CALLSTACK_USER = 21, + CONTEXT_CGROUP_NS = 22, + CONTEXT_IPC_NS = 23, + CONTEXT_MNT_NS = 24, + CONTEXT_NET_NS = 25, + CONTEXT_PID_NS = 26, + CONTEXT_USER_NS = 27, + CONTEXT_UTS_NS = 28, }; /* @@ -246,6 +253,13 @@ const struct ctx_opts { #if HAVE_MODULES_USERSPACE_CALLSTACK_CONTEXT { "callstack-user", CONTEXT_CALLSTACK_USER }, #endif + { "cgroup_ns", CONTEXT_CGROUP_NS }, + { "ipc_ns", CONTEXT_IPC_NS }, + { "mnt_ns", CONTEXT_MNT_NS }, + { "net_ns", CONTEXT_NET_NS }, + { "pid_ns", CONTEXT_PID_NS }, + { "user_ns", CONTEXT_USER_NS }, + { "uts_ns", CONTEXT_UTS_NS }, /* Perf options */ diff --git a/src/common/config/config-session-abi.h b/src/common/config/config-session-abi.h index 950efa5f9..ced35254d 100644 --- a/src/common/config/config-session-abi.h +++ b/src/common/config/config-session-abi.h @@ -151,5 +151,12 @@ extern const char * const config_element_rotation_schedule_periodic; extern const char * const config_element_rotation_schedule_periodic_time_us; extern const char * const config_element_rotation_schedule_size_threshold; extern const char * const config_element_rotation_schedule_size_threshold_bytes; +extern const char * const config_event_context_cgroup_ns; +extern const char * const config_event_context_ipc_ns; +extern const char * const config_event_context_mnt_ns; +extern const char * const config_event_context_net_ns; +extern const char * const config_event_context_pid_ns; +extern const char * const config_event_context_user_ns; +extern const char * const config_event_context_uts_ns; #endif /* CONFIG_SESSION_INTERNAL_H */ diff --git a/src/common/config/session-config.c b/src/common/config/session-config.c index 8e5410c3f..2c9f69266 100644 --- a/src/common/config/session-config.c +++ b/src/common/config/session-config.c @@ -205,6 +205,13 @@ LTTNG_HIDDEN const char * const config_event_context_need_reschedule = "NEED_RES LTTNG_HIDDEN const char * const config_event_context_migratable = "MIGRATABLE"; LTTNG_HIDDEN const char * const config_event_context_callstack_user= "CALLSTACK_USER"; LTTNG_HIDDEN const char * const config_event_context_callstack_kernel = "CALLSTACK_KERNEL"; +LTTNG_HIDDEN const char * const config_event_context_cgroup_ns = "CGROUP_NS"; +LTTNG_HIDDEN const char * const config_event_context_ipc_ns = "IPC_NS"; +LTTNG_HIDDEN const char * const config_event_context_mnt_ns = "MNT_NS"; +LTTNG_HIDDEN const char * const config_event_context_net_ns = "NET_NS"; +LTTNG_HIDDEN const char * const config_event_context_pid_ns = "PID_NS"; +LTTNG_HIDDEN const char * const config_event_context_user_ns = "USER_NS"; +LTTNG_HIDDEN const char * const config_event_context_uts_ns = "UTS_NS"; /* Deprecated symbols */ const char * const config_element_perf; @@ -1047,6 +1054,27 @@ int get_context_type(xmlChar *context_type) } else if (!strcmp((char *) context_type, config_event_context_callstack_kernel)) { ret = LTTNG_EVENT_CONTEXT_CALLSTACK_KERNEL; + } else if (!strcmp((char *) context_type, + config_event_context_cgroup_ns)) { + ret = LTTNG_EVENT_CONTEXT_CGROUP_NS; + } else if (!strcmp((char *) context_type, + config_event_context_ipc_ns)) { + ret = LTTNG_EVENT_CONTEXT_IPC_NS; + } else if (!strcmp((char *) context_type, + config_event_context_mnt_ns)) { + ret = LTTNG_EVENT_CONTEXT_MNT_NS; + } else if (!strcmp((char *) context_type, + config_event_context_net_ns)) { + ret = LTTNG_EVENT_CONTEXT_NET_NS; + } else if (!strcmp((char *) context_type, + config_event_context_pid_ns)) { + ret = LTTNG_EVENT_CONTEXT_PID_NS; + } else if (!strcmp((char *) context_type, + config_event_context_user_ns)) { + ret = LTTNG_EVENT_CONTEXT_USER_NS; + } else if (!strcmp((char *) context_type, + config_event_context_uts_ns)) { + ret = LTTNG_EVENT_CONTEXT_UTS_NS; } else { goto error; } diff --git a/src/common/lttng-kernel.h b/src/common/lttng-kernel.h index cd1a15f67..9445b3740 100644 --- a/src/common/lttng-kernel.h +++ b/src/common/lttng-kernel.h @@ -64,6 +64,13 @@ enum lttng_kernel_context_type { LTTNG_KERNEL_CONTEXT_MIGRATABLE = 15, LTTNG_KERNEL_CONTEXT_CALLSTACK_KERNEL = 16, LTTNG_KERNEL_CONTEXT_CALLSTACK_USER = 17, + LTTNG_KERNEL_CONTEXT_CGROUP_NS = 18, + LTTNG_KERNEL_CONTEXT_IPC_NS = 19, + LTTNG_KERNEL_CONTEXT_MNT_NS = 20, + LTTNG_KERNEL_CONTEXT_NET_NS = 21, + LTTNG_KERNEL_CONTEXT_PID_NS = 22, + LTTNG_KERNEL_CONTEXT_USER_NS = 23, + LTTNG_KERNEL_CONTEXT_UTS_NS = 24, }; /* Perf counter attributes */ -- 2.34.1 From 46ec7146144b3e989788876524a66feec8049d9b Mon Sep 17 00:00:00 2001 From: Michael Jeanson Date: Tue, 12 Feb 2019 11:51:21 -0500 Subject: [PATCH 09/16] Add UST namespace contexts Signed-off-by: Michael Jeanson --- src/bin/lttng-sessiond/lttng-ust-abi.h | 7 +++++++ src/bin/lttng-sessiond/save.c | 21 +++++++++++++++++++++ src/bin/lttng-sessiond/trace-ust.c | 21 +++++++++++++++++++++ 3 files changed, 49 insertions(+) diff --git a/src/bin/lttng-sessiond/lttng-ust-abi.h b/src/bin/lttng-sessiond/lttng-ust-abi.h index 687eb0b23..c57dc90c7 100644 --- a/src/bin/lttng-sessiond/lttng-ust-abi.h +++ b/src/bin/lttng-sessiond/lttng-ust-abi.h @@ -145,6 +145,13 @@ enum lttng_ust_context_type { LTTNG_UST_CONTEXT_PERF_THREAD_COUNTER = 5, LTTNG_UST_CONTEXT_CPU_ID = 6, LTTNG_UST_CONTEXT_APP_CONTEXT = 7, + LTTNG_UST_CONTEXT_CGROUP_NS = 8, + LTTNG_UST_CONTEXT_IPC_NS = 9, + LTTNG_UST_CONTEXT_MNT_NS = 10, + LTTNG_UST_CONTEXT_NET_NS = 11, + LTTNG_UST_CONTEXT_PID_NS = 12, + LTTNG_UST_CONTEXT_USER_NS = 13, + LTTNG_UST_CONTEXT_UTS_NS = 14, }; struct lttng_ust_perf_counter_ctx { diff --git a/src/bin/lttng-sessiond/save.c b/src/bin/lttng-sessiond/save.c index a29d4c833..bb305b440 100644 --- a/src/bin/lttng-sessiond/save.c +++ b/src/bin/lttng-sessiond/save.c @@ -347,6 +347,27 @@ const char *get_ust_context_type_string( case LTTNG_UST_CONTEXT_APP_CONTEXT: context_type_string = config_event_context_app; break; + case LTTNG_UST_CONTEXT_CGROUP_NS: + context_type_string = config_event_context_cgroup_ns; + break; + case LTTNG_UST_CONTEXT_IPC_NS: + context_type_string = config_event_context_ipc_ns; + break; + case LTTNG_UST_CONTEXT_MNT_NS: + context_type_string = config_event_context_mnt_ns; + break; + case LTTNG_UST_CONTEXT_NET_NS: + context_type_string = config_event_context_net_ns; + break; + case LTTNG_UST_CONTEXT_PID_NS: + context_type_string = config_event_context_pid_ns; + break; + case LTTNG_UST_CONTEXT_USER_NS: + context_type_string = config_event_context_user_ns; + break; + case LTTNG_UST_CONTEXT_UTS_NS: + context_type_string = config_event_context_uts_ns; + break; case LTTNG_UST_CONTEXT_PERF_THREAD_COUNTER: /* * Error, should not be stored in the XML, perf contexts diff --git a/src/bin/lttng-sessiond/trace-ust.c b/src/bin/lttng-sessiond/trace-ust.c index 8d63e2525..a37161865 100644 --- a/src/bin/lttng-sessiond/trace-ust.c +++ b/src/bin/lttng-sessiond/trace-ust.c @@ -563,6 +563,27 @@ int trace_ust_context_type_event_to_ust( case LTTNG_EVENT_CONTEXT_APP_CONTEXT: utype = LTTNG_UST_CONTEXT_APP_CONTEXT; break; + case LTTNG_EVENT_CONTEXT_CGROUP_NS: + utype = LTTNG_UST_CONTEXT_CGROUP_NS; + break; + case LTTNG_EVENT_CONTEXT_IPC_NS: + utype = LTTNG_UST_CONTEXT_IPC_NS; + break; + case LTTNG_EVENT_CONTEXT_MNT_NS: + utype = LTTNG_UST_CONTEXT_MNT_NS; + break; + case LTTNG_EVENT_CONTEXT_NET_NS: + utype = LTTNG_UST_CONTEXT_NET_NS; + break; + case LTTNG_EVENT_CONTEXT_PID_NS: + utype = LTTNG_UST_CONTEXT_PID_NS; + break; + case LTTNG_EVENT_CONTEXT_USER_NS: + utype = LTTNG_UST_CONTEXT_USER_NS; + break; + case LTTNG_EVENT_CONTEXT_UTS_NS: + utype = LTTNG_UST_CONTEXT_UTS_NS; + break; default: utype = -1; break; -- 2.34.1 From 0e828719e99f6d23a576856be9bdf3ddc6e591e8 Mon Sep 17 00:00:00 2001 From: Michael Jeanson Date: Tue, 12 Feb 2019 11:51:42 -0500 Subject: [PATCH 10/16] Add kernel uid/gid contexts Signed-off-by: Michael Jeanson --- include/lttng/event.h | 12 +++++++ src/bin/lttng-sessiond/context.c | 36 +++++++++++++++++++ src/bin/lttng-sessiond/save.c | 36 +++++++++++++++++++ src/bin/lttng/commands/add_context.c | 24 +++++++++++++ src/common/config/config-session-abi.h | 12 +++++++ src/common/config/session-config.c | 48 ++++++++++++++++++++++++++ src/common/lttng-kernel.h | 12 +++++++ 7 files changed, 180 insertions(+) diff --git a/include/lttng/event.h b/include/lttng/event.h index 35c8d96f5..451a43351 100644 --- a/include/lttng/event.h +++ b/include/lttng/event.h @@ -153,6 +153,18 @@ enum lttng_event_context_type { LTTNG_EVENT_CONTEXT_PID_NS = 26, LTTNG_EVENT_CONTEXT_USER_NS = 27, LTTNG_EVENT_CONTEXT_UTS_NS = 28, + LTTNG_EVENT_CONTEXT_UID = 29, + LTTNG_EVENT_CONTEXT_EUID = 30, + LTTNG_EVENT_CONTEXT_SUID = 31, + LTTNG_EVENT_CONTEXT_GID = 32, + LTTNG_EVENT_CONTEXT_EGID = 33, + LTTNG_EVENT_CONTEXT_SGID = 34, + LTTNG_EVENT_CONTEXT_VUID = 35, + LTTNG_EVENT_CONTEXT_VEUID = 36, + LTTNG_EVENT_CONTEXT_VSUID = 37, + LTTNG_EVENT_CONTEXT_VGID = 38, + LTTNG_EVENT_CONTEXT_VEGID = 39, + LTTNG_EVENT_CONTEXT_VSGID = 40, }; enum lttng_event_field_type { diff --git a/src/bin/lttng-sessiond/context.c b/src/bin/lttng-sessiond/context.c index 6f7847b0d..3dd89cfdd 100644 --- a/src/bin/lttng-sessiond/context.c +++ b/src/bin/lttng-sessiond/context.c @@ -287,6 +287,42 @@ int context_kernel_add(struct ltt_kernel_session *ksession, case LTTNG_EVENT_CONTEXT_UTS_NS: kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_UTS_NS; break; + case LTTNG_EVENT_CONTEXT_UID: + kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_UID; + break; + case LTTNG_EVENT_CONTEXT_EUID: + kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_EUID; + break; + case LTTNG_EVENT_CONTEXT_SUID: + kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_SUID; + break; + case LTTNG_EVENT_CONTEXT_GID: + kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_GID; + break; + case LTTNG_EVENT_CONTEXT_EGID: + kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_EGID; + break; + case LTTNG_EVENT_CONTEXT_SGID: + kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_SGID; + break; + case LTTNG_EVENT_CONTEXT_VUID: + kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_VUID; + break; + case LTTNG_EVENT_CONTEXT_VEUID: + kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_VEUID; + break; + case LTTNG_EVENT_CONTEXT_VSUID: + kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_VSUID; + break; + case LTTNG_EVENT_CONTEXT_VGID: + kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_VGID; + break; + case LTTNG_EVENT_CONTEXT_VEGID: + kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_VEGID; + break; + case LTTNG_EVENT_CONTEXT_VSGID: + kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_VSGID; + break; default: ret = LTTNG_ERR_KERN_CONTEXT_FAIL; goto error; diff --git a/src/bin/lttng-sessiond/save.c b/src/bin/lttng-sessiond/save.c index bb305b440..993c3716a 100644 --- a/src/bin/lttng-sessiond/save.c +++ b/src/bin/lttng-sessiond/save.c @@ -315,6 +315,42 @@ const char *get_kernel_context_type_string( case LTTNG_KERNEL_CONTEXT_UTS_NS: context_type_string = config_event_context_uts_ns; break; + case LTTNG_KERNEL_CONTEXT_UID: + context_type_string = config_event_context_uid; + break; + case LTTNG_KERNEL_CONTEXT_EUID: + context_type_string = config_event_context_euid; + break; + case LTTNG_KERNEL_CONTEXT_SUID: + context_type_string = config_event_context_suid; + break; + case LTTNG_KERNEL_CONTEXT_GID: + context_type_string = config_event_context_gid; + break; + case LTTNG_KERNEL_CONTEXT_EGID: + context_type_string = config_event_context_egid; + break; + case LTTNG_KERNEL_CONTEXT_SGID: + context_type_string = config_event_context_sgid; + break; + case LTTNG_KERNEL_CONTEXT_VUID: + context_type_string = config_event_context_vuid; + break; + case LTTNG_KERNEL_CONTEXT_VEUID: + context_type_string = config_event_context_veuid; + break; + case LTTNG_KERNEL_CONTEXT_VSUID: + context_type_string = config_event_context_vsuid; + break; + case LTTNG_KERNEL_CONTEXT_VGID: + context_type_string = config_event_context_vgid; + break; + case LTTNG_KERNEL_CONTEXT_VEGID: + context_type_string = config_event_context_vegid; + break; + case LTTNG_KERNEL_CONTEXT_VSGID: + context_type_string = config_event_context_vsgid; + break; default: context_type_string = NULL; } diff --git a/src/bin/lttng/commands/add_context.c b/src/bin/lttng/commands/add_context.c index a9ef0ddad..9fcb16d6e 100644 --- a/src/bin/lttng/commands/add_context.c +++ b/src/bin/lttng/commands/add_context.c @@ -93,6 +93,18 @@ enum context_type { CONTEXT_PID_NS = 26, CONTEXT_USER_NS = 27, CONTEXT_UTS_NS = 28, + CONTEXT_UID = 29, + CONTEXT_EUID = 30, + CONTEXT_SUID = 31, + CONTEXT_GID = 32, + CONTEXT_EGID = 33, + CONTEXT_SGID = 34, + CONTEXT_VUID = 35, + CONTEXT_VEUID = 36, + CONTEXT_VSUID = 37, + CONTEXT_VGID = 38, + CONTEXT_VEGID = 39, + CONTEXT_VSGID = 40, }; /* @@ -260,6 +272,18 @@ const struct ctx_opts { { "pid_ns", CONTEXT_PID_NS }, { "user_ns", CONTEXT_USER_NS }, { "uts_ns", CONTEXT_UTS_NS }, + { "uid", CONTEXT_UID }, + { "euid", CONTEXT_EUID }, + { "suid", CONTEXT_SUID }, + { "gid", CONTEXT_GID }, + { "egid", CONTEXT_EGID }, + { "sgid", CONTEXT_SGID }, + { "vuid", CONTEXT_VUID }, + { "veuid", CONTEXT_VEUID }, + { "vsuid", CONTEXT_VSUID }, + { "vgid", CONTEXT_VGID }, + { "vegid", CONTEXT_VEGID }, + { "vsgid", CONTEXT_VSGID }, /* Perf options */ diff --git a/src/common/config/config-session-abi.h b/src/common/config/config-session-abi.h index ced35254d..12dfe600c 100644 --- a/src/common/config/config-session-abi.h +++ b/src/common/config/config-session-abi.h @@ -158,5 +158,17 @@ extern const char * const config_event_context_net_ns; extern const char * const config_event_context_pid_ns; extern const char * const config_event_context_user_ns; extern const char * const config_event_context_uts_ns; +extern const char * const config_event_context_uid; +extern const char * const config_event_context_euid; +extern const char * const config_event_context_suid; +extern const char * const config_event_context_gid; +extern const char * const config_event_context_egid; +extern const char * const config_event_context_sgid; +extern const char * const config_event_context_vuid; +extern const char * const config_event_context_veuid; +extern const char * const config_event_context_vsuid; +extern const char * const config_event_context_vgid; +extern const char * const config_event_context_vegid; +extern const char * const config_event_context_vsgid; #endif /* CONFIG_SESSION_INTERNAL_H */ diff --git a/src/common/config/session-config.c b/src/common/config/session-config.c index 2c9f69266..df0603b2e 100644 --- a/src/common/config/session-config.c +++ b/src/common/config/session-config.c @@ -212,6 +212,18 @@ LTTNG_HIDDEN const char * const config_event_context_net_ns = "NET_NS"; LTTNG_HIDDEN const char * const config_event_context_pid_ns = "PID_NS"; LTTNG_HIDDEN const char * const config_event_context_user_ns = "USER_NS"; LTTNG_HIDDEN const char * const config_event_context_uts_ns = "UTS_NS"; +LTTNG_HIDDEN const char * const config_event_context_uid = "UID"; +LTTNG_HIDDEN const char * const config_event_context_euid = "EUID"; +LTTNG_HIDDEN const char * const config_event_context_suid = "SUID"; +LTTNG_HIDDEN const char * const config_event_context_gid = "GID"; +LTTNG_HIDDEN const char * const config_event_context_egid = "EGID"; +LTTNG_HIDDEN const char * const config_event_context_sgid = "SGID"; +LTTNG_HIDDEN const char * const config_event_context_vuid = "VUID"; +LTTNG_HIDDEN const char * const config_event_context_veuid = "VEUID"; +LTTNG_HIDDEN const char * const config_event_context_vsuid = "VSUID"; +LTTNG_HIDDEN const char * const config_event_context_vgid = "VGID"; +LTTNG_HIDDEN const char * const config_event_context_vegid = "VEGID"; +LTTNG_HIDDEN const char * const config_event_context_vsgid = "VSGID"; /* Deprecated symbols */ const char * const config_element_perf; @@ -1075,6 +1087,42 @@ int get_context_type(xmlChar *context_type) } else if (!strcmp((char *) context_type, config_event_context_uts_ns)) { ret = LTTNG_EVENT_CONTEXT_UTS_NS; + } else if (!strcmp((char *) context_type, + config_event_context_uid)) { + ret = LTTNG_EVENT_CONTEXT_UID; + } else if (!strcmp((char *) context_type, + config_event_context_euid)) { + ret = LTTNG_EVENT_CONTEXT_EUID; + } else if (!strcmp((char *) context_type, + config_event_context_suid)) { + ret = LTTNG_EVENT_CONTEXT_SUID; + } else if (!strcmp((char *) context_type, + config_event_context_gid)) { + ret = LTTNG_EVENT_CONTEXT_GID; + } else if (!strcmp((char *) context_type, + config_event_context_egid)) { + ret = LTTNG_EVENT_CONTEXT_EGID; + } else if (!strcmp((char *) context_type, + config_event_context_sgid)) { + ret = LTTNG_EVENT_CONTEXT_SGID; + } else if (!strcmp((char *) context_type, + config_event_context_vuid)) { + ret = LTTNG_EVENT_CONTEXT_VUID; + } else if (!strcmp((char *) context_type, + config_event_context_veuid)) { + ret = LTTNG_EVENT_CONTEXT_VEUID; + } else if (!strcmp((char *) context_type, + config_event_context_vsuid)) { + ret = LTTNG_EVENT_CONTEXT_VSUID; + } else if (!strcmp((char *) context_type, + config_event_context_vgid)) { + ret = LTTNG_EVENT_CONTEXT_VGID; + } else if (!strcmp((char *) context_type, + config_event_context_vegid)) { + ret = LTTNG_EVENT_CONTEXT_VEGID; + } else if (!strcmp((char *) context_type, + config_event_context_vsgid)) { + ret = LTTNG_EVENT_CONTEXT_VSGID; } else { goto error; } diff --git a/src/common/lttng-kernel.h b/src/common/lttng-kernel.h index 9445b3740..9d777ee77 100644 --- a/src/common/lttng-kernel.h +++ b/src/common/lttng-kernel.h @@ -71,6 +71,18 @@ enum lttng_kernel_context_type { LTTNG_KERNEL_CONTEXT_PID_NS = 22, LTTNG_KERNEL_CONTEXT_USER_NS = 23, LTTNG_KERNEL_CONTEXT_UTS_NS = 24, + LTTNG_KERNEL_CONTEXT_UID = 25, + LTTNG_KERNEL_CONTEXT_EUID = 26, + LTTNG_KERNEL_CONTEXT_SUID = 27, + LTTNG_KERNEL_CONTEXT_GID = 28, + LTTNG_KERNEL_CONTEXT_EGID = 29, + LTTNG_KERNEL_CONTEXT_SGID = 30, + LTTNG_KERNEL_CONTEXT_VUID = 31, + LTTNG_KERNEL_CONTEXT_VEUID = 32, + LTTNG_KERNEL_CONTEXT_VSUID = 33, + LTTNG_KERNEL_CONTEXT_VGID = 34, + LTTNG_KERNEL_CONTEXT_VEGID = 35, + LTTNG_KERNEL_CONTEXT_VSGID = 36, }; /* Perf counter attributes */ -- 2.34.1 From fc6d2633a10e8647bdab76d8f008affff875476f Mon Sep 17 00:00:00 2001 From: Michael Jeanson Date: Tue, 12 Feb 2019 11:51:55 -0500 Subject: [PATCH 11/16] Add UST uid/gid contexts Signed-off-by: Michael Jeanson --- src/bin/lttng-sessiond/lttng-ust-abi.h | 6 ++++++ src/bin/lttng-sessiond/save.c | 18 ++++++++++++++++++ src/bin/lttng-sessiond/trace-ust.c | 18 ++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/src/bin/lttng-sessiond/lttng-ust-abi.h b/src/bin/lttng-sessiond/lttng-ust-abi.h index c57dc90c7..7cfb18646 100644 --- a/src/bin/lttng-sessiond/lttng-ust-abi.h +++ b/src/bin/lttng-sessiond/lttng-ust-abi.h @@ -152,6 +152,12 @@ enum lttng_ust_context_type { LTTNG_UST_CONTEXT_PID_NS = 12, LTTNG_UST_CONTEXT_USER_NS = 13, LTTNG_UST_CONTEXT_UTS_NS = 14, + LTTNG_UST_CONTEXT_VUID = 15, + LTTNG_UST_CONTEXT_VEUID = 16, + LTTNG_UST_CONTEXT_VSUID = 17, + LTTNG_UST_CONTEXT_VGID = 18, + LTTNG_UST_CONTEXT_VEGID = 19, + LTTNG_UST_CONTEXT_VSGID = 20, }; struct lttng_ust_perf_counter_ctx { diff --git a/src/bin/lttng-sessiond/save.c b/src/bin/lttng-sessiond/save.c index 993c3716a..d3a702ab6 100644 --- a/src/bin/lttng-sessiond/save.c +++ b/src/bin/lttng-sessiond/save.c @@ -404,6 +404,24 @@ const char *get_ust_context_type_string( case LTTNG_UST_CONTEXT_UTS_NS: context_type_string = config_event_context_uts_ns; break; + case LTTNG_UST_CONTEXT_VUID: + context_type_string = config_event_context_vuid; + break; + case LTTNG_UST_CONTEXT_VEUID: + context_type_string = config_event_context_veuid; + break; + case LTTNG_UST_CONTEXT_VSUID: + context_type_string = config_event_context_vsuid; + break; + case LTTNG_UST_CONTEXT_VGID: + context_type_string = config_event_context_vgid; + break; + case LTTNG_UST_CONTEXT_VEGID: + context_type_string = config_event_context_vegid; + break; + case LTTNG_UST_CONTEXT_VSGID: + context_type_string = config_event_context_vsgid; + break; case LTTNG_UST_CONTEXT_PERF_THREAD_COUNTER: /* * Error, should not be stored in the XML, perf contexts diff --git a/src/bin/lttng-sessiond/trace-ust.c b/src/bin/lttng-sessiond/trace-ust.c index a37161865..3095c8617 100644 --- a/src/bin/lttng-sessiond/trace-ust.c +++ b/src/bin/lttng-sessiond/trace-ust.c @@ -584,6 +584,24 @@ int trace_ust_context_type_event_to_ust( case LTTNG_EVENT_CONTEXT_UTS_NS: utype = LTTNG_UST_CONTEXT_UTS_NS; break; + case LTTNG_EVENT_CONTEXT_VUID: + utype = LTTNG_UST_CONTEXT_VUID; + break; + case LTTNG_EVENT_CONTEXT_VEUID: + utype = LTTNG_UST_CONTEXT_VEUID; + break; + case LTTNG_EVENT_CONTEXT_VSUID: + utype = LTTNG_UST_CONTEXT_VSUID; + break; + case LTTNG_EVENT_CONTEXT_VGID: + utype = LTTNG_UST_CONTEXT_VGID; + break; + case LTTNG_EVENT_CONTEXT_VEGID: + utype = LTTNG_UST_CONTEXT_VEGID; + break; + case LTTNG_EVENT_CONTEXT_VSGID: + utype = LTTNG_UST_CONTEXT_VSGID; + break; default: utype = -1; break; -- 2.34.1 From 3c9c7247b5a90133f996fac6a3fa6acf74f1bd3f Mon Sep 17 00:00:00 2001 From: Jonathan Rajotte Date: Tue, 2 Apr 2019 17:51:01 -0400 Subject: [PATCH 12/16] mi: Add support for namespace and uid/gid contexts Signed-off-by: Jonathan Rajotte Signed-off-by: Michael Jeanson --- src/common/mi-lttng-3.0.xsd | 19 +++++++++++++++++++ src/common/mi-lttng.c | 38 +++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/src/common/mi-lttng-3.0.xsd b/src/common/mi-lttng-3.0.xsd index 017956ccc..b15491a6e 100644 --- a/src/common/mi-lttng-3.0.xsd +++ b/src/common/mi-lttng-3.0.xsd @@ -119,6 +119,25 @@ THE SOFTWARE. + + + + + + + + + + + + + + + + + + + diff --git a/src/common/mi-lttng.c b/src/common/mi-lttng.c index 69b3cc041..d889a4029 100644 --- a/src/common/mi-lttng.c +++ b/src/common/mi-lttng.c @@ -428,6 +428,44 @@ const char *mi_lttng_event_contexttype_string(enum lttng_event_context_type val) return config_event_context_callstack_user; case LTTNG_EVENT_CONTEXT_CALLSTACK_KERNEL: return config_event_context_callstack_kernel; + case LTTNG_EVENT_CONTEXT_CGROUP_NS: + return config_event_context_cgroup_ns; + case LTTNG_EVENT_CONTEXT_IPC_NS: + return config_event_context_ipc_ns; + case LTTNG_EVENT_CONTEXT_MNT_NS: + return config_event_context_mnt_ns; + case LTTNG_EVENT_CONTEXT_NET_NS: + return config_event_context_net_ns; + case LTTNG_EVENT_CONTEXT_PID_NS: + return config_event_context_pid_ns; + case LTTNG_EVENT_CONTEXT_USER_NS: + return config_event_context_user_ns; + case LTTNG_EVENT_CONTEXT_UTS_NS: + return config_event_context_uts_ns; + case LTTNG_EVENT_CONTEXT_UID: + return config_event_context_uid; + case LTTNG_EVENT_CONTEXT_EUID: + return config_event_context_euid; + case LTTNG_EVENT_CONTEXT_SUID: + return config_event_context_suid; + case LTTNG_EVENT_CONTEXT_GID: + return config_event_context_gid; + case LTTNG_EVENT_CONTEXT_EGID: + return config_event_context_egid; + case LTTNG_EVENT_CONTEXT_SGID: + return config_event_context_sgid; + case LTTNG_EVENT_CONTEXT_VUID: + return config_event_context_vuid; + case LTTNG_EVENT_CONTEXT_VEUID: + return config_event_context_veuid; + case LTTNG_EVENT_CONTEXT_VSUID: + return config_event_context_vsuid; + case LTTNG_EVENT_CONTEXT_VGID: + return config_event_context_vgid; + case LTTNG_EVENT_CONTEXT_VEGID: + return config_event_context_vegid; + case LTTNG_EVENT_CONTEXT_VSGID: + return config_event_context_vsgid; default: return NULL; } -- 2.34.1 From ed997599d0b045971c7cdc01ce1f6248724d8c61 Mon Sep 17 00:00:00 2001 From: Michael Jeanson Date: Mon, 1 Apr 2019 11:51:52 -0400 Subject: [PATCH 13/16] Add UST namespace contexts tests Signed-off-by: Michael Jeanson --- configure.ac | 1 + tests/regression/Makefile.am | 3 +- tests/regression/ust/Makefile.am | 2 +- tests/regression/ust/namespaces/Makefile.am | 16 +++ .../ust/namespaces/test_ns_contexts | 106 ++++++++++++++++++ 5 files changed, 126 insertions(+), 2 deletions(-) create mode 100644 tests/regression/ust/namespaces/Makefile.am create mode 100755 tests/regression/ust/namespaces/test_ns_contexts diff --git a/configure.ac b/configure.ac index f11d1b86d..56acf4fb9 100644 --- a/configure.ac +++ b/configure.ac @@ -1147,6 +1147,7 @@ AC_CONFIG_FILES([ tests/regression/ust/type-declarations/Makefile tests/regression/ust/rotation-destroy-flush/Makefile tests/regression/ust/blocking/Makefile + tests/regression/ust/namespaces/Makefile tests/stress/Makefile tests/unit/Makefile tests/unit/ini_config/Makefile diff --git a/tests/regression/Makefile.am b/tests/regression/Makefile.am index 775240405..1d3cda3bb 100644 --- a/tests/regression/Makefile.am +++ b/tests/regression/Makefile.am @@ -50,7 +50,8 @@ TESTS += ust/before-after/test_before_after \ ust/test_event_perf \ ust/blocking/test_blocking \ ust/multi-lib/test_multi_lib \ - ust/rotation-destroy-flush/test_rotation_destroy_flush + ust/rotation-destroy-flush/test_rotation_destroy_flush \ + ust/namespaces/test_ns_contexts endif # HAVE_LIBLTTNG_UST_CTL if PYTHON_BINDING diff --git a/tests/regression/ust/Makefile.am b/tests/regression/ust/Makefile.am index 6237b1610..cf6f20dd4 100644 --- a/tests/regression/ust/Makefile.am +++ b/tests/regression/ust/Makefile.am @@ -3,7 +3,7 @@ SUBDIRS = nprocesses high-throughput low-throughput before-after multi-session \ overlap buffers-pid linking daemon exit-fast fork libc-wrapper \ periodical-metadata-flush java-jul java-log4j python-logging \ getcpu-override clock-override type-declarations \ - rotation-destroy-flush blocking multi-lib + rotation-destroy-flush blocking multi-lib namespaces if HAVE_OBJCOPY SUBDIRS += baddr-statedump ust-dl diff --git a/tests/regression/ust/namespaces/Makefile.am b/tests/regression/ust/namespaces/Makefile.am new file mode 100644 index 000000000..11f4d8508 --- /dev/null +++ b/tests/regression/ust/namespaces/Makefile.am @@ -0,0 +1,16 @@ +noinst_SCRIPTS = test_ns_contexts +EXTRA_DIST = test_ns_contexts + +all-local: + @if [ x"$(srcdir)" != x"$(builddir)" ]; then \ + for script in $(EXTRA_DIST); do \ + cp -f $(srcdir)/$$script $(builddir); \ + done; \ + fi + +clean-local: + @if [ x"$(srcdir)" != x"$(builddir)" ]; then \ + for script in $(EXTRA_DIST); do \ + rm -f $(builddir)/$$script; \ + done; \ + fi diff --git a/tests/regression/ust/namespaces/test_ns_contexts b/tests/regression/ust/namespaces/test_ns_contexts new file mode 100755 index 000000000..105c4f03a --- /dev/null +++ b/tests/regression/ust/namespaces/test_ns_contexts @@ -0,0 +1,106 @@ +#!/bin/bash +# +# Copyright (C) 2019 Michael Jeanson +# +# This library is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this library; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +TEST_DESC="UST - Namespace contexts" + +CURDIR=$(dirname "$0")/ +TESTDIR=$CURDIR/../../.. + +TESTAPP_PATH="$TESTDIR/utils/testapp" +TESTAPP_NAME="gen-ust-events" +TESTAPP_BIN="$TESTAPP_PATH/$TESTAPP_NAME/$TESTAPP_NAME" +NUM_EVENT=10000 +EVENT_NAME="tp:tptest" + +TESTS_PER_NS=13 + +NUM_TESTS=$((TESTS_PER_NS * 7)) + +source "$TESTDIR/utils/utils.sh" + +# MUST set TESTDIR before calling those functions +function run_app() +{ + $TESTAPP_BIN $NUM_EVENT + ok $? "Application done" +} + +function test_ns() +{ + local ns=$1 + + local session_name="${ns}_ns" + local chan_name="${ns}_ns" + local context_name="${ns}_ns" + + local trace_path + local ns_inode + + # Check if the kernel has support for this ns type + if [ ! -f "/proc/$$/ns/$ns" ]; then + skip 0 "System has no $ns namespace support" $TESTS_PER_NS + return + fi + + # Get the current ns inode number + ns_inode=$(stat -c '%i' -L "/proc/$$/ns/$ns") + ok $? "Get current $ns namespace inode: $ns_inode" + + trace_path=$(mktemp -d) + + start_lttng_sessiond + + create_lttng_session_ok "$session_name" "$trace_path" + enable_ust_lttng_channel_ok "$session_name" "$chan_name" + add_context_ust_ok "$session_name" "$chan_name" "$context_name" + enable_ust_lttng_event_ok "$session_name" "$EVENT_NAME" "$chan_name" + start_lttng_tracing_ok "$session_name" + + run_app + + # stop and destroy + stop_lttng_tracing_ok "$session_name" + destroy_lttng_session_ok "$session_name" + stop_lttng_sessiond + + # Check that the events contain the right namespace inode number + validate_trace_count "${ns}_ns = $ns_inode" "$trace_path" $NUM_EVENT + + rm -rf "$trace_path" + +} + + +plan_tests $NUM_TESTS + +print_test_banner "$TEST_DESC" + +system_has_ns=0 +if [ -d "/proc/$$/ns" ]; then + system_has_ns=1 +fi + +skip $system_has_ns "System has no namespaces support" $NUM_TESTS && exit 0 + + +test_ns cgroup +test_ns ipc +test_ns mnt +test_ns net +test_ns pid +test_ns user +test_ns uts -- 2.34.1 From c0876a86e2fc3c97e0995f15f4f7e1dcfb8ec731 Mon Sep 17 00:00:00 2001 From: Michael Jeanson Date: Mon, 1 Apr 2019 11:53:20 -0400 Subject: [PATCH 14/16] Add kernel namespace contexts tests Signed-off-by: Michael Jeanson --- tests/regression/kernel/Makefile.am | 3 +- tests/regression/kernel/test_ns_contexts | 146 +++++++++++++++++++++++ tests/root_regression | 1 + 3 files changed, 149 insertions(+), 1 deletion(-) create mode 100755 tests/regression/kernel/test_ns_contexts diff --git a/tests/regression/kernel/Makefile.am b/tests/regression/kernel/Makefile.am index 3ab6d75bd..169267adb 100644 --- a/tests/regression/kernel/Makefile.am +++ b/tests/regression/kernel/Makefile.am @@ -2,7 +2,8 @@ EXTRA_DIST = test_event_basic test_all_events test_syscall \ test_clock_override test_rotation_destroy_flush \ test_select_poll_epoll test_lttng_logger \ test_userspace_probe test_callstack \ - test_syscall validate_select_poll_epoll.py + test_syscall validate_select_poll_epoll.py \ + test_ns_contexts noinst_PROGRAMS = select_poll_epoll select_poll_epoll_SOURCES = select_poll_epoll.c diff --git a/tests/regression/kernel/test_ns_contexts b/tests/regression/kernel/test_ns_contexts new file mode 100755 index 000000000..406814cb4 --- /dev/null +++ b/tests/regression/kernel/test_ns_contexts @@ -0,0 +1,146 @@ +#!/bin/bash +# +# Copyright (C) 2019 Michael Jeanson +# +# This library is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this library; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +TEST_DESC="Kernel tracer - Namespace contexts" + +CURDIR=$(dirname "$0")/ +TESTDIR=$CURDIR/../.. + +TESTS_PER_NS=11 + +NUM_TESTS=$((TESTS_PER_NS * 7)) + +source "$TESTDIR/utils/utils.sh" + +# MUST set TESTDIR before calling those functions +function add_context_kernel_skip_ok() +{ + local session_name=$1 + local channel_name=$2 + local context_name=$3 + local skip_num=$4 + + local ret + + "$TESTDIR/../src/bin/lttng/$LTTNG_BIN" add-context -k \ + -s "$session_name" -c "$channel_name" \ + -t "$context_name" 1>"$OUTPUT_DEST" 2>"$ERROR_OUTPUT_DEST" + ret=$? + + if [ "$ret" == "4" ]; then + skip 0 "Current kernel doesn't implement '$context_name' context" $((skip_num + 1)) + else + ok $ret "Add context command for type: $context_name" + fi + + return $ret +} + +function enable_kernel_lttng_event_filter_ok() +{ + local session_name=$1 + local syscall_name=$2 + local channel_name=$3 + local filter=$4 + + "$TESTDIR/../src/bin/lttng/$LTTNG_BIN" enable-event -k \ + -c "$channel_name" -s "$session_name" \ + --syscall "$syscall_name" \ + -f "$filter" \ + 1>"$OUTPUT_DEST" 2>"$ERROR_OUTPUT_DEST" + + ok $? "Add syscall with filter" +} + +function test_ns() +{ + local ns=$1 + + local session_name="${ns}_ns" + local chan_name="${ns}_ns" + local context_name="${ns}_ns" + + local trace_path + local ns_inode + + # Check if the kernel has support for this ns type + if [ ! -f "/proc/$$/ns/$ns" ]; then + skip 0 "System has no $ns namespace support" $TESTS_PER_NS + return + fi + + # Get the current ns inode number + ns_inode=$(stat -c '%i' -L "/proc/$$/ns/$ns") + ok $? "Get current $ns namespace inode: $ns_inode" + + trace_path=$(mktemp -d) + + start_lttng_sessiond + + create_lttng_session_ok "$session_name" "$trace_path" + enable_kernel_lttng_channel_ok "$session_name" "$chan_name" + add_context_kernel_skip_ok "$session_name" "$chan_name" "$context_name" 4 + if [ "$?" != "4" ]; then + enable_kernel_lttng_event_filter_ok "$session_name" "read" "$chan_name" "\$ctx.$context_name == $ns_inode" + start_lttng_tracing_ok "$session_name" + + # Make sure there is at least one read syscall + cat /proc/cmdline >/dev/null + + stop_lttng_tracing_ok "$session_name" + + # Check that the events contain the right namespace inode number + validate_trace "${ns}_ns = $ns_inode" "$trace_path" + fi + + destroy_lttng_session_ok "$session_name" + stop_lttng_sessiond + + rm -rf "$trace_path" +} + + +plan_tests $NUM_TESTS + +print_test_banner "$TEST_DESC" + + +isroot=0 +if [ "$(id -u)" == "0" ]; then + isroot=1 +fi + +skip $isroot "Root access is needed. Skipping all tests." "$NUM_TESTS" && exit 0 + + +system_has_ns=0 +if [ -d "/proc/$$/ns" ]; then + system_has_ns=1 +fi + +skip $system_has_ns "System has no namespaces support" $NUM_TESTS && exit 0 + + +validate_lttng_modules_present + +test_ns cgroup +test_ns ipc +test_ns mnt +test_ns net +test_ns pid +test_ns user +test_ns uts diff --git a/tests/root_regression b/tests/root_regression index f1f661997..c9394aa2c 100644 --- a/tests/root_regression +++ b/tests/root_regression @@ -8,6 +8,7 @@ regression/kernel/test_select_poll_epoll regression/kernel/test_lttng_logger regression/kernel/test_callstack regression/kernel/test_userspace_probe +regression/kernel/test_ns_contexts regression/tools/live/test_kernel regression/tools/live/test_lttng_kernel regression/tools/streaming/test_high_throughput_limits -- 2.34.1 From 8d013e04cc35f80d177e827c59c07dca44b94e66 Mon Sep 17 00:00:00 2001 From: Michael Jeanson Date: Mon, 1 Apr 2019 11:53:57 -0400 Subject: [PATCH 15/16] Add UST namespace context change tests Signed-off-by: Michael Jeanson --- .gitignore | 1 + configure.ac | 1 + tests/regression/Makefile.am | 3 +- tests/regression/ust/namespaces/Makefile.am | 4 +- .../ust/namespaces/test_ns_contexts_change | 135 +++++++++++ tests/utils/testapp/Makefile.am | 1 + .../testapp/gen-ust-events-ns/Makefile.am | 10 + .../gen-ust-events-ns/gen-ust-events-ns.c | 229 ++++++++++++++++++ tests/utils/testapp/gen-ust-events-ns/tp.c | 16 ++ tests/utils/testapp/gen-ust-events-ns/tp.h | 35 +++ 10 files changed, 432 insertions(+), 3 deletions(-) create mode 100755 tests/regression/ust/namespaces/test_ns_contexts_change create mode 100644 tests/utils/testapp/gen-ust-events-ns/Makefile.am create mode 100644 tests/utils/testapp/gen-ust-events-ns/gen-ust-events-ns.c create mode 100644 tests/utils/testapp/gen-ust-events-ns/tp.c create mode 100644 tests/utils/testapp/gen-ust-events-ns/tp.h diff --git a/.gitignore b/.gitignore index 19276012e..080df57ec 100644 --- a/.gitignore +++ b/.gitignore @@ -117,6 +117,7 @@ health_check /tests/regression/ust/multi-lib/exec-without-callsites /tests/utils/testapp/gen-syscall-events-callstack/gen-syscall-events-callstack /tests/utils/testapp/gen-ust-events/gen-ust-events +/tests/utils/testapp/gen-ust-events-ns/gen-ust-events-ns /tests/utils/testapp/gen-ust-nevents-str/gen-ust-nevents-str /tests/utils/testapp/gen-ust-nevents/gen-ust-nevents /tests/utils/testapp/gen-ust-tracef/gen-ust-tracef diff --git a/configure.ac b/configure.ac index 56acf4fb9..679ddb450 100644 --- a/configure.ac +++ b/configure.ac @@ -1156,6 +1156,7 @@ AC_CONFIG_FILES([ tests/utils/tap/Makefile tests/utils/testapp/Makefile tests/utils/testapp/gen-ust-events/Makefile + tests/utils/testapp/gen-ust-events-ns/Makefile tests/utils/testapp/gen-syscall-events-callstack/Makefile tests/utils/testapp/gen-ust-nevents/Makefile tests/utils/testapp/gen-ust-nevents-str/Makefile diff --git a/tests/regression/Makefile.am b/tests/regression/Makefile.am index 1d3cda3bb..2071b28b7 100644 --- a/tests/regression/Makefile.am +++ b/tests/regression/Makefile.am @@ -51,7 +51,8 @@ TESTS += ust/before-after/test_before_after \ ust/blocking/test_blocking \ ust/multi-lib/test_multi_lib \ ust/rotation-destroy-flush/test_rotation_destroy_flush \ - ust/namespaces/test_ns_contexts + ust/namespaces/test_ns_contexts \ + ust/namespaces/test_ns_contexts_change endif # HAVE_LIBLTTNG_UST_CTL if PYTHON_BINDING diff --git a/tests/regression/ust/namespaces/Makefile.am b/tests/regression/ust/namespaces/Makefile.am index 11f4d8508..78f659cc1 100644 --- a/tests/regression/ust/namespaces/Makefile.am +++ b/tests/regression/ust/namespaces/Makefile.am @@ -1,5 +1,5 @@ -noinst_SCRIPTS = test_ns_contexts -EXTRA_DIST = test_ns_contexts +noinst_SCRIPTS = test_ns_contexts test_ns_contexts_change +EXTRA_DIST = test_ns_contexts test_ns_contexts_change all-local: @if [ x"$(srcdir)" != x"$(builddir)" ]; then \ diff --git a/tests/regression/ust/namespaces/test_ns_contexts_change b/tests/regression/ust/namespaces/test_ns_contexts_change new file mode 100755 index 000000000..18a22e588 --- /dev/null +++ b/tests/regression/ust/namespaces/test_ns_contexts_change @@ -0,0 +1,135 @@ +#!/bin/bash +# +# Copyright (C) 2019 Michael Jeanson +# +# This library is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this library; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +TEST_DESC="UST - Namespace contexts change" + +CURDIR=$(dirname "$0")/ +TESTDIR=$CURDIR/../../.. + +TESTAPP_PATH="$TESTDIR/utils/testapp" +TESTAPP_NAME="gen-ust-events-ns" +TESTAPP_BIN="$TESTAPP_PATH/$TESTAPP_NAME/$TESTAPP_NAME" +NUM_EVENT=1000 +EVENT_NAME="tp:tptest" + +TESTS_PER_NS=16 + +NUM_TESTS=$((TESTS_PER_NS * 5)) + +source "$TESTDIR/utils/utils.sh" + +# MUST set TESTDIR before calling those functions + +function test_ns() +{ + local ns=$1 + + local session_name="${ns}_ns" + local chan_name="${ns}_ns" + local context_name="${ns}_ns" + + local trace_path + local ns_inode + local file_sync_before_last + local file_sync_after_unshare + + # Check if the kernel has support for this ns type + if [ ! -f "/proc/$$/ns/$ns" ]; then + skip 0 "System has no $ns namespace support" $TESTS_PER_NS + return + fi + + # Get the current ns inode number + ns_inode=$(stat -c '%i' -L "/proc/$$/ns/$ns") + ok $? "Get current $ns namespace inode: $ns_inode" || ns_inode="invalid" + + trace_path=$(mktemp -d) + file_sync_before_last=$(mktemp -u) + file_sync_after_unshare=$(mktemp -u) + + start_lttng_sessiond + + create_lttng_session_ok "$session_name" "$trace_path" + enable_ust_lttng_channel_ok "$session_name" "$chan_name" + add_context_ust_ok "$session_name" "$chan_name" "$context_name" + enable_ust_lttng_event_ok "$session_name" "$EVENT_NAME" "$chan_name" + start_lttng_tracing_ok "$session_name" + + $TESTAPP_BIN -n "$ns" -i $NUM_EVENT -a "$file_sync_after_unshare" -b "$file_sync_before_last" & + app_pid=$! + + # Let the app do it's thing before entering the synchronisation loop + sleep 0.5 + + while [ ! -f "$file_sync_after_unshare" ]; do + # Break if the app failed / died + if [ ! -f "/proc/$app_pid" ]; then + break + fi + echo "# Waiting for app..." + sleep 0.5 + done + + app_ns_inode=$(stat -c '%i' -L "/proc/$app_pid/ns/$ns") + ok $? "Get current $ns namespace inode: $app_ns_inode" || app_ns_inode="invalid" + + test "$ns_inode" != "invalid" && test "$app_ns_inode" != "invalid" && test "$ns_inode" != "$app_ns_inode" + ok $? "Reported namespace inode changed after unshare" + + touch "$file_sync_before_last" + + # stop and destroy + stop_lttng_tracing_ok "$session_name" + destroy_lttng_session_ok "$session_name" + stop_lttng_sessiond + + # Check that the events contain the right namespace inode number + validate_trace_count "${ns}_ns = $ns_inode" "$trace_path" $NUM_EVENT + validate_trace_count "${ns}_ns = $app_ns_inode" "$trace_path" $NUM_EVENT + + rm -rf "$trace_path" + rm -f "$file_sync_before_last" + rm -f "$file_sync_after_unshare" +} + + +plan_tests $NUM_TESTS + +print_test_banner "$TEST_DESC" + +isroot=0 +if [ "$(id -u)" == "0" ]; then + isroot=1 +fi + +skip $isroot "Root access is needed. Skipping all tests." "$NUM_TESTS" && exit 0 + +system_has_ns=0 +if [ -d "/proc/$$/ns" ]; then + system_has_ns=1 +fi + +skip $system_has_ns "System has no namespaces support" $NUM_TESTS && exit 0 + + +test_ns cgroup +test_ns ipc +test_ns mnt +test_ns net +#test_ns pid # pid_ns is special, can't be changed that way +#test_ns user # user_ns can only be change when the app is single threaded, this is always false for an ust instrumented app +test_ns uts diff --git a/tests/utils/testapp/Makefile.am b/tests/utils/testapp/Makefile.am index e54ac890a..e98f4b571 100644 --- a/tests/utils/testapp/Makefile.am +++ b/tests/utils/testapp/Makefile.am @@ -1,4 +1,5 @@ SUBDIRS = gen-ust-events \ + gen-ust-events-ns \ gen-ust-nevents \ gen-ust-nevents-str \ gen-ust-tracef \ diff --git a/tests/utils/testapp/gen-ust-events-ns/Makefile.am b/tests/utils/testapp/gen-ust-events-ns/Makefile.am new file mode 100644 index 000000000..39f991240 --- /dev/null +++ b/tests/utils/testapp/gen-ust-events-ns/Makefile.am @@ -0,0 +1,10 @@ +AM_CPPFLAGS += -I$(top_srcdir)/tests/utils -I$(srcdir) \ + -I$(top_srcdir)/tests/utils/testapp + +if HAVE_LIBLTTNG_UST_CTL +noinst_PROGRAMS = gen-ust-events-ns +gen_ust_events_ns_SOURCES = gen-ust-events-ns.c tp.c tp.h +gen_ust_events_ns_LDADD = -llttng-ust -lurcu-bp -llttng-ust-fork \ + $(top_builddir)/tests/utils/libtestutils.la \ + $(DL_LIBS) $(POPT_LIBS) +endif diff --git a/tests/utils/testapp/gen-ust-events-ns/gen-ust-events-ns.c b/tests/utils/testapp/gen-ust-events-ns/gen-ust-events-ns.c new file mode 100644 index 000000000..61611853b --- /dev/null +++ b/tests/utils/testapp/gen-ust-events-ns/gen-ust-events-ns.c @@ -0,0 +1,229 @@ +/* + * Copyright (C) 2019 Michael Jeanson + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation; version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "utils.h" +#include "signal-helper.h" + +#define TRACEPOINT_DEFINE +#include "tp.h" + +#define LTTNG_PROC_NS_PATH_MAX 40 + +static int nr_iter = 100; +static int debug = 0; +static char *ns_opt = NULL; +static char *after_unshare_file_path = NULL; +static char *before_second_event_file_path = NULL; + +static +struct poptOption opts[] = { + /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */ + { "debug", 'd', POPT_ARG_NONE, &debug, 0, "Enable debug output", NULL }, + { "ns", 'n', POPT_ARG_STRING, &ns_opt, 0, "Namespace short identifier", NULL }, + { "iter", 'i', POPT_ARG_INT, &nr_iter, 0, "Number of tracepoint iterations", NULL }, + { "after", 'a', POPT_ARG_STRING, &after_unshare_file_path, 0, "after_unshare_file_path,", NULL }, + { "before", 'b', POPT_ARG_STRING, &before_second_event_file_path, 0, "before_second_event_file_path,", NULL }, + POPT_AUTOHELP + { NULL, 0, 0, NULL, 0 } +}; + +static +void debug_printf(const char *format, ...) { + va_list args; + va_start(args, format); + + if (debug) + vfprintf(stderr, format, args); + + va_end(args); +} + +static +ino_t get_ns_inum(char ns[]) { + struct stat sb; + char proc_ns_path[LTTNG_PROC_NS_PATH_MAX]; + + /* + * /proc/thread-self was introduced in kernel v3.17 + */ + if (snprintf(proc_ns_path, LTTNG_PROC_NS_PATH_MAX, + "/proc/thread-self/ns/%s", ns) >= 0) { + if (stat(proc_ns_path, &sb) == 0) { + return sb.st_ino; + } + } + + if (snprintf(proc_ns_path, LTTNG_PROC_NS_PATH_MAX, + "/proc/self/task/%d/%s/net", + gettid(), ns) >= 0) { + + if (stat(proc_ns_path, &sb) == 0) { + return sb.st_ino; + } + } + + return 1; +} + +static +int do_the_needful(int ns_flag, char ns_str[]) { + int ret = 0, i; + ino_t ns1, ns2; + + ns1 = get_ns_inum(ns_str); + debug_printf("Initial %s ns inode number: %lu\n", ns_str, ns1); + + for (i = 0; nr_iter < 0 || i < nr_iter; i++) { + + tracepoint(tp, tptest, ns1); + + if (should_quit) { + break; + } + } + + ret = unshare(ns_flag); + + if (ret == -1) { + perror("unshare"); + ret = 0; + } + + ns2 = get_ns_inum(ns_str); + debug_printf("Post unshare %s ns inode number: %lu\n", ns_str, ns2); + + /* + * Signal that we emited the first event group and that the + * unshare call is completed. + */ + if (after_unshare_file_path) { + ret = create_file(after_unshare_file_path); + + if (ret != 0) { + goto end; + } + } + + /* + * Wait on synchronization before writing second event group. + */ + if (before_second_event_file_path) { + ret = wait_on_file(before_second_event_file_path); + if (ret != 0) { + goto end; + } + } + + for (i = 0; nr_iter < 0 || i < nr_iter; i++) { + + tracepoint(tp, tptest, ns2); + + if (should_quit) { + break; + } + } + +end: + return ret; +} + +// Send X events, change NS, wait for file to sync with test script, send X events in new NS + + +int main(int argc, const char **argv) { + int opt; + int ret = EXIT_SUCCESS; + poptContext pc; + + pc = poptGetContext(NULL, argc, argv, opts, 0); + poptReadDefaultConfig(pc, 0); + + if (argc < 2) { + poptPrintHelp(pc, stderr, 0); + ret = EXIT_FAILURE; + goto end; + } + + while ((opt = poptGetNextOpt(pc)) >= 0) { + switch(opt) { + default: + poptPrintUsage(pc, stderr, 0); + ret = EXIT_FAILURE; + goto end; + } + } + + if (opt < -1) { + /* an error occurred during option processing */ + poptPrintUsage(pc, stderr, 0); + fprintf(stderr, "%s: %s\n", + poptBadOption(pc, POPT_BADOPTION_NOALIAS), + poptStrerror(opt)); + ret = EXIT_FAILURE; + goto end; + } + + if (ns_opt == NULL) { + poptPrintUsage(pc, stderr, 0); + ret = EXIT_FAILURE; + goto end; + } + + if (set_signal_handler()) { + ret = EXIT_FAILURE; + goto end; + } + + if (strncmp(ns_opt, "cgroup", 3) == 0) { + do_the_needful(CLONE_NEWCGROUP, "cgroup"); + } else if (strncmp(ns_opt, "ipc", 3) == 0) { + do_the_needful(CLONE_NEWIPC, "ipc"); + } else if (strncmp(ns_opt, "mnt", 3) == 0) { + do_the_needful(CLONE_NEWNS, "mnt"); + } else if (strncmp(ns_opt, "net", 3) == 0) { + do_the_needful(CLONE_NEWNET, "net"); + } else if (strncmp(ns_opt, "pid", 3) == 0) { + do_the_needful(CLONE_NEWPID, "pid"); + } else if (strncmp(ns_opt, "user", 3) == 0) { + // Will always fail, requires a single threaded application, which can't happen with UST. + do_the_needful(CLONE_NEWUSER, "user"); + } else if (strncmp(ns_opt, "uts", 3) == 0) { + do_the_needful(CLONE_NEWUTS, "uts"); + } else { + printf("invalid ns id\n"); + ret = EXIT_FAILURE; + } + +end: + poptFreeContext(pc); + return ret; +} diff --git a/tests/utils/testapp/gen-ust-events-ns/tp.c b/tests/utils/testapp/gen-ust-events-ns/tp.c new file mode 100644 index 000000000..6f5341436 --- /dev/null +++ b/tests/utils/testapp/gen-ust-events-ns/tp.c @@ -0,0 +1,16 @@ +/* + * Copyright (c) - 2012 David Goulet + * + * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED OR + * IMPLIED. ANY USE IS AT YOUR OWN RISK. + * + * Permission is hereby granted to use or copy this program for any purpose, + * provided the above notices are retained on all copies. Permission to modify + * the code and to distribute modified code is granted, provided the above + * notices are retained, and a notice that the code was modified is included + * with the above copyright notice. + */ + +#define _LGPL_SOURCE +#define TRACEPOINT_CREATE_PROBES +#include "tp.h" diff --git a/tests/utils/testapp/gen-ust-events-ns/tp.h b/tests/utils/testapp/gen-ust-events-ns/tp.h new file mode 100644 index 000000000..59b3f295b --- /dev/null +++ b/tests/utils/testapp/gen-ust-events-ns/tp.h @@ -0,0 +1,35 @@ +#undef TRACEPOINT_PROVIDER +#define TRACEPOINT_PROVIDER tp + +#if !defined(_TRACEPOINT_TP_H) || defined(TRACEPOINT_HEADER_MULTI_READ) +#define _TRACEPOINT_TP_H + +/* + * Copyright (C) 2011 Mathieu Desnoyers + * + * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED + * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + * + * Permission is hereby granted to use or copy this program + * for any purpose, provided the above notices are retained on all copies. + * Permission to modify the code and to distribute modified code is granted, + * provided the above notices are retained, and a notice that the code was + * modified is included with the above copyright notice. + */ + +#include + +TRACEPOINT_EVENT(tp, tptest, + TP_ARGS(ino_t, ns_ino), + TP_FIELDS( + ctf_integer(ino_t, ns_ino, ns_ino) + ) +) + +#endif /* _TRACEPOINT_TP_H */ + +#undef TRACEPOINT_INCLUDE_FILE +#define TRACEPOINT_INCLUDE_FILE ./tp.h + +/* This part must be outside ifdef protection */ +#include -- 2.34.1 From 0e28eb334c7e35b6bb15b8a13ebf7caf954101d6 Mon Sep 17 00:00:00 2001 From: Michael Jeanson Date: Tue, 2 Apr 2019 13:38:07 -0400 Subject: [PATCH 16/16] Add kernel namespace context change tests Signed-off-by: Michael Jeanson --- .gitignore | 1 + configure.ac | 1 + tests/regression/kernel/Makefile.am | 2 +- .../regression/kernel/test_ns_contexts_change | 189 +++++++++++++++ tests/utils/testapp/Makefile.am | 4 +- tests/utils/testapp/gen-ns-events/Makefile.am | 8 + .../testapp/gen-ns-events/gen-ns-events.c | 215 ++++++++++++++++++ 7 files changed, 418 insertions(+), 2 deletions(-) create mode 100755 tests/regression/kernel/test_ns_contexts_change create mode 100644 tests/utils/testapp/gen-ns-events/Makefile.am create mode 100644 tests/utils/testapp/gen-ns-events/gen-ns-events.c diff --git a/.gitignore b/.gitignore index 080df57ec..abde871fc 100644 --- a/.gitignore +++ b/.gitignore @@ -132,6 +132,7 @@ health_check /tests/utils/testapp/userspace-probe-elf-cxx-binary/userspace-probe-elf-cxx-binary /tests/utils/testapp/userspace-probe-sdt-binary/foobar_provider.h /tests/utils/testapp/userspace-probe-sdt-binary/userspace-probe-sdt-binary +/tests/utils/testapp/gen-ns-events/gen-ns-events # man pages /doc/man/*.1 diff --git a/configure.ac b/configure.ac index 679ddb450..29f0f5845 100644 --- a/configure.ac +++ b/configure.ac @@ -1155,6 +1155,7 @@ AC_CONFIG_FILES([ tests/utils/Makefile tests/utils/tap/Makefile tests/utils/testapp/Makefile + tests/utils/testapp/gen-ns-events/Makefile tests/utils/testapp/gen-ust-events/Makefile tests/utils/testapp/gen-ust-events-ns/Makefile tests/utils/testapp/gen-syscall-events-callstack/Makefile diff --git a/tests/regression/kernel/Makefile.am b/tests/regression/kernel/Makefile.am index 169267adb..f539b80b6 100644 --- a/tests/regression/kernel/Makefile.am +++ b/tests/regression/kernel/Makefile.am @@ -3,7 +3,7 @@ EXTRA_DIST = test_event_basic test_all_events test_syscall \ test_select_poll_epoll test_lttng_logger \ test_userspace_probe test_callstack \ test_syscall validate_select_poll_epoll.py \ - test_ns_contexts + test_ns_contexts test_ns_contexts_change noinst_PROGRAMS = select_poll_epoll select_poll_epoll_SOURCES = select_poll_epoll.c diff --git a/tests/regression/kernel/test_ns_contexts_change b/tests/regression/kernel/test_ns_contexts_change new file mode 100755 index 000000000..b97f12f22 --- /dev/null +++ b/tests/regression/kernel/test_ns_contexts_change @@ -0,0 +1,189 @@ +#!/bin/bash +# +# Copyright (C) 2019 Michael Jeanson +# +# This library is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this library; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +TEST_DESC="Kernel tracer - Namespace contexts change" + +CURDIR=$(dirname "$0")/ +TESTDIR=$CURDIR/../.. + +TESTAPP_PATH="$TESTDIR/utils/testapp" +TESTAPP_NAME="gen-ns-events" +TESTAPP_BIN="$TESTAPP_PATH/$TESTAPP_NAME/$TESTAPP_NAME" + +TESTS_PER_NS=19 + +NUM_TESTS=$((TESTS_PER_NS * 6)) + +source "$TESTDIR/utils/utils.sh" + +# MUST set TESTDIR before calling those functions + +function add_context_kernel_skip_ok() +{ + local session_name=$1 + local channel_name=$2 + local context_name=$3 + local skip_num=$4 + + local ret + + "$TESTDIR/../src/bin/lttng/$LTTNG_BIN" add-context -k \ + -s "$session_name" -c "$channel_name" \ + -t "$context_name" 1>"$OUTPUT_DEST" 2>"$ERROR_OUTPUT_DEST" + ret=$? + + if [ "$ret" == "4" ]; then + skip 0 "Current kernel doesn't implement '$context_name' context" $((skip_num + 1)) + else + ok $ret "Add context command for type: $context_name" + fi + + return $ret +} + +function enable_kernel_lttng_event_filter_ok() +{ + local session_name=$1 + local syscall_name=$2 + local channel_name=$3 + local filter=$4 + + "$TESTDIR/../src/bin/lttng/$LTTNG_BIN" enable-event -k \ + -c "$channel_name" -s "$session_name" \ + --syscall "$syscall_name" \ + -f "$filter" \ + 1>"$OUTPUT_DEST" 2>"$ERROR_OUTPUT_DEST" + + ok $? "Add syscall with filter" +} + +function test_ns() +{ + local ns=$1 + + local session_name="${ns}_ns" + local chan_name="${ns}_ns" + local context_name="${ns}_ns" + + local trace_path + local ns_inode + local file_sync_wait_before_unshare + local file_sync_wait_after_unshare + local file_sync_signal_after_unshare + + # Check if the kernel has support for this ns type + if [ ! -f "/proc/$$/ns/$ns" ]; then + skip 0 "System has no $ns namespace support" $TESTS_PER_NS + return + fi + + trace_path=$(mktemp -d) + file_sync_wait_before_unshare=$(mktemp -u) + file_sync_wait_after_unshare=$(mktemp -u) + file_sync_signal_after_unshare=$(mktemp -u) + + # Get the current ns inode number + ns_inode=$(stat -c '%i' -L "/proc/$$/ns/$ns") + ok $? "Get current $ns namespace inode: $ns_inode" || ns_inode="invalid" + + $TESTAPP_BIN -n "$ns" -a "$file_sync_wait_after_unshare" -b "$file_sync_wait_before_unshare" -s "$file_sync_signal_after_unshare" & + ok $? "Launch test app." + app_pid=$! + + app_ns_inode=$(stat -c '%i' -L "/proc/$app_pid/ns/$ns") + ok $? "Get app current $ns namespace inode: $app_ns_inode" || app_ns_inode="invalid" + + start_lttng_sessiond + + create_lttng_session_ok "$session_name" "$trace_path" + enable_kernel_lttng_channel_ok "$session_name" "$chan_name" + add_context_kernel_skip_ok "$session_name" "$chan_name" "$context_name" 10 + if [ "$?" != "4" ]; then + lttng_enable_kernel_syscall_ok "$session_name" "unshare" "$chan_name" + lttng_track_pid_ok "$app_pid" + start_lttng_tracing_ok "$session_name" + + touch "$file_sync_wait_before_unshare" + + # Let the app do it's thing before entering the synchronisation loop + sleep 0.5 + + while [ ! -f "$file_sync_signal_after_unshare" ]; do + # Break if the app failed / died + if [ ! -f "/proc/$app_pid" ]; then + break + fi + echo "# Waiting for app..." + sleep 0.5 + done + + app_unshare_ns_inode=$(stat -c '%i' -L "/proc/$app_pid/ns/$ns") + ok $? "Get app current $ns namespace inode: $app_unshare_ns_inode" || app_unshare_ns_inode="invalid" + + test "$app_ns_inode" != "invalid" && test "$app_unshare_ns_inode" != "invalid" && test "$app_ns_inode" != "$app_unshare_ns_inode" + ok $? "Reported namespace inode changed after unshare" + + touch "$file_sync_wait_after_unshare" + + stop_lttng_tracing_ok "$session_name" + + # Check that the events contain the right namespace inode number + validate_trace_count "${ns}_ns = $app_ns_inode" "$trace_path" 1 + validate_trace_count "${ns}_ns = $app_unshare_ns_inode" "$trace_path" 1 + fi + + # stop and destroy + destroy_lttng_session_ok "$session_name" + stop_lttng_sessiond + + rm -rf "$trace_path" + rm -f "$file_sync_wait_after_unshare" + rm -f "$file_sync_wait_before_unshare" + rm -f "$file_sync_signal_after_unshare" +} + + +plan_tests $NUM_TESTS + +print_test_banner "$TEST_DESC" + + +isroot=0 +if [ "$(id -u)" == "0" ]; then + isroot=1 +fi + +skip $isroot "Root access is needed. Skipping all tests." "$NUM_TESTS" && exit 0 + + +system_has_ns=0 +if [ -d "/proc/$$/ns" ]; then + system_has_ns=1 +fi + +skip $system_has_ns "System has no namespaces support" $NUM_TESTS && exit 0 + + +validate_lttng_modules_present + +test_ns cgroup +test_ns ipc +test_ns mnt +test_ns net +#test_ns pid # pid_ns is special, can't be changed that way +test_ns user +test_ns uts diff --git a/tests/utils/testapp/Makefile.am b/tests/utils/testapp/Makefile.am index e98f4b571..2a4cf5c7b 100644 --- a/tests/utils/testapp/Makefile.am +++ b/tests/utils/testapp/Makefile.am @@ -1,4 +1,6 @@ -SUBDIRS = gen-ust-events \ +SUBDIRS = \ + gen-ns-events \ + gen-ust-events \ gen-ust-events-ns \ gen-ust-nevents \ gen-ust-nevents-str \ diff --git a/tests/utils/testapp/gen-ns-events/Makefile.am b/tests/utils/testapp/gen-ns-events/Makefile.am new file mode 100644 index 000000000..17bc21ffe --- /dev/null +++ b/tests/utils/testapp/gen-ns-events/Makefile.am @@ -0,0 +1,8 @@ +AM_CPPFLAGS += -I$(top_srcdir)/tests/utils -I$(srcdir) \ + -I$(top_srcdir)/tests/utils/testapp + +noinst_PROGRAMS = gen-ns-events +gen_ns_events_SOURCES = gen-ns-events.c +gen_ns_events_LDADD = \ + $(top_builddir)/tests/utils/libtestutils.la \ + $(DL_LIBS) $(POPT_LIBS) diff --git a/tests/utils/testapp/gen-ns-events/gen-ns-events.c b/tests/utils/testapp/gen-ns-events/gen-ns-events.c new file mode 100644 index 000000000..d841b2726 --- /dev/null +++ b/tests/utils/testapp/gen-ns-events/gen-ns-events.c @@ -0,0 +1,215 @@ +/* + * Copyright (C) 2019 Michael Jeanson + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation; version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "utils.h" +#include "signal-helper.h" + +#define LTTNG_PROC_NS_PATH_MAX 40 + +static int debug = 0; +static char *ns_opt = NULL; +static char *before_unshare_wait_file_path = NULL; +static char *after_unshare_wait_file_path = NULL; +static char *after_unshare_signal_file_path = NULL; + +static +struct poptOption opts[] = { + /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */ + { "debug", 'd', POPT_ARG_NONE, &debug, 0, "Enable debug output", NULL }, + { "ns", 'n', POPT_ARG_STRING, &ns_opt, 0, "Namespace short identifier", NULL }, + { "before", 'b', POPT_ARG_STRING, &before_unshare_wait_file_path, 0, "Wait for file before unshare", NULL }, + { "after", 'a', POPT_ARG_STRING, &after_unshare_wait_file_path, 0, "Wait for file after unshare", NULL }, + { "signal", 's', POPT_ARG_STRING, &after_unshare_signal_file_path, 0, "Create signal file after unshare", NULL }, + POPT_AUTOHELP + { NULL, 0, 0, NULL, 0 } +}; + +static +void debug_printf(const char *format, ...) { + va_list args; + va_start(args, format); + + if (debug) + vfprintf(stderr, format, args); + + va_end(args); +} + +static +ino_t get_ns_inum(char ns[]) { + struct stat sb; + char proc_ns_path[LTTNG_PROC_NS_PATH_MAX]; + + /* + * /proc/thread-self was introduced in kernel v3.17 + */ + if (snprintf(proc_ns_path, LTTNG_PROC_NS_PATH_MAX, + "/proc/thread-self/ns/%s", ns) >= 0) { + if (stat(proc_ns_path, &sb) == 0) { + return sb.st_ino; + } + } + + if (snprintf(proc_ns_path, LTTNG_PROC_NS_PATH_MAX, + "/proc/self/task/%d/%s/net", + gettid(), ns) >= 0) { + + if (stat(proc_ns_path, &sb) == 0) { + return sb.st_ino; + } + } + + return 1; +} + +static +int do_the_needful(int ns_flag, char ns_str[]) { + int ret = 0; + ino_t ns1, ns2; + + ns1 = get_ns_inum(ns_str); + debug_printf("Initial %s ns inode number: %lu\n", ns_str, ns1); + + /* + * Wait on synchronization before unshare + */ + if (before_unshare_wait_file_path) { + ret = wait_on_file(before_unshare_wait_file_path); + if (ret != 0) { + goto end; + } + } + + ret = unshare(ns_flag); + + if (ret == -1) { + perror("unshare"); + ret = 0; + } + + ns2 = get_ns_inum(ns_str); + debug_printf("Post unshare %s ns inode number: %lu\n", ns_str, ns2); + + /* + * Signal that the unshare call is completed. + */ + if (after_unshare_signal_file_path) { + ret = create_file(after_unshare_signal_file_path); + + if (ret != 0) { + goto end; + } + } + + /* + * Wait on synchronization after unshare + */ + if (after_unshare_wait_file_path) { + ret = wait_on_file(after_unshare_wait_file_path); + if (ret != 0) { + goto end; + } + } + +end: + return ret; +} + +int main(int argc, const char **argv) { + int opt; + int ret = EXIT_SUCCESS; + poptContext pc; + + pc = poptGetContext(NULL, argc, argv, opts, 0); + poptReadDefaultConfig(pc, 0); + + if (argc < 2) { + poptPrintHelp(pc, stderr, 0); + ret = EXIT_FAILURE; + goto end; + } + + while ((opt = poptGetNextOpt(pc)) >= 0) { + switch(opt) { + default: + poptPrintUsage(pc, stderr, 0); + ret = EXIT_FAILURE; + goto end; + } + } + + if (opt < -1) { + /* an error occurred during option processing */ + poptPrintUsage(pc, stderr, 0); + fprintf(stderr, "%s: %s\n", + poptBadOption(pc, POPT_BADOPTION_NOALIAS), + poptStrerror(opt)); + ret = EXIT_FAILURE; + goto end; + } + + if (ns_opt == NULL) { + poptPrintUsage(pc, stderr, 0); + ret = EXIT_FAILURE; + goto end; + } + + if (set_signal_handler()) { + ret = EXIT_FAILURE; + goto end; + } + + if (strncmp(ns_opt, "cgroup", 3) == 0) { + do_the_needful(CLONE_NEWCGROUP, "cgroup"); + } else if (strncmp(ns_opt, "ipc", 3) == 0) { + do_the_needful(CLONE_NEWIPC, "ipc"); + } else if (strncmp(ns_opt, "mnt", 3) == 0) { + do_the_needful(CLONE_NEWNS, "mnt"); + } else if (strncmp(ns_opt, "net", 3) == 0) { + do_the_needful(CLONE_NEWNET, "net"); + } else if (strncmp(ns_opt, "pid", 3) == 0) { + do_the_needful(CLONE_NEWPID, "pid"); + } else if (strncmp(ns_opt, "user", 3) == 0) { + // Will always fail, requires a single threaded application, which can't happen with UST. + do_the_needful(CLONE_NEWUSER, "user"); + } else if (strncmp(ns_opt, "uts", 3) == 0) { + do_the_needful(CLONE_NEWUTS, "uts"); + } else { + printf("invalid ns id\n"); + ret = EXIT_FAILURE; + } + +end: + poptFreeContext(pc); + return ret; +} -- 2.34.1