CommandListener.cpp revision 8e46896b4c4be5deaef651a12b17314f63ae9070
1d18304287dbabc7835be771400b85d4ae8b63de6San Mehat/* 2d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * Copyright (C) 2008 The Android Open Source Project 3d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * 4d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * Licensed under the Apache License, Version 2.0 (the "License"); 5d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * you may not use this file except in compliance with the License. 6d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * You may obtain a copy of the License at 7d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * 8d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * http://www.apache.org/licenses/LICENSE-2.0 9d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * 10d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * Unless required by applicable law or agreed to in writing, software 11d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * distributed under the License is distributed on an "AS IS" BASIS, 12d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * See the License for the specific language governing permissions and 14d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * limitations under the License. 15d18304287dbabc7835be771400b85d4ae8b63de6San Mehat */ 16d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 17d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <stdlib.h> 18d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <sys/socket.h> 19d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <sys/types.h> 20d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <netinet/in.h> 21d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <arpa/inet.h> 22d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <dirent.h> 23d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <errno.h> 24d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 255c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat#include <linux/if.h> 265c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 27d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#define LOG_TAG "CommandListener" 28d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <cutils/log.h> 29d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 30d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <sysutils/SocketClient.h> 31d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 32d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include "CommandListener.h" 33d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include "ResponseCode.h" 34d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 355c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatextern "C" int ifc_init(void); 365c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatextern "C" int ifc_get_hwaddr(const char *name, void *ptr); 375c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatextern "C" int ifc_get_info(const char *name, in_addr_t *addr, in_addr_t *mask, unsigned *flags); 385c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatextern "C" int ifc_set_addr(const char *name, in_addr_t addr); 395c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatextern "C" int ifc_set_mask(const char *name, in_addr_t mask); 405c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatextern "C" int ifc_up(const char *name); 415c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatextern "C" int ifc_down(const char *name); 425c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 439d10b341a0ba46f108cb96e46691197d778cbc06San MehatTetherController *CommandListener::sTetherCtrl = NULL; 449ff78fb7da7158f5bd7c86d89a842691820259cfSan MehatNatController *CommandListener::sNatCtrl = NULL; 45d5573d34c8fac49e16b20cf144486125bf940086San MehatPppController *CommandListener::sPppCtrl = NULL; 461bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San MehatPanController *CommandListener::sPanCtrl = NULL; 475af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry ShmidtSoftapController *CommandListener::sSoftapCtrl = NULL; 483e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert GreenwaltUsbController *CommandListener::sUsbCtrl = NULL; 499d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 50d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::CommandListener() : 51d18304287dbabc7835be771400b85d4ae8b63de6San Mehat FrameworkListener("netd") { 525c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat registerCmd(new InterfaceCmd()); 53d18304287dbabc7835be771400b85d4ae8b63de6San Mehat registerCmd(new IpFwdCmd()); 54d18304287dbabc7835be771400b85d4ae8b63de6San Mehat registerCmd(new TetherCmd()); 55d18304287dbabc7835be771400b85d4ae8b63de6San Mehat registerCmd(new NatCmd()); 56d5573d34c8fac49e16b20cf144486125bf940086San Mehat registerCmd(new ListTtysCmd()); 57d5573d34c8fac49e16b20cf144486125bf940086San Mehat registerCmd(new PppdCmd()); 581bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat registerCmd(new PanCmd()); 595af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt registerCmd(new SoftapCmd()); 603e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt registerCmd(new UsbCmd()); 619d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 629d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!sTetherCtrl) 639d10b341a0ba46f108cb96e46691197d778cbc06San Mehat sTetherCtrl = new TetherController(); 649ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat if (!sNatCtrl) 659ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat sNatCtrl = new NatController(); 66d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!sPppCtrl) 67d5573d34c8fac49e16b20cf144486125bf940086San Mehat sPppCtrl = new PppController(); 681bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (!sPanCtrl) 691bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat sPanCtrl = new PanController(); 705af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (!sSoftapCtrl) 715af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt sSoftapCtrl = new SoftapController(); 723e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt if (!sUsbCtrl) 733e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt sUsbCtrl = new UsbController(); 74d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 75d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 765c1b8af16dbbc20c89aaca2f93e725e12b16d055San MehatCommandListener::InterfaceCmd::InterfaceCmd() : 775c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat NetdCommand("interface") { 78d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 79d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 805c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatint CommandListener::InterfaceCmd::runCommand(SocketClient *cli, 81d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 825c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (argc < 2) { 835c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 845c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 855c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 865c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 875c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!strcmp(argv[1], "list")) { 885c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat DIR *d; 895c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat struct dirent *de; 905c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 915c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!(d = opendir("/sys/class/net"))) { 925c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to open sysfs dir", true); 935c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 945c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 955c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 965c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat while((de = readdir(d))) { 975c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (de->d_name[0] == '.') 985c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat continue; 995c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::InterfaceListResult, de->d_name, false); 1005c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 1015c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat closedir(d); 1025c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Interface list completed", false); 1035c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 1048e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } else if (!strcmp(argv[1], "readrxcounter")) { 1058e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (argc != 3) { 1068e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 1078e46896b4c4be5deaef651a12b17314f63ae9070San Mehat "Usage: interface readrxcounter <interface>", false); 1088e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1098e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 1108e46896b4c4be5deaef651a12b17314f63ae9070San Mehat unsigned long rx = 0, tx = 0; 1118e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (readInterfaceCounters(argv[2], &rx, &tx)) { 1128e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to read counters", true); 1138e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1148e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 1158e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 1168e46896b4c4be5deaef651a12b17314f63ae9070San Mehat char *msg; 1178e46896b4c4be5deaef651a12b17314f63ae9070San Mehat asprintf(&msg, "%lu", rx); 1188e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::InterfaceRxCounterResult, msg, false); 1198e46896b4c4be5deaef651a12b17314f63ae9070San Mehat free(msg); 1208e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 1218e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1228e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } else if (!strcmp(argv[1], "readtxcounter")) { 1238e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (argc != 3) { 1248e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 1258e46896b4c4be5deaef651a12b17314f63ae9070San Mehat "Usage: interface readtxcounter <interface>", false); 1268e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1278e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 1288e46896b4c4be5deaef651a12b17314f63ae9070San Mehat unsigned long rx = 0, tx = 0; 1298e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (readInterfaceCounters(argv[2], &rx, &tx)) { 1308e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to read counters", true); 1318e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1328e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 1338e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 1348e46896b4c4be5deaef651a12b17314f63ae9070San Mehat char *msg = NULL; 1358e46896b4c4be5deaef651a12b17314f63ae9070San Mehat asprintf(&msg, "%lu", tx); 1368e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::InterfaceTxCounterResult, msg, false); 1378e46896b4c4be5deaef651a12b17314f63ae9070San Mehat free(msg); 1388e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1398e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } else if (!strcmp(argv[1], "getthrottle")) { 1408e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (argc != 4) { 1418e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 1428e46896b4c4be5deaef651a12b17314f63ae9070San Mehat "Usage: interface getthrottle <interface> <rx|tx>", false); 1438e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1448e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 1458e46896b4c4be5deaef651a12b17314f63ae9070San Mehat errno = ENOSYS; 1468e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Not Implemented", true); 1478e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1488e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } else if (!strcmp(argv[1], "setthrottle")) { 1498e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (argc != 5) { 1508e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 1518e46896b4c4be5deaef651a12b17314f63ae9070San Mehat "Usage: interface getthrottle <interface> <rx|tx> <kbps>", false); 1528e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1538e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 1548e46896b4c4be5deaef651a12b17314f63ae9070San Mehat errno = ENOSYS; 1558e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Not Implemented", true); 1568e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1575c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else { 1585c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat /* 1595c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat * These commands take a minimum of 3 arguments 1605c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat */ 1615c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (argc < 3) { 1625c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 1635c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 1645c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 1655c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!strcmp(argv[1], "getcfg")) { 1665c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat struct in_addr addr, mask; 1675c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat unsigned char hwaddr[6]; 1685c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat unsigned flags = 0; 1695c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1705c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat ifc_init(); 1715c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat memset(hwaddr, 0, sizeof(hwaddr)); 1725c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1735c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_get_info(argv[2], &addr.s_addr, &mask.s_addr, &flags)) { 1745c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Interface not found", true); 1755c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 1765c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 1775c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1785c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_get_hwaddr(argv[2], (void *) hwaddr)) { 1795c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat LOGW("Failed to retrieve HW addr for %s (%s)", argv[2], strerror(errno)); 1805c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 1815c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1825c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *addr_s = strdup(inet_ntoa(addr)); 1835c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *mask_s = strdup(inet_ntoa(mask)); 1845c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat const char *updown, *brdcst, *loopbk, *ppp, *running, *multi; 1855c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1865c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat updown = (flags & IFF_UP) ? "up" : "down"; 1875c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat brdcst = (flags & IFF_BROADCAST) ? " broadcast" : ""; 1885c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat loopbk = (flags & IFF_LOOPBACK) ? " loopback" : ""; 1895c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat ppp = (flags & IFF_POINTOPOINT) ? " point-to-point" : ""; 1905c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat running = (flags & IFF_RUNNING) ? " running" : ""; 1915c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat multi = (flags & IFF_MULTICAST) ? " multicast" : ""; 1925c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1935c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *flag_s; 1945c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 195e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt asprintf(&flag_s, "[%s%s%s%s%s%s]", updown, brdcst, loopbk, ppp, running, multi); 1965c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1975c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *msg = NULL; 1985c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat asprintf(&msg, "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x %s %s %s", 1995c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat hwaddr[0], hwaddr[1], hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5], 2005c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat addr_s, mask_s, flag_s); 2015c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 20201fed783828b592cda3b774deea4099a9e690e3dSan Mehat cli->sendMsg(ResponseCode::InterfaceGetCfgResult, msg, false); 2035c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2045c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(addr_s); 2055c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(mask_s); 2065c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(flag_s); 2075c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(msg); 2085c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2095c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else if (!strcmp(argv[1], "setcfg")) { 210e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt // arglist: iface addr mask [flags] 2115c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (argc < 5) { 2125c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 2135c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2145c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 215e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt LOGD("Setting iface cfg"); 2165c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2175c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat struct in_addr addr, mask; 2185c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat unsigned flags = 0; 2195c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2205c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!inet_aton(argv[3], &addr)) { 2215c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Invalid address", false); 2225c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2235c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2245c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2255c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!inet_aton(argv[4], &mask)) { 2265c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Invalid netmask", false); 2275c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2285c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2295c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2305c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat ifc_init(); 2315c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_set_addr(argv[2], addr.s_addr)) { 2325c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to set address", true); 2335c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2345c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2355c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2365c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_set_mask(argv[2], mask.s_addr)) { 2375c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to set netmask", true); 2385c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2395c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2405c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2415c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat /* Process flags */ 242e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt /* read from "[XX" arg to "YY]" arg */ 243e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt bool bStarted = false; 2445c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat for (int i = 5; i < argc; i++) { 245e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt char *flag = argv[i]; 246e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt if (!bStarted) { 247e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt if (*flag == '[') { 248e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt flag++; 249e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt bStarted = true; 250e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else { 251e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt continue; 252e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } 253e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } 254e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt int len = strlen(flag); 255e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt if (flag[len-1] == ']') { 256e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt i = argc; // stop after this loop 257e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt flag[len-1] = 0; 258e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } 259e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt if (!strcmp(flag, "up")) { 260e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt LOGD("Trying to bring up %s", argv[2]); 2615c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_up(argv[2])) { 2625c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat LOGE("Error upping interface"); 2635c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to up interface", true); 2645c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2655c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 266e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else if (!strcmp(flag, "down")) { 267e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt LOGD("Trying to bring down %s", argv[2]); 2685c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_down(argv[2])) { 2695c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat LOGE("Error downing interface"); 2705c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to down interface", true); 2715c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2725c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 273e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else if (!strcmp(flag, "broadcast")) { 274e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt LOGD("broadcast flag ignored"); 275e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else if (!strcmp(flag, "multicast")) { 276e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt LOGD("multicast flag ignored"); 2775c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else { 2785c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Flag unsupported", false); 2795c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2805c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2815c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2825c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Interface configuration set", false); 2835c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2845c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else { 2855c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown interface cmd", false); 2865c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2875c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2885c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 289d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 290d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 291d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 292d5573d34c8fac49e16b20cf144486125bf940086San MehatCommandListener::ListTtysCmd::ListTtysCmd() : 293d5573d34c8fac49e16b20cf144486125bf940086San Mehat NetdCommand("list_ttys") { 294d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 295d5573d34c8fac49e16b20cf144486125bf940086San Mehat 296d5573d34c8fac49e16b20cf144486125bf940086San Mehatint CommandListener::ListTtysCmd::runCommand(SocketClient *cli, 297d5573d34c8fac49e16b20cf144486125bf940086San Mehat int argc, char **argv) { 298d5573d34c8fac49e16b20cf144486125bf940086San Mehat TtyCollection *tlist = sPppCtrl->getTtyList(); 299d5573d34c8fac49e16b20cf144486125bf940086San Mehat TtyCollection::iterator it; 300d5573d34c8fac49e16b20cf144486125bf940086San Mehat 301d5573d34c8fac49e16b20cf144486125bf940086San Mehat for (it = tlist->begin(); it != tlist->end(); ++it) { 302d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::TtyListResult, *it, false); 303d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 304d5573d34c8fac49e16b20cf144486125bf940086San Mehat 305d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Ttys listed.", false); 306d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 307d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 308d5573d34c8fac49e16b20cf144486125bf940086San Mehat 309d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::IpFwdCmd::IpFwdCmd() : 310d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetdCommand("ipfwd") { 311d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 312d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 313d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint CommandListener::IpFwdCmd::runCommand(SocketClient *cli, 314d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 3159d10b341a0ba46f108cb96e46691197d778cbc06San Mehat int rc = 0; 3169d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 3179d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (argc < 2) { 3189d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 3199d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 3209d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 3219d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 3229d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[1], "status")) { 3239d10b341a0ba46f108cb96e46691197d778cbc06San Mehat char *tmp = NULL; 3249d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 3259d10b341a0ba46f108cb96e46691197d778cbc06San Mehat asprintf(&tmp, "Forwarding %s", (sTetherCtrl->getIpFwdEnabled() ? "enabled" : "disabled")); 3269d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::IpFwdStatusResult, tmp, false); 3279d10b341a0ba46f108cb96e46691197d778cbc06San Mehat free(tmp); 3289d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 3299d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "enable")) { 3309d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->setIpFwdEnabled(true); 3319d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "disable")) { 3329d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->setIpFwdEnabled(false); 3339d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 3349d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown ipfwd cmd", false); 3359d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 3369d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 3379d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 3389d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!rc) { 3399d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandOkay, "ipfwd operation succeeded", false); 3409d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 3419d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::OperationFailed, "ipfwd operation failed", true); 3429d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 343d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 344d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 345d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 346d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 347d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::TetherCmd::TetherCmd() : 348d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetdCommand("tether") { 349d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 350d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 351d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint CommandListener::TetherCmd::runCommand(SocketClient *cli, 352d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 3539d10b341a0ba46f108cb96e46691197d778cbc06San Mehat int rc = 0; 3549d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 355d18304287dbabc7835be771400b85d4ae8b63de6San Mehat if (argc < 2) { 356d18304287dbabc7835be771400b85d4ae8b63de6San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 357d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 358d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 359d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 3609d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[1], "stop")) { 3619d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->stopTethering(); 362d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } else if (!strcmp(argv[1], "status")) { 3639d10b341a0ba46f108cb96e46691197d778cbc06San Mehat char *tmp = NULL; 3649d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 3659d10b341a0ba46f108cb96e46691197d778cbc06San Mehat asprintf(&tmp, "Tethering services %s", 3669d10b341a0ba46f108cb96e46691197d778cbc06San Mehat (sTetherCtrl->isTetheringStarted() ? "started" : "stopped")); 3679d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::TetherStatusResult, tmp, false); 3689d10b341a0ba46f108cb96e46691197d778cbc06San Mehat free(tmp); 369d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 3709d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 3719d10b341a0ba46f108cb96e46691197d778cbc06San Mehat /* 3729d10b341a0ba46f108cb96e46691197d778cbc06San Mehat * These commands take a minimum of 4 arguments 3739d10b341a0ba46f108cb96e46691197d778cbc06San Mehat */ 3749d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (argc < 4) { 3759d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 3769d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 3779d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 3789d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 3799d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[1], "start")) { 3803208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt if (argc % 2 == 1) { 3813208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt cli->sendMsg(ResponseCode::CommandSyntaxError, "Bad number of arguments", false); 3829d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 3839d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 3843208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt 3853208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt int num_addrs = argc - 2; 3863208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt int arg_index = 2; 3873208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt int array_index = 0; 3883208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt in_addr *addrs = (in_addr *)malloc(sizeof(in_addr) * num_addrs); 3893208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt while (array_index < num_addrs) { 3903208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt if (!inet_aton(argv[arg_index++], &(addrs[array_index++]))) { 3913208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid address", false); 3923208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt free(addrs); 3933208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt return 0; 3943208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt } 3959d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 3963208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt rc = sTetherCtrl->startTethering(num_addrs, addrs); 3973208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt free(addrs); 3989d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "interface")) { 3999d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[2], "add")) { 4009d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->tetherInterface(argv[3]); 4019d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[2], "remove")) { 4029d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->untetherInterface(argv[3]); 4039d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[2], "list")) { 4049d10b341a0ba46f108cb96e46691197d778cbc06San Mehat InterfaceCollection *ilist = sTetherCtrl->getTetheredInterfaceList(); 4059d10b341a0ba46f108cb96e46691197d778cbc06San Mehat InterfaceCollection::iterator it; 4069d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4079d10b341a0ba46f108cb96e46691197d778cbc06San Mehat for (it = ilist->begin(); it != ilist->end(); ++it) { 4089d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::TetherInterfaceListResult, *it, false); 4099d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 4109d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 4119d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandParameterError, 4129d10b341a0ba46f108cb96e46691197d778cbc06San Mehat "Unknown tether interface operation", false); 4139d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 4149d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 4159d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "dns")) { 4169d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[2], "set")) { 4179d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->setDnsForwarders(&argv[3], argc - 3); 4189d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[2], "list")) { 4199d10b341a0ba46f108cb96e46691197d778cbc06San Mehat NetAddressCollection *dlist = sTetherCtrl->getDnsForwarders(); 4209d10b341a0ba46f108cb96e46691197d778cbc06San Mehat NetAddressCollection::iterator it; 4219d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4229d10b341a0ba46f108cb96e46691197d778cbc06San Mehat for (it = dlist->begin(); it != dlist->end(); ++it) { 4239d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::TetherDnsFwdTgtListResult, inet_ntoa(*it), false); 4249d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 4259d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 4269d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandParameterError, 4279d10b341a0ba46f108cb96e46691197d778cbc06San Mehat "Unknown tether interface operation", false); 4289d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 4299d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 4309d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 4319d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown tether cmd", false); 4329d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 4339d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 4349d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 4359d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4369d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!rc) { 4379d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Tether operation succeeded", false); 4389d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 4399d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Tether operation failed", true); 440d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 441d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 442d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 443d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 444d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 445d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::NatCmd::NatCmd() : 446d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetdCommand("nat") { 447d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 448d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 449d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint CommandListener::NatCmd::runCommand(SocketClient *cli, 450d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 4519d10b341a0ba46f108cb96e46691197d778cbc06San Mehat int rc = 0; 4529d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4539d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (argc < 3) { 4549d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 4559d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 4569d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 4579d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4589ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat if (!strcmp(argv[1], "enable")) { 4599ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat rc = sNatCtrl->enableNat(argv[2], argv[3]); 4609ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat } else if (!strcmp(argv[1], "disable")) { 4619ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat rc = sNatCtrl->disableNat(argv[2], argv[3]); 4629d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 4639d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown nat cmd", false); 4649d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 4659d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 4669d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4679d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!rc) { 4689d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Nat operation succeeded", false); 4699d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 4709d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Nat operation failed", true); 4719d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 472d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 473d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 474d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 475d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 476d5573d34c8fac49e16b20cf144486125bf940086San MehatCommandListener::PppdCmd::PppdCmd() : 477d5573d34c8fac49e16b20cf144486125bf940086San Mehat NetdCommand("pppd") { 478d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 479d5573d34c8fac49e16b20cf144486125bf940086San Mehat 480d5573d34c8fac49e16b20cf144486125bf940086San Mehatint CommandListener::PppdCmd::runCommand(SocketClient *cli, 481d5573d34c8fac49e16b20cf144486125bf940086San Mehat int argc, char **argv) { 482d5573d34c8fac49e16b20cf144486125bf940086San Mehat int rc = 0; 483d5573d34c8fac49e16b20cf144486125bf940086San Mehat 484d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (argc < 3) { 485d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 486d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 487d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 488d5573d34c8fac49e16b20cf144486125bf940086San Mehat 489d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!strcmp(argv[1], "attach")) { 49074d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt struct in_addr l, r, dns1, dns2; 49174d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt 49274d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt memset(&dns1, sizeof(struct in_addr), 0); 49374d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt memset(&dns2, sizeof(struct in_addr), 0); 494d5573d34c8fac49e16b20cf144486125bf940086San Mehat 495d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!inet_aton(argv[3], &l)) { 496d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Invalid local address", false); 497d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 498d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 499d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!inet_aton(argv[4], &r)) { 500d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Invalid remote address", false); 501d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 502d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 50374d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt if ((argc > 3) && (!inet_aton(argv[5], &dns1))) { 50474d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid dns1 address", false); 50574d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt return 0; 50674d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt } 50774d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt if ((argc > 4) && (!inet_aton(argv[6], &dns2))) { 50874d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid dns2 address", false); 50974d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt return 0; 51074d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt } 51174d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt rc = sPppCtrl->attachPppd(argv[2], l, r, dns1, dns2); 512d5573d34c8fac49e16b20cf144486125bf940086San Mehat } else if (!strcmp(argv[1], "detach")) { 513d5573d34c8fac49e16b20cf144486125bf940086San Mehat rc = sPppCtrl->detachPppd(argv[2]); 514d5573d34c8fac49e16b20cf144486125bf940086San Mehat } else { 515d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown pppd cmd", false); 516d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 517d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 518d5573d34c8fac49e16b20cf144486125bf940086San Mehat 519d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!rc) { 520d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Pppd operation succeeded", false); 521d5573d34c8fac49e16b20cf144486125bf940086San Mehat } else { 522d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Pppd operation failed", true); 523d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 524d5573d34c8fac49e16b20cf144486125bf940086San Mehat 525d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 526d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 5271bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 5281bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San MehatCommandListener::PanCmd::PanCmd() : 5291bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat NetdCommand("pan") { 5301bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat} 5311bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 5321bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehatint CommandListener::PanCmd::runCommand(SocketClient *cli, 5331bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat int argc, char **argv) { 5341bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat int rc = 0; 5351bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 5361bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (argc < 2) { 5371bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 5381bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 5391bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } 5401bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 5411bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (!strcmp(argv[1], "start")) { 5421bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat rc = sPanCtrl->startPan(); 5431bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else if (!strcmp(argv[1], "stop")) { 5441bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat rc = sPanCtrl->stopPan(); 5451bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else if (!strcmp(argv[1], "status")) { 5461bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat char *tmp = NULL; 5471bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 5481bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat asprintf(&tmp, "Pan services %s", 5491bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat (sPanCtrl->isPanStarted() ? "started" : "stopped")); 5501bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::PanStatusResult, tmp, false); 5511bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat free(tmp); 5521bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 5531bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else { 5541bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown pan cmd", false); 5551bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 5561bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } 5571bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 5581bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (!rc) { 5591bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Pan operation succeeded", false); 5601bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else { 5611bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Pan operation failed", true); 5621bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } 5631bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 5641bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 5651bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat} 5665af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 5675af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry ShmidtCommandListener::SoftapCmd::SoftapCmd() : 5685af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt NetdCommand("softap") { 5695af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt} 5705af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 5715af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidtint CommandListener::SoftapCmd::runCommand(SocketClient *cli, 5725af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt int argc, char **argv) { 57331fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt int rc = 0, flag = 0; 5745af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 5755af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (argc < 2) { 5765af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt cli->sendMsg(ResponseCode::CommandSyntaxError, "Softap Missing argument", false); 5775af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 5785af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 5795af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 5805af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (!strcmp(argv[1], "start")) { 581c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt rc = sSoftapCtrl->startDriver(argv[2]); 5825af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else if (!strcmp(argv[1], "stop")) { 583c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt rc = sSoftapCtrl->stopDriver(argv[2]); 584c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt } else if (!strcmp(argv[1], "startap")) { 585c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt rc = sSoftapCtrl->startSoftap(); 586c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt } else if (!strcmp(argv[1], "stopap")) { 5875af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt rc = sSoftapCtrl->stopSoftap(); 58831fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt } else if (!strcmp(argv[1], "fwreload")) { 58931fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt rc = sSoftapCtrl->fwReloadSoftap(argc, argv); 5905af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else if (!strcmp(argv[1], "status")) { 5915af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt char *tmp = NULL; 5925af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 5935af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt asprintf(&tmp, "Softap service %s", 5945af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt (sSoftapCtrl->isSoftapStarted() ? "started" : "stopped")); 5955af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt cli->sendMsg(ResponseCode::SoftapStatusResult, tmp, false); 5965af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt free(tmp); 5975af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 5985af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else if (!strcmp(argv[1], "set")) { 5995af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt rc = sSoftapCtrl->setSoftap(argc, argv); 6005af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else { 6015af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt cli->sendMsg(ResponseCode::CommandSyntaxError, "Softap Unknown cmd", false); 6025af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 6035af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 6045af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 6055af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (!rc) { 6065af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt cli->sendMsg(ResponseCode::CommandOkay, "Softap operation succeeded", false); 6075af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else { 6085af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt cli->sendMsg(ResponseCode::OperationFailed, "Softap operation failed", true); 6095af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 6105af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 6115af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 6125af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt} 6133e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt 6143e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert GreenwaltCommandListener::UsbCmd::UsbCmd() : 6153e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt NetdCommand("usb") { 6163e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt} 6173e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt 6183e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwaltint CommandListener::UsbCmd::runCommand(SocketClient *cli, int argc, char **argv) { 6193e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt int rc = 0; 6203e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt 6213e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt if (argc < 2) { 6223e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt cli->sendMsg(ResponseCode::CommandSyntaxError, "Usb Missing argument", false); 6233e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt return 0; 6243e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt } 6253e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt 6263e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt if (!strcmp(argv[1], "startrndis")) { 6273e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt rc = sUsbCtrl->startRNDIS(); 6283e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt } else if (!strcmp(argv[1], "stoprndis")) { 6293e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt rc = sUsbCtrl->stopRNDIS(); 6303e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt } else if (!strcmp(argv[1], "rndisstatus")) { 6313e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt char *tmp = NULL; 6323e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt 6333e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt asprintf(&tmp, "Usb RNDIS %s", 6343e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt (sUsbCtrl->isRNDISStarted() ? "started" : "stopped")); 6353e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt cli->sendMsg(ResponseCode::UsbRNDISStatusResult, tmp, false); 6363e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt free(tmp); 6373e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt return 0; 6383e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt } else { 6393e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt cli->sendMsg(ResponseCode::CommandSyntaxError, "Usb Unknown cmd", false); 6403e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt return 0; 6413e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt } 6423e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt 6433e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt if (!rc) { 6443e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt cli->sendMsg(ResponseCode::CommandOkay, "Usb operation succeeded", false); 6453e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt } else { 6463e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt cli->sendMsg(ResponseCode::OperationFailed, "Softap operation failed", true); 6473e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt } 6483e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt 6493e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt return 0; 6503e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt} 6518e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 6528e46896b4c4be5deaef651a12b17314f63ae9070San Mehatint CommandListener::readInterfaceCounters(const char *iface, unsigned long *rx, unsigned long *tx) { 6538e46896b4c4be5deaef651a12b17314f63ae9070San Mehat FILE *fp = fopen("/proc/net/dev", "r"); 6548e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (!fp) { 6558e46896b4c4be5deaef651a12b17314f63ae9070San Mehat LOGE("Failed to open /proc/net/dev (%s)", strerror(errno)); 6568e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return -1; 6578e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 6588e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 6598e46896b4c4be5deaef651a12b17314f63ae9070San Mehat char buffer[512]; 6608e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 6618e46896b4c4be5deaef651a12b17314f63ae9070San Mehat fgets(buffer, sizeof(buffer), fp); // Header 1 6628e46896b4c4be5deaef651a12b17314f63ae9070San Mehat fgets(buffer, sizeof(buffer), fp); // Header 2 6638e46896b4c4be5deaef651a12b17314f63ae9070San Mehat while(fgets(buffer, sizeof(buffer), fp)) { 6648e46896b4c4be5deaef651a12b17314f63ae9070San Mehat buffer[strlen(buffer)-1] = '\0'; 6658e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 6668e46896b4c4be5deaef651a12b17314f63ae9070San Mehat char name[8]; 6678e46896b4c4be5deaef651a12b17314f63ae9070San Mehat unsigned long d; 6688e46896b4c4be5deaef651a12b17314f63ae9070San Mehat sscanf(buffer, "%6s %8lu %7lu %4lu %4lu %4lu %5lu %10lu %9lu %8lu", 6698e46896b4c4be5deaef651a12b17314f63ae9070San Mehat name, rx, &d, &d, &d, &d, &d, &d, &d, tx); 6708e46896b4c4be5deaef651a12b17314f63ae9070San Mehat name[strlen(name)-1] = '\0'; 6718e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 6728e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (strcmp(name, iface)) { 6738e46896b4c4be5deaef651a12b17314f63ae9070San Mehat continue; 6748e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 6758e46896b4c4be5deaef651a12b17314f63ae9070San Mehat fclose(fp); 6768e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 6778e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 6788e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 6798e46896b4c4be5deaef651a12b17314f63ae9070San Mehat fclose(fp); 6808e46896b4c4be5deaef651a12b17314f63ae9070San Mehat errno = ENOENT; 6818e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return -1; 6828e46896b4c4be5deaef651a12b17314f63ae9070San Mehat} 683