+
+static
+int handle_message(int sock, struct lttcomm_ust_msg *lum)
+{
+ ssize_t len;
+ int ret;
+
+ switch (lum->cmd_type) {
+ case UST_CREATE_SESSION:
+ {
+ struct lttcomm_ust_reply lur;
+
+ DBG("Handling create session message");
+ memset(&lur, 0, sizeof(lur));
+ lur.cmd_type = UST_CREATE_SESSION;
+
+ /* ... */
+ ret = 0;
+
+ if (!ret)
+ lur.ret_code = LTTCOMM_OK;
+ else
+ lur.ret_code = LTTCOMM_SESSION_FAIL;
+ lur.ret_val = 42;
+ len = lttcomm_send_unix_sock(sock, &lur, sizeof(lur));
+ switch (len) {
+ case sizeof(lur):
+ printf("message successfully sent\n");
+ break;
+ case -1:
+ if (errno == ECONNRESET) {
+ printf("remote end closed connection\n");
+ return 0;
+ }
+ return -1;
+ default:
+ printf("incorrect message size: %zd\n", len);
+ return -1;
+ }
+ break;
+ }
+ default:
+ ERR("Unimplemented command %d", (int) lum->cmd_type);
+ return -1;
+ }
+ return 0;
+}
+
+static
+void *ust_listener_thread(void *arg)
+{
+ const char *sock_path = (const char *) arg;
+ int sock;
+ int ret;
+
+ /* Restart trying to connect to the session daemon */
+restart:
+
+ /* Check for sessiond availability with pipe TODO */
+
+ /* Register */
+ ret = lttcomm_connect_unix_sock(sock_path);
+ if (ret < 0) {
+ ERR("Error connecting to global apps socket");
+ }
+ sock = ret;
+ ret = register_app_to_sessiond(sock);
+ if (ret < 0) {
+ ERR("Error registering app to local apps socket");
+ sleep(5);
+ goto restart;
+ }
+ for (;;) {
+ ssize_t len;
+ struct lttcomm_ust_msg lum;
+
+ /* Receive session handle */
+ len = lttcomm_recv_unix_sock(sock, &lum, sizeof(lum));
+ switch (len) {
+ case 0: /* orderly shutdown */
+ DBG("ltt-sessiond has performed an orderly shutdown\n");
+ goto end;
+ case sizeof(lum):
+ DBG("message received\n");
+ ret = handle_message(sock, &lum);
+ if (ret) {
+ ERR("Error handling message\n");
+ }
+ continue;
+ case -1:
+ if (errno == ECONNRESET) {
+ ERR("remote end closed connection\n");
+ goto end;
+ }
+ goto end;
+ default:
+ ERR("incorrect message size: %zd\n", len);
+ continue;
+ }
+
+ }
+end:
+ ret = close(sock);
+ if (ret) {
+ ERR("Error closing local apps socket");
+ }
+ goto restart; /* try to reconnect */
+ return NULL;
+}
+
+