4 * Copyright (C) 2011 David Goulet <david.goulet@polymtl.ca>
5 * Copyright (C) 2011 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; only
10 * version 2.1 of the License.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 #include <sys/types.h>
23 #include <sys/socket.h>
26 #include <ust/lttng-ust-abi.h>
27 #include <lttng-ust-comm.h>
28 #include <ust/usterr-signal-safe.h>
31 /* Socket from app (connect) to session daemon (listen) for communication */
32 static char global_apps_sock_path
[PATH_MAX
] = DEFAULT_GLOBAL_APPS_UNIX_SOCK
;
33 static pthread_t global_ust_listener
;
35 /* TODO: allow global_apps_sock_path override */
37 static char local_apps_sock_path
[PATH_MAX
];
38 static pthread_t local_ust_listener
;
41 int setup_local_apps_socket(void)
45 home_dir
= (const char *) getenv("HOME");
48 snprintf(local_apps_sock_path
, PATH_MAX
,
49 DEFAULT_HOME_APPS_UNIX_SOCK
, home_dir
);
54 int register_app_to_sessiond(int socket
)
64 reg_msg
.major
= LTTNG_UST_COMM_VERSION_MAJOR
;
65 reg_msg
.minor
= LTTNG_UST_COMM_VERSION_MINOR
;
66 reg_msg
.pid
= getpid();
67 reg_msg
.uid
= getuid();
69 ret
= lttcomm_send_unix_sock(socket
, ®_msg
, sizeof(reg_msg
));
70 if (ret
>= 0 && ret
!= sizeof(reg_msg
))
77 int handle_message(int sock
, struct lttcomm_ust_msg
*lum
)
82 switch (lum
->cmd_type
) {
83 case UST_CREATE_SESSION
:
85 struct lttcomm_ust_reply lur
;
87 DBG("Handling create session message");
88 memset(&lur
, 0, sizeof(lur
));
89 lur
.cmd_type
= UST_CREATE_SESSION
;
95 lur
.ret_code
= LTTCOMM_OK
;
97 lur
.ret_code
= LTTCOMM_SESSION_FAIL
;
99 len
= lttcomm_send_unix_sock(sock
, &lur
, sizeof(lur
));
102 printf("message successfully sent\n");
105 if (errno
== ECONNRESET
) {
106 printf("remote end closed connection\n");
111 printf("incorrect message size: %zd\n", len
);
117 ERR("Unimplemented command %d", (int) lum
->cmd_type
);
124 void *ust_listener_thread(void *arg
)
126 const char *sock_path
= (const char *) arg
;
130 /* Restart trying to connect to the session daemon */
133 /* Check for sessiond availability with pipe TODO */
136 ret
= lttcomm_connect_unix_sock(sock_path
);
138 ERR("Error connecting to global apps socket");
141 ret
= register_app_to_sessiond(sock
);
143 ERR("Error registering app to local apps socket");
149 struct lttcomm_ust_msg lum
;
151 /* Receive session handle */
152 len
= lttcomm_recv_unix_sock(sock
, &lum
, sizeof(lum
));
154 case 0: /* orderly shutdown */
155 DBG("ltt-sessiond has performed an orderly shutdown\n");
158 DBG("message received\n");
159 ret
= handle_message(sock
, &lum
);
161 ERR("Error handling message\n");
165 if (errno
== ECONNRESET
) {
166 ERR("remote end closed connection\n");
171 ERR("incorrect message size: %zd\n", len
);
179 ERR("Error closing local apps socket");
181 goto restart
; /* try to reconnect */
187 * sessiond monitoring thread: monitor presence of global and per-user
188 * sessiond by polling the application common named pipe.
192 void __attribute__((constructor
)) lttng_ust_comm_init(void)
198 /* Connect to the per-user (local) sessiond apps socket */
199 ret
= setup_local_apps_socket();
201 ERR("Error setting up to local apps socket");
204 ret
= pthread_create(&global_ust_listener
, NULL
,
205 ust_listener_thread
, global_apps_sock_path
);
207 ret
= pthread_create(&local_ust_listener
, NULL
,
208 ust_listener_thread
, local_apps_sock_path
);
211 void __attribute__((destructor
)) lttng_ust_comm_exit(void)
216 * Using pthread_cancel here because:
217 * A) we don't want to hang application teardown.
218 * B) the thread is not allocating any resource.
220 ret
= pthread_cancel(global_ust_listener
);
222 ERR("Error cancelling global ust listener thread");
224 ret
= pthread_cancel(local_ust_listener
);
226 ERR("Error cancelling local ust listener thread");
228 lttng_ust_abi_exit();