18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Copyright (C) 2007-2008 The Android Open Source Project 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This software is licensed under the terms of the GNU General Public 48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** License version 2, as published by the Free Software Foundation, and 58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** may be copied, distributed, and modified under those terms. 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This program is distributed in the hope that it will be useful, 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** but WITHOUT ANY WARRANTY; without even the implied warranty of 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** GNU General Public License for more details. 118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*/ 128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Android emulator control console 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * this console is enabled automatically at emulator startup, on port 5554 by default, 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * unless some other emulator is already running. See (android_emulation_start in android_sdl.c 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * for details) 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * you can telnet to the console, then use commands like 'help' or others to dynamically 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * change emulator settings. 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "sockets.h" 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "qemu-char.h" 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "sysemu.h" 278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/android.h" 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "cpu.h" 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "hw/goldfish_device.h" 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "hw/power_supply.h" 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "shaper.h" 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "modem_driver.h" 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/gps.h" 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/globals.h" 358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/bufprint.h" 368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/debug.h" 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/stralloc.h" 382ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije#include "android/config/config.h" 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "tcpdump.h" 405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "net.h" 41e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner#include "monitor.h" 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <stdlib.h> 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <stdio.h> 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <stdarg.h> 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <string.h> 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <unistd.h> 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <fcntl.h> 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/hw-events.h" 5034f2974ce7ec7c71beb47b5daf9089d5c8c40c79David 'Digit' Turner#include "user-events.h" 51736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan#include "android/hw-sensors.h" 5271bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine#include "android/keycode-array.h" 5371bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine#include "android/charmap.h" 54e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine#include "android/display-core.h" 5594a2fba98924c6684650d66409934358cb0c9d09Vladimir Chtchetkine#include "android/protocol/fb-updates-proxy.h" 56250b2e00af04f8407dea564e643dad4ef08b8a88Vladimir Chtchetkine#include "android/protocol/user-events-impl.h" 57777eb68eb60cac18f4b62e2e1b14a906875cbe7aVladimir Chtchetkine#include "android/protocol/ui-commands-api.h" 58777eb68eb60cac18f4b62e2e1b14a906875cbe7aVladimir Chtchetkine#include "android/protocol/core-commands-impl.h" 59777eb68eb60cac18f4b62e2e1b14a906875cbe7aVladimir Chtchetkine#include "android/protocol/ui-commands-proxy.h" 6085276806ec6ac969d7befa2496c1de59adaaac74Vladimir Chtchetkine#include "android/protocol/attach-ui-proxy.h" 618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(CONFIG_SLIRP) 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "libslirp.h" 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define DEBUG 1 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if 1 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define D_ACTIVE VERBOSE_CHECK(console) 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define D_ACTIVE DEBUG 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if DEBUG 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define D(x) do { if (D_ACTIVE) ( printf x , fflush(stdout) ); } while (0) 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define D(x) do{}while(0) 788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct ControlGlobalRec_* ControlGlobal; 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct ControlClientRec_* ControlClient; 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct { 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int host_port; 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int host_udp; 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned int guest_ip; 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int guest_port; 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} RedirRec, *Redir; 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 92e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turnertypedef int Socket; 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct ControlClientRec_ 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project struct ControlClientRec_* next; /* next client in list */ 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Socket sock; /* socket used for communication */ 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ControlGlobal global; 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char finished; 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char buff[ 4096 ]; 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int buff_len; 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} ControlClientRec; 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct ControlGlobalRec_ 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* listening socket */ 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Socket listen_fd; 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* the list of current clients */ 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ControlClient clients; 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* the list of redirections currently active */ 1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Redir redirs; 1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int num_redirs; 1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int max_redirs; 1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} ControlGlobalRec; 1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 121e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine#ifdef CONFIG_STANDALONE_CORE 122d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine/* UI client currently attached to the core. */ 123d87b080495e71ada650b165a1f06616b433e6073Vladimir ChtchetkineControlClient attached_ui_client = NULL; 1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1259411a562e1ab772732a4d5147c9103a638837c82Vladimir Chtchetkine/* User events service client. */ 1269411a562e1ab772732a4d5147c9103a638837c82Vladimir ChtchetkineControlClient user_events_client = NULL; 1279411a562e1ab772732a4d5147c9103a638837c82Vladimir Chtchetkine 1286b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine/* UI control service client (UI -> Core). */ 1296b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir ChtchetkineControlClient ui_core_ctl_client = NULL; 1306b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine 1316b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine/* UI control service (UI -> Core. */ 1326b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine// CoreUICtl* ui_core_ctl = NULL; 1336b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine 1346b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine/* UI control service client (Core-> UI). */ 1356b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir ChtchetkineControlClient core_ui_ctl_client = NULL; 136e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine#endif // CONFIG_STANDALONE_CORE 137e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine 1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectcontrol_global_add_redir( ControlGlobal global, 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int host_port, 1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int host_udp, 1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned int guest_ip, 1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int guest_port ) 1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Redir redir; 1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (global->num_redirs >= global->max_redirs) 1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int old_max = global->max_redirs; 1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int new_max = old_max + (old_max >> 1) + 4; 1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Redir new_redirs = realloc( global->redirs, new_max*sizeof(global->redirs[0]) ); 1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (new_redirs == NULL) 1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project global->redirs = new_redirs; 1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project global->max_redirs = new_max; 1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project redir = &global->redirs[ global->num_redirs++ ]; 1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project redir->host_port = host_port; 1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project redir->host_udp = host_udp; 1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project redir->guest_ip = guest_ip; 1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project redir->guest_port = guest_port; 1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectcontrol_global_del_redir( ControlGlobal global, 1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int host_port, 1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int host_udp ) 1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; nn < global->num_redirs; nn++) 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Redir redir = &global->redirs[nn]; 1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( redir->host_port == host_port && 1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project redir->host_udp == host_udp ) 1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project memmove( redir, redir + 1, ((global->num_redirs - nn)-1)*sizeof(*redir) ); 1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project global->num_redirs -= 1; 1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* we didn't find it */ 1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 193e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner/* Detach the socket descriptor from a given ControlClient 194e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner * and return its value. This is useful either when destroying 195e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner * the client, or redirecting the socket to another service. 196e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner * 197e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner * NOTE: this does not close the socket. 198e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner */ 199e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turnerstatic int 200e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turnercontrol_client_detach( ControlClient client ) 201e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner{ 202e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner int result; 203e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner 204e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner if (client->sock < 0) 205e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner return -1; 206e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner 207e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner qemu_set_fd_handler( client->sock, NULL, NULL, NULL ); 208e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner result = client->sock; 209e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner client->sock = -1; 210e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner 211e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner return result; 212e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner} 213e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner 214e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turnerstatic void control_client_read( void* _client ); /* forward */ 215e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner 216e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner/* Reattach a control client to a given socket. 217e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner * Return the old socket descriptor for the client. 218e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner */ 219e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turnerstatic int 220e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turnercontrol_client_reattach( ControlClient client, int fd ) 221e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner{ 222e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner int result = control_client_detach(client); 223e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner client->sock = fd; 224e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner qemu_set_fd_handler( fd, control_client_read, NULL, client ); 225e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner return result; 226e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner} 227e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner 2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectcontrol_client_destroy( ControlClient client ) 2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ControlGlobal global = client->global; 2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ControlClient *pnode = &global->clients; 233e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner int sock; 2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D(( "destroying control client %p\n", client )); 2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 237e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine#ifdef CONFIG_STANDALONE_CORE 238d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine if (client == attached_ui_client) { 23985276806ec6ac969d7befa2496c1de59adaaac74Vladimir Chtchetkine attachUiProxy_destroy(); 240d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine attached_ui_client = NULL; 241d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine } 242d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine 2439411a562e1ab772732a4d5147c9103a638837c82Vladimir Chtchetkine if (client == user_events_client) { 244250b2e00af04f8407dea564e643dad4ef08b8a88Vladimir Chtchetkine userEventsImpl_destroy(); 2459411a562e1ab772732a4d5147c9103a638837c82Vladimir Chtchetkine user_events_client = NULL; 2469411a562e1ab772732a4d5147c9103a638837c82Vladimir Chtchetkine } 2476b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine 2486b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine if (client == ui_core_ctl_client) { 249777eb68eb60cac18f4b62e2e1b14a906875cbe7aVladimir Chtchetkine coreCmdImpl_destroy(); 2506b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine ui_core_ctl_client = NULL; 2516b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine } 2526b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine 2536b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine if (client == core_ui_ctl_client) { 254777eb68eb60cac18f4b62e2e1b14a906875cbe7aVladimir Chtchetkine uiCmdProxy_destroy(); 2556b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine core_ui_ctl_client = NULL; 2566b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine } 257e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine#endif // CONFIG_STANDALONE_CORE 258e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine 259e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner sock = control_client_detach( client ); 260e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner if (sock >= 0) 261e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner socket_close(sock); 2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ;; ) { 2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ControlClient node = *pnode; 2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( node == NULL ) 2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( node == client ) { 2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *pnode = node->next; 2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project node->next = NULL; 2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project pnode = &node->next; 2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project free( client ); 2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void control_control_write( ControlClient client, const char* buff, int len ) 2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int ret; 2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (len < 0) 2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project len = strlen(buff); 2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (len > 0) { 2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = socket_send( client->sock, buff, len); 2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret < 0) { 290ce0f4b02160ee72d7d2428867fe757bc37c68c98David 'Digit' Turner if (errno != EINTR && errno != EWOULDBLOCK && errno != EAGAIN) 2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project buff += ret; 2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project len -= ret; 2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2992ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thijestatic int control_vwrite( ControlClient client, const char* format, va_list args ) 3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static char temp[1024]; 3022ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije int ret = vsnprintf( temp, sizeof(temp), format, args ); 3032ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije temp[ sizeof(temp)-1 ] = 0; 3042ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije control_control_write( client, temp, -1 ); 3052ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 3062ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije return ret; 3072ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije} 3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3092ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thijestatic int control_write( ControlClient client, const char* format, ... ) 3102ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije{ 3112ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije int ret; 3122ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije va_list args; 3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project va_start(args, format); 3142ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije ret = control_vwrite(client, format, args); 3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project va_end(args); 3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3172ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije return ret; 3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic ControlClient 3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectcontrol_client_create( Socket socket, 3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ControlGlobal global ) 3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ControlClient client = calloc( sizeof(*client), 1 ); 3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (client) { 3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project socket_set_nodelay( socket ); 3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project socket_set_nonblock( socket ); 3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project client->finished = 0; 3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project client->global = global; 3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project client->sock = socket; 3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project client->next = global->clients; 3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project global->clients = client; 3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_set_fd_handler( socket, control_client_read, NULL, client ); 3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return client; 3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef const struct CommandDefRec_ *CommandDef; 3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct CommandDefRec_ { 3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* names; 3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* abstract; 3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* description; 3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void (*descriptor)( ControlClient client ); 3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int (*handler)( ControlClient client, char* args ); 3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project CommandDef subcommands; /* if handler is NULL */ 3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} CommandDefRec; 3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const CommandDefRec main_commands[]; /* forward */ 3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic CommandDef 3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfind_command( char* input, CommandDef commands, char* *pend, char* *pargs ) 3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* args = strchr(input, ' '); 3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (args != NULL) { 3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (*args == ' ') 3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args++; 3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (args[0] == 0) 3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args = NULL; 3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; commands[nn].names != NULL; nn++) 3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* name = commands[nn].names; 3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* sep; 3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do { 3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int len, c; 3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sep = strchr( name, '|' ); 3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (sep) 3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project len = sep - name; 3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project len = strlen(name); 3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project c = input[len]; 3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !memcmp( name, input, len ) && (c == ' ' || c == 0) ) { 3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *pend = input + len; 3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *pargs = args; 3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return &commands[nn]; 3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (sep) 3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project name = sep + 1; 3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } while (sep != NULL && *name); 3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* NOTE: don't touch *pend and *pargs if no command is found */ 3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdump_help( ControlClient client, 4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project CommandDef cmd, 4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* prefix ) 4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (cmd->description) { 4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "%s", cmd->description ); 4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (cmd->descriptor) { 4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cmd->descriptor( client ); 4088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else 4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "%s\r\n", cmd->abstract ); 4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (cmd->subcommands) { 4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cmd = cmd->subcommands; 4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "\r\navailable sub-commands:\r\n" ); 4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ; cmd->names != NULL; cmd++ ) { 4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, " %s %-15s %s\r\n", prefix, cmd->names, cmd->abstract ); 4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "\r\n" ); 4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectcontrol_client_do_command( ControlClient client ) 4238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* line = client->buff; 4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* args = NULL; 4268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project CommandDef commands = main_commands; 4278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* cmdend = client->buff; 4288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project CommandDef cmd = find_command( line, commands, &cmdend, &args ); 4298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (cmd == NULL) { 4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: unknown command, try 'help'\r\n" ); 4328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (;;) { 4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project CommandDef subcmd; 4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (cmd->handler) { 439d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine if ( !cmd->handler( client, args ) ) { 4408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "OK\r\n" ); 441d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine } 4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 4438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* no handler means we should have sub-commands */ 4468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (cmd->subcommands == NULL) { 4478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: internal error: buggy command table for '%.*s'\r\n", 4488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cmdend - client->buff, client->buff ); 4498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 4508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* we need a sub-command here */ 4538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !args ) { 4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dump_help( client, cmd, "" ); 4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: missing sub-command\r\n" ); 4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 4578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project line = args; 4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project commands = cmd->subcommands; 4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project subcmd = find_command( line, commands, &cmdend, &args ); 4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (subcmd == NULL) { 4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dump_help( client, cmd, "" ); 4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: bad sub-command\r\n" ); 4658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 4668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cmd = subcmd; 4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* implement the 'help' command */ 4728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 4738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_help( ControlClient client, char* args ) 4748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* line; 4768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* start = args; 4778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end = start; 4788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project CommandDef cmd = main_commands; 4798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* without arguments, simply dump all commands */ 4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (args == NULL) { 4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "Android console command help:\r\n\r\n" ); 4838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ; cmd->names != NULL; cmd++ ) { 4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, " %-15s %s\r\n", cmd->names, cmd->abstract ); 4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "\r\ntry 'help <command>' for command-specific help\r\n" ); 4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 4888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* with an argument, find the corresponding command */ 4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (;;) { 4928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project CommandDef subcmd; 4938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project line = args; 4958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project subcmd = find_command( line, cmd, &end, &args ); 4968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (subcmd == NULL) { 4978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "try one of these instead:\r\n\r\n" ); 4988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ; cmd->names != NULL; cmd++ ) { 4998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, " %.*s %s\r\n", 5008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project end - start, start, cmd->names ); 5018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "\r\nKO: unknown command\r\n" ); 5038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 5048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !args || !subcmd->subcommands ) { 5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dump_help( client, subcmd, start ); 5088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 5098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cmd = subcmd->subcommands; 5118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 5168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectcontrol_client_read_byte( ControlClient client, unsigned char ch ) 5178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ch == '\r') 5198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* filter them out */ 5218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (ch == '\n') 5238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project client->buff[ client->buff_len ] = 0; 5258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_client_do_command( client ); 5268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (client->finished) 5278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 5288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project client->buff_len = 0; 5308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 5328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (client->buff_len >= sizeof(client->buff)-1) 5348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project client->buff_len = 0; 5358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project client->buff[ client->buff_len++ ] = ch; 5378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 5418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectcontrol_client_read( void* _client ) 5428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ControlClient client = _client; 5448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned char buf[4096]; 5458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int size; 5468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D(( "in control_client read: " )); 5488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project size = socket_recv( client->sock, buf, sizeof(buf) ); 5498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (size < 0) { 5508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D(( "size < 0, exiting with %d: %s\n", errno, errno_str )); 551d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine if (errno != EWOULDBLOCK && errno != EAGAIN) 552d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine control_client_destroy( client ); 5538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 5548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (size == 0) { 5578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* end of connection */ 5588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D(( "end of connection detected !!\n" )); 5598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_client_destroy( client ); 5608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else { 5628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 5638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32 5648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# if DEBUG 5658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char temp[16]; 5668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int count = size > sizeof(temp)-1 ? sizeof(temp)-1 : size; 5678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; nn < count; nn++) { 5688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int c = buf[nn]; 5698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (c == '\n') 5708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project temp[nn] = '!'; 5718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (c < 32) 5728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project temp[nn] = '.'; 5738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 5748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project temp[nn] = (char)c; 5758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project temp[nn] = 0; 5778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D(( "received %d bytes: %s\n", size, temp )); 5788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif 5798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 5808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D(( "received %.*s\n", size, buf )); 5818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 5828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; nn < size; nn++) { 5838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_client_read_byte( client, buf[nn] ); 5848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (client->finished) { 5858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_client_destroy(client); 5868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 5878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* this function is called on each new client connection */ 5948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 5958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectcontrol_global_accept( void* _global ) 5968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ControlGlobal global = _global; 5988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ControlClient client; 5998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Socket fd; 6008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 60180bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner D(( "control_global_accept: just in (fd=%d)\n", global->listen_fd )); 6028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for(;;) { 6048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fd = socket_accept( global->listen_fd, NULL ); 6058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (fd < 0 && errno != EINTR) { 6068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D(( "problem in accept: %d: %s\n", errno, errno_str )); 6078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project perror("accept"); 6088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 6098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (fd >= 0) { 6108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 6118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D(( "relooping in accept()\n" )); 6138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project socket_set_xreuseaddr( fd ); 6168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D(( "control_global_accept: creating new client\n" )); 6188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project client = control_client_create( fd, global ); 6198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (client) { 6208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D(( "control_global_accept: new client %p\n", client )); 6218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "Android Console: type 'help' for a list of commands\r\n" ); 6228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "OK\r\n" ); 6238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 6288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectcontrol_global_init( ControlGlobal global, 6298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int control_port ) 6308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Socket fd; 6328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int ret; 6338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SockAddress sockaddr; 6348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project memset( global, 0, sizeof(*global) ); 6368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fd = socket_create_inet( SOCKET_STREAM ); 6388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (fd < 0) { 6398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project perror("socket"); 6408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 6418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project socket_set_xreuseaddr( fd ); 6448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sock_address_init_inet( &sockaddr, SOCK_ADDRESS_INET_LOOPBACK, control_port ); 6468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = socket_bind(fd, &sockaddr ); 6488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret < 0) { 6498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project perror("bind"); 6508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project socket_close( fd ); 6518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 6528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = socket_listen(fd, 0); 6558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret < 0) { 6568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project perror("listen"); 6578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project socket_close( fd ); 6588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 6598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project socket_set_nonblock(fd); 6628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project global->listen_fd = fd; 6648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_set_fd_handler( fd, control_global_accept, NULL, global ); 6668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 6678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 6728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_quit( ControlClient client, char* args ) 6738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project client->finished = 1; 6758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 6768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 6798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 6808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 6818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** N E T W O R K S E T T I N G S ******/ 6828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 6838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 6848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 6858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 6878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_network_status( ControlClient client, char* args ) 6888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "Current network status:\r\n" ); 6908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, " download speed: %8d bits/s (%.1f KB/s)\r\n", 6928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (long)qemu_net_download_speed, qemu_net_download_speed/8192. ); 6938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, " upload speed: %8d bits/s (%.1f KB/s)\r\n", 6958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (long)qemu_net_upload_speed, qemu_net_upload_speed/8192. ); 6968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, " minimum latency: %ld ms\r\n", qemu_net_min_latency ); 6988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, " maximum latency: %ld ms\r\n", qemu_net_max_latency ); 6998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 7008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 7038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdump_network_speeds( ControlClient client ) 7048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const NetworkSpeed* speed = android_netspeeds; 7068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* const format = " %-8s %s\r\n"; 7078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ; speed->name; speed++ ) { 7088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, format, speed->name, speed->display ); 7098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, format, "<num>", "selects both upload and download speed" ); 7118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, format, "<up>:<down>", "select individual upload/download speeds" ); 7128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 7168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_network_speed( ControlClient client, char* args ) 7178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !args ) { 7198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: missing <speed> argument, see 'help network speed'\r\n" ); 7208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 7218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( android_parse_network_speed( args ) < 0 ) { 7238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: invalid <speed> argument, see 'help network speed' for valid values\r\n" ); 7248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 7258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project netshaper_set_rate( slirp_shaper_in, qemu_net_download_speed ); 7288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project netshaper_set_rate( slirp_shaper_out, qemu_net_upload_speed ); 7298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (android_modem) { 73171bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine amodem_set_data_network_type( android_modem, 7328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_parse_network_type( args ) ); 7338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 7358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 7388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdescribe_network_speed( ControlClient client ) 7398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, 7418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'network speed <speed>' allows you to dynamically change the speed of the emulated\r\n" 7428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "network on the device, where <speed> is one of the following:\r\n\r\n" ); 7438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dump_network_speeds( client ); 7448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 7478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_network_delay( ControlClient client, char* args ) 7488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !args ) { 7508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: missing <delay> argument, see 'help network delay'\r\n" ); 7518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 7528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( android_parse_network_latency( args ) < 0 ) { 7548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: invalid <delay> argument, see 'help network delay' for valid values\r\n" ); 7558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 7568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project netdelay_set_latency( slirp_delay_in, qemu_net_min_latency, qemu_net_max_latency ); 7588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 7598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 7628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdescribe_network_delay( ControlClient client ) 7638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, 7658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'network delay <latency>' allows you to dynamically change the latency of the emulated\r\n" 7668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "network on the device, where <latency> is one of the following:\r\n\r\n" ); 7678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* XXX: TODO */ 7688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 7718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_network_capture_start( ControlClient client, char* args ) 7728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !args ) { 7748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: missing <file> argument, see 'help network capture start'\r\n" ); 7758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 7768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( qemu_tcpdump_start(args) < 0) { 7788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: could not start capture: %s", strerror(errno) ); 7798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 7808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 7828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 7858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_network_capture_stop( ControlClient client, char* args ) 7868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* no need to return an error here */ 7888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_tcpdump_stop(); 7898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 7908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const CommandDefRec network_capture_commands[] = 7938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "start", "start network capture", 7958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'network capture start <file>' starts a new capture of network packets\r\n" 7968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "into a specific <file>. This will stop any capture already in progress.\r\n" 7978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "the capture file can later be analyzed by tools like WireShark. It uses\r\n" 7988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "the libpcap file format.\r\n\r\n" 7998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "you can stop the capture anytime with 'network capture stop'\r\n", NULL, 8008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_network_capture_start, NULL }, 8018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "stop", "stop network capture", 8038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'network capture stop' stops a currently running packet capture, if any.\r\n" 8048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "you can start one with 'network capture start <file>'\r\n", NULL, 8058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_network_capture_stop, NULL }, 8068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { NULL, NULL, NULL, NULL, NULL, NULL } 8088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 8098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const CommandDefRec network_commands[] = 8118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 8128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "status", "dump network status", NULL, NULL, 8138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_network_status, NULL }, 8148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "speed", "change network speed", NULL, describe_network_speed, 8168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_network_speed, NULL }, 8178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "delay", "change network latency", NULL, describe_network_delay, 8198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_network_delay, NULL }, 8208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "capture", "dump network packets to file", 8228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "allows to start/stop capture of network packets to a file for later analysis\r\n", NULL, 8238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, network_capture_commands }, 8248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { NULL, NULL, NULL, NULL, NULL, NULL } 8268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 8278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 8298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 8308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 8318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** P O R T R E D I R E C T I O N S ******/ 8328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 8338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 8348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 8358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 8378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_redir_list( ControlClient client, char* args ) 8388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 8398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ControlGlobal global = client->global; 8408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (global->num_redirs == 0) 8428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "no active redirections\r\n" ); 8438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else { 8448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 8458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; nn < global->num_redirs; nn++) { 8468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Redir redir = &global->redirs[nn]; 8478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "%s:%-5d => %-5d\r\n", 8488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project redir->host_udp ? "udp" : "tcp", 8498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project redir->host_port, 8508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project redir->guest_port ); 8518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 8548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* parse a protocol:port specification */ 8578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 8588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectredir_parse_proto_port( char* args, int *pport, int *pproto ) 8598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 8608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int proto = -1; 8618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int len = 0; 8628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 8638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !memcmp( args, "tcp:", 4 ) ) { 8658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project proto = 0; 8668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project len = 4; 8678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if ( !memcmp( args, "udp:", 4 ) ) { 8698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project proto = 1; 8708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project len = 4; 8718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 8738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 8748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args += len; 8768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *pproto = proto; 8778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *pport = strtol( args, &end, 10 ); 8788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (end == args) 8798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 8808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project len += end - args; 8828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return len; 8838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 8868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectredir_parse_guest_port( char* arg, int *pport ) 8878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 8888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 8898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *pport = strtoul( arg, &end, 10 ); 8918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (end == arg) 8928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 8938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return end - arg; 8958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic Redir 8988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectredir_find( ControlGlobal global, int port, int isudp ) 8998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 9008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 9018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; nn < global->num_redirs; nn++) { 9038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Redir redir = &global->redirs[nn]; 9048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (redir->host_port == port && redir->host_udp == isudp) 9068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return redir; 9078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 9098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 9138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_redir_add( ControlClient client, char* args ) 9148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 9158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int len, host_proto, host_port, guest_port; 9168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t guest_ip; 9178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Redir redir; 9188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !args ) 9208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto BadFormat; 9218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!slirp_is_inited()) { 9235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner control_write( client, "KO: network emulation disabled\r\n"); 9245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return -1; 9258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project len = redir_parse_proto_port( args, &host_port, &host_proto ); 9288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (len == 0 || args[len] != ':') 9298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto BadFormat; 9308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args += len + 1; 9328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project len = redir_parse_guest_port( args, &guest_port ); 9338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (len == 0 || args[len] != 0) 9348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto BadFormat; 9358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project redir = redir_find( client->global, host_port, host_proto ); 9378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( redir != NULL ) { 9388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: host port already active, use 'redir del' to remove first\r\n" ); 9398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 9408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9427d9a2705e7ae6d8c4b1d9d5b4e2a67ab88c19044David Turner if (inet_strtoip("10.0.2.15", &guest_ip) < 0) { 9438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: unexpected internal failure when resolving 10.0.2.15\r\n" ); 9448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 9458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D(("pattern hport=%d gport=%d proto=%d\n", host_port, guest_port, host_proto )); 9488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( control_global_add_redir( client->global, host_port, host_proto, 9498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project guest_ip, guest_port ) < 0 ) 9508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: not enough memory to allocate redirection\r\n" ); 9528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 9538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (slirp_redir(host_proto, host_port, guest_ip, guest_port) < 0) { 9568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: can't setup redirection, port probably used by another program on host\r\n" ); 9578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_global_del_redir( client->global, host_port, host_proto ); 9588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 9598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 9628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectBadFormat: 9648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: bad redirection format, try (tcp|udp):hostport:guestport\r\n", -1 ); 9658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 9668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 9708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_redir_del( ControlClient client, char* args ) 9718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 9728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int len, proto, port; 9738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Redir redir; 9748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !args ) 9768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto BadFormat; 9778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project len = redir_parse_proto_port( args, &port, &proto ); 9788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( len == 0 || args[len] != 0 ) 9798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto BadFormat; 9808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project redir = redir_find( client->global, port, proto ); 9828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (redir == NULL) { 9838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: can't remove unknown redirection (%s:%d)\r\n", 9848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project proto ? "udp" : "tcp", port ); 9858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 9868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project slirp_unredir( redir->host_udp, redir->host_port ); 9898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_global_del_redir( client->global, port, proto );\ 9908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 9928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectBadFormat: 9948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: bad redirection format, try (tcp|udp):hostport\r\n" ); 9958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 9968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const CommandDefRec redir_commands[] = 9998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 10008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "list", "list current redirections", 10018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "list current port redirections. use 'redir add' and 'redir del' to add and remove them\r\n", NULL, 10028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_redir_list, NULL }, 10038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "add", "add new redirection", 10058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "add a new port redirection, arguments must be:\r\n\r\n" 10068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " redir add <protocol>:<host-port>:<guest-port>\r\n\r\n" 10078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "where: <protocol> is either 'tcp' or 'udp'\r\n" 10088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " <host-port> a number indicating which port on the host to open\r\n" 10098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " <guest-port> a number indicating which port to route to on the device\r\n" 10108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "\r\nas an example, 'redir tcp:5000:6000' will allow any packets sent to\r\n" 10118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "the host's TCP port 5000 to be routed to TCP port 6000 of the emulated device\r\n", NULL, 10128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_redir_add, NULL }, 10138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "del", "remove existing redirection", 10158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "remove a port redirecion that was created with 'redir add', arguments must be:\r\n\r\n" 10168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " redir del <protocol>:<host-port>\r\n\r\n" 10178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "see the 'help redir add' for the meaning of <protocol> and <host-port>\r\n", NULL, 10188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_redir_del, NULL }, 10198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { NULL, NULL, NULL, NULL, NULL, NULL } 10218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 10228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 10268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 10278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 10281a000857bb7eef298efa787699050884f92311feJaime Lopez/***** C D M A M O D E M ******/ 10291a000857bb7eef298efa787699050884f92311feJaime Lopez/***** ******/ 10301a000857bb7eef298efa787699050884f92311feJaime Lopez/********************************************************************************************/ 10311a000857bb7eef298efa787699050884f92311feJaime Lopez/********************************************************************************************/ 10321a000857bb7eef298efa787699050884f92311feJaime Lopez 10331a000857bb7eef298efa787699050884f92311feJaime Lopezstatic const struct { 10341a000857bb7eef298efa787699050884f92311feJaime Lopez const char * name; 10351a000857bb7eef298efa787699050884f92311feJaime Lopez const char * display; 10361a000857bb7eef298efa787699050884f92311feJaime Lopez ACdmaSubscriptionSource source; 10371a000857bb7eef298efa787699050884f92311feJaime Lopez} _cdma_subscription_sources[] = { 10381a000857bb7eef298efa787699050884f92311feJaime Lopez { "nv", "Read subscription from non-volatile RAM", A_SUBSCRIPTION_NVRAM }, 10391a000857bb7eef298efa787699050884f92311feJaime Lopez { "ruim", "Read subscription from RUIM", A_SUBSCRIPTION_RUIM }, 10401a000857bb7eef298efa787699050884f92311feJaime Lopez}; 10411a000857bb7eef298efa787699050884f92311feJaime Lopez 10421a000857bb7eef298efa787699050884f92311feJaime Lopezstatic void 10431a000857bb7eef298efa787699050884f92311feJaime Lopezdump_subscription_sources( ControlClient client ) 10441a000857bb7eef298efa787699050884f92311feJaime Lopez{ 10451a000857bb7eef298efa787699050884f92311feJaime Lopez int i; 10461a000857bb7eef298efa787699050884f92311feJaime Lopez for (i = 0; 10471a000857bb7eef298efa787699050884f92311feJaime Lopez i < sizeof(_cdma_subscription_sources) / sizeof(_cdma_subscription_sources[0]); 10481a000857bb7eef298efa787699050884f92311feJaime Lopez i++) { 10491a000857bb7eef298efa787699050884f92311feJaime Lopez control_write( client, " %s: %s\r\n", 10501a000857bb7eef298efa787699050884f92311feJaime Lopez _cdma_subscription_sources[i].name, 10511a000857bb7eef298efa787699050884f92311feJaime Lopez _cdma_subscription_sources[i].display ); 10521a000857bb7eef298efa787699050884f92311feJaime Lopez } 10531a000857bb7eef298efa787699050884f92311feJaime Lopez} 10541a000857bb7eef298efa787699050884f92311feJaime Lopez 10551a000857bb7eef298efa787699050884f92311feJaime Lopezstatic void 10561a000857bb7eef298efa787699050884f92311feJaime Lopezdescribe_subscription_source( ControlClient client ) 10571a000857bb7eef298efa787699050884f92311feJaime Lopez{ 10581a000857bb7eef298efa787699050884f92311feJaime Lopez control_write( client, 10591a000857bb7eef298efa787699050884f92311feJaime Lopez "'cdma ssource <ssource>' allows you to specify where to read the subscription from\r\n" ); 10601a000857bb7eef298efa787699050884f92311feJaime Lopez dump_subscription_sources( client ); 10611a000857bb7eef298efa787699050884f92311feJaime Lopez} 10621a000857bb7eef298efa787699050884f92311feJaime Lopez 10631a000857bb7eef298efa787699050884f92311feJaime Lopezstatic int 10641a000857bb7eef298efa787699050884f92311feJaime Lopezdo_cdma_ssource( ControlClient client, char* args ) 10651a000857bb7eef298efa787699050884f92311feJaime Lopez{ 10661a000857bb7eef298efa787699050884f92311feJaime Lopez int nn; 10671a000857bb7eef298efa787699050884f92311feJaime Lopez if (!args) { 10681a000857bb7eef298efa787699050884f92311feJaime Lopez control_write( client, "KO: missing argument, try 'cdma ssource <source>'\r\n" ); 10691a000857bb7eef298efa787699050884f92311feJaime Lopez return -1; 10701a000857bb7eef298efa787699050884f92311feJaime Lopez } 10711a000857bb7eef298efa787699050884f92311feJaime Lopez 10721a000857bb7eef298efa787699050884f92311feJaime Lopez for (nn = 0; ; nn++) { 10731a000857bb7eef298efa787699050884f92311feJaime Lopez const char* name = _cdma_subscription_sources[nn].name; 10741a000857bb7eef298efa787699050884f92311feJaime Lopez ACdmaSubscriptionSource ssource = _cdma_subscription_sources[nn].source; 10751a000857bb7eef298efa787699050884f92311feJaime Lopez 10761a000857bb7eef298efa787699050884f92311feJaime Lopez if (!name) 10771a000857bb7eef298efa787699050884f92311feJaime Lopez break; 10781a000857bb7eef298efa787699050884f92311feJaime Lopez 10791a000857bb7eef298efa787699050884f92311feJaime Lopez if (!strcasecmp( args, name )) { 10801a000857bb7eef298efa787699050884f92311feJaime Lopez amodem_set_cdma_subscription_source( android_modem, ssource ); 10811a000857bb7eef298efa787699050884f92311feJaime Lopez return 0; 10821a000857bb7eef298efa787699050884f92311feJaime Lopez } 10831a000857bb7eef298efa787699050884f92311feJaime Lopez } 10841a000857bb7eef298efa787699050884f92311feJaime Lopez control_write( client, "KO: Don't know source %s\r\n", args ); 10851a000857bb7eef298efa787699050884f92311feJaime Lopez return -1; 10861a000857bb7eef298efa787699050884f92311feJaime Lopez} 10871a000857bb7eef298efa787699050884f92311feJaime Lopez 10881a000857bb7eef298efa787699050884f92311feJaime Lopezstatic int 10891a000857bb7eef298efa787699050884f92311feJaime Lopezdo_cdma_prl_version( ControlClient client, char * args ) 10901a000857bb7eef298efa787699050884f92311feJaime Lopez{ 10911a000857bb7eef298efa787699050884f92311feJaime Lopez int version = 0; 10921a000857bb7eef298efa787699050884f92311feJaime Lopez char *endptr; 10931a000857bb7eef298efa787699050884f92311feJaime Lopez 10941a000857bb7eef298efa787699050884f92311feJaime Lopez if (!args) { 10951a000857bb7eef298efa787699050884f92311feJaime Lopez control_write( client, "KO: missing argument, try 'cdma prl_version <version>'\r\n"); 10961a000857bb7eef298efa787699050884f92311feJaime Lopez return -1; 10971a000857bb7eef298efa787699050884f92311feJaime Lopez } 10981a000857bb7eef298efa787699050884f92311feJaime Lopez 10991a000857bb7eef298efa787699050884f92311feJaime Lopez version = strtol(args, &endptr, 0); 11001a000857bb7eef298efa787699050884f92311feJaime Lopez if (endptr != args) { 11011a000857bb7eef298efa787699050884f92311feJaime Lopez amodem_set_cdma_prl_version( android_modem, version ); 11021a000857bb7eef298efa787699050884f92311feJaime Lopez } 110380bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner return 0; 11041a000857bb7eef298efa787699050884f92311feJaime Lopez} 11051a000857bb7eef298efa787699050884f92311feJaime Lopez/********************************************************************************************/ 11061a000857bb7eef298efa787699050884f92311feJaime Lopez/********************************************************************************************/ 11071a000857bb7eef298efa787699050884f92311feJaime Lopez/***** ******/ 11088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** G S M M O D E M ******/ 11098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 11108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 11118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 11128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const struct { 11148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* name; 11158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* display; 11168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARegistrationState state; 11178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} _gsm_states[] = { 11188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "unregistered", "no network available", A_REGISTRATION_UNREGISTERED }, 11198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "home", "on local network, non-roaming", A_REGISTRATION_HOME }, 11208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "roaming", "on roaming network", A_REGISTRATION_ROAMING }, 11218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "searching", "searching networks", A_REGISTRATION_SEARCHING }, 11228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "denied", "emergency calls only", A_REGISTRATION_DENIED }, 11238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "off", "same as 'unregistered'", A_REGISTRATION_UNREGISTERED }, 11248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "on", "same as 'home'", A_REGISTRATION_HOME }, 11258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { NULL, NULL, A_REGISTRATION_UNREGISTERED } 11268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 11278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const char* 11298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectgsm_state_to_string( ARegistrationState state ) 11308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 11318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 11328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; _gsm_states[nn].name != NULL; nn++) { 11338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (state == _gsm_states[nn].state) 11348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return _gsm_states[nn].name; 11358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return "<unknown>"; 11378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 11408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_gsm_status( ControlClient client, char* args ) 11418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 11428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (args) { 11438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: no argument required\r\n" ); 11448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 11458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_modem) { 11478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: modem emulation not running\r\n" ); 11488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 11498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "gsm voice state: %s\r\n", 11518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project gsm_state_to_string( 11528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project amodem_get_voice_registration(android_modem) ) ); 11538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "gsm data state: %s\r\n", 11548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project gsm_state_to_string( 11558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project amodem_get_data_registration(android_modem) ) ); 11568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 11578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 11618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecthelp_gsm_data( ControlClient client ) 11628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 11638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 11648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, 11658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "the 'gsm data <state>' allows you to change the state of your GPRS connection\r\n" 11668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "valid values for <state> are the following:\r\n\r\n" ); 11678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; ; nn++) { 11688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* name = _gsm_states[nn].name; 11698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* display = _gsm_states[nn].display; 11708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!name) 11728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 11738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, " %-15s %s\r\n", name, display ); 11758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "\r\n" ); 11778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 11818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_gsm_data( ControlClient client, char* args ) 11828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 11838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 11848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!args) { 11868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: missing argument, try 'gsm data <state>'\r\n" ); 11878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 11888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; ; nn++) { 11918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* name = _gsm_states[nn].name; 11928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARegistrationState state = _gsm_states[nn].state; 11938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!name) 11958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 11968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !strcmp( args, name ) ) { 11988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_modem) { 11998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: modem emulation not running\r\n" ); 12008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 12018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project amodem_set_data_registration( android_modem, state ); 12038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_net_disable = (state != A_REGISTRATION_HOME && 12048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project state != A_REGISTRATION_ROAMING ); 12058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 12068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: bad GSM data state name, try 'help gsm data' for list of valid values\r\n" ); 12098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 12108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 12118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 12138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecthelp_gsm_voice( ControlClient client ) 12148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 12158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 12168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, 12178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "the 'gsm voice <state>' allows you to change the state of your GPRS connection\r\n" 12188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "valid values for <state> are the following:\r\n\r\n" ); 12198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; ; nn++) { 12208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* name = _gsm_states[nn].name; 12218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* display = _gsm_states[nn].display; 12228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!name) 12248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 12258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, " %-15s %s\r\n", name, display ); 12278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "\r\n" ); 12298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 12308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 12338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_gsm_voice( ControlClient client, char* args ) 12348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 12358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 12368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!args) { 12388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: missing argument, try 'gsm voice <state>'\r\n" ); 12398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 12408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; ; nn++) { 12438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* name = _gsm_states[nn].name; 12448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARegistrationState state = _gsm_states[nn].state; 12458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!name) 12478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 12488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !strcmp( args, name ) ) { 12508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_modem) { 12518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: modem emulation not running\r\n" ); 12528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 12538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project amodem_set_voice_registration( android_modem, state ); 12558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 12568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: bad GSM data state name, try 'help gsm voice' for list of valid values\r\n" ); 12598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 12608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 12618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 12648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectgsm_check_number( char* args ) 12658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 12668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 12678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; args[nn] != 0; nn++) { 12698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int c = args[nn]; 12708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !isdigit(c) && c != '+' && c != '#' ) { 12718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 12728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (nn == 0) 12758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 12768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 12788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 12798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 12818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_gsm_call( ControlClient client, char* args ) 12828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 12838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* check that we have a phone number made of digits */ 12848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!args) { 12858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: missing argument, try 'gsm call <phonenumber>'\r\n" ); 12868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 12878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (gsm_check_number(args)) { 12908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: bad phone number format, use digits, # and + only\r\n" ); 12918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 12928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_modem) { 12958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: modem emulation not running\r\n" ); 12968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 12978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project amodem_add_inbound_call( android_modem, args ); 12998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 13008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 13018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 13038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_gsm_cancel( ControlClient client, char* args ) 13048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 13058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!args) { 13068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: missing argument, try 'gsm call <phonenumber>'\r\n" ); 13078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 13088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (gsm_check_number(args)) { 13108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: bad phone number format, use digits, # and + only\r\n" ); 13118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 13128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_modem) { 13148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: modem emulation not running\r\n" ); 13158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 13168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( amodem_disconnect_call( android_modem, args ) < 0 ) { 13188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: could not cancel this number\r\n" ); 13198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 13208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 13228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 13238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const char* 13268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectcall_state_to_string( ACallState state ) 13278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 13288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (state) { 13298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case A_CALL_ACTIVE: return "active"; 13308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case A_CALL_HELD: return "held"; 13318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case A_CALL_ALERTING: return "ringing"; 13328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case A_CALL_WAITING: return "waiting"; 13338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case A_CALL_INCOMING: return "incoming"; 13348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: return "unknown"; 13358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 13378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 13398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_gsm_list( ControlClient client, char* args ) 13408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 13418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* check that we have a phone number made of digits */ 13428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int count = amodem_get_call_count( android_modem ); 13438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 13448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; nn < count; nn++) { 13458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ACall call = amodem_get_call( android_modem, nn ); 13468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* dir; 13478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (call == NULL) 13498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project continue; 13508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (call->dir == A_CALL_OUTBOUND) 13528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dir = "outbound to "; 13538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 13548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dir = "inbound from"; 13558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "%s %-10s : %s\r\n", dir, 13578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project call->number, call_state_to_string(call->state) ); 13588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 13608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 13618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 13638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_gsm_busy( ControlClient client, char* args ) 13648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 13658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ACall call; 13668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!args) { 13688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: missing argument, try 'gsm busy <phonenumber>'\r\n" ); 13698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 13708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project call = amodem_find_call_by_number( android_modem, args ); 13728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (call == NULL || call->dir != A_CALL_OUTBOUND) { 13738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: no current outbound call to number '%s' (call %p)\r\n", args, call ); 13748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 13758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( amodem_disconnect_call( android_modem, args ) < 0 ) { 13778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: could not cancel this number\r\n" ); 13788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 13798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 13818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 13828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 13848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_gsm_hold( ControlClient client, char* args ) 13858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 13868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ACall call; 13878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!args) { 13898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: missing argument, try 'gsm out hold <phonenumber>'\r\n" ); 13908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 13918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project call = amodem_find_call_by_number( android_modem, args ); 13938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (call == NULL) { 13948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: no current call to/from number '%s'\r\n", args ); 13958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 13968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( amodem_update_call( android_modem, args, A_CALL_HELD ) < 0 ) { 13988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: could put this call on hold\r\n" ); 13998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 14008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 14028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 14038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 14068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_gsm_accept( ControlClient client, char* args ) 14078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 14088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ACall call; 14098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!args) { 14118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: missing argument, try 'gsm accept <phonenumber>'\r\n" ); 14128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 14138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project call = amodem_find_call_by_number( android_modem, args ); 14158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (call == NULL) { 14168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: no current call to/from number '%s'\r\n", args ); 14178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 14188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( amodem_update_call( android_modem, args, A_CALL_ACTIVE ) < 0 ) { 14208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: could not activate this call\r\n" ); 14218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 14228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 14248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 14258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14264c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstockstatic int 14274c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstockdo_gsm_signal( ControlClient client, char* args ) 14284c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock{ 14294c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock enum { SIGNAL_RSSI = 0, SIGNAL_BER, NUM_SIGNAL_PARAMS }; 14304c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock char* p = args; 14314c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock int top_param = -1; 14324c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock int params[ NUM_SIGNAL_PARAMS ]; 14334c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock 14344c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock static int last_ber = 99; 14354c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock 14364c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock if (!p) 14374c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock p = ""; 14384c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock 14394c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock /* tokenize */ 14404c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock while (*p) { 14414c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock char* end; 14424c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock int val = strtol( p, &end, 10 ); 14434c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock 14444c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock if (end == p) { 14454c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock control_write( client, "KO: argument '%s' is not a number\n", p ); 14464c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock return -1; 14474c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock } 14484c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock 14494c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock params[++top_param] = val; 14504c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock if (top_param + 1 == NUM_SIGNAL_PARAMS) 14514c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock break; 14524c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock 14534c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock p = end; 14544c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock while (*p && (p[0] == ' ' || p[0] == '\t')) 14554c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock p += 1; 14564c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock } 14574c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock 14584c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock /* sanity check */ 14594c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock if (top_param < SIGNAL_RSSI) { 14604c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock control_write( client, "KO: not enough arguments: see 'help gsm signal' for details\r\n" ); 14614c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock return -1; 14624c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock } 14634c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock 14644c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock int rssi = params[SIGNAL_RSSI]; 14654c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock if ((rssi < 0 || rssi > 31) && rssi != 99) { 14664c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock control_write( client, "KO: invalid RSSI - must be 0..31 or 99\r\n"); 14674c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock return -1; 14684c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock } 14694c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock 14704c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock /* check ber is 0..7 or 99 */ 14714c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock if (top_param >= SIGNAL_BER) { 14724c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock int ber = params[SIGNAL_BER]; 14734c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock if ((ber < 0 || ber > 7) && ber != 99) { 14744c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock control_write( client, "KO: invalid BER - must be 0..7 or 99\r\n"); 14754c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock return -1; 14764c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock } 14774c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock last_ber = ber; 14784c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock } 14794c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock 14804c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock amodem_set_signal_strength( android_modem, rssi, last_ber ); 14814c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock 14824c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock return 0; 14834c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock } 14844c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock 14858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if 0 14878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const CommandDefRec gsm_in_commands[] = 14888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 14898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "new", "create a new 'waiting' inbound call", 14908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'gsm in create <phonenumber>' creates a new inbound phone call, placed in\r\n" 14918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "the 'waiting' state by default, until the system answers/holds/closes it\r\n", NULL 14928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_gsm_in_create, NULL }, 14938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "hold", "change the state of an oubtound call to 'held'", 14958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "change the state of an outbound call to 'held'. this is only possible\r\n" 14968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "if the call in the 'waiting' or 'active' state\r\n", NULL, 14978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_gsm_out_hold, NULL }, 14988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "accept", "change the state of an outbound call to 'active'", 15008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "change the state of an outbound call to 'active'. this is only possible\r\n" 15018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "if the call is in the 'waiting' or 'held' state\r\n", NULL, 15028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_gsm_out_accept, NULL }, 15038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { NULL, NULL, NULL, NULL, NULL, NULL } 15058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 15068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 15078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15091a000857bb7eef298efa787699050884f92311feJaime Lopezstatic const CommandDefRec cdma_commands[] = 15101a000857bb7eef298efa787699050884f92311feJaime Lopez{ 15111a000857bb7eef298efa787699050884f92311feJaime Lopez { "ssource", "Set the current CDMA subscription source", 15121a000857bb7eef298efa787699050884f92311feJaime Lopez NULL, describe_subscription_source, 15131a000857bb7eef298efa787699050884f92311feJaime Lopez do_cdma_ssource, NULL }, 151480bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner { "prl_version", "Dump the current PRL version", 151580bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner NULL, NULL, 151680bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner do_cdma_prl_version, NULL }, 15171a000857bb7eef298efa787699050884f92311feJaime Lopez}; 15181a000857bb7eef298efa787699050884f92311feJaime Lopez 15198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const CommandDefRec gsm_commands[] = 15208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 15218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "list", "list current phone calls", 15228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'gsm list' lists all inbound and outbound calls and their state\r\n", NULL, 15238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_gsm_list, NULL }, 15248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "call", "create inbound phone call", 15268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'gsm call <phonenumber>' allows you to simulate a new inbound call\r\n", NULL, 15278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_gsm_call, NULL }, 15288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "busy", "close waiting outbound call as busy", 15308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'gsm busy <remoteNumber>' closes an outbound call, reporting\r\n" 15318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "the remote phone as busy. only possible if the call is 'waiting'.\r\n", NULL, 15328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_gsm_busy, NULL }, 15338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "hold", "change the state of an oubtound call to 'held'", 15358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'gsm hold <remoteNumber>' change the state of a call to 'held'. this is only possible\r\n" 15368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "if the call in the 'waiting' or 'active' state\r\n", NULL, 15378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_gsm_hold, NULL }, 15388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "accept", "change the state of an outbound call to 'active'", 15408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'gsm accept <remoteNumber>' change the state of a call to 'active'. this is only possible\r\n" 15418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "if the call is in the 'waiting' or 'held' state\r\n", NULL, 15428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_gsm_accept, NULL }, 15438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "cancel", "disconnect an inbound or outbound phone call", 15458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'gsm cancel <phonenumber>' allows you to simulate the end of an inbound or outbound call\r\n", NULL, 15468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_gsm_cancel, NULL }, 15478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "data", "modify data connection state", NULL, help_gsm_data, 15498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_gsm_data, NULL }, 15508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "voice", "modify voice connection state", NULL, help_gsm_voice, 15528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_gsm_voice, NULL }, 15538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "status", "display GSM status", 15558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'gsm status' displays the current state of the GSM emulation\r\n", NULL, 15568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_gsm_status, NULL }, 15578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15584c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock { "signal", "set sets the rssi and ber", 15594c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock "'gsm signal <rssi> [<ber>]' changes the reported strength and error rate on next (15s) update.\r\n" 15604c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock "rssi range is 0..31 and 99 for unknown\r\n" 15614c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock "ber range is 0..7 percent and 99 for unknown\r\n", 15624c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock NULL, do_gsm_signal, NULL }, 15634c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock 15648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { NULL, NULL, NULL, NULL, NULL, NULL } 15658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 15668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 15688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 15698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 15708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** S M S C O M M A N D ******/ 15718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 15728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 15738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 15748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 15768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_sms_send( ControlClient client, char* args ) 15778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 15788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* p; 15798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int textlen; 15808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SmsAddressRec sender; 15818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SmsPDU* pdus; 15828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 15838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* check that we have a phone number made of digits */ 15858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!args) { 15868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project MissingArgument: 15878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: missing argument, try 'sms send <phonenumber> <text message>'\r\n" ); 15888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 15898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = strchr( args, ' ' ); 15918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!p) { 15928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto MissingArgument; 15938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( sms_address_from_str( &sender, args, p - args ) < 0 ) { 15968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: bad phone number format, must be [+](0-9)*\r\n" ); 15978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 15988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* un-secape message text into proper utf-8 (conversion happens in-site) */ 16028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p += 1; 16038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project textlen = strlen(p); 16048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project textlen = sms_utf8_from_message_str( p, textlen, (unsigned char*)p, textlen ); 16058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (textlen < 0) { 16068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "message must be utf8 and can use the following escapes:\r\n" 16078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " \\n for a newline\r\n" 16088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " \\xNN where NN are two hexadecimal numbers\r\n" 16098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " \\uNNNN where NNNN are four hexadecimal numbers\r\n" 16108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " \\\\ to send a '\\' character\r\n\r\n" 16118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " anything else is an error\r\n" 16128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "KO: badly formatted text\r\n" ); 16138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 16148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_modem) { 16178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: modem emulation not running\r\n" ); 16188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 16198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* create a list of SMS PDUs, then send them */ 16228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project pdus = smspdu_create_deliver_utf8( (cbytes_t)p, textlen, &sender, NULL ); 16238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (pdus == NULL) { 16248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: internal error when creating SMS-DELIVER PDUs\n" ); 16258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 16268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; pdus[nn] != NULL; nn++) 16298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project amodem_receive_sms( android_modem, pdus[nn] ); 16308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project smspdu_free_list( pdus ); 16328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 16338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 16348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 16368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_sms_sendpdu( ControlClient client, char* args ) 16378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 16388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SmsPDU pdu; 16398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* check that we have a phone number made of digits */ 16418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!args) { 16428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: missing argument, try 'sms sendpdu <hexstring>'\r\n" ); 16438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 16448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_modem) { 16478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: modem emulation not running\r\n" ); 16488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 16498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project pdu = smspdu_create_from_hex( args, strlen(args) ); 16528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (pdu == NULL) { 16538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: badly formatted <hexstring>\r\n" ); 16548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 16558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project amodem_receive_sms( android_modem, pdu ); 16588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project smspdu_free( pdu ); 16598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 16608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 16618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const CommandDefRec sms_commands[] = 16638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 16648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "send", "send inbound SMS text message", 16658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'sms send <phonenumber> <message>' allows you to simulate a new inbound sms message\r\n", NULL, 16668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_sms_send, NULL }, 16678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "pdu", "send inbound SMS PDU", 16698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'sms pdu <hexstring>' allows you to simulate a new inbound sms PDU\r\n" 16708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "(used internally when one emulator sends SMS messages to another instance).\r\n" 16718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "you probably don't want to play with this at all\r\n", NULL, 16728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_sms_sendpdu, NULL }, 16738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { NULL, NULL, NULL, NULL, NULL, NULL } 16758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 16768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 16788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_control_write(void* data, const char* string) 16798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 16808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write((ControlClient)data, string); 16818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 16828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 16848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_power_display( ControlClient client, char* args ) 16858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 16868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_battery_display(do_control_write, client); 16878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 16888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 16898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 16918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_ac_state( ControlClient client, char* args ) 16928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 16938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (args) { 16948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strcasecmp(args, "on") == 0) { 16958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_battery_set_prop(1, POWER_SUPPLY_PROP_ONLINE, 1); 16968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 16978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strcasecmp(args, "off") == 0) { 16998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_battery_set_prop(1, POWER_SUPPLY_PROP_ONLINE, 0); 17008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 17018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: Usage: \"ac on\" or \"ac off\"\n" ); 17058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 17068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 17078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 17098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_battery_status( ControlClient client, char* args ) 17108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 17118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (args) { 17128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strcasecmp(args, "unknown") == 0) { 17138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_battery_set_prop(0, POWER_SUPPLY_PROP_STATUS, POWER_SUPPLY_STATUS_UNKNOWN); 17148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 17158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strcasecmp(args, "charging") == 0) { 17178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_battery_set_prop(0, POWER_SUPPLY_PROP_STATUS, POWER_SUPPLY_STATUS_CHARGING); 17188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 17198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strcasecmp(args, "discharging") == 0) { 17218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_battery_set_prop(0, POWER_SUPPLY_PROP_STATUS, POWER_SUPPLY_STATUS_DISCHARGING); 17228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 17238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strcasecmp(args, "not-charging") == 0) { 17258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_battery_set_prop(0, POWER_SUPPLY_PROP_STATUS, POWER_SUPPLY_STATUS_NOT_CHARGING); 17268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 17278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strcasecmp(args, "full") == 0) { 17298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_battery_set_prop(0, POWER_SUPPLY_PROP_STATUS, POWER_SUPPLY_STATUS_FULL); 17308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 17318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: Usage: \"status unknown|charging|discharging|not-charging|full\"\n" ); 17358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 17368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 17378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 17398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_battery_present( ControlClient client, char* args ) 17408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 17418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (args) { 17428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strcasecmp(args, "true") == 0) { 17438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_battery_set_prop(0, POWER_SUPPLY_PROP_PRESENT, 1); 17448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 17458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strcasecmp(args, "false") == 0) { 17478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_battery_set_prop(0, POWER_SUPPLY_PROP_PRESENT, 0); 17488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 17498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: Usage: \"present true\" or \"present false\"\n" ); 17538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 17548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 17558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 17578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_battery_health( ControlClient client, char* args ) 17588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 17598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (args) { 17608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strcasecmp(args, "unknown") == 0) { 17618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_battery_set_prop(0, POWER_SUPPLY_PROP_HEALTH, POWER_SUPPLY_HEALTH_UNKNOWN); 17628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 17638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strcasecmp(args, "good") == 0) { 17658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_battery_set_prop(0, POWER_SUPPLY_PROP_HEALTH, POWER_SUPPLY_HEALTH_GOOD); 17668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 17678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strcasecmp(args, "overheat") == 0) { 17698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_battery_set_prop(0, POWER_SUPPLY_PROP_HEALTH, POWER_SUPPLY_HEALTH_OVERHEAT); 17708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 17718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strcasecmp(args, "dead") == 0) { 17738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_battery_set_prop(0, POWER_SUPPLY_PROP_HEALTH, POWER_SUPPLY_HEALTH_DEAD); 17748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 17758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strcasecmp(args, "overvoltage") == 0) { 17778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_battery_set_prop(0, POWER_SUPPLY_PROP_HEALTH, POWER_SUPPLY_HEALTH_OVERVOLTAGE); 17788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 17798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strcasecmp(args, "failure") == 0) { 17818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_battery_set_prop(0, POWER_SUPPLY_PROP_HEALTH, POWER_SUPPLY_HEALTH_UNSPEC_FAILURE); 17828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 17838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: Usage: \"health unknown|good|overheat|dead|overvoltage|failure\"\n" ); 17878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 17888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 17898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 17918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_battery_capacity( ControlClient client, char* args ) 17928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 17938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (args) { 17948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int capacity; 17958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (sscanf(args, "%d", &capacity) == 1 && capacity >= 0 && capacity <= 100) { 17978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_battery_set_prop(0, POWER_SUPPLY_PROP_CAPACITY, capacity); 17988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 17998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 18008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 18018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: Usage: \"capacity <percentage>\"\n" ); 18038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 18048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 18058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const CommandDefRec power_commands[] = 18088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 18098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "display", "display battery and charger state", 18108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "display battery and charger state\r\n", NULL, 18118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_power_display, NULL }, 18128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "ac", "set AC charging state", 18148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'ac on|off' allows you to set the AC charging state to on or off\r\n", NULL, 18158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_ac_state, NULL }, 18168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "status", "set battery status", 18188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'status unknown|charging|discharging|not-charging|full' allows you to set battery status\r\n", NULL, 18198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_battery_status, NULL }, 18208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "present", "set battery present state", 18228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'present true|false' allows you to set battery present state to true or false\r\n", NULL, 18238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_battery_present, NULL }, 18248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "health", "set battery health state", 18268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'health unknown|good|overheat|dead|overvoltage|failure' allows you to set battery health state\r\n", NULL, 18278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_battery_health, NULL }, 18288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "capacity", "set battery capacity state", 18308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'capacity <percentage>' allows you to set battery capacity to a value 0 - 100\r\n", NULL, 18318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_battery_capacity, NULL }, 18328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { NULL, NULL, NULL, NULL, NULL, NULL } 18348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 18358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 18378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 18388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 18398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** E V E N T C O M M A N D S ******/ 18408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 18418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 18428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 18438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 18468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_event_send( ControlClient client, char* args ) 18478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 18488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* p; 18498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!args) { 18518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: Usage: event send <type>:<code>:<value> ...\r\n" ); 18528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 18538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 18548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = args; 18568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (*p) { 18578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* q; 185888935f701f51d84ed536cb55cc7b2ba391d7597eDavid 'Digit' Turner char temp[128]; 18598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int type, code, value, ret; 18608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 186188935f701f51d84ed536cb55cc7b2ba391d7597eDavid 'Digit' Turner p += strspn( p, " \t" ); /* skip spaces */ 18628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (*p == 0) 18638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 18648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project q = p + strcspn( p, " \t" ); 18668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (q == p) 18688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 18698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1870c7389bd69e570a2c8432b37399aff1976b021f0fAndrew Hsieh snprintf(temp, sizeof temp, "%.*s", (int)(intptr_t)(q-p), p); 187188935f701f51d84ed536cb55cc7b2ba391d7597eDavid 'Digit' Turner ret = android_event_from_str( temp, &type, &code, &value ); 18728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret < 0) { 18738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret == -1) { 18748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, 18758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "KO: invalid event type in '%.*s', try 'event list types' for valid values\r\n", 18768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project q-p, p ); 18778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (ret == -2) { 18788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, 18798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "KO: invalid event code in '%.*s', try 'event list codes <type>' for valid values\r\n", 18808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project q-p, p ); 18818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 18828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, 18838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "KO: invalid event value in '%.*s', must be an integer\r\n", 18848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project q-p, p); 18858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 18868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 18878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 18888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 188934f2974ce7ec7c71beb47b5daf9089d5c8c40c79David 'Digit' Turner user_event_generic( type, code, value ); 18908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = q; 18918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 18928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 18938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 18948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 18968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_event_types( ControlClient client, char* args ) 18978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 18988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int count = android_event_get_type_count(); 18998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 19008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "event <type> can be an integer or one of the following aliases\r\n" ); 19028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; nn < count; nn++) { 19038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char tmp[16]; 19048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* p = tmp; 19058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end = p + sizeof(tmp); 19068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int count2 = android_event_get_code_count( nn );; 19078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = android_event_bufprint_type_str( p, end, nn ); 19098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, " %-8s", tmp ); 19118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (count2 > 0) 19128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, " (%d code aliases)", count2 ); 19138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "\r\n" ); 19158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 19168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 19178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 19188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 19208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_event_codes( ControlClient client, char* args ) 19218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 19228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int count; 19238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn, type, dummy; 19248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!args) { 19268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: argument missing, try 'event codes <type>'\r\n" ); 19278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 19288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 19298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( android_event_from_str( args, &type, &dummy, &dummy ) < 0 ) { 19318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: bad argument, see 'event types' for valid values\r\n" ); 19328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 19338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 19348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project count = android_event_get_code_count( type ); 19368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (count == 0) { 19378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "no code aliases defined for this type\r\n" ); 19388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 19398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "type '%s' accepts the following <code> aliases:\r\n", 19408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args ); 19418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; nn < count; nn++) { 19428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char temp[20], *p = temp, *end = p + sizeof(temp); 19438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_event_bufprint_code_str( p, end, type, nn ); 19448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, " %-12s\r\n", temp ); 19458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 19468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 19478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 19498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 19508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic __inline__ int 19528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectutf8_next( unsigned char* *pp, unsigned char* end ) 19538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 19548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned char* p = *pp; 19558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int result = -1; 19568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p < end) { 19588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int c= *p++; 19598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (c >= 128) { 19608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((c & 0xe0) == 0xc0) 19618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project c &= 0x1f; 19628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if ((c & 0xf0) == 0xe0) 19638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project c &= 0x0f; 19648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 19658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project c &= 0x07; 19668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (p < end && (p[0] & 0xc0) == 0x80) { 19688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project c = (c << 6) | (p[0] & 0x3f); 19698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 19708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 19718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project result = c; 19728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *pp = p; 19738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 19748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return result; 19758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 19768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 19788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_event_text( ControlClient client, char* args ) 19798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 198071bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine AKeycodeBuffer keycodes; 19818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned char* p = (unsigned char*) args; 19828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned char* end = p + strlen(args); 19838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int textlen; 198471bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine const AKeyCharmap* charmap; 19858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!args) { 19878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: argument missing, try 'event text <message>'\r\n" ); 19888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 19898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 199071bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine 19910158ea3220978ecc0fa1738e4a0bdae83fa36175David 'Digit' Turner /* Get active charmap. */ 19920158ea3220978ecc0fa1738e4a0bdae83fa36175David 'Digit' Turner charmap = android_get_charmap(); 199371bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine if (charmap == NULL) { 199471bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine control_write( client, "KO: no character map active in current device layout/config\r\n" ); 19958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 19968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 19978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 199871bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine keycodes.keycode_count = 0; 199971bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine 20008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* un-secape message text into proper utf-8 (conversion happens in-site) */ 20018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project textlen = strlen((char*)p); 20028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project textlen = sms_utf8_from_message_str( args, textlen, (unsigned char*)p, textlen ); 20038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (textlen < 0) { 20048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "message must be utf8 and can use the following escapes:\r\n" 20058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " \\n for a newline\r\n" 20068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " \\xNN where NN are two hexadecimal numbers\r\n" 20078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " \\uNNNN where NNNN are four hexadecimal numbers\r\n" 20088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " \\\\ to send a '\\' character\r\n\r\n" 20098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " anything else is an error\r\n" 20108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "KO: badly formatted text\r\n" ); 20118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 20128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 20138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 20148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project end = p + textlen; 20158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (p < end) { 20168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int c = utf8_next( &p, end ); 20178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (c <= 0) 20188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 20198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 202071bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine android_charmap_reverse_map_unicode( NULL, (unsigned)c, 1, &keycodes ); 202171bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine android_charmap_reverse_map_unicode( NULL, (unsigned)c, 0, &keycodes ); 202271bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine android_keycodes_flush( &keycodes ); 20238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 20248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 20258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 20268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 20278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 20288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const CommandDefRec event_commands[] = 20298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 20308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "send", "send a series of events to the kernel", 20318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'event send <type>:<code>:<value> ...' allows your to send one or more hardware events\r\n" 20328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "to the Android kernel. you can use text names or integers for <type> and <code>\r\n", NULL, 20338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_event_send, NULL }, 20348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 20358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "types", "list all <type> aliases", 20368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'event types' list all <type> string aliases supported by the 'event' subcommands\r\n", 20378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, do_event_types, NULL }, 20388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 20398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "codes", "list all <code> aliases for a given <type>", 20408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'event codes <type>' lists all <code> string aliases for a given event <type>\r\n", 20418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, do_event_codes, NULL }, 20428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 20438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "text", "simulate keystrokes from a given text", 20448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'event text <message>' allows you to simulate keypresses to generate a given text\r\n" 20458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "message. <message> must be an utf-8 string. Unicode points will be reverse-mapped\r\n" 20468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "according to the current device keyboard. unsupported characters will be discarded\r\n" 20478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "silently\r\n", NULL, do_event_text, NULL }, 20488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 20498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { NULL, NULL, NULL, NULL, NULL, NULL } 20508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 20518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 20522ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 20532ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije/********************************************************************************************/ 20542ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije/********************************************************************************************/ 20552ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije/***** ******/ 20562ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije/***** S N A P S H O T C O M M A N D S ******/ 20572ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije/***** ******/ 20582ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije/********************************************************************************************/ 20592ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije/********************************************************************************************/ 20602ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 20612ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thijestatic int 206295a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turnercontrol_write_out_cb(void* opaque, const char* str, int strsize) 20632ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije{ 20642ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije ControlClient client = opaque; 206595a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner control_control_write(client, str, strsize); 206695a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner return strsize; 20672ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije} 20682ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 20692ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thijestatic int 207095a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turnercontrol_write_err_cb(void* opaque, const char* str, int strsize) 20712ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije{ 20722ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije int ret = 0; 20732ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije ControlClient client = opaque; 20742ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije ret += control_write(client, "KO: "); 207595a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner control_control_write(client, str, strsize); 207695a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner return ret + strsize; 20772ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije} 20782ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 20792ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thijestatic int 20802ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thijedo_snapshot_list( ControlClient client, char* args ) 20812ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije{ 208295a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner int64_t ret; 208395a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner Monitor *out = monitor_fake_new(client, control_write_out_cb); 208495a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner Monitor *err = monitor_fake_new(client, control_write_err_cb); 208595a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner do_info_snapshots(out, err); 208695a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner ret = monitor_fake_get_bytes(err); 208795a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner monitor_fake_free(err); 208895a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner monitor_fake_free(out); 20892ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 20902ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije return ret > 0; 20912ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije} 20922ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 20932ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thijestatic int 20942ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thijedo_snapshot_save( ControlClient client, char* args ) 20952ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije{ 209695a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner int64_t ret; 20979fb360ec4c47d750711c8f1776c180e3802b0aabDavid 'Digit' Turner 20989fb360ec4c47d750711c8f1776c180e3802b0aabDavid 'Digit' Turner if (args == NULL) { 20999fb360ec4c47d750711c8f1776c180e3802b0aabDavid 'Digit' Turner control_write(client, "KO: argument missing, try 'avd snapshot save <name>'\r\n"); 21009fb360ec4c47d750711c8f1776c180e3802b0aabDavid 'Digit' Turner return -1; 21019fb360ec4c47d750711c8f1776c180e3802b0aabDavid 'Digit' Turner } 21029fb360ec4c47d750711c8f1776c180e3802b0aabDavid 'Digit' Turner 210395a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner Monitor *err = monitor_fake_new(client, control_write_err_cb); 210495a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner do_savevm(err, args); 210595a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner ret = monitor_fake_get_bytes(err); 210695a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner monitor_fake_free(err); 21072ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 21082ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije return ret > 0; // no output on error channel indicates success 21092ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije} 21102ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 21112ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thijestatic int 21122ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thijedo_snapshot_load( ControlClient client, char* args ) 21132ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije{ 211495a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner int64_t ret; 21159fb360ec4c47d750711c8f1776c180e3802b0aabDavid 'Digit' Turner 21169fb360ec4c47d750711c8f1776c180e3802b0aabDavid 'Digit' Turner if (args == NULL) { 21179fb360ec4c47d750711c8f1776c180e3802b0aabDavid 'Digit' Turner control_write(client, "KO: argument missing, try 'avd snapshot load <name>'\r\n"); 21189fb360ec4c47d750711c8f1776c180e3802b0aabDavid 'Digit' Turner return -1; 21199fb360ec4c47d750711c8f1776c180e3802b0aabDavid 'Digit' Turner } 21209fb360ec4c47d750711c8f1776c180e3802b0aabDavid 'Digit' Turner 212195a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner Monitor *err = monitor_fake_new(client, control_write_err_cb); 212295a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner do_loadvm(err, args); 212395a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner ret = monitor_fake_get_bytes(err); 212495a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner monitor_fake_free(err); 21252ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 21262ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije return ret > 0; 21272ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije} 21282ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 21292ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thijestatic int 21302ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thijedo_snapshot_del( ControlClient client, char* args ) 21312ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije{ 213295a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner int64_t ret; 21339fb360ec4c47d750711c8f1776c180e3802b0aabDavid 'Digit' Turner 21349fb360ec4c47d750711c8f1776c180e3802b0aabDavid 'Digit' Turner if (args == NULL) { 21359fb360ec4c47d750711c8f1776c180e3802b0aabDavid 'Digit' Turner control_write(client, "KO: argument missing, try 'avd snapshot del <name>'\r\n"); 21369fb360ec4c47d750711c8f1776c180e3802b0aabDavid 'Digit' Turner return -1; 21379fb360ec4c47d750711c8f1776c180e3802b0aabDavid 'Digit' Turner } 21389fb360ec4c47d750711c8f1776c180e3802b0aabDavid 'Digit' Turner 213995a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner Monitor *err = monitor_fake_new(client, control_write_err_cb); 214095a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner do_delvm(err, args); 214195a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner ret = monitor_fake_get_bytes(err); 214295a83ce7ee413954ba6325584ea659c6685edfd5David 'Digit' Turner monitor_fake_free(err); 21432ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 21442ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije return ret > 0; 21452ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije} 21462ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 21472ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thijestatic const CommandDefRec snapshot_commands[] = 21482ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije{ 21492ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije { "list", "list available state snapshots", 21502ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije "'avd snapshot list' will show a list of all state snapshots that can be loaded\r\n", 21512ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije NULL, do_snapshot_list, NULL }, 21522ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 21532ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije { "save", "save state snapshot", 21542ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije "'avd snapshot save <name>' will save the current (run-time) state to a snapshot with the given name\r\n", 21552ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije NULL, do_snapshot_save, NULL }, 21562ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 21572ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije { "load", "load state snapshot", 21582ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije "'avd snapshot load <name>' will load the state snapshot of the given name\r\n", 21592ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije NULL, do_snapshot_load, NULL }, 21602ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 21612ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije { "del", "delete state snapshot", 21622ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije "'avd snapshot del <name>' will delete the state snapshot with the given name\r\n", 21632ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije NULL, do_snapshot_del, NULL }, 21642ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 21652ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije { NULL, NULL, NULL, NULL, NULL, NULL } 21662ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije}; 21672ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 21682ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 21698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 21718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 21728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 21738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** V M C O M M A N D S ******/ 21748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 21758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 21768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 21778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 21798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_avd_stop( ControlClient client, char* args ) 21808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 21818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!vm_running) { 21828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: virtual device already stopped\r\n" ); 21838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 21848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 21858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project vm_stop(EXCP_INTERRUPT); 21868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 21878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 21888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 21908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_avd_start( ControlClient client, char* args ) 21918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 21928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (vm_running) { 21938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: virtual device already running\r\n" ); 21948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 21958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 21968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project vm_start(); 21978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 21988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 21998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 22018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_avd_status( ControlClient client, char* args ) 22028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 22038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "virtual device is %s\r\n", vm_running ? "running" : "stopped" ); 22048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 22058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 22068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 22088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_avd_name( ControlClient client, char* args ) 22098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2210ec6cedb56251ce3d5703c43c352d373c0baaa76dDavid 'Digit' Turner control_write( client, "%s\r\n", android_hw->avd_name); 22118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 22128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 22138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const CommandDefRec vm_commands[] = 22158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 22168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "stop", "stop the virtual device", 22178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'avd stop' stops the virtual device immediately, use 'avd start' to continue execution\r\n", 22188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, do_avd_stop, NULL }, 22198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "start", "start/restart the virtual device", 22218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'avd start' will start or continue the virtual device, use 'avd stop' to stop it\r\n", 22228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, do_avd_start, NULL }, 22238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "status", "query virtual device status", 22252ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije "'avd status' will indicate whether the virtual device is running or not\r\n", 22268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, do_avd_status, NULL }, 22278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "name", "query virtual device name", 22298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'avd name' will return the name of this virtual device\r\n", 22308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, do_avd_name, NULL }, 22318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22322ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije { "snapshot", "state snapshot commands", 22332ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije "allows you to save and restore the virtual device state in snapshots\r\n", 22342ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije NULL, NULL, snapshot_commands }, 22352ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 22368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { NULL, NULL, NULL, NULL, NULL, NULL } 22378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 22388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 22408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 22418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 22428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** G E O C O M M A N D S ******/ 22438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 22448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 22458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 22468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 22488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_geo_nmea( ControlClient client, char* args ) 22498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 22508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!args) { 22518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: NMEA sentence missing, try 'help geo nmea'\r\n" ); 22528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 22538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 22548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_gps_cs) { 22558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: no GPS emulation in this virtual device\r\n" ); 22568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 22578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 22588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_gps_send_nmea( args ); 22598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 22608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 22618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 22638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_geo_fix( ControlClient client, char* args ) 22648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 22654afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock // GEO_SAT2 provides bug backwards compatibility. 22664afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock enum { GEO_LONG = 0, GEO_LAT, GEO_ALT, GEO_SAT, GEO_SAT2, NUM_GEO_PARAMS }; 22678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* p = args; 22684afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock int top_param = -1; 22694afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock double params[ NUM_GEO_PARAMS ]; 2270657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner int n_satellites = 1; 22718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static int last_time = 0; 22738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static double last_altitude = 0.; 22748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!p) 22768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = ""; 22778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* tokenize */ 22798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (*p) { 22808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 22818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project double val = strtod( p, &end ); 22828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (end == p) { 22848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: argument '%s' is not a number\n", p ); 22858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 22868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 22878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22884afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock params[++top_param] = val; 22894afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock if (top_param + 1 == NUM_GEO_PARAMS) 22908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 22918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = end; 22938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (*p && (p[0] == ' ' || p[0] == '\t')) 22948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p += 1; 22958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 22968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* sanity check */ 22984afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock if (top_param < GEO_LAT) { 22998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: not enough arguments: see 'help geo fix' for details\r\n" ); 23008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 23018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 23028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 23034afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock /* check number of satellites, must be integer between 1 and 12 */ 23044afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock if (top_param >= GEO_SAT) { 23054afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock int sat_index = (top_param >= GEO_SAT2) ? GEO_SAT2 : GEO_SAT; 23064afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock n_satellites = (int) params[sat_index]; 23074afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock if (n_satellites != params[sat_index] 23084afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock || n_satellites < 1 || n_satellites > 12) { 2309657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner control_write( client, "KO: invalid number of satellites. Must be an integer between 1 and 12\r\n"); 2310657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner return -1; 2311657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner } 2312657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner } 2313657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner 23148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* generate an NMEA sentence for this fix */ 23158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 23168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project STRALLOC_DEFINE(s); 23178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project double val; 23188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int deg, min; 23198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char hemi; 23208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2321657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner /* format overview: 2322657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner * time of fix 123519 12:35:19 UTC 2323657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner * latitude 4807.038 48 degrees, 07.038 minutes 2324657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner * north/south N or S 2325657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner * longitude 01131.000 11 degrees, 31. minutes 2326657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner * east/west E or W 2327657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner * fix quality 1 standard GPS fix 2328657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner * satellites 1 to 12 number of satellites being tracked 2329657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner * HDOP <dontcare> horizontal dilution 2330657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner * altitude 546. altitude above sea-level 2331657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner * altitude units M to indicate meters 2332657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner * diff <dontcare> height of sea-level above ellipsoid 2333657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner * diff units M to indicate meters (should be <dontcare>) 2334657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner * dgps age <dontcare> time in seconds since last DGPS fix 2335657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner * dgps sid <dontcare> DGPS station id 2336657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner */ 2337657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner 23388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* first, the time */ 23398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project stralloc_add_format( s, "$GPGGA,%06d", last_time ); 23408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project last_time ++; 23418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 23428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* then the latitude */ 23438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project hemi = 'N'; 23444afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock val = params[GEO_LAT]; 23458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (val < 0) { 23468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project hemi = 'S'; 23478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project val = -val; 23488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 23498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project deg = (int) val; 2350657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner val = 60*(val - deg); 2351657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner min = (int) val; 2352631f2555ed2b50a07ea19eaefa495a028ab1991aDavid 'Digit' Turner val = 10000*(val - min); 2353657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner stralloc_add_format( s, ",%02d%02d.%04d,%c", deg, min, (int)val, hemi ); 23548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 23558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* the longitude */ 23568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project hemi = 'E'; 23574afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock val = params[GEO_LONG]; 23588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (val < 0) { 23598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project hemi = 'W'; 23608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project val = -val; 23618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 23628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project deg = (int) val; 2363657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner val = 60*(val - deg); 2364657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner min = (int) val; 2365631f2555ed2b50a07ea19eaefa495a028ab1991aDavid 'Digit' Turner val = 10000*(val - min); 2366657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner stralloc_add_format( s, ",%02d%02d.%04d,%c", deg, min, (int)val, hemi ); 23678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2368657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner /* bogus fix quality, satellite count and dilution */ 2369657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner stralloc_add_format( s, ",1,%02d,", n_satellites ); 23708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2371657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner /* optional altitude + bogus diff */ 23724afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock if (top_param >= GEO_ALT) { 23734afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock stralloc_add_format( s, ",%.1g,M,0.,M", params[GEO_ALT] ); 23744afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock last_altitude = params[GEO_ALT]; 23758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 2376657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner stralloc_add_str( s, ",,,," ); 23778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 23788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* bogus rest and checksum */ 23798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project stralloc_add_str( s, ",,,*47" ); 23808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 23818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* send it, then free */ 23828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_gps_send_nmea( stralloc_cstr(s) ); 23838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project stralloc_reset( s ); 23848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 23858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 23868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 23878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 23888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const CommandDefRec geo_commands[] = 23898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 23908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "nmea", "send an GPS NMEA sentence", 23918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'geo nema <sentence>' sends a NMEA 0183 sentence to the emulated device, as\r\n" 23928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "if it came from an emulated GPS modem. <sentence> must begin with '$GP'. only\r\n" 23938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'$GPGGA' and '$GPRCM' sentences are supported at the moment.\r\n", 23948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, do_geo_nmea, NULL }, 23958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 23968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "fix", "send a simple GPS fix", 23974afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock "'geo fix <longitude> <latitude> [<altitude> [<satellites>]]'\r\n" 23984afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock " allows you to send a simple GPS fix to the emulated system.\r\n" 23994afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock " The parameters are:\r\n\r\n" 24008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " <longitude> longitude, in decimal degrees\r\n" 24018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " <latitude> latitude, in decimal degrees\r\n" 24028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " <altitude> optional altitude in meters\r\n" 2403657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner " <satellites> number of satellites being tracked (1-12)\r\n" 24048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "\r\n", 24058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, do_geo_fix, NULL }, 24068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 24078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { NULL, NULL, NULL, NULL, NULL, NULL } 24088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 24098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 24108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 24118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 24128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 24138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 2414736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan/***** S E N S O R S C O M M A N D S ******/ 2415736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan/***** ******/ 2416736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan/********************************************************************************************/ 2417736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan/********************************************************************************************/ 2418736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan 2419736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan/* For sensors user prompt string size.*/ 2420736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan#define SENSORS_INFO_SIZE 150 2421736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan 2422736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan/* Get sensor data - (a,b,c) from sensor name */ 2423736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wanstatic int 2424736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wando_sensors_get( ControlClient client, char* args ) 2425736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan{ 2426736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan if (! args) { 2427736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan control_write( client, "KO: Usage: \"get <sensorname>\"\n" ); 2428736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan return -1; 2429736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan } 2430736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan 2431736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan int status = SENSOR_STATUS_UNKNOWN; 2432736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan char sensor[strlen(args) + 1]; 2433736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan if (1 != sscanf( args, "%s", &sensor[0] )) 2434736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan goto SENSOR_STATUS_ERROR; 2435736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan 2436736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan int sensor_id = android_sensors_get_id_from_name( sensor ); 2437736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan char buffer[SENSORS_INFO_SIZE] = { 0 }; 2438736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan float a, b, c; 2439736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan 2440736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan if (sensor_id < 0) { 2441736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan status = sensor_id; 2442736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan goto SENSOR_STATUS_ERROR; 2443736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan } else { 2444736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan status = android_sensors_get( sensor_id, &a, &b, &c ); 2445736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan if (status != SENSOR_STATUS_OK) 2446736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan goto SENSOR_STATUS_ERROR; 2447736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan snprintf( buffer, sizeof(buffer), 2448736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan "%s = %g:%g:%g\r\n", sensor, a, b, c ); 2449736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan do_control_write( client, buffer ); 2450736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan return 0; 2451736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan } 2452736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan 2453736e01f86f4ec4049bb5795f1ddb979132b05333Tim WanSENSOR_STATUS_ERROR: 2454736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan switch(status) { 2455736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan case SENSOR_STATUS_NO_SERVICE: 2456736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan snprintf( buffer, sizeof(buffer), "KO: No sensor service found!\r\n" ); 2457736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan break; 2458736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan case SENSOR_STATUS_DISABLED: 2459736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan snprintf( buffer, sizeof(buffer), "KO: '%s' sensor is disabled.\r\n", sensor ); 2460736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan break; 2461736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan case SENSOR_STATUS_UNKNOWN: 2462736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan snprintf( buffer, sizeof(buffer), 2463736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan "KO: unknown sensor name: %s, run 'sensor status' to get available sensors.\r\n", sensor ); 2464736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan break; 2465736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan default: 2466736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan snprintf( buffer, sizeof(buffer), "KO: '%s' sensor: exception happens.\r\n", sensor ); 2467736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan } 2468736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan do_control_write( client, buffer ); 2469736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan return -1; 2470736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan} 2471736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan 2472736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan/* set sensor data - (a,b,c) from sensor name */ 2473736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wanstatic int 2474736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wando_sensors_set( ControlClient client, char* args ) 2475736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan{ 2476736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan if (! args) { 2477736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan control_write( client, "KO: Usage: \"set <sensorname> <value-a>[:<value-b>[:<value-c>]]\"\n" ); 2478736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan return -1; 2479736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan } 2480736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan 2481736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan int status; 2482736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan char* sensor; 2483736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan char* value; 2484736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan char* args_dup = strdup( args ); 2485736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan if (args_dup == NULL) { 2486736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan control_write( client, "KO: Memory allocation failed.\n" ); 2487736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan return -1; 2488736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan } 2489736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan char* p = args_dup; 2490736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan 2491736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan /* Parsing the args to get sensor name string */ 2492736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan while (*p && isspace(*p)) p++; 2493736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan if (*p == 0) 2494736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan goto INPUT_ERROR; 2495736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan sensor = p; 2496736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan 2497736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan /* Parsing the args to get value string */ 2498736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan while (*p && (! isspace(*p))) p++; 2499736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan if (*p == 0 || *(p + 1) == 0/* make sure value isn't NULL */) 2500736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan goto INPUT_ERROR; 2501736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan *p = 0; 2502736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan value = p + 1; 2503736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan 2504736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan if (! (strlen(sensor) && strlen(value))) 2505736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan goto INPUT_ERROR; 2506736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan 2507736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan int sensor_id = android_sensors_get_id_from_name( sensor ); 2508736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan char buffer[SENSORS_INFO_SIZE] = { 0 }; 2509736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan 2510736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan if (sensor_id < 0) { 2511736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan status = sensor_id; 2512736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan goto SENSOR_STATUS_ERROR; 2513736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan } else { 2514736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan float fvalues[3]; 2515736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan status = android_sensors_get( sensor_id, &fvalues[0], &fvalues[1], &fvalues[2] ); 2516736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan if (status != SENSOR_STATUS_OK) 2517736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan goto SENSOR_STATUS_ERROR; 2518736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan 2519736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan /* Parsing the value part to get the sensor values(a, b, c) */ 2520736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan int i; 2521736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan char* pnext; 2522736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan char* pend = value + strlen(value); 2523736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan for (i = 0; i < 3; i++, value = pnext + 1) { 2524736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan pnext=strchr( value, ':' ); 2525736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan if (pnext) { 2526736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan *pnext = 0; 2527736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan } else { 2528736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan pnext = pend; 2529736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan } 2530736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan 2531736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan if (pnext > value) { 2532736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan if (1 != sscanf( value,"%g", &fvalues[i] )) 2533736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan goto INPUT_ERROR; 2534736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan } 2535736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan } 2536736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan 2537736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan status = android_sensors_set( sensor_id, fvalues[0], fvalues[1], fvalues[2] ); 2538736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan if (status != SENSOR_STATUS_OK) 2539736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan goto SENSOR_STATUS_ERROR; 2540736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan 2541736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan free( args_dup ); 2542736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan return 0; 2543736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan } 2544736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan 2545736e01f86f4ec4049bb5795f1ddb979132b05333Tim WanSENSOR_STATUS_ERROR: 2546736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan switch(status) { 2547736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan case SENSOR_STATUS_NO_SERVICE: 2548736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan snprintf( buffer, sizeof(buffer), "KO: No sensor service found!\r\n" ); 2549736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan break; 2550736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan case SENSOR_STATUS_DISABLED: 2551736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan snprintf( buffer, sizeof(buffer), "KO: '%s' sensor is disabled.\r\n", sensor ); 2552736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan break; 2553736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan case SENSOR_STATUS_UNKNOWN: 2554736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan snprintf( buffer, sizeof(buffer), 2555736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan "KO: unknown sensor name: %s, run 'sensor status' to get available sensors.\r\n", sensor ); 2556736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan break; 2557736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan default: 2558736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan snprintf( buffer, sizeof(buffer), "KO: '%s' sensor: exception happens.\r\n", sensor ); 2559736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan } 2560736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan do_control_write( client, buffer ); 2561736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan free( args_dup ); 2562736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan return -1; 2563736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan 2564736e01f86f4ec4049bb5795f1ddb979132b05333Tim WanINPUT_ERROR: 2565736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan control_write( client, "KO: Usage: \"set <sensorname> <value-a>[:<value-b>[:<value-c>]]\"\n" ); 2566736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan free( args_dup ); 2567736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan return -1; 2568736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan} 2569736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan 2570736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan/* get all available sensor names and enable status respectively. */ 2571736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wanstatic int 2572736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wando_sensors_status( ControlClient client, char* args ) 2573736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan{ 2574736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan uint8_t id, status; 2575736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan char buffer[SENSORS_INFO_SIZE] = { 0 }; 2576736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan 2577736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan for(id = 0; id < MAX_SENSORS; id++) { 2578736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan status = android_sensors_get_sensor_status( id ); 2579736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan snprintf( buffer, sizeof(buffer), "%s: %s\n", 2580736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan android_sensors_get_name_from_id(id), (status ? "enabled.":"disabled.") ); 2581736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan control_write( client, buffer ); 2582736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan } 2583736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan 2584736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan return 0; 2585736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan} 2586736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan 2587736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan/* Sensor commands for get/set sensor values and get available sensor names. */ 2588736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wanstatic const CommandDefRec sensor_commands[] = 2589736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan{ 2590736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan { "status", "list all sensors and their status.", 2591736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan "'status': list all sensors and their status.\r\n", 2592736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan NULL, do_sensors_status, NULL }, 2593736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan 2594736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan { "get", "get sensor values", 2595736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan "'get <sensorname>' returns the values of a given sensor.\r\n", 2596736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan NULL, do_sensors_get, NULL }, 2597736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan 2598736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan { "set", "set sensor values", 2599736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan "'set <sensorname> <value-a>[:<value-b>[:<value-c>]]' set the values of a given sensor.\r\n", 2600736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan NULL, do_sensors_set, NULL }, 2601736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan 2602736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan { NULL, NULL, NULL, NULL, NULL, NULL } 2603736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan}; 2604736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan 2605736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan/********************************************************************************************/ 2606736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan/********************************************************************************************/ 2607736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan/***** ******/ 26088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** M A I N C O M M A N D S ******/ 26098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 26108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 26118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 26128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 26138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 26148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_window_scale( ControlClient client, char* args ) 26158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 26168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project double scale; 26178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int is_dpi = 0; 26188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 26198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 26208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!args) { 26218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: argument missing, try 'window scale <scale>'\r\n" ); 26228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 26238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 26248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 26258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project scale = strtol( args, &end, 10 ); 26268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (end > args && !memcmp( end, "dpi", 4 )) { 26278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project is_dpi = 1; 26288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 26298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else { 26308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project scale = strtod( args, &end ); 26318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (end == args || end[0]) { 26328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: argument <scale> must be a real number, or an integer followed by 'dpi'\r\n" ); 26338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 26348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 26358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 26368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2637777eb68eb60cac18f4b62e2e1b14a906875cbe7aVladimir Chtchetkine uicmd_set_window_scale( scale, is_dpi ); 26388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 26398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 26408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 26418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const CommandDefRec window_commands[] = 26428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 26438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "scale", "change the window scale", 26448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'window scale <scale>' allows you to change the scale of the emulator window at runtime\r\n" 26458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "<scale> must be either a real number between 0.1 and 3.0, or an integer followed by\r\n" 26468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "the 'dpi' prefix (as in '120dpi')\r\n", 26478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, do_window_scale, NULL }, 26488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 26498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { NULL, NULL, NULL, NULL, NULL, NULL } 26508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 26518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 26528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 26538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 26548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 2655e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner/***** Q E M U C O M M A N D S ******/ 2656e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner/***** ******/ 2657e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner/********************************************************************************************/ 2658e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner/********************************************************************************************/ 2659e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner 2660e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turnerstatic int 2661e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turnerdo_qemu_monitor( ControlClient client, char* args ) 2662e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner{ 2663e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner char socketname[32]; 2664e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner int fd; 2665e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner CharDriverState* cs; 2666e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner 2667e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner if (args != NULL) { 2668e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner control_write( client, "KO: no argument for 'qemu monitor'\r\n" ); 2669e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner return -1; 2670e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner } 2671e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner /* Detach the client socket, and re-attach it to a monitor */ 2672e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner fd = control_client_detach(client); 2673e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner snprintf(socketname, sizeof socketname, "tcp:socket=%d", fd); 2674e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner cs = qemu_chr_open("monitor", socketname, NULL); 2675e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner if (cs == NULL) { 2676e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner control_client_reattach(client, fd); 2677e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner control_write( client, "KO: internal error: could not detach from console !\r\n" ); 2678e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner return -1; 2679e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner } 2680e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner monitor_init(cs, MONITOR_USE_READLINE|MONITOR_QUIT_DOESNT_EXIT); 2681e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner control_client_destroy(client); 2682e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner return 0; 2683e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner} 2684e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner 2685e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine#ifdef CONFIG_STANDALONE_CORE 2686d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine/* UI settings, passed to the core via -ui-settings command line parameter. */ 2687d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkineextern char* android_op_ui_settings; 2688d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine 2689d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkinestatic int 2690d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkinedo_attach_ui( ControlClient client, char* args ) 2691d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine{ 2692d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine // Make sure that there are no UI already attached to this console. 2693d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine if (attached_ui_client != NULL) { 2694d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine control_write( client, "KO: Another UI is attached to this core!\r\n" ); 2695d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine control_client_destroy(client); 2696d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine return -1; 2697d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine } 2698d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine 269985276806ec6ac969d7befa2496c1de59adaaac74Vladimir Chtchetkine if (!attachUiProxy_create(client->sock)) { 2700d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine char reply_buf[4096]; 270185276806ec6ac969d7befa2496c1de59adaaac74Vladimir Chtchetkine attached_ui_client = client; 270285276806ec6ac969d7befa2496c1de59adaaac74Vladimir Chtchetkine // Reply "OK" with the saved -ui-settings property. 2703d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine snprintf(reply_buf, sizeof(reply_buf), "OK: %s\r\n", android_op_ui_settings); 2704d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine control_write( client, reply_buf); 2705d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine } else { 270685276806ec6ac969d7befa2496c1de59adaaac74Vladimir Chtchetkine control_write( client, "KO\r\n" ); 270785276806ec6ac969d7befa2496c1de59adaaac74Vladimir Chtchetkine control_client_destroy(client); 270885276806ec6ac969d7befa2496c1de59adaaac74Vladimir Chtchetkine return -1; 2709d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine } 2710d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine 2711d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine return 0; 2712d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine} 2713d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine 271485276806ec6ac969d7befa2496c1de59adaaac74Vladimir Chtchetkinevoid 271585276806ec6ac969d7befa2496c1de59adaaac74Vladimir Chtchetkinedestroy_attach_ui_client(void) 271685276806ec6ac969d7befa2496c1de59adaaac74Vladimir Chtchetkine{ 271785276806ec6ac969d7befa2496c1de59adaaac74Vladimir Chtchetkine if (attached_ui_client != NULL) { 271885276806ec6ac969d7befa2496c1de59adaaac74Vladimir Chtchetkine control_client_destroy(attached_ui_client); 271985276806ec6ac969d7befa2496c1de59adaaac74Vladimir Chtchetkine } 272085276806ec6ac969d7befa2496c1de59adaaac74Vladimir Chtchetkine} 272185276806ec6ac969d7befa2496c1de59adaaac74Vladimir Chtchetkine 2722e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkinestatic int 2723e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkinedo_create_framebuffer_service( ControlClient client, char* args ) 2724e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine{ 272594a2fba98924c6684650d66409934358cb0c9d09Vladimir Chtchetkine ProxyFramebuffer* core_fb; 2726e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine const char* protocol = "-raw"; // Default framebuffer exchange protocol. 27277a5ee57895822a769f48ab40e590711a2459e2d1David 'Digit' Turner char reply_buf[64]; 2728e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine 2729e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine // Protocol type is defined by the arguments passed with the stream switch 2730e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine // command. 2731e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine if (args != NULL && *args != '\0') { 2732e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine size_t token_len; 2733e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine const char* param_end = strchr(args, ' '); 2734e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine if (param_end == NULL) { 2735e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine param_end = args + strlen(args); 2736e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine } 2737e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine token_len = param_end - args; 2738e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine protocol = args; 2739e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine 2740e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine // Make sure that this is one of the supported protocols. 2741e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine if (strncmp(protocol, "-raw", token_len) && 2742e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine strncmp(protocol, "-shared", token_len)) { 2743e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine derror("Invalid framebuffer parameter %s\n", protocol); 2744e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine control_write( client, "KO: Invalid parameter\r\n" ); 2745e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine control_client_destroy(client); 2746e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine return -1; 2747e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine } 2748e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine } 2749e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine 27507a5ee57895822a769f48ab40e590711a2459e2d1David 'Digit' Turner core_fb = proxyFb_create(client->sock, protocol); 27517a5ee57895822a769f48ab40e590711a2459e2d1David 'Digit' Turner if (core_fb == NULL) { 2752e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine control_write( client, "KO\r\n" ); 2753e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine control_client_destroy(client); 2754e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine return -1; 2755e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine } 2756e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine 27577a5ee57895822a769f48ab40e590711a2459e2d1David 'Digit' Turner // Reply "OK" with the framebuffer's bits per pixel 27587a5ee57895822a769f48ab40e590711a2459e2d1David 'Digit' Turner snprintf(reply_buf, sizeof(reply_buf), "OK: -bitsperpixel=%d\r\n", 27597a5ee57895822a769f48ab40e590711a2459e2d1David 'Digit' Turner proxyFb_get_bits_per_pixel(core_fb)); 27607a5ee57895822a769f48ab40e590711a2459e2d1David 'Digit' Turner control_write( client, reply_buf); 2761e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine return 0; 2762e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine} 27639411a562e1ab772732a4d5147c9103a638837c82Vladimir Chtchetkine 27649411a562e1ab772732a4d5147c9103a638837c82Vladimir Chtchetkinestatic int 27659411a562e1ab772732a4d5147c9103a638837c82Vladimir Chtchetkinedo_create_user_events_service( ControlClient client, char* args ) 27669411a562e1ab772732a4d5147c9103a638837c82Vladimir Chtchetkine{ 27676b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine // Make sure that there are no user events client already existing. 27689411a562e1ab772732a4d5147c9103a638837c82Vladimir Chtchetkine if (user_events_client != NULL) { 27699411a562e1ab772732a4d5147c9103a638837c82Vladimir Chtchetkine control_write( client, "KO: Another user events service is already existing!\r\n" ); 27709411a562e1ab772732a4d5147c9103a638837c82Vladimir Chtchetkine control_client_destroy(client); 27719411a562e1ab772732a4d5147c9103a638837c82Vladimir Chtchetkine return -1; 27729411a562e1ab772732a4d5147c9103a638837c82Vladimir Chtchetkine } 27739411a562e1ab772732a4d5147c9103a638837c82Vladimir Chtchetkine 2774250b2e00af04f8407dea564e643dad4ef08b8a88Vladimir Chtchetkine if (!userEventsImpl_create(client->sock)) { 27759411a562e1ab772732a4d5147c9103a638837c82Vladimir Chtchetkine char reply_buf[4096]; 27769411a562e1ab772732a4d5147c9103a638837c82Vladimir Chtchetkine user_events_client = client; 27779411a562e1ab772732a4d5147c9103a638837c82Vladimir Chtchetkine snprintf(reply_buf, sizeof(reply_buf), "OK\r\n"); 27789411a562e1ab772732a4d5147c9103a638837c82Vladimir Chtchetkine control_write( client, reply_buf); 27799411a562e1ab772732a4d5147c9103a638837c82Vladimir Chtchetkine } else { 27809411a562e1ab772732a4d5147c9103a638837c82Vladimir Chtchetkine control_write( client, "KO\r\n" ); 27819411a562e1ab772732a4d5147c9103a638837c82Vladimir Chtchetkine control_client_destroy(client); 27829411a562e1ab772732a4d5147c9103a638837c82Vladimir Chtchetkine return -1; 27839411a562e1ab772732a4d5147c9103a638837c82Vladimir Chtchetkine } 27849411a562e1ab772732a4d5147c9103a638837c82Vladimir Chtchetkine 27859411a562e1ab772732a4d5147c9103a638837c82Vladimir Chtchetkine return 0; 27869411a562e1ab772732a4d5147c9103a638837c82Vladimir Chtchetkine} 27876ee1c4edbd30b7c7aff9d6e13793207278aa1660Vladimir Chtchetkine 27886ee1c4edbd30b7c7aff9d6e13793207278aa1660Vladimir Chtchetkinevoid 2789250b2e00af04f8407dea564e643dad4ef08b8a88Vladimir Chtchetkinedestroy_user_events_client(void) 27906ee1c4edbd30b7c7aff9d6e13793207278aa1660Vladimir Chtchetkine{ 27916ee1c4edbd30b7c7aff9d6e13793207278aa1660Vladimir Chtchetkine if (user_events_client != NULL) { 27926ee1c4edbd30b7c7aff9d6e13793207278aa1660Vladimir Chtchetkine control_client_destroy(user_events_client); 27936ee1c4edbd30b7c7aff9d6e13793207278aa1660Vladimir Chtchetkine } 27946ee1c4edbd30b7c7aff9d6e13793207278aa1660Vladimir Chtchetkine} 27956b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine 27966b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkinestatic int 27976b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkinedo_create_ui_core_ctl_service( ControlClient client, char* args ) 27986b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine{ 27996b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine // Make sure that there are no ui control client already existing. 28006b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine if (ui_core_ctl_client != NULL) { 28016b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine control_write( client, "KO: Another UI control service is already existing!\r\n" ); 28026b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine control_client_destroy(client); 28036b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine return -1; 28046b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine } 28056b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine 2806777eb68eb60cac18f4b62e2e1b14a906875cbe7aVladimir Chtchetkine if (!coreCmdImpl_create(client->sock)) { 28076b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine char reply_buf[4096]; 28086b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine ui_core_ctl_client = client; 28096b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine snprintf(reply_buf, sizeof(reply_buf), "OK\r\n"); 28106b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine control_write( client, reply_buf); 28116b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine } else { 28126b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine control_write( client, "KO\r\n" ); 28136b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine control_client_destroy(client); 28146b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine return -1; 28156b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine } 28166b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine 28176b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine return 0; 28186b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine} 28196b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine 28206b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkinevoid 28216b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkinedestroy_ui_core_ctl_client(void) 28226b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine{ 28236b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine if (ui_core_ctl_client != NULL) { 28246b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine control_client_destroy(ui_core_ctl_client); 28256b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine } 28266b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine} 28276b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine 2828777eb68eb60cac18f4b62e2e1b14a906875cbe7aVladimir Chtchetkinevoid 2829777eb68eb60cac18f4b62e2e1b14a906875cbe7aVladimir Chtchetkinedestroy_corecmd_client(void) 2830777eb68eb60cac18f4b62e2e1b14a906875cbe7aVladimir Chtchetkine{ 2831777eb68eb60cac18f4b62e2e1b14a906875cbe7aVladimir Chtchetkine if (ui_core_ctl_client != NULL) { 2832777eb68eb60cac18f4b62e2e1b14a906875cbe7aVladimir Chtchetkine control_client_destroy(ui_core_ctl_client); 2833777eb68eb60cac18f4b62e2e1b14a906875cbe7aVladimir Chtchetkine } 2834777eb68eb60cac18f4b62e2e1b14a906875cbe7aVladimir Chtchetkine} 2835777eb68eb60cac18f4b62e2e1b14a906875cbe7aVladimir Chtchetkine 28366b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkinestatic int 28376b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkinedo_create_core_ui_ctl_service( ControlClient client, char* args ) 28386b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine{ 28396b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine // Make sure that there are no ui control client already existing. 28406b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine if (core_ui_ctl_client != NULL) { 28416b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine control_write( client, "KO: Another UI control service is already existing!\r\n" ); 28426b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine control_client_destroy(client); 28436b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine return -1; 28446b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine } 28456b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine 2846777eb68eb60cac18f4b62e2e1b14a906875cbe7aVladimir Chtchetkine if (!uiCmdProxy_create(client->sock)) { 28476b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine char reply_buf[4096]; 28486b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine core_ui_ctl_client = client; 28496b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine snprintf(reply_buf, sizeof(reply_buf), "OK\r\n"); 28506b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine control_write( client, reply_buf); 28516b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine } else { 28526b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine control_write( client, "KO\r\n" ); 28536b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine control_client_destroy(client); 28546b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine return -1; 28556b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine } 28566b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine 28576b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine return 0; 28586b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine} 28596b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine 28606b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkinevoid 28616b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkinedestroy_core_ui_ctl_client(void) 28626b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine{ 28636b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine if (core_ui_ctl_client != NULL) { 28646b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine control_client_destroy(core_ui_ctl_client); 28656b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine } 28666b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine} 2867777eb68eb60cac18f4b62e2e1b14a906875cbe7aVladimir Chtchetkine 2868777eb68eb60cac18f4b62e2e1b14a906875cbe7aVladimir Chtchetkinevoid 2869777eb68eb60cac18f4b62e2e1b14a906875cbe7aVladimir Chtchetkinedestroy_uicmd_client(void) 2870777eb68eb60cac18f4b62e2e1b14a906875cbe7aVladimir Chtchetkine{ 2871777eb68eb60cac18f4b62e2e1b14a906875cbe7aVladimir Chtchetkine if (core_ui_ctl_client != NULL) { 2872777eb68eb60cac18f4b62e2e1b14a906875cbe7aVladimir Chtchetkine control_client_destroy(core_ui_ctl_client); 2873777eb68eb60cac18f4b62e2e1b14a906875cbe7aVladimir Chtchetkine } 2874777eb68eb60cac18f4b62e2e1b14a906875cbe7aVladimir Chtchetkine} 2875777eb68eb60cac18f4b62e2e1b14a906875cbe7aVladimir Chtchetkine 2876e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine#endif // CONFIG_STANDALONE_CORE 2877e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine 2878e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turnerstatic const CommandDefRec qemu_commands[] = 2879e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner{ 2880e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner { "monitor", "enter QEMU monitor", 2881e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner "Enter the QEMU virtual machine monitor\r\n", 2882e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner NULL, do_qemu_monitor, NULL }, 2883e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner 2884e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine#ifdef CONFIG_STANDALONE_CORE 2885a473d81826d44905bc0d7ec8c9b39aef1cf87fb7Vladimir Chtchetkine { "attach-UI", "attach UI to the core", 2886d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine "Attach UI to the core\r\n", 2887d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine NULL, do_attach_ui, NULL }, 2888d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine 2889e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine { "framebuffer", "create framebuffer service", 2890e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine "Create framebuffer service\r\n", 2891e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine NULL, do_create_framebuffer_service, NULL }, 28929411a562e1ab772732a4d5147c9103a638837c82Vladimir Chtchetkine 2893a473d81826d44905bc0d7ec8c9b39aef1cf87fb7Vladimir Chtchetkine { "user-events", "create user events service", 28949411a562e1ab772732a4d5147c9103a638837c82Vladimir Chtchetkine "Create user events service\r\n", 28959411a562e1ab772732a4d5147c9103a638837c82Vladimir Chtchetkine NULL, do_create_user_events_service, NULL }, 28966b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine 2897a473d81826d44905bc0d7ec8c9b39aef1cf87fb7Vladimir Chtchetkine { "ui-core-control", "create UI control service", 28986b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine "Create UI control service\r\n", 28996b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine NULL, do_create_ui_core_ctl_service, NULL }, 29006b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine 2901a473d81826d44905bc0d7ec8c9b39aef1cf87fb7Vladimir Chtchetkine { "core-ui-control", "create UI control service", 29026b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine "Create UI control service\r\n", 29036b985d708d64008eee69fe0c3f03c6e3c61e7f73Vladimir Chtchetkine NULL, do_create_core_ui_ctl_service, NULL }, 2904e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine#endif // CONFIG_STANDALONE_CORE 2905e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine 2906e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner { NULL, NULL, NULL, NULL, NULL, NULL } 2907e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner}; 2908e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner 2909e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner 2910e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner/********************************************************************************************/ 2911e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner/********************************************************************************************/ 2912e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner/***** ******/ 29138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** M A I N C O M M A N D S ******/ 29148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 29158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 29168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 29178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 29188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 29198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_kill( ControlClient client, char* args ) 29208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2921d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine control_write( client, "OK: killing emulator, bye bye\r\n" ); 2922d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine exit(0); 29238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 29248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 29258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const CommandDefRec main_commands[] = 29268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 29278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "help|h|?", "print a list of commands", NULL, NULL, do_help, NULL }, 29288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 29298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "event", "simulate hardware events", 29308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "allows you to send fake hardware events to the kernel\r\n", NULL, 29318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, event_commands }, 29328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 29338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "geo", "Geo-location commands", 29348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "allows you to change Geo-related settings, or to send GPS NMEA sentences\r\n", NULL, 29358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, geo_commands }, 29368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 29378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "gsm", "GSM related commands", 29388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "allows you to change GSM-related settings, or to make a new inbound phone call\r\n", NULL, 29398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, gsm_commands }, 29408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 29411a000857bb7eef298efa787699050884f92311feJaime Lopez { "cdma", "CDMA related commands", 29421a000857bb7eef298efa787699050884f92311feJaime Lopez "allows you to change CDMA-related settings\r\n", NULL, 29431a000857bb7eef298efa787699050884f92311feJaime Lopez NULL, cdma_commands }, 29441a000857bb7eef298efa787699050884f92311feJaime Lopez 29458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "kill", "kill the emulator instance", NULL, NULL, 2946d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine do_kill, NULL }, 29478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 29488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "network", "manage network settings", 29498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "allows you to manage the settings related to the network data connection of the\r\n" 29508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "emulated device.\r\n", NULL, 29518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, network_commands }, 29528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 29538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "power", "power related commands", 29548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "allows to change battery and AC power status\r\n", NULL, 29558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, power_commands }, 29568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 29578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "quit|exit", "quit control session", NULL, NULL, 29588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_quit, NULL }, 29598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 29608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "redir", "manage port redirections", 29618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "allows you to add, list and remove UDP and/or PORT redirection from the host to the device\r\n" 29628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "as an example, 'redir tcp:5000:6000' will route any packet sent to the host's TCP port 5000\r\n" 29638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "to TCP port 6000 of the emulated device\r\n", NULL, 29648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, redir_commands }, 29658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 29668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "sms", "SMS related commands", 29678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "allows you to simulate an inbound SMS\r\n", NULL, 29688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, sms_commands }, 29698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 29702ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije { "avd", "control virtual device execution", 29712ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije "allows you to control (e.g. start/stop) the execution of the virtual device\r\n", NULL, 29728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, vm_commands }, 29738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 29748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "window", "manage emulator window", 29758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "allows you to modify the emulator window\r\n", NULL, 29768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, window_commands }, 29778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2978e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner { "qemu", "QEMU-specific commands", 2979e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner "allows to connect to the QEMU virtual machine monitor\r\n", NULL, 2980e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner NULL, qemu_commands }, 2981e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner 2982736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan { "sensor", "manage emulator sensors", 2983736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan "allows you to request the emulator sensors\r\n", NULL, 2984736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan NULL, sensor_commands }, 2985736e01f86f4ec4049bb5795f1ddb979132b05333Tim Wan 29868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { NULL, NULL, NULL, NULL, NULL, NULL } 29878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 29888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 29898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 29908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic ControlGlobalRec _g_global; 29918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 29928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint 29938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectcontrol_console_start( int port ) 29948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 29958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return control_global_init( &_g_global, port ); 29968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2997