xref: /haiku/src/system/libroot/os/launch.cpp (revision ef462ab57f0ba739629194e6c071815d521c7955)
1 /*
2  * Copyright 2015, Axel Dörfler, axeld@pinc-software.de.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 
7 #include <launch.h>
8 
9 #include <TokenSpace.h>
10 #include <util/KMessage.h>
11 
12 
13 static port_id sLaunchDaemonPort = -1;
14 
15 
16 port_id
get_launch_daemon_port()17 BPrivate::get_launch_daemon_port()
18 {
19 	if (sLaunchDaemonPort < 0) {
20 		sLaunchDaemonPort = find_port(B_LAUNCH_DAEMON_PORT_NAME);
21 
22 		port_info info;
23 		if (get_port_info(sLaunchDaemonPort, &info) == B_OK
24 			&& info.team == find_thread(NULL)) {
25 			// Make sure that the launch_daemon doesn't wait on itself
26 			sLaunchDaemonPort = -1;
27 			return -1;
28 		}
29 	}
30 
31 	return sLaunchDaemonPort;
32 }
33 
34 
35 status_t
send_request_to_launch_daemon(KMessage & request,KMessage & reply)36 BPrivate::send_request_to_launch_daemon(KMessage& request, KMessage& reply)
37 {
38 	status_t status = request.SendTo(get_launch_daemon_port(),
39 		B_PREFERRED_TOKEN, &reply);
40 	if (status != B_OK)
41 		return status;
42 
43 	return (status_t)reply.What();
44 }
45 
46 
47 status_t
get_launch_data(const char * signature,KMessage & data)48 BPrivate::get_launch_data(const char* signature, KMessage& data)
49 {
50 	BPrivate::KMessage request(B_GET_LAUNCH_DATA);
51 	request.AddString("name", signature);
52 
53 	return BPrivate::send_request_to_launch_daemon(request, data);
54 }
55