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 <lttng-sessiond-comm.h>
27 #include <ust/usterr-signal-safe.h>
30 /* Socket from app (connect) to session daemon (listen) for communication */
31 static char global_apps_sock_path
[PATH_MAX
] = DEFAULT_GLOBAL_APPS_UNIX_SOCK
;
32 static pthread_t global_ust_listener
;
34 /* TODO: allow global_apps_sock_path override */
36 static char local_apps_sock_path
[PATH_MAX
];
37 static pthread_t local_ust_listener
;
40 int setup_local_apps_socket(void)
44 home_dir
= (const char *) getenv("HOME");
47 snprintf(local_apps_sock_path
, PATH_MAX
,
48 DEFAULT_HOME_APPS_UNIX_SOCK
, home_dir
);
53 int register_app_to_sessiond(int socket
)
61 reg_msg
.pid
= getpid();
62 reg_msg
.uid
= getuid();
64 ret
= lttcomm_send_unix_sock(socket
, ®_msg
, sizeof(reg_msg
));
65 if (ret
>= 0 && ret
!= sizeof(reg_msg
))
72 int handle_message(int sock
, struct lttcomm_ust_msg
*lum
)
77 switch (lum
->cmd_type
) {
78 case LTTNG_CREATE_SESSION
:
80 struct lttcomm_ust_reply lur
;
82 DBG("Handling create session message");
83 memset(&lur
, 0, sizeof(lur
));
84 lur
.cmd_type
= LTTNG_CREATE_SESSION
;
90 lur
.ret_code
= LTTCOMM_OK
;
92 lur
.ret_code
= LTTCOMM_SESSION_FAIL
;
93 lur
.u
.session
.handle
= 42;
94 len
= lttcomm_send_unix_sock(sock
, &lur
, sizeof(lur
));
97 printf("message successfully sent\n");
100 if (errno
== ECONNRESET
) {
101 printf("remote end closed connection\n");
106 printf("incorrect message size: %zd\n", len
);
112 ERR("Unimplemented command %d", (int) lum
->cmd_type
);
119 void *ust_listener_thread(void *arg
)
121 const char *sock_path
= (const char *) arg
;
125 /* Restart trying to connect to the session daemon */
128 /* Check for sessiond availability with pipe TODO */
131 ret
= lttcomm_connect_unix_sock(sock_path
);
133 ERR("Error connecting to global apps socket");
136 ret
= register_app_to_sessiond(sock
);
138 ERR("Error registering app to local apps socket");
144 struct lttcomm_ust_msg lum
;
146 /* Receive session handle */
147 len
= lttcomm_recv_unix_sock(sock
, &lum
, sizeof(lum
));
149 case 0: /* orderly shutdown */
150 DBG("ltt-sessiond has performed an orderly shutdown\n");
153 DBG("message received\n");
154 ret
= handle_message(sock
, &lum
);
156 ERR("Error handling message\n");
160 if (errno
== ECONNRESET
) {
161 ERR("remote end closed connection\n");
166 ERR("incorrect message size: %zd\n", len
);
174 ERR("Error closing local apps socket");
176 goto restart
; /* try to reconnect */
182 * sessiond monitoring thread: monitor presence of global and per-user
183 * sessiond by polling the application common named pipe.
187 void __attribute__((constructor
)) lttng_ust_comm_init(void)
193 /* Connect to the per-user (local) sessiond apps socket */
194 ret
= setup_local_apps_socket();
196 ERR("Error setting up to local apps socket");
199 ret
= pthread_create(&global_ust_listener
, NULL
,
200 ust_listener_thread
, global_apps_sock_path
);
202 ret
= pthread_create(&local_ust_listener
, NULL
,
203 ust_listener_thread
, local_apps_sock_path
);
206 void __attribute__((destructor
)) lttng_ust_comm_exit(void)
211 * Using pthread_cancel here because:
212 * A) we don't want to hang application teardown.
213 * B) the thread is not allocating any resource.
215 ret
= pthread_cancel(global_ust_listener
);
217 ERR("Error cancelling global ust listener thread");
219 ret
= pthread_cancel(local_ust_listener
);
221 ERR("Error cancelling local ust listener thread");