summaryrefslogtreecommitdiff
path: root/system/service/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'system/service/main.cpp')
-rw-r--r--system/service/main.cpp48
1 files changed, 45 insertions, 3 deletions
diff --git a/system/service/main.cpp b/system/service/main.cpp
index cb536eb9b4..46bff4aefe 100644
--- a/system/service/main.cpp
+++ b/system/service/main.cpp
@@ -13,14 +13,20 @@
// See the License for the specific language governing permissions and
// limitations under the License.
//
+
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <unistd.h>
#define LOG_TAG "bt_host"
// For system properties
// TODO(icoolidge): abstraction or non-cutils stub.
+#if !defined(OS_GENERIC)
#include <cutils/properties.h>
+#endif // !defined(OS_GENERIC)
#include "core_stack.h"
#include "host.h"
@@ -29,27 +35,62 @@
namespace {
+// TODO(armansito): None of these should be hardcoded here. Instead, pass these
+// via commandline.
const char kDisableProperty[] = "persist.bluetooth.disable";
const char kSocketFromInit[] = "bluetooth";
+const char kUnixIpcSocketPath[] = "bluetooth-ipc-socket";
} // namespace
int main() {
+ // TODO(armansito): Move all of the IPC connection establishment into its own
+ // class. Here we should only need to initialize and start the main
+ // MessageLoop and the CoreStack instance.
+ int status;
+
+#if !defined(OS_GENERIC)
char disable_value[PROPERTY_VALUE_MAX];
- int status = property_get(kDisableProperty, disable_value, nullptr);
+ status = property_get(kDisableProperty, disable_value, nullptr);
if (status && !strcmp(disable_value, "1")) {
LOG_INFO(LOG_TAG, "%s", "service disabled");
return EXIT_SUCCESS;
}
int server_socket = osi_android_get_control_socket(kSocketFromInit);
- if (server_socket == -1) {
+ if (server_socket < 0) {
LOG_ERROR(LOG_TAG, "failed to get socket from init");
return EXIT_FAILURE;
}
+#else // defined(OS_GENERIC)
+ int server_socket = socket(PF_UNIX, SOCK_SEQPACKET, 0);
+ if (server_socket < 0) {
+ LOG_ERROR(LOG_TAG, "failed to open domain socket for IPC");
+ return EXIT_FAILURE;
+ }
+
+ // TODO(armansito): This is opens the door to potentially unlinking files in
+ // the current directory that we're not supposed to. For now we will have an
+ // assumption that the daemon runs in a sandbox but we should generally do
+ // this properly.
+ //
+ // Also, the daemon should clean this up properly as it shuts down.
+ unlink(kUnixIpcSocketPath);
+
+ struct sockaddr_un address;
+ memset(&address, 0, sizeof(address));
+ address.sun_family = AF_UNIX;
+ strncpy(address.sun_path, kUnixIpcSocketPath, sizeof(address.sun_path) - 1);
+
+ if (bind(server_socket, (struct sockaddr*)&address, sizeof(address)) < 0) {
+ LOG_ERROR(LOG_TAG, "Failed to bind IPC socket to address");
+ return EXIT_FAILURE;
+ }
+
+#endif // !defined(OS_GENERIC)
status = listen(server_socket, SOMAXCONN);
- if (status == -1) {
+ if (status < 0) {
LOG_ERROR(LOG_TAG, "listen failed: %s", strerror(errno));
return EXIT_FAILURE;
}
@@ -71,5 +112,6 @@ int main() {
}
close(server_socket);
+
return EXIT_SUCCESS;
}