#include "ustcomm.h"
#include "ustcmd.h"
+#include "usterr.h"
pid_t *ustcmd_get_online_pids(void)
{
return 0;
}
+/**
+ * Set subbuffer size.
+ *
+ * @param channel_size Channel name and size
+ * @param pid Traced process ID
+ * @return 0 if successful, or error
+ */
+int ustcmd_set_subbuf_size(const char *channel_size, pid_t pid)
+{
+ char *cmd;
+ int result;
+
+ asprintf(&cmd, "%s %s", "set_subbuf_size", channel_size);
+
+ result = ustcmd_send_cmd(cmd, pid, NULL);
+ if (result != 1) {
+ free(cmd);
+ return 1;
+ }
+
+ free(cmd);
+ return 0;
+}
+
+/**
+ * Set subbuffer num.
+ *
+ * @param channel_num Channel name and num
+ * @param pid Traced process ID
+ * @return 0 if successful, or error
+ */
+int ustcmd_set_subbuf_num(const char *channel_size, pid_t pid)
+{
+ char *cmd;
+ int result;
+
+ asprintf(&cmd, "%s %s", "set_subbuf_num", channel_size);
+
+ result = ustcmd_send_cmd(cmd, pid, NULL);
+ if (result != 1) {
+ free(cmd);
+ return 1;
+ }
+
+ free(cmd);
+ return 0;
+}
+
+/**
+ * Get subbuffer size.
+ *
+ * @param channel Channel name
+ * @param pid Traced process ID
+ * @return subbuf size if successful, or error
+ */
+int ustcmd_get_subbuf_size(const char *channel, pid_t pid)
+{
+ char *cmd, *reply;
+ int result;
+
+ /* format: channel_cpu */
+ asprintf(&cmd, "%s %s_0", "get_subbuf_size", channel);
+
+ result = ustcmd_send_cmd(cmd, pid, &reply);
+ if (result) {
+ free(cmd);
+ free(reply);
+ return -1;
+ }
+
+ result = atoi(reply);
+ free(cmd);
+ free(reply);
+ return result;
+}
+
+/**
+ * Get subbuffer num.
+ *
+ * @param channel Channel name
+ * @param pid Traced process ID
+ * @return subbuf cnf if successful, or error
+ */
+int ustcmd_get_subbuf_num(const char *channel, pid_t pid)
+{
+ char *cmd, *reply;
+ int result;
+
+ /* format: channel_cpu */
+ asprintf(&cmd, "%s %s_0", "get_n_subbufs", channel);
+
+ result = ustcmd_send_cmd(cmd, pid, &reply);
+ if (result) {
+ free(cmd);
+ free(reply);
+ return -1;
+ }
+
+ result = atoi(reply);
+ free(cmd);
+ free(reply);
+ return result;
+}
+
/**
* Destroys an UST trace according to a PID.
*
{
int result;
- result = ustcmd_send_cmd("destroy", pid, NULL);
- if (result) {
+ result = ustcmd_send_cmd("trace_destroy", pid, NULL);
+ if (result != 1) {
return USTCMD_ERR_GEN;
}
int result;
result = ustcmd_send_cmd("start", pid, NULL);
- if (result) {
+ if (result != 1) {
+ return USTCMD_ERR_GEN;
+ }
+
+ return 0;
+}
+
+/**
+ * Creates an UST trace according to a PID.
+ *
+ * @param pid Traced process ID
+ * @return 0 if successful, or error USTCMD_ERR_GEN
+ */
+int ustcmd_create_trace(pid_t pid)
+{
+ int result;
+
+ result = ustcmd_send_cmd("trace_create", pid, NULL);
+ if (result != 1) {
return USTCMD_ERR_GEN;
}
int result;
result = ustcmd_send_cmd("trace_start", pid, NULL);
- if (result) {
+ if (result != 1) {
+ return USTCMD_ERR_GEN;
+ }
+
+ return 0;
+}
+
+/**
+ * Alloc an UST trace according to a PID.
+ *
+ * @param pid Traced process ID
+ * @return 0 if successful, or error USTCMD_ERR_GEN
+ */
+int ustcmd_alloc_trace(pid_t pid)
+{
+ int result;
+
+ result = ustcmd_send_cmd("trace_alloc", pid, NULL);
+ if (result != 1) {
return USTCMD_ERR_GEN;
}
int result;
result = ustcmd_send_cmd("trace_stop", pid, NULL);
- if (result) {
+ if (result != 1) {
return USTCMD_ERR_GEN;
}
* @param cmsf Pointer to CMSF array to be filled (callee allocates, caller
* frees with `ustcmd_free_cmsf')
* @param pid Targeted PID
- * @return 0 if successful, or errors {USTCMD_ERR_ARG, USTCMD_ERR_GEN}
+ * @return 0 if successful, or -1 on error
*/
int ustcmd_get_cmsf(struct marker_status **cmsf, const pid_t pid)
{
unsigned int i = 0, cmsf_ind = 0;
if (cmsf == NULL) {
- return USTCMD_ERR_ARG;
+ return -1;
}
result = ustcmd_send_cmd("list_markers", pid, &big_str);
- if (result) {
- return USTCMD_ERR_GEN;
+ if (result != 1) {
+ return -1;
}
- if (big_str == NULL) {
- fprintf(stderr, "ustcmd: error while getting markers list\n");
- return USTCMD_ERR_GEN;
+ if (result != 1) {
+ ERR("error while getting markers list");
+ return -1;
}
tmp_cmsf = (struct marker_status *) malloc(sizeof(struct marker_status) *
(ustcmd_count_nl(big_str) + 1));
if (tmp_cmsf == NULL) {
- return USTCMD_ERR_GEN;
+ return -1;
}
/* Parse received reply string (format: "[chan]/[mark] [st] [fs]"): */
while (big_str[i] != '\0') {
char state;
- sscanf(big_str + i, "%a[^/]/%a[^ ] %c %a[^\n]",
+ sscanf(big_str + i, "marker: %a[^/]/%a[^ ] %c %a[^\n]",
&tmp_cmsf[cmsf_ind].channel,
&tmp_cmsf[cmsf_ind].marker,
&state,
}
/**
- * Shoots a given command using ustcomm.
+ * Sends a given command to a traceable process
*
- * @param cmd Null-terminated command to shoot
+ * @param cmd Null-terminated command to send
* @param pid Targeted PID
* @param reply Pointer to string to be filled with a reply string (must
* be NULL if no reply is needed for the given command).
- * @return 0 if successful, or errors {USTCMD_ERR_ARG, USTCMD_ERR_CONN}
+ * @return -1 if successful, 0 on EOT, 1 on success
*/
int ustcmd_send_cmd(const char *cmd, const pid_t pid, char **reply)
{
struct ustcomm_connection conn;
-
- if (cmd == NULL) {
- return USTCMD_ERR_ARG;
- }
+ int retval;
if (ustcomm_connect_app(pid, &conn)) {
- fprintf(stderr, "ustcmd_send_cmd: could not connect to PID %u\n",
- (unsigned int) pid);
- return USTCMD_ERR_CONN;
+ ERR("could not connect to PID %u", (unsigned int) pid);
+ return -1;
}
- ustcomm_send_request(&conn, cmd, reply);
+ retval = ustcomm_send_request(&conn, cmd, reply);
- return 0;
+ ustcomm_close_app(&conn);
+
+ return retval;
}