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