CommandListener.cpp revision 5c1b8af16dbbc20c89aaca2f93e725e12b16d055
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; 479d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 48d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::CommandListener() : 49d18304287dbabc7835be771400b85d4ae8b63de6San Mehat FrameworkListener("netd") { 505c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat registerCmd(new InterfaceCmd()); 51d18304287dbabc7835be771400b85d4ae8b63de6San Mehat registerCmd(new IpFwdCmd()); 52d18304287dbabc7835be771400b85d4ae8b63de6San Mehat registerCmd(new TetherCmd()); 53d18304287dbabc7835be771400b85d4ae8b63de6San Mehat registerCmd(new NatCmd()); 54d5573d34c8fac49e16b20cf144486125bf940086San Mehat registerCmd(new ListTtysCmd()); 55d5573d34c8fac49e16b20cf144486125bf940086San Mehat registerCmd(new PppdCmd()); 561bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat registerCmd(new PanCmd()); 579d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 589d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!sTetherCtrl) 599d10b341a0ba46f108cb96e46691197d778cbc06San Mehat sTetherCtrl = new TetherController(); 609ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat if (!sNatCtrl) 619ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat sNatCtrl = new NatController(); 62d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!sPppCtrl) 63d5573d34c8fac49e16b20cf144486125bf940086San Mehat sPppCtrl = new PppController(); 641bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (!sPanCtrl) 651bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat sPanCtrl = new PanController(); 66d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 67d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 685c1b8af16dbbc20c89aaca2f93e725e12b16d055San MehatCommandListener::InterfaceCmd::InterfaceCmd() : 695c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat NetdCommand("interface") { 70d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 71d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 725c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatint CommandListener::InterfaceCmd::runCommand(SocketClient *cli, 73d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 745c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (argc < 2) { 755c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 765c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 775c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 785c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 795c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!strcmp(argv[1], "list")) { 805c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat DIR *d; 815c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat struct dirent *de; 825c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 835c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!(d = opendir("/sys/class/net"))) { 845c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to open sysfs dir", true); 855c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 865c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 875c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 885c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat while((de = readdir(d))) { 895c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (de->d_name[0] == '.') 905c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat continue; 915c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::InterfaceListResult, de->d_name, false); 925c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 935c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat closedir(d); 945c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Interface list completed", false); 955c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 965c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else { 975c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat /* 985c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat * These commands take a minimum of 3 arguments 995c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat */ 1005c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (argc < 3) { 1015c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 1025c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 1035c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 1045c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!strcmp(argv[1], "getcfg")) { 1055c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat struct in_addr addr, mask; 1065c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat unsigned char hwaddr[6]; 1075c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat unsigned flags = 0; 1085c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1095c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat ifc_init(); 1105c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat memset(hwaddr, 0, sizeof(hwaddr)); 1115c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1125c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_get_info(argv[2], &addr.s_addr, &mask.s_addr, &flags)) { 1135c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Interface not found", true); 1145c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 1155c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 1165c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1175c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_get_hwaddr(argv[2], (void *) hwaddr)) { 1185c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat LOGW("Failed to retrieve HW addr for %s (%s)", argv[2], strerror(errno)); 1195c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 1205c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1215c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *addr_s = strdup(inet_ntoa(addr)); 1225c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *mask_s = strdup(inet_ntoa(mask)); 1235c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat const char *updown, *brdcst, *loopbk, *ppp, *running, *multi; 1245c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1255c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat updown = (flags & IFF_UP) ? "up" : "down"; 1265c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat brdcst = (flags & IFF_BROADCAST) ? " broadcast" : ""; 1275c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat loopbk = (flags & IFF_LOOPBACK) ? " loopback" : ""; 1285c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat ppp = (flags & IFF_POINTOPOINT) ? " point-to-point" : ""; 1295c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat running = (flags & IFF_RUNNING) ? " running" : ""; 1305c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat multi = (flags & IFF_MULTICAST) ? " multicast" : ""; 1315c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1325c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *flag_s; 1335c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1345c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat asprintf(&flag_s, "[%s%s%s%s%s%s]\n", updown, brdcst, loopbk, ppp, running, multi); 1355c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1365c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *msg = NULL; 1375c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat asprintf(&msg, "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x %s %s %s", 1385c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat hwaddr[0], hwaddr[1], hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5], 1395c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat addr_s, mask_s, flag_s); 1405c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1415c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::InterfaceGetInfoResult, msg, false); 1425c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1435c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(addr_s); 1445c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(mask_s); 1455c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(flag_s); 1465c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(msg); 1475c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 1485c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else if (!strcmp(argv[1], "setcfg")) { 1495c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (argc < 5) { 1505c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 1515c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 1525c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 1535c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1545c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat struct in_addr addr, mask; 1555c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat unsigned flags = 0; 1565c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1575c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!inet_aton(argv[3], &addr)) { 1585c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Invalid address", false); 1595c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 1605c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 1615c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1625c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!inet_aton(argv[4], &mask)) { 1635c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Invalid netmask", false); 1645c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 1655c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 1665c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1675c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat ifc_init(); 1685c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_set_addr(argv[2], addr.s_addr)) { 1695c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to set address", true); 1705c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 1715c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 1725c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1735c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_set_mask(argv[2], mask.s_addr)) { 1745c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to set netmask", true); 1755c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 1765c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 1775c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1785c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat /* Process flags */ 1795c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat for (int i = 5; i < argc; i++) { 1805c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!strcmp(argv[i], "up")) { 1815c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_up(argv[2])) { 1825c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat LOGE("Error upping interface"); 1835c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to up interface", true); 1845c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 1855c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 1865c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else if (!strcmp(argv[i], "down")) { 1875c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_down(argv[2])) { 1885c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat LOGE("Error downing interface"); 1895c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to down interface", true); 1905c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 1915c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 1925c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else { 1935c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Flag unsupported", false); 1945c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 1955c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 1965c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 1975c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Interface configuration set", false); 1985c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 1995c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else { 2005c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown interface cmd", false); 2015c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2025c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2035c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 204d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 205d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 206d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 207d5573d34c8fac49e16b20cf144486125bf940086San MehatCommandListener::ListTtysCmd::ListTtysCmd() : 208d5573d34c8fac49e16b20cf144486125bf940086San Mehat NetdCommand("list_ttys") { 209d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 210d5573d34c8fac49e16b20cf144486125bf940086San Mehat 211d5573d34c8fac49e16b20cf144486125bf940086San Mehatint CommandListener::ListTtysCmd::runCommand(SocketClient *cli, 212d5573d34c8fac49e16b20cf144486125bf940086San Mehat int argc, char **argv) { 213d5573d34c8fac49e16b20cf144486125bf940086San Mehat TtyCollection *tlist = sPppCtrl->getTtyList(); 214d5573d34c8fac49e16b20cf144486125bf940086San Mehat TtyCollection::iterator it; 215d5573d34c8fac49e16b20cf144486125bf940086San Mehat 216d5573d34c8fac49e16b20cf144486125bf940086San Mehat for (it = tlist->begin(); it != tlist->end(); ++it) { 217d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::TtyListResult, *it, false); 218d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 219d5573d34c8fac49e16b20cf144486125bf940086San Mehat 220d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Ttys listed.", false); 221d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 222d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 223d5573d34c8fac49e16b20cf144486125bf940086San Mehat 224d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::IpFwdCmd::IpFwdCmd() : 225d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetdCommand("ipfwd") { 226d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 227d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 228d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint CommandListener::IpFwdCmd::runCommand(SocketClient *cli, 229d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 2309d10b341a0ba46f108cb96e46691197d778cbc06San Mehat int rc = 0; 2319d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 2329d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (argc < 2) { 2339d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 2349d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 2359d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 2369d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 2379d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[1], "status")) { 2389d10b341a0ba46f108cb96e46691197d778cbc06San Mehat char *tmp = NULL; 2399d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 2409d10b341a0ba46f108cb96e46691197d778cbc06San Mehat asprintf(&tmp, "Forwarding %s", (sTetherCtrl->getIpFwdEnabled() ? "enabled" : "disabled")); 2419d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::IpFwdStatusResult, tmp, false); 2429d10b341a0ba46f108cb96e46691197d778cbc06San Mehat free(tmp); 2439d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 2449d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "enable")) { 2459d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->setIpFwdEnabled(true); 2469d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "disable")) { 2479d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->setIpFwdEnabled(false); 2489d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 2499d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown ipfwd cmd", false); 2509d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 2519d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 2529d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 2539d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!rc) { 2549d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandOkay, "ipfwd operation succeeded", false); 2559d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 2569d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::OperationFailed, "ipfwd operation failed", true); 2579d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 258d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 259d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 260d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 261d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 262d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::TetherCmd::TetherCmd() : 263d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetdCommand("tether") { 264d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 265d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 266d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint CommandListener::TetherCmd::runCommand(SocketClient *cli, 267d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 2689d10b341a0ba46f108cb96e46691197d778cbc06San Mehat int rc = 0; 2699d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 270d18304287dbabc7835be771400b85d4ae8b63de6San Mehat if (argc < 2) { 271d18304287dbabc7835be771400b85d4ae8b63de6San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 272d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 273d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 274d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 2759d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[1], "stop")) { 2769d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->stopTethering(); 277d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } else if (!strcmp(argv[1], "status")) { 2789d10b341a0ba46f108cb96e46691197d778cbc06San Mehat char *tmp = NULL; 2799d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 2809d10b341a0ba46f108cb96e46691197d778cbc06San Mehat asprintf(&tmp, "Tethering services %s", 2819d10b341a0ba46f108cb96e46691197d778cbc06San Mehat (sTetherCtrl->isTetheringStarted() ? "started" : "stopped")); 2829d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::TetherStatusResult, tmp, false); 2839d10b341a0ba46f108cb96e46691197d778cbc06San Mehat free(tmp); 284d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 2859d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 2869d10b341a0ba46f108cb96e46691197d778cbc06San Mehat /* 2879d10b341a0ba46f108cb96e46691197d778cbc06San Mehat * These commands take a minimum of 4 arguments 2889d10b341a0ba46f108cb96e46691197d778cbc06San Mehat */ 2899d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (argc < 4) { 2909d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 2919d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 2929d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 2939d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 2949d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[1], "start")) { 2959d10b341a0ba46f108cb96e46691197d778cbc06San Mehat struct in_addr s, e; 2969d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 2979d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!inet_aton(argv[2], &s)) { 2989d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Invalid start address", false); 2999d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 3009d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 3019d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!inet_aton(argv[3], &e)) { 3029d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Invalid end address", false); 3039d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 3049d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 3059d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->startTethering(s, e); 3069d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "interface")) { 3079d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[2], "add")) { 3089d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->tetherInterface(argv[3]); 3099d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[2], "remove")) { 3109d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->untetherInterface(argv[3]); 3119d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[2], "list")) { 3129d10b341a0ba46f108cb96e46691197d778cbc06San Mehat InterfaceCollection *ilist = sTetherCtrl->getTetheredInterfaceList(); 3139d10b341a0ba46f108cb96e46691197d778cbc06San Mehat InterfaceCollection::iterator it; 3149d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 3159d10b341a0ba46f108cb96e46691197d778cbc06San Mehat for (it = ilist->begin(); it != ilist->end(); ++it) { 3169d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::TetherInterfaceListResult, *it, false); 3179d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 3189d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 3199d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandParameterError, 3209d10b341a0ba46f108cb96e46691197d778cbc06San Mehat "Unknown tether interface operation", false); 3219d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 3229d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 3239d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "dns")) { 3249d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[2], "set")) { 3259d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->setDnsForwarders(&argv[3], argc - 3); 3269d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[2], "list")) { 3279d10b341a0ba46f108cb96e46691197d778cbc06San Mehat NetAddressCollection *dlist = sTetherCtrl->getDnsForwarders(); 3289d10b341a0ba46f108cb96e46691197d778cbc06San Mehat NetAddressCollection::iterator it; 3299d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 3309d10b341a0ba46f108cb96e46691197d778cbc06San Mehat for (it = dlist->begin(); it != dlist->end(); ++it) { 3319d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::TetherDnsFwdTgtListResult, inet_ntoa(*it), false); 3329d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 3339d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 3349d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandParameterError, 3359d10b341a0ba46f108cb96e46691197d778cbc06San Mehat "Unknown tether interface operation", false); 3369d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 3379d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 3389d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 3399d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown tether cmd", false); 3409d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 3419d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 3429d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 3439d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 3449d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!rc) { 3459d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Tether operation succeeded", false); 3469d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 3479d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Tether operation failed", true); 348d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 349d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 350d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 351d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 352d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 353d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::NatCmd::NatCmd() : 354d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetdCommand("nat") { 355d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 356d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 357d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint CommandListener::NatCmd::runCommand(SocketClient *cli, 358d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 3599d10b341a0ba46f108cb96e46691197d778cbc06San Mehat int rc = 0; 3609d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 3619d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (argc < 3) { 3629d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 3639d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 3649d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 3659d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 3669ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat if (!strcmp(argv[1], "enable")) { 3679ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat rc = sNatCtrl->enableNat(argv[2], argv[3]); 3689ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat } else if (!strcmp(argv[1], "disable")) { 3699ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat rc = sNatCtrl->disableNat(argv[2], argv[3]); 3709d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 3719d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown nat cmd", false); 3729d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 3739d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 3749d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 3759d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!rc) { 3769d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Nat operation succeeded", false); 3779d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 3789d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Nat operation failed", true); 3799d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 380d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 381d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 382d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 383d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 384d5573d34c8fac49e16b20cf144486125bf940086San MehatCommandListener::PppdCmd::PppdCmd() : 385d5573d34c8fac49e16b20cf144486125bf940086San Mehat NetdCommand("pppd") { 386d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 387d5573d34c8fac49e16b20cf144486125bf940086San Mehat 388d5573d34c8fac49e16b20cf144486125bf940086San Mehatint CommandListener::PppdCmd::runCommand(SocketClient *cli, 389d5573d34c8fac49e16b20cf144486125bf940086San Mehat int argc, char **argv) { 390d5573d34c8fac49e16b20cf144486125bf940086San Mehat int rc = 0; 391d5573d34c8fac49e16b20cf144486125bf940086San Mehat 392d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (argc < 3) { 393d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 394d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 395d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 396d5573d34c8fac49e16b20cf144486125bf940086San Mehat 397d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!strcmp(argv[1], "attach")) { 398d5573d34c8fac49e16b20cf144486125bf940086San Mehat struct in_addr l, r; 399d5573d34c8fac49e16b20cf144486125bf940086San Mehat 400d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!inet_aton(argv[3], &l)) { 401d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Invalid local address", false); 402d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 403d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 404d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!inet_aton(argv[4], &r)) { 405d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Invalid remote address", false); 406d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 407d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 408d5573d34c8fac49e16b20cf144486125bf940086San Mehat rc = sPppCtrl->attachPppd(argv[2], l, r); 409d5573d34c8fac49e16b20cf144486125bf940086San Mehat } else if (!strcmp(argv[1], "detach")) { 410d5573d34c8fac49e16b20cf144486125bf940086San Mehat rc = sPppCtrl->detachPppd(argv[2]); 411d5573d34c8fac49e16b20cf144486125bf940086San Mehat } else { 412d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown pppd cmd", false); 413d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 414d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 415d5573d34c8fac49e16b20cf144486125bf940086San Mehat 416d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!rc) { 417d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Pppd operation succeeded", false); 418d5573d34c8fac49e16b20cf144486125bf940086San Mehat } else { 419d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Pppd operation failed", true); 420d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 421d5573d34c8fac49e16b20cf144486125bf940086San Mehat 422d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 423d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 4241bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 4251bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San MehatCommandListener::PanCmd::PanCmd() : 4261bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat NetdCommand("pan") { 4271bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat} 4281bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 4291bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehatint CommandListener::PanCmd::runCommand(SocketClient *cli, 4301bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat int argc, char **argv) { 4311bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat int rc = 0; 4321bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 4331bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (argc < 2) { 4341bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 4351bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 4361bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } 4371bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 4381bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (!strcmp(argv[1], "start")) { 4391bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat rc = sPanCtrl->startPan(); 4401bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else if (!strcmp(argv[1], "stop")) { 4411bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat rc = sPanCtrl->stopPan(); 4421bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else if (!strcmp(argv[1], "status")) { 4431bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat char *tmp = NULL; 4441bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 4451bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat asprintf(&tmp, "Pan services %s", 4461bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat (sPanCtrl->isPanStarted() ? "started" : "stopped")); 4471bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::PanStatusResult, tmp, false); 4481bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat free(tmp); 4491bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 4501bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else { 4511bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown pan cmd", false); 4521bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 4531bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } 4541bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 4551bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (!rc) { 4561bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Pan operation succeeded", false); 4571bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else { 4581bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Pan operation failed", true); 4591bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } 4601bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 4611bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 4621bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat} 463