11bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat/*
21bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat * Copyright (C) 2008 The Android Open Source Project
31bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat *
41bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat * Licensed under the Apache License, Version 2.0 (the "License");
51bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat * you may not use this file except in compliance with the License.
61bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat * You may obtain a copy of the License at
71bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat *
81bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat *      http://www.apache.org/licenses/LICENSE-2.0
91bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat *
101bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat * Unless required by applicable law or agreed to in writing, software
111bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat * distributed under the License is distributed on an "AS IS" BASIS,
121bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat * See the License for the specific language governing permissions and
141bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat * limitations under the License.
151bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat */
161bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
171bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat#include <stdlib.h>
181bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat#include <errno.h>
191bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat#include <fcntl.h>
20ff2c0d8c13457e43f0d4bf06d3177271aac104c1Olivier Bailly#include <string.h>
211bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
221bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat#include <sys/socket.h>
231bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat#include <sys/stat.h>
241bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat#include <sys/types.h>
251bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat#include <sys/wait.h>
261bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
271bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat#include <netinet/in.h>
281bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat#include <arpa/inet.h>
291bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
307826bd095a7ecfd642524cfd93a39a52986b73fcRene Bolldorf#ifdef HAVE_BLUETOOTH
311bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat#include <bluedroid/bluetooth.h>
327826bd095a7ecfd642524cfd93a39a52986b73fcRene Bolldorf#endif
331bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
341bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat#define LOG_TAG "PanController"
351bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat#include <cutils/log.h>
361bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
371bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat#include "PanController.h"
381bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
390399710d9a7ee575104e7d76dc988afb7829ccb9San Mehat#ifdef HAVE_BLUETOOTH
401bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehatextern "C" int bt_is_enabled();
410399710d9a7ee575104e7d76dc988afb7829ccb9San Mehat#endif
421bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
431bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San MehatPanController::PanController() {
441bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    mPid = 0;
451bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat}
461bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
471bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San MehatPanController::~PanController() {
481bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat}
491bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
501bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehatint PanController::startPan() {
511bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    pid_t pid;
521bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
530399710d9a7ee575104e7d76dc988afb7829ccb9San Mehat#ifdef HAVE_BLUETOOTH
541bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    if (!bt_is_enabled()) {
551bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        LOGE("Cannot start PAN services - Bluetooth not running");
561bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        errno = ENODEV;
571bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        return -1;
581bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    }
590399710d9a7ee575104e7d76dc988afb7829ccb9San Mehat#else
600399710d9a7ee575104e7d76dc988afb7829ccb9San Mehat    LOGE("Cannot start PAN services - No Bluetooth support");
610399710d9a7ee575104e7d76dc988afb7829ccb9San Mehat    errno = ENODEV;
620399710d9a7ee575104e7d76dc988afb7829ccb9San Mehat    return -1;
630399710d9a7ee575104e7d76dc988afb7829ccb9San Mehat#endif
641bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
651bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    if (mPid) {
661bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        LOGE("PAN already started");
671bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        errno = EBUSY;
681bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        return -1;
691bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    }
701bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
711bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat   if ((pid = fork()) < 0) {
721bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        LOGE("fork failed (%s)", strerror(errno));
731bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        return -1;
741bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    }
751bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
761bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    if (!pid) {
771bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        if (execl("/system/bin/pand", "/system/bin/pand", "--nodetach", "--listen",
781bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat                  "--role", "NAP", (char *) NULL)) {
791bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat            LOGE("execl failed (%s)", strerror(errno));
801bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        }
811bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        LOGE("Should never get here!");
821bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        return 0;
831bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    } else {
841bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        mPid = pid;
851bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    }
861bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    return 0;
871bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
881bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat}
891bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
901bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehatint PanController::stopPan() {
911bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    if (mPid == 0) {
921bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        LOGE("PAN already stopped");
931bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        return 0;
941bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    }
951bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
961bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    LOGD("Stopping PAN services");
971bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    kill(mPid, SIGTERM);
981bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    waitpid(mPid, NULL, 0);
991bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    mPid = 0;
1001bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    LOGD("PAN services stopped");
1011bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    return 0;
1021bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat}
1031bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
1041bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehatbool PanController::isPanStarted() {
1051bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    return (mPid != 0 ? true : false);
1061bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat}
107