const struct lttng_kernel_type_common *type,
struct field_location_ctx *field_location_ctx);
+/* Per json RFC 4627 Section 2.5 for basic ascii */
+static
+int print_escaped_ctf_string(struct lttng_kernel_session *session, const char *string)
+{
+ int ret = 0;
+ size_t i;
+ char cur;
+
+ i = 0;
+ cur = string[i];
+ while (cur != '\0') {
+ switch (cur) {
+ case '"':
+ ret = lttng_metadata_printf(session, "%s", "\\\"");
+ break;
+ case '\\':
+ ret = lttng_metadata_printf(session, "%s", "\\\\");
+ break;
+ case '\b':
+ ret = lttng_metadata_printf(session, "%s", "\\b");
+ break;
+ case '\f':
+ ret = lttng_metadata_printf(session, "%s", "\\f");
+ break;
+ case '\n':
+ ret = lttng_metadata_printf(session, "%s", "\\n");
+ break;
+ case '\r':
+ ret = lttng_metadata_printf(session, "%s", "\\r");
+ break;
+ case '\t':
+ ret = lttng_metadata_printf(session, "%s", "\\t");
+ break;
+ default:
+ if ('\x00' <= cur && cur <= '\x1f') {
+ ret = lttng_metadata_printf(session, "%s", "\\u");
+ if (ret)
+ goto error;
+ ret = lttng_metadata_printf(session, "%04x", cur);
+ } else {
+ ret = lttng_metadata_printf(session, "%c", cur);
+ }
+ break;
+ }
+
+ if (ret)
+ goto error;
+
+ cur = string[++i];
+ }
+error:
+ return ret;
+}
+
+static
+int print_metadata_escaped_field(struct lttng_kernel_session *session, const char *field,
+ const char *field_value)
+{
+ int ret;
+
+ ret = lttng_metadata_printf(session, "\"%s\": \"", field);
+ if (ret)
+ goto error;
+
+ ret = print_escaped_ctf_string(session, field_value);
+ if (ret)
+ goto error;
+
+ ret = lttng_metadata_printf(session, "\"");
+
+error:
+ return ret;
+}
static int
ctf2_metadata_write_record_separator(struct lttng_kernel_session *session)
{
static int ctf2_metadata_write_environment(struct lttng_kernel_session *session)
{
int ret;
+ const char *product_uuid;
ret = lttng_metadata_printf(
session,
" \"tracer_major\": %d,\n"
" \"tracer_minor\": %d,\n"
" \"tracer_patchlevel\": %d,\n"
- " \"trace_buffering_scheme\": \"global\"\n"
- "}\n",
+ " \"trace_buffering_scheme\": \"global\",\n",
current->nsproxy->uts_ns->name.nodename, utsname()->sysname,
utsname()->release, utsname()->version,
LTTNG_MODULES_MAJOR_VERSION, LTTNG_MODULES_MINOR_VERSION,
LTTNG_MODULES_PATCHLEVEL_VERSION);
+ if (ret)
+ goto end;
+ printk(KERN_WARNING
+ "JORAJ here\n");
+
+ ret = lttng_metadata_printf(session, " ");
+ if (ret)
+ goto end;
+
+ ret = print_metadata_escaped_field(session, "trace_name", session->priv->name);
+ if (ret)
+ goto end;
+
+ ret = lttng_metadata_printf(session, ",\n");
+ if (ret)
+ goto end;
+
+ ret = lttng_metadata_printf(session, " ");
+ if (ret)
+ goto end;
+
+ ret = print_metadata_escaped_field(session, "trace_creation_datetime",
+ session->priv->creation_time);
+ if (ret)
+ goto end;
+
+
+ /* Add the product UUID to the 'env' section */
+ product_uuid = dmi_get_system_info(DMI_PRODUCT_UUID);
+ if (product_uuid) {
+ ret = lttng_metadata_printf(session, ",\n");
+ if (ret)
+ goto end;
+
+ ret = lttng_metadata_printf(session,
+ " \"product_uuid\": \"%s\"",
+ product_uuid
+ );
+ if (ret)
+ goto end;
+ }
+
+ /* Close the 'env' section */
+ ret = lttng_metadata_printf(session, "\n}\n");
+ if (ret)
+ goto end;
+
+end:
return ret;
}