ret = lttcomm_send_unix_sock(socket, ®_msg, sizeof(reg_msg));
if (ret >= 0 && ret != sizeof(reg_msg))
return -EIO;
- ret = fdatasync(socket);
- if (ret) {
- return -errno;
- }
return ret;
}
int send_reply(int sock, struct lttcomm_ust_reply *lur)
{
ssize_t len;
- int ret;
len = lttcomm_send_unix_sock(sock, lur, sizeof(*lur));
switch (len) {
case sizeof(*lur):
DBG("message successfully sent");
- ret = fdatasync(sock);
- if (ret) {
- DBG("fdatasync error");
- return -1;
- }
return 0;
case -1:
if (errno == ECONNRESET) {
} else {
lur.ret_code = LTTCOMM_SESSION_FAIL;
}
+ if (lum->cmd == LTTNG_UST_STREAM) {
+ /*
+ * Special-case reply to send stream info.
+ * Use lum.u output.
+ */
+ lur.u.stream.memory_map_size = lum->u.stream.memory_map_size;
+ }
ret = send_reply(sock, &lur);
+ if (lum->cmd == LTTNG_UST_STREAM && ret >= 0) {
+ /* we also need to send the file descriptors. */
+ ret = lttcomm_send_fds_unix_sock(sock,
+ &lum->u.stream.shm_fd, &lum->u.stream.shm_fd,
+ 1, sizeof(int));
+ if (ret < 0) {
+ perror("send shm_fd");
+ goto error;
+ }
+ ret = lttcomm_send_fds_unix_sock(sock,
+ &lum->u.stream.wait_fd, &lum->u.stream.wait_fd,
+ 1, sizeof(int));
+ if (ret < 0) {
+ perror("send wait_fd");
+ goto error;
+ }
+ }
+error:
ust_unlock();
return ret;
}