+static const char *field_type(struct lttng_event_field *field)
+{
+ switch(field->type) {
+ case LTTNG_EVENT_FIELD_INTEGER:
+ return "integer";
+ case LTTNG_EVENT_FIELD_ENUM:
+ return "enum";
+ case LTTNG_EVENT_FIELD_FLOAT:
+ return "float";
+ case LTTNG_EVENT_FIELD_STRING:
+ return "string";
+ case LTTNG_EVENT_FIELD_OTHER:
+ default: /* fall-through */
+ return "unknown";
+ }
+}
+
+/*
+ * Pretty print single event fields.
+ */
+static void print_event_field(struct lttng_event_field *field)
+{
+ if (!field->field_name[0]) {
+ return;
+ }
+ MSG("%sfield: %s (%s)%s", indent8, field->field_name,
+ field_type(field), field->nowrite ? " [no write]" : "");
+}
+
+static int list_jul_events(void)
+{
+ int i, size;
+ struct lttng_domain domain;
+ struct lttng_handle *handle;
+ struct lttng_event *event_list;
+ pid_t cur_pid = 0;
+ char *cmdline = NULL;
+
+ DBG("Getting JUL tracing events");
+
+ memset(&domain, 0, sizeof(domain));
+ domain.type = LTTNG_DOMAIN_JUL;
+
+ handle = lttng_create_handle(NULL, &domain);
+ if (handle == NULL) {
+ goto error;
+ }
+
+ size = lttng_list_tracepoints(handle, &event_list);
+ if (size < 0) {
+ ERR("Unable to list JUL events: %s", lttng_strerror(size));
+ lttng_destroy_handle(handle);
+ return size;
+ }
+
+ MSG("JUL events (Logger name):\n-------------------------");
+
+ if (size == 0) {
+ MSG("None");
+ }
+
+ for (i = 0; i < size; i++) {
+ if (cur_pid != event_list[i].pid) {
+ cur_pid = event_list[i].pid;
+ cmdline = get_cmdline_by_pid(cur_pid);
+ MSG("\nPID: %d - Name: %s", cur_pid, cmdline);
+ free(cmdline);
+ }
+ MSG("%s- %s", indent6, event_list[i].name);
+ }
+
+ MSG("");
+
+ free(event_list);
+ lttng_destroy_handle(handle);
+
+ return CMD_SUCCESS;
+
+error:
+ lttng_destroy_handle(handle);
+ return -1;
+}
+