PanController.cpp revision 7826bd095a7ecfd642524cfd93a39a52986b73fc
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>
201bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
211bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat#include <sys/socket.h>
221bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat#include <sys/stat.h>
231bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat#include <sys/types.h>
241bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat#include <sys/wait.h>
251bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
261bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat#include <netinet/in.h>
271bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat#include <arpa/inet.h>
281bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
297826bd095a7ecfd642524cfd93a39a52986b73fcRene Bolldorf#ifdef HAVE_BLUETOOTH
301bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat#include <bluedroid/bluetooth.h>
317826bd095a7ecfd642524cfd93a39a52986b73fcRene Bolldorf#endif
321bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
331bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat#define LOG_TAG "PanController"
341bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat#include <cutils/log.h>
351bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
361bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat#include "PanController.h"
371bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
380399710d9a7ee575104e7d76dc988afb7829ccb9San Mehat#ifdef HAVE_BLUETOOTH
391bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehatextern "C" int bt_is_enabled();
400399710d9a7ee575104e7d76dc988afb7829ccb9San Mehat#endif
411bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
421bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San MehatPanController::PanController() {
431bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    mPid = 0;
441bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat}
451bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
461bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San MehatPanController::~PanController() {
471bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat}
481bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
491bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehatint PanController::startPan() {
501bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    pid_t pid;
511bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
520399710d9a7ee575104e7d76dc988afb7829ccb9San Mehat#ifdef HAVE_BLUETOOTH
531bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    if (!bt_is_enabled()) {
541bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        LOGE("Cannot start PAN services - Bluetooth not running");
551bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        errno = ENODEV;
561bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        return -1;
571bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    }
580399710d9a7ee575104e7d76dc988afb7829ccb9San Mehat#else
590399710d9a7ee575104e7d76dc988afb7829ccb9San Mehat    LOGE("Cannot start PAN services - No Bluetooth support");
600399710d9a7ee575104e7d76dc988afb7829ccb9San Mehat    errno = ENODEV;
610399710d9a7ee575104e7d76dc988afb7829ccb9San Mehat    return -1;
620399710d9a7ee575104e7d76dc988afb7829ccb9San Mehat#endif
631bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
641bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    if (mPid) {
651bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        LOGE("PAN already started");
661bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        errno = EBUSY;
671bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        return -1;
681bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    }
691bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
701bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat   if ((pid = fork()) < 0) {
711bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        LOGE("fork failed (%s)", strerror(errno));
721bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        return -1;
731bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    }
741bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
751bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    if (!pid) {
761bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        if (execl("/system/bin/pand", "/system/bin/pand", "--nodetach", "--listen",
771bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat                  "--role", "NAP", (char *) NULL)) {
781bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat            LOGE("execl failed (%s)", strerror(errno));
791bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        }
801bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        LOGE("Should never get here!");
811bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        return 0;
821bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    } else {
831bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        mPid = pid;
841bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    }
851bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    return 0;
861bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
871bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat}
881bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
891bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehatint PanController::stopPan() {
901bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    if (mPid == 0) {
911bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        LOGE("PAN already stopped");
921bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        return 0;
931bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    }
941bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
951bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    LOGD("Stopping PAN services");
961bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    kill(mPid, SIGTERM);
971bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    waitpid(mPid, NULL, 0);
981bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    mPid = 0;
991bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    LOGD("PAN services stopped");
1001bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    return 0;
1011bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat}
1021bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
1031bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehatbool PanController::isPanStarted() {
1041bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    return (mPid != 0 ? true : false);
1051bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat}
106