Fix: missing env fields
authorJonathan Rajotte <jonathan.rajotte-julien@efficios.com>
Thu, 11 Aug 2022 20:23:39 +0000 (16:23 -0400)
committerJonathan Rajotte <jonathan.rajotte-julien@efficios.com>
Mon, 15 Aug 2022 18:31:14 +0000 (14:31 -0400)
TODO: validate json escaping?

Signed-off-by: Jonathan Rajotte <jonathan.rajotte-julien@efficios.com>
Change-Id: Ifde7485dc97df7bc588ea6620474f7ac34709920

src/ctf2.c

index 0ec0b94bb529a99b2af32833df0869d19d057ce3..7117f2aa0ba946327862893a2024c4c09f2c943d 100644 (file)
@@ -59,6 +59,79 @@ ctf2_metadata_write_field_class(struct lttng_kernel_session *session,
                                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)
 {
@@ -239,6 +312,7 @@ static int ctf2_metadata_write_packet_header_field_class(
 static int ctf2_metadata_write_environment(struct lttng_kernel_session *session)
 {
        int ret;
+       const char *product_uuid;
 
        ret = lttng_metadata_printf(
                session,
@@ -252,13 +326,60 @@ static int ctf2_metadata_write_environment(struct lttng_kernel_session *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;
 }
 
This page took 0.026949 seconds and 5 git commands to generate.