return ret;
}
+static struct lttng_tracker_list *get_id_tracker_list(
+ struct ltt_kernel_session *session,
+ enum lttng_tracker_type tracker_type)
+{
+ switch (tracker_type) {
+ case LTTNG_TRACKER_PID:
+ return session->tracker_list_pid;
+ case LTTNG_TRACKER_VPID:
+ return session->tracker_list_vpid;
+ case LTTNG_TRACKER_UID:
+ return session->tracker_list_uid;
+ case LTTNG_TRACKER_VUID:
+ return session->tracker_list_vuid;
+ case LTTNG_TRACKER_GID:
+ return session->tracker_list_gid;
+ case LTTNG_TRACKER_VGID:
+ return session->tracker_list_vgid;
+ default:
+ return NULL;
+ }
+}
-int kernel_track_pid(struct ltt_kernel_session *session, int pid)
+int kernel_track_id(enum lttng_tracker_type tracker_type,
+ struct ltt_kernel_session *session,
+ const struct lttng_tracker_id *id)
{
- int ret;
+ int ret, value;
+ struct lttng_tracker_list *tracker_list;
+ struct lttng_tracker_id **saved_ids;
+ ssize_t saved_ids_count;
- DBG("Kernel track PID %d for session id %" PRIu64 ".",
- pid, session->id);
- ret = kernctl_track_pid(session->fd, pid);
- if (!ret) {
- return LTTNG_OK;
+ ret = lttng_tracker_id_lookup_string(tracker_type, id, &value);
+ if (ret != LTTNG_OK) {
+ return ret;
}
- switch (-ret) {
- case EINVAL:
+
+ tracker_list = get_id_tracker_list(session, tracker_type);
+ if (!tracker_list) {
return LTTNG_ERR_INVALID;
- case ENOMEM:
- return LTTNG_ERR_NOMEM;
- case EEXIST:
- return LTTNG_ERR_PID_TRACKED;
- default:
- return LTTNG_ERR_UNK;
}
-}
-int kernel_untrack_pid(struct ltt_kernel_session *session, int pid)
-{
- int ret;
+ /* Save list for restore on error. */
+ saved_ids_count = lttng_tracker_id_get_list(tracker_list, &saved_ids);
+ if (saved_ids_count < 0) {
+ return LTTNG_ERR_INVALID;
+ }
- DBG("Kernel untrack PID %d for session id %" PRIu64 ".",
- pid, session->id);
- ret = kernctl_untrack_pid(session->fd, pid);
- if (!ret) {
- return LTTNG_OK;
+ /* Add to list. */
+ ret = lttng_tracker_list_add(tracker_list, id);
+ if (ret != LTTNG_OK) {
+ goto end;
}
+
+ switch (tracker_type) {
+ case LTTNG_TRACKER_PID:
+ DBG("Kernel track PID %d for session id %" PRIu64 ".", value,
+ session->id);
+ ret = kernctl_track_pid(session->fd, value);
+ if (!ret) {
+ ret = LTTNG_OK;
+ goto end;
+ }
+ break;
+ case LTTNG_TRACKER_VPID:
+ DBG("Kernel track VPID %d for session id %" PRIu64 ".", value,
+ session->id);
+ ret = kernctl_track_id(session->fd, LTTNG_TRACKER_VPID, value);
+ if (!ret) {
+ ret = LTTNG_OK;
+ goto end;
+ }
+ break;
+ case LTTNG_TRACKER_UID:
+ DBG("Kernel track UID %d for session id %" PRIu64 ".", value,
+ session->id);
+ ret = kernctl_track_id(session->fd, LTTNG_TRACKER_UID, value);
+ if (!ret) {
+ ret = LTTNG_OK;
+ goto end;
+ }
+ break;
+ case LTTNG_TRACKER_GID:
+ DBG("Kernel track GID %d for session id %" PRIu64 ".", value,
+ session->id);
+ ret = kernctl_track_id(session->fd, LTTNG_TRACKER_GID, value);
+ if (!ret) {
+ ret = LTTNG_OK;
+ goto end;
+ }
+ break;
+ case LTTNG_TRACKER_VUID:
+ DBG("Kernel track VUID %d for session id %" PRIu64 ".", value,
+ session->id);
+ ret = kernctl_track_id(session->fd, LTTNG_TRACKER_VUID, value);
+ if (!ret) {
+ ret = LTTNG_OK;
+ goto end;
+ }
+ break;
+ case LTTNG_TRACKER_VGID:
+ DBG("Kernel track VGID %d for session id %" PRIu64 ".", value,
+ session->id);
+ ret = kernctl_track_id(session->fd, LTTNG_TRACKER_VGID, value);
+ if (!ret) {
+ ret = LTTNG_OK;
+ goto end;
+ }
+ break;
+ default:
+ ret = -EINVAL;
+ break;
+ }
+
+ /* Error handling. */
switch (-ret) {
case EINVAL:
- return LTTNG_ERR_INVALID;
+ ret = LTTNG_ERR_INVALID;
+ break;
case ENOMEM:
- return LTTNG_ERR_NOMEM;
- case ENOENT:
- return LTTNG_ERR_PID_NOT_TRACKED;
+ ret = LTTNG_ERR_NOMEM;
+ break;
+ case EEXIST:
+ ret = LTTNG_ERR_ID_TRACKED;
+ break;
default:
- return LTTNG_ERR_UNK;
+ ret = LTTNG_ERR_UNK;
+ break;
}
+
+ if (lttng_tracker_id_set_list(tracker_list, saved_ids,
+ saved_ids_count) != LTTNG_OK) {
+ ERR("Error on tracker add error handling.\n");
+ }
+end:
+ lttng_tracker_ids_destroy(saved_ids, saved_ids_count);
+ free(saved_ids);
+ return ret;
}
-ssize_t kernel_list_tracker_pids(struct ltt_kernel_session *session,
- int **_pids)
+int kernel_untrack_id(enum lttng_tracker_type tracker_type,
+ struct ltt_kernel_session *session,
+ const struct lttng_tracker_id *id)
{
- int fd, ret;
- int pid;
- ssize_t nbmem, count = 0;
- FILE *fp;
- int *pids;
+ int ret, value;
+ struct lttng_tracker_list *tracker_list;
+ struct lttng_tracker_id **saved_ids;
+ ssize_t saved_ids_count;
- fd = kernctl_list_tracker_pids(session->fd);
- if (fd < 0) {
- PERROR("kernel tracker pids list");
- goto error;
+ ret = lttng_tracker_id_lookup_string(tracker_type, id, &value);
+ if (ret != LTTNG_OK) {
+ return ret;
}
- fp = fdopen(fd, "r");
- if (fp == NULL) {
- PERROR("kernel tracker pids list fdopen");
- goto error_fp;
+ tracker_list = get_id_tracker_list(session, tracker_type);
+ if (!tracker_list) {
+ return LTTNG_ERR_INVALID;
}
-
- nbmem = KERNEL_TRACKER_PIDS_INIT_LIST_SIZE;
- pids = zmalloc(sizeof(*pids) * nbmem);
- if (pids == NULL) {
- PERROR("alloc list pids");
- count = -ENOMEM;
+ /* Save list for restore on error. */
+ saved_ids_count = lttng_tracker_id_get_list(tracker_list, &saved_ids);
+ if (saved_ids_count < 0) {
+ return LTTNG_ERR_INVALID;
+ }
+ /* Remove from list. */
+ ret = lttng_tracker_list_remove(tracker_list, id);
+ if (ret != LTTNG_OK) {
goto end;
}
- while (fscanf(fp, "process { pid = %u; };\n", &pid) == 1) {
- if (count >= nbmem) {
- int *new_pids;
- size_t new_nbmem;
-
- new_nbmem = nbmem << 1;
- DBG("Reallocating pids list from %zu to %zu entries",
- nbmem, new_nbmem);
- new_pids = realloc(pids, new_nbmem * sizeof(*new_pids));
- if (new_pids == NULL) {
- PERROR("realloc list events");
- free(pids);
- count = -ENOMEM;
- goto end;
- }
- /* Zero the new memory */
- memset(new_pids + nbmem, 0,
- (new_nbmem - nbmem) * sizeof(*new_pids));
- nbmem = new_nbmem;
- pids = new_pids;
+ switch (tracker_type) {
+ case LTTNG_TRACKER_PID:
+ DBG("Kernel untrack PID %d for session id %" PRIu64 ".", value,
+ session->id);
+ ret = kernctl_untrack_pid(session->fd, value);
+ if (!ret) {
+ ret = LTTNG_OK;
+ goto end;
}
- pids[count++] = pid;
+ break;
+ case LTTNG_TRACKER_VPID:
+ DBG("Kernel untrack VPID %d for session id %" PRIu64 ".", value,
+ session->id);
+ ret = kernctl_untrack_id(
+ session->fd, LTTNG_TRACKER_VPID, value);
+ if (!ret) {
+ ret = LTTNG_OK;
+ goto end;
+ }
+ break;
+ case LTTNG_TRACKER_UID:
+ DBG("Kernel untrack UID %d for session id %" PRIu64 ".", value,
+ session->id);
+ ret = kernctl_untrack_id(session->fd, LTTNG_TRACKER_UID, value);
+ if (!ret) {
+ ret = LTTNG_OK;
+ goto end;
+ }
+ break;
+ case LTTNG_TRACKER_GID:
+ DBG("Kernel untrack GID %d for session id %" PRIu64 ".", value,
+ session->id);
+ ret = kernctl_untrack_id(session->fd, LTTNG_TRACKER_GID, value);
+ if (!ret) {
+ ret = LTTNG_OK;
+ goto end;
+ }
+ break;
+ case LTTNG_TRACKER_VUID:
+ DBG("Kernel untrack VUID %d for session id %" PRIu64 ".", value,
+ session->id);
+ ret = kernctl_untrack_id(
+ session->fd, LTTNG_TRACKER_VUID, value);
+ if (!ret) {
+ ret = LTTNG_OK;
+ goto end;
+ }
+ break;
+ case LTTNG_TRACKER_VGID:
+ DBG("Kernel untrack VGID %d for session id %" PRIu64 ".", value,
+ session->id);
+ ret = kernctl_untrack_id(
+ session->fd, LTTNG_TRACKER_VGID, value);
+ if (!ret) {
+ ret = LTTNG_OK;
+ goto end;
+ }
+ break;
+ default:
+ ret = -EINVAL;
+ break;
}
- *_pids = pids;
- DBG("Kernel list tracker pids done (%zd pids)", count);
-end:
- ret = fclose(fp); /* closes both fp and fd */
- if (ret) {
- PERROR("fclose");
+ /* Error handling. */
+ switch (-ret) {
+ case EINVAL:
+ ret = LTTNG_ERR_INVALID;
+ break;
+ case ENOMEM:
+ ret = LTTNG_ERR_NOMEM;
+ break;
+ case EEXIST:
+ ret = LTTNG_ERR_ID_TRACKED;
+ break;
+ default:
+ ret = LTTNG_ERR_UNK;
+ break;
}
- return count;
-error_fp:
- ret = close(fd);
- if (ret) {
- PERROR("close");
+ if (lttng_tracker_id_set_list(tracker_list, saved_ids,
+ saved_ids_count) != LTTNG_OK) {
+ ERR("Error on tracker remove error handling.\n");
}
-error:
- return -1;
+end:
+ lttng_tracker_ids_destroy(saved_ids, saved_ids_count);
+ free(saved_ids);
+ return ret;
+}
+
+/*
+ * Called with session lock held.
+ */
+ssize_t kernel_list_tracker_ids(enum lttng_tracker_type tracker_type,
+ struct ltt_kernel_session *session,
+ struct lttng_tracker_id ***_ids)
+{
+ struct lttng_tracker_list *tracker_list;
+
+ tracker_list = get_id_tracker_list(session, tracker_type);
+ if (!tracker_list) {
+ return -LTTNG_ERR_INVALID;
+ }
+ return lttng_tracker_id_get_list(tracker_list, _ids);
}
/*
}
/*
- * Packet sequence number was introduced in 2.8
+ * Packet sequence number was introduced in LTTng 2.8,
+ * lttng-modules ABI 2.1.
*/
- if (abi.major >= 2 && abi.minor >= 8) {
+ if (abi.major >= 2 && abi.minor >= 1) {
/* Supported */
ret = 1;
} else {