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