* Send command. Fill up the header and append the data.
*/
static int send_command(struct lttcomm_relayd_sock *rsock,
- enum lttcomm_relayd_command cmd, void *data, size_t size,
+ enum lttcomm_relayd_command cmd, const void *data, size_t size,
int flags)
{
int ret;
* If major versions are compatible, we assign minor_to_use to the
* minor version of the procotol we are going to use for this session.
*
- * Return 0 if compatible else negative value.
+ * Return 0 if the two daemons are compatible, LTTNG_ERR_RELAYD_VERSION_FAIL
+ * otherwise, or a negative value on network errors.
*/
int relayd_version_check(struct lttcomm_relayd_sock *rsock)
{
*/
if (msg.major != rsock->major) {
/* Not compatible */
- ret = -1;
+ ret = LTTNG_ERR_RELAYD_VERSION_FAIL;
DBG2("Relayd version is NOT compatible. Relayd version %u != %u (us)",
msg.major, rsock->major);
goto error;
}
/* Send command */
- ret = send_command(rsock, RELAYD_SEND_INDEX, &msg, sizeof(msg), 0);
+ ret = send_command(rsock, RELAYD_SEND_INDEX, &msg,
+ lttcomm_relayd_index_len(lttng_to_index_major(rsock->major,
+ rsock->minor),
+ lttng_to_index_minor(rsock->major, rsock->minor)),
+ 0);
if (ret < 0) {
goto error;
}
error:
return ret;
}
+
+int relayd_mkdir(struct lttcomm_relayd_sock *rsock, const char *path)
+{
+ int ret;
+ struct lttcomm_relayd_mkdir *msg;
+ struct lttcomm_relayd_generic_reply reply;
+ size_t len;
+
+ /* Code flow error. Safety net. */
+ assert(rsock);
+
+ DBG("Relayd mkdir path %s", path);
+
+ len = strlen(path) + 1;
+ msg = zmalloc(sizeof(msg->length) + len);
+ if (!msg) {
+ PERROR("Alloc mkdir msg");
+ ret = -1;
+ goto error;
+ }
+ msg->length = htobe32((uint32_t) len);
+
+ if (lttng_strncpy(msg->path, path, len)) {
+ ret = -1;
+ goto error;
+ }
+
+ /* Send command */
+ ret = send_command(rsock, RELAYD_MKDIR, (void *) msg,
+ sizeof(msg->length) + len, 0);
+ if (ret < 0) {
+ goto error;
+ }
+
+ /* Receive response */
+ ret = recv_reply(rsock, (void *) &reply, sizeof(reply));
+ if (ret < 0) {
+ goto error;
+ }
+
+ reply.ret_code = be32toh(reply.ret_code);
+
+ /* Return session id or negative ret code. */
+ if (reply.ret_code != LTTNG_OK) {
+ ret = -1;
+ ERR("Relayd mkdir replied error %d", reply.ret_code);
+ } else {
+ /* Success */
+ ret = 0;
+ }
+
+ DBG("Relayd mkdir completed successfully");
+
+error:
+ free(msg);
+ return ret;
+
+}