console.c revision 4c6b10a4f385c04dbd7226e10a86a1f5cbd34f2a
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 "sockets.h" 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "cpu.h" 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "hw/goldfish_device.h" 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "hw/power_supply.h" 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "shaper.h" 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "modem_driver.h" 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/gps.h" 358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/globals.h" 368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/bufprint.h" 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/debug.h" 388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/stralloc.h" 392ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije#include "android/config/config.h" 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "tcpdump.h" 415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "net.h" 42e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner#include "monitor.h" 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <stdlib.h> 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <stdio.h> 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <stdarg.h> 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <string.h> 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <unistd.h> 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <fcntl.h> 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/hw-events.h" 5134f2974ce7ec7c71beb47b5daf9089d5c8c40c79David 'Digit' Turner#include "user-events.h" 5271bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine#include "android/keycode-array.h" 5371bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine#include "android/charmap.h" 542fa5173bd1ce7341c50adac676a317945f0969c7Vladimir Chtchetkine#include "android/core-ui-protocol.h" 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(CONFIG_SLIRP) 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "libslirp.h" 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define DEBUG 1 618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if 1 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define D_ACTIVE VERBOSE_CHECK(console) 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define D_ACTIVE DEBUG 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if DEBUG 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define D(x) do { if (D_ACTIVE) ( printf x , fflush(stdout) ); } while (0) 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define D(x) do{}while(0) 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct ControlGlobalRec_* ControlGlobal; 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct ControlClientRec_* ControlClient; 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct { 798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int host_port; 808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int host_udp; 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned int guest_ip; 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int guest_port; 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} RedirRec, *Redir; 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 86e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turnertypedef int Socket; 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct ControlClientRec_ 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project struct ControlClientRec_* next; /* next client in list */ 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Socket sock; /* socket used for communication */ 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ControlGlobal global; 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char finished; 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char buff[ 4096 ]; 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int buff_len; 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} ControlClientRec; 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct ControlGlobalRec_ 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* listening socket */ 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Socket listen_fd; 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* the list of current clients */ 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ControlClient clients; 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* the list of redirections currently active */ 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Redir redirs; 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int num_redirs; 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int max_redirs; 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} ControlGlobalRec; 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 115d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine/* UI client currently attached to the core. */ 116d87b080495e71ada650b165a1f06616b433e6073Vladimir ChtchetkineControlClient attached_ui_client = NULL; 1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectcontrol_global_add_redir( ControlGlobal global, 1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int host_port, 1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int host_udp, 1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned int guest_ip, 1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int guest_port ) 1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Redir redir; 1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (global->num_redirs >= global->max_redirs) 1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int old_max = global->max_redirs; 1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int new_max = old_max + (old_max >> 1) + 4; 1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Redir new_redirs = realloc( global->redirs, new_max*sizeof(global->redirs[0]) ); 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (new_redirs == NULL) 1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project global->redirs = new_redirs; 1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project global->max_redirs = new_max; 1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project redir = &global->redirs[ global->num_redirs++ ]; 1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project redir->host_port = host_port; 1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project redir->host_udp = host_udp; 1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project redir->guest_ip = guest_ip; 1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project redir->guest_port = guest_port; 1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectcontrol_global_del_redir( ControlGlobal global, 1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int host_port, 1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int host_udp ) 1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; nn < global->num_redirs; nn++) 1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Redir redir = &global->redirs[nn]; 1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( redir->host_port == host_port && 1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project redir->host_udp == host_udp ) 1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project memmove( redir, redir + 1, ((global->num_redirs - nn)-1)*sizeof(*redir) ); 1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project global->num_redirs -= 1; 1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* we didn't find it */ 1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 173e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner/* Detach the socket descriptor from a given ControlClient 174e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner * and return its value. This is useful either when destroying 175e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner * the client, or redirecting the socket to another service. 176e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner * 177e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner * NOTE: this does not close the socket. 178e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner */ 179e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turnerstatic int 180e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turnercontrol_client_detach( ControlClient client ) 181e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner{ 182e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner int result; 183e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner 184e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner if (client->sock < 0) 185e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner return -1; 186e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner 187e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner qemu_set_fd_handler( client->sock, NULL, NULL, NULL ); 188e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner result = client->sock; 189e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner client->sock = -1; 190e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner 191e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner return result; 192e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner} 193e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner 194e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turnerstatic void control_client_read( void* _client ); /* forward */ 195e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner 196e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner/* Reattach a control client to a given socket. 197e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner * Return the old socket descriptor for the client. 198e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner */ 199e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turnerstatic int 200e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turnercontrol_client_reattach( ControlClient client, int fd ) 201e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner{ 202e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner int result = control_client_detach(client); 203e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner client->sock = fd; 204e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner qemu_set_fd_handler( fd, control_client_read, NULL, client ); 205e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner return result; 206e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner} 207e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner 2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectcontrol_client_destroy( ControlClient client ) 2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ControlGlobal global = client->global; 2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ControlClient *pnode = &global->clients; 213e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner int sock; 2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D(( "destroying control client %p\n", client )); 2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 217d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine if (client == attached_ui_client) { 218d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine attached_ui_client = NULL; 219d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine } 220d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine 221e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner sock = control_client_detach( client ); 222e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner if (sock >= 0) 223e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner socket_close(sock); 2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ;; ) { 2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ControlClient node = *pnode; 2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( node == NULL ) 2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( node == client ) { 2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *pnode = node->next; 2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project node->next = NULL; 2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project pnode = &node->next; 2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project free( client ); 2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void control_control_write( ControlClient client, const char* buff, int len ) 2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int ret; 2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (len < 0) 2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project len = strlen(buff); 2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (len > 0) { 2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = socket_send( client->sock, buff, len); 2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret < 0) { 252ce0f4b02160ee72d7d2428867fe757bc37c68c98David 'Digit' Turner if (errno != EINTR && errno != EWOULDBLOCK && errno != EAGAIN) 2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project buff += ret; 2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project len -= ret; 2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2612ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thijestatic int control_vwrite( ControlClient client, const char* format, va_list args ) 2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static char temp[1024]; 2642ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije int ret = vsnprintf( temp, sizeof(temp), format, args ); 2652ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije temp[ sizeof(temp)-1 ] = 0; 2662ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije control_control_write( client, temp, -1 ); 2672ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 2682ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije return ret; 2692ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije} 2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2712ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thijestatic int control_write( ControlClient client, const char* format, ... ) 2722ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije{ 2732ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije int ret; 2742ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije va_list args; 2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project va_start(args, format); 2762ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije ret = control_vwrite(client, format, args); 2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project va_end(args); 2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2792ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije return ret; 2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic ControlClient 2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectcontrol_client_create( Socket socket, 2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ControlGlobal global ) 2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ControlClient client = calloc( sizeof(*client), 1 ); 2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (client) { 2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project socket_set_nodelay( socket ); 2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project socket_set_nonblock( socket ); 2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project client->finished = 0; 2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project client->global = global; 2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project client->sock = socket; 2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project client->next = global->clients; 2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project global->clients = client; 2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_set_fd_handler( socket, control_client_read, NULL, client ); 2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return client; 3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef const struct CommandDefRec_ *CommandDef; 3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct CommandDefRec_ { 3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* names; 3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* abstract; 3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* description; 3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void (*descriptor)( ControlClient client ); 3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int (*handler)( ControlClient client, char* args ); 3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project CommandDef subcommands; /* if handler is NULL */ 3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} CommandDefRec; 3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const CommandDefRec main_commands[]; /* forward */ 3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic CommandDef 3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfind_command( char* input, CommandDef commands, char* *pend, char* *pargs ) 3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* args = strchr(input, ' '); 3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (args != NULL) { 3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (*args == ' ') 3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args++; 3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (args[0] == 0) 3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args = NULL; 3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; commands[nn].names != NULL; nn++) 3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* name = commands[nn].names; 3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* sep; 3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do { 3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int len, c; 3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sep = strchr( name, '|' ); 3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (sep) 3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project len = sep - name; 3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project len = strlen(name); 3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project c = input[len]; 3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !memcmp( name, input, len ) && (c == ' ' || c == 0) ) { 3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *pend = input + len; 3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *pargs = args; 3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return &commands[nn]; 3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (sep) 3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project name = sep + 1; 3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } while (sep != NULL && *name); 3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* NOTE: don't touch *pend and *pargs if no command is found */ 3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdump_help( ControlClient client, 3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project CommandDef cmd, 3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* prefix ) 3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (cmd->description) { 3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "%s", cmd->description ); 3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (cmd->descriptor) { 3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cmd->descriptor( client ); 3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else 3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "%s\r\n", cmd->abstract ); 3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (cmd->subcommands) { 3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cmd = cmd->subcommands; 3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "\r\navailable sub-commands:\r\n" ); 3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ; cmd->names != NULL; cmd++ ) { 3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, " %s %-15s %s\r\n", prefix, cmd->names, cmd->abstract ); 3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "\r\n" ); 3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectcontrol_client_do_command( ControlClient client ) 3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* line = client->buff; 3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* args = NULL; 3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project CommandDef commands = main_commands; 3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* cmdend = client->buff; 3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project CommandDef cmd = find_command( line, commands, &cmdend, &args ); 3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (cmd == NULL) { 3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: unknown command, try 'help'\r\n" ); 3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (;;) { 3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project CommandDef subcmd; 3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (cmd->handler) { 401d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine if ( !cmd->handler( client, args ) ) { 4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "OK\r\n" ); 403d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine } 4048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* no handler means we should have sub-commands */ 4088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (cmd->subcommands == NULL) { 4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: internal error: buggy command table for '%.*s'\r\n", 4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cmdend - client->buff, client->buff ); 4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* we need a sub-command here */ 4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !args ) { 4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dump_help( client, cmd, "" ); 4178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: missing sub-command\r\n" ); 4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project line = args; 4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project commands = cmd->subcommands; 4238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project subcmd = find_command( line, commands, &cmdend, &args ); 4248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (subcmd == NULL) { 4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dump_help( client, cmd, "" ); 4268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: bad sub-command\r\n" ); 4278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 4288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cmd = subcmd; 4308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* implement the 'help' command */ 4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 4358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_help( ControlClient client, char* args ) 4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* line; 4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* start = args; 4398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end = start; 4408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project CommandDef cmd = main_commands; 4418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* without arguments, simply dump all commands */ 4438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (args == NULL) { 4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "Android console command help:\r\n\r\n" ); 4458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ; cmd->names != NULL; cmd++ ) { 4468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, " %-15s %s\r\n", cmd->names, cmd->abstract ); 4478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "\r\ntry 'help <command>' for command-specific help\r\n" ); 4498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 4508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* with an argument, find the corresponding command */ 4538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (;;) { 4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project CommandDef subcmd; 4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project line = args; 4578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project subcmd = find_command( line, cmd, &end, &args ); 4588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (subcmd == NULL) { 4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "try one of these instead:\r\n\r\n" ); 4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ; cmd->names != NULL; cmd++ ) { 4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, " %.*s %s\r\n", 4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project end - start, start, cmd->names ); 4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "\r\nKO: unknown command\r\n" ); 4658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 4668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !args || !subcmd->subcommands ) { 4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dump_help( client, subcmd, start ); 4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 4718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cmd = subcmd->subcommands; 4738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 4788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectcontrol_client_read_byte( ControlClient client, unsigned char ch ) 4798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ch == '\r') 4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* filter them out */ 4838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (ch == '\n') 4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project client->buff[ client->buff_len ] = 0; 4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_client_do_command( client ); 4888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (client->finished) 4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 4908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project client->buff_len = 0; 4928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 4948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (client->buff_len >= sizeof(client->buff)-1) 4968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project client->buff_len = 0; 4978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project client->buff[ client->buff_len++ ] = ch; 4998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 5038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectcontrol_client_read( void* _client ) 5048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ControlClient client = _client; 5068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned char buf[4096]; 5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int size; 5088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D(( "in control_client read: " )); 5108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project size = socket_recv( client->sock, buf, sizeof(buf) ); 5118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (size < 0) { 5128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D(( "size < 0, exiting with %d: %s\n", errno, errno_str )); 513d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine if (errno != EWOULDBLOCK && errno != EAGAIN) 514d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine control_client_destroy( client ); 5158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 5168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (size == 0) { 5198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* end of connection */ 5208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D(( "end of connection detected !!\n" )); 5218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_client_destroy( client ); 5228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else { 5248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 5258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32 5268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# if DEBUG 5278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char temp[16]; 5288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int count = size > sizeof(temp)-1 ? sizeof(temp)-1 : size; 5298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; nn < count; nn++) { 5308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int c = buf[nn]; 5318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (c == '\n') 5328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project temp[nn] = '!'; 5338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (c < 32) 5348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project temp[nn] = '.'; 5358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 5368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project temp[nn] = (char)c; 5378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project temp[nn] = 0; 5398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D(( "received %d bytes: %s\n", size, temp )); 5408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif 5418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 5428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D(( "received %.*s\n", size, buf )); 5438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 5448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; nn < size; nn++) { 5458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_client_read_byte( client, buf[nn] ); 5468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (client->finished) { 5478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_client_destroy(client); 5488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 5498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* this function is called on each new client connection */ 5568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 5578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectcontrol_global_accept( void* _global ) 5588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ControlGlobal global = _global; 5608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ControlClient client; 5618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Socket fd; 5628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 56380bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner D(( "control_global_accept: just in (fd=%d)\n", global->listen_fd )); 5648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for(;;) { 5668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fd = socket_accept( global->listen_fd, NULL ); 5678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (fd < 0 && errno != EINTR) { 5688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D(( "problem in accept: %d: %s\n", errno, errno_str )); 5698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project perror("accept"); 5708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 5718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (fd >= 0) { 5728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 5738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D(( "relooping in accept()\n" )); 5758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project socket_set_xreuseaddr( fd ); 5788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D(( "control_global_accept: creating new client\n" )); 5808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project client = control_client_create( fd, global ); 5818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (client) { 5828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D(( "control_global_accept: new client %p\n", client )); 5838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "Android Console: type 'help' for a list of commands\r\n" ); 5848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "OK\r\n" ); 5858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 5908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectcontrol_global_init( ControlGlobal global, 5918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int control_port ) 5928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Socket fd; 5948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int ret; 5958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SockAddress sockaddr; 5968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project memset( global, 0, sizeof(*global) ); 5988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fd = socket_create_inet( SOCKET_STREAM ); 6008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (fd < 0) { 6018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project perror("socket"); 6028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 6038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project socket_set_xreuseaddr( fd ); 6068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sock_address_init_inet( &sockaddr, SOCK_ADDRESS_INET_LOOPBACK, control_port ); 6088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = socket_bind(fd, &sockaddr ); 6108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret < 0) { 6118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project perror("bind"); 6128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project socket_close( fd ); 6138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 6148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = socket_listen(fd, 0); 6178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret < 0) { 6188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project perror("listen"); 6198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project socket_close( fd ); 6208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 6218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project socket_set_nonblock(fd); 6248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project global->listen_fd = fd; 6268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_set_fd_handler( fd, control_global_accept, NULL, global ); 6288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 6298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 6348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_quit( ControlClient client, char* args ) 6358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project client->finished = 1; 6378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 6388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 6418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 6428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 6438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** N E T W O R K S E T T I N G S ******/ 6448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 6458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 6468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 6478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 6498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_network_status( ControlClient client, char* args ) 6508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "Current network status:\r\n" ); 6528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, " download speed: %8d bits/s (%.1f KB/s)\r\n", 6548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (long)qemu_net_download_speed, qemu_net_download_speed/8192. ); 6558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, " upload speed: %8d bits/s (%.1f KB/s)\r\n", 6578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (long)qemu_net_upload_speed, qemu_net_upload_speed/8192. ); 6588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, " minimum latency: %ld ms\r\n", qemu_net_min_latency ); 6608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, " maximum latency: %ld ms\r\n", qemu_net_max_latency ); 6618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 6628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 6658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdump_network_speeds( ControlClient client ) 6668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const NetworkSpeed* speed = android_netspeeds; 6688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* const format = " %-8s %s\r\n"; 6698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ; speed->name; speed++ ) { 6708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, format, speed->name, speed->display ); 6718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, format, "<num>", "selects both upload and download speed" ); 6738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, format, "<up>:<down>", "select individual upload/download speeds" ); 6748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 6788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_network_speed( ControlClient client, char* args ) 6798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !args ) { 6818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: missing <speed> argument, see 'help network speed'\r\n" ); 6828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 6838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( android_parse_network_speed( args ) < 0 ) { 6858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: invalid <speed> argument, see 'help network speed' for valid values\r\n" ); 6868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 6878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project netshaper_set_rate( slirp_shaper_in, qemu_net_download_speed ); 6908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project netshaper_set_rate( slirp_shaper_out, qemu_net_upload_speed ); 6918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (android_modem) { 69371bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine amodem_set_data_network_type( android_modem, 6948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_parse_network_type( args ) ); 6958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 6978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 7008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdescribe_network_speed( ControlClient client ) 7018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, 7038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'network speed <speed>' allows you to dynamically change the speed of the emulated\r\n" 7048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "network on the device, where <speed> is one of the following:\r\n\r\n" ); 7058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dump_network_speeds( client ); 7068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 7098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_network_delay( ControlClient client, char* args ) 7108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !args ) { 7128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: missing <delay> argument, see 'help network delay'\r\n" ); 7138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 7148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( android_parse_network_latency( args ) < 0 ) { 7168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: invalid <delay> argument, see 'help network delay' for valid values\r\n" ); 7178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 7188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project netdelay_set_latency( slirp_delay_in, qemu_net_min_latency, qemu_net_max_latency ); 7208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 7218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 7248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdescribe_network_delay( ControlClient client ) 7258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, 7278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'network delay <latency>' allows you to dynamically change the latency of the emulated\r\n" 7288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "network on the device, where <latency> is one of the following:\r\n\r\n" ); 7298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* XXX: TODO */ 7308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 7338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_network_capture_start( ControlClient client, char* args ) 7348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !args ) { 7368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: missing <file> argument, see 'help network capture start'\r\n" ); 7378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 7388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( qemu_tcpdump_start(args) < 0) { 7408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: could not start capture: %s", strerror(errno) ); 7418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 7428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 7448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 7478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_network_capture_stop( ControlClient client, char* args ) 7488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* no need to return an error here */ 7508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_tcpdump_stop(); 7518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 7528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const CommandDefRec network_capture_commands[] = 7558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "start", "start network capture", 7578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'network capture start <file>' starts a new capture of network packets\r\n" 7588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "into a specific <file>. This will stop any capture already in progress.\r\n" 7598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "the capture file can later be analyzed by tools like WireShark. It uses\r\n" 7608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "the libpcap file format.\r\n\r\n" 7618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "you can stop the capture anytime with 'network capture stop'\r\n", NULL, 7628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_network_capture_start, NULL }, 7638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "stop", "stop network capture", 7658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'network capture stop' stops a currently running packet capture, if any.\r\n" 7668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "you can start one with 'network capture start <file>'\r\n", NULL, 7678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_network_capture_stop, NULL }, 7688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { NULL, NULL, NULL, NULL, NULL, NULL } 7708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 7718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const CommandDefRec network_commands[] = 7738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "status", "dump network status", NULL, NULL, 7758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_network_status, NULL }, 7768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "speed", "change network speed", NULL, describe_network_speed, 7788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_network_speed, NULL }, 7798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "delay", "change network latency", NULL, describe_network_delay, 7818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_network_delay, NULL }, 7828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "capture", "dump network packets to file", 7848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "allows to start/stop capture of network packets to a file for later analysis\r\n", NULL, 7858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, network_capture_commands }, 7868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { NULL, NULL, NULL, NULL, NULL, NULL } 7888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 7898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 7918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 7928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 7938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** P O R T R E D I R E C T I O N S ******/ 7948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 7958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 7968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 7978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 7998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_redir_list( ControlClient client, char* args ) 8008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 8018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ControlGlobal global = client->global; 8028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (global->num_redirs == 0) 8048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "no active redirections\r\n" ); 8058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else { 8068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 8078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; nn < global->num_redirs; nn++) { 8088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Redir redir = &global->redirs[nn]; 8098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "%s:%-5d => %-5d\r\n", 8108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project redir->host_udp ? "udp" : "tcp", 8118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project redir->host_port, 8128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project redir->guest_port ); 8138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 8168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* parse a protocol:port specification */ 8198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 8208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectredir_parse_proto_port( char* args, int *pport, int *pproto ) 8218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 8228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int proto = -1; 8238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int len = 0; 8248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 8258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !memcmp( args, "tcp:", 4 ) ) { 8278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project proto = 0; 8288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project len = 4; 8298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if ( !memcmp( args, "udp:", 4 ) ) { 8318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project proto = 1; 8328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project len = 4; 8338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 8358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 8368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args += len; 8388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *pproto = proto; 8398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *pport = strtol( args, &end, 10 ); 8408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (end == args) 8418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 8428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project len += end - args; 8448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return len; 8458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 8488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectredir_parse_guest_port( char* arg, int *pport ) 8498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 8508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 8518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *pport = strtoul( arg, &end, 10 ); 8538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (end == arg) 8548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 8558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return end - arg; 8578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic Redir 8608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectredir_find( ControlGlobal global, int port, int isudp ) 8618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 8628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 8638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; nn < global->num_redirs; nn++) { 8658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Redir redir = &global->redirs[nn]; 8668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (redir->host_port == port && redir->host_udp == isudp) 8688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return redir; 8698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 8718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 8758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_redir_add( ControlClient client, char* args ) 8768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 8778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int len, host_proto, host_port, guest_port; 8788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t guest_ip; 8798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Redir redir; 8808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !args ) 8828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto BadFormat; 8838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!slirp_is_inited()) { 8855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner control_write( client, "KO: network emulation disabled\r\n"); 8865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return -1; 8878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project len = redir_parse_proto_port( args, &host_port, &host_proto ); 8908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (len == 0 || args[len] != ':') 8918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto BadFormat; 8928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args += len + 1; 8948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project len = redir_parse_guest_port( args, &guest_port ); 8958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (len == 0 || args[len] != 0) 8968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto BadFormat; 8978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project redir = redir_find( client->global, host_port, host_proto ); 8998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( redir != NULL ) { 9008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: host port already active, use 'redir del' to remove first\r\n" ); 9018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 9028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9047d9a2705e7ae6d8c4b1d9d5b4e2a67ab88c19044David Turner if (inet_strtoip("10.0.2.15", &guest_ip) < 0) { 9058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: unexpected internal failure when resolving 10.0.2.15\r\n" ); 9068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 9078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D(("pattern hport=%d gport=%d proto=%d\n", host_port, guest_port, host_proto )); 9108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( control_global_add_redir( client->global, host_port, host_proto, 9118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project guest_ip, guest_port ) < 0 ) 9128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: not enough memory to allocate redirection\r\n" ); 9148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 9158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (slirp_redir(host_proto, host_port, guest_ip, guest_port) < 0) { 9188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: can't setup redirection, port probably used by another program on host\r\n" ); 9198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_global_del_redir( client->global, host_port, host_proto ); 9208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 9218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 9248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectBadFormat: 9268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: bad redirection format, try (tcp|udp):hostport:guestport\r\n", -1 ); 9278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 9288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 9328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_redir_del( ControlClient client, char* args ) 9338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 9348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int len, proto, port; 9358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Redir redir; 9368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !args ) 9388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto BadFormat; 9398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project len = redir_parse_proto_port( args, &port, &proto ); 9408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( len == 0 || args[len] != 0 ) 9418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto BadFormat; 9428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project redir = redir_find( client->global, port, proto ); 9448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (redir == NULL) { 9458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: can't remove unknown redirection (%s:%d)\r\n", 9468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project proto ? "udp" : "tcp", port ); 9478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 9488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project slirp_unredir( redir->host_udp, redir->host_port ); 9518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_global_del_redir( client->global, port, proto );\ 9528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 9548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectBadFormat: 9568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: bad redirection format, try (tcp|udp):hostport\r\n" ); 9578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 9588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const CommandDefRec redir_commands[] = 9618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 9628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "list", "list current redirections", 9638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "list current port redirections. use 'redir add' and 'redir del' to add and remove them\r\n", NULL, 9648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_redir_list, NULL }, 9658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "add", "add new redirection", 9678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "add a new port redirection, arguments must be:\r\n\r\n" 9688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " redir add <protocol>:<host-port>:<guest-port>\r\n\r\n" 9698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "where: <protocol> is either 'tcp' or 'udp'\r\n" 9708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " <host-port> a number indicating which port on the host to open\r\n" 9718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " <guest-port> a number indicating which port to route to on the device\r\n" 9728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "\r\nas an example, 'redir tcp:5000:6000' will allow any packets sent to\r\n" 9738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "the host's TCP port 5000 to be routed to TCP port 6000 of the emulated device\r\n", NULL, 9748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_redir_add, NULL }, 9758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "del", "remove existing redirection", 9778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "remove a port redirecion that was created with 'redir add', arguments must be:\r\n\r\n" 9788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " redir del <protocol>:<host-port>\r\n\r\n" 9798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "see the 'help redir add' for the meaning of <protocol> and <host-port>\r\n", NULL, 9808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_redir_del, NULL }, 9818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { NULL, NULL, NULL, NULL, NULL, NULL } 9838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 9848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 9888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 9898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 9901a000857bb7eef298efa787699050884f92311feJaime Lopez/***** C D M A M O D E M ******/ 9911a000857bb7eef298efa787699050884f92311feJaime Lopez/***** ******/ 9921a000857bb7eef298efa787699050884f92311feJaime Lopez/********************************************************************************************/ 9931a000857bb7eef298efa787699050884f92311feJaime Lopez/********************************************************************************************/ 9941a000857bb7eef298efa787699050884f92311feJaime Lopez 9951a000857bb7eef298efa787699050884f92311feJaime Lopezstatic const struct { 9961a000857bb7eef298efa787699050884f92311feJaime Lopez const char * name; 9971a000857bb7eef298efa787699050884f92311feJaime Lopez const char * display; 9981a000857bb7eef298efa787699050884f92311feJaime Lopez ACdmaSubscriptionSource source; 9991a000857bb7eef298efa787699050884f92311feJaime Lopez} _cdma_subscription_sources[] = { 10001a000857bb7eef298efa787699050884f92311feJaime Lopez { "nv", "Read subscription from non-volatile RAM", A_SUBSCRIPTION_NVRAM }, 10011a000857bb7eef298efa787699050884f92311feJaime Lopez { "ruim", "Read subscription from RUIM", A_SUBSCRIPTION_RUIM }, 10021a000857bb7eef298efa787699050884f92311feJaime Lopez}; 10031a000857bb7eef298efa787699050884f92311feJaime Lopez 10041a000857bb7eef298efa787699050884f92311feJaime Lopezstatic void 10051a000857bb7eef298efa787699050884f92311feJaime Lopezdump_subscription_sources( ControlClient client ) 10061a000857bb7eef298efa787699050884f92311feJaime Lopez{ 10071a000857bb7eef298efa787699050884f92311feJaime Lopez int i; 10081a000857bb7eef298efa787699050884f92311feJaime Lopez for (i = 0; 10091a000857bb7eef298efa787699050884f92311feJaime Lopez i < sizeof(_cdma_subscription_sources) / sizeof(_cdma_subscription_sources[0]); 10101a000857bb7eef298efa787699050884f92311feJaime Lopez i++) { 10111a000857bb7eef298efa787699050884f92311feJaime Lopez control_write( client, " %s: %s\r\n", 10121a000857bb7eef298efa787699050884f92311feJaime Lopez _cdma_subscription_sources[i].name, 10131a000857bb7eef298efa787699050884f92311feJaime Lopez _cdma_subscription_sources[i].display ); 10141a000857bb7eef298efa787699050884f92311feJaime Lopez } 10151a000857bb7eef298efa787699050884f92311feJaime Lopez} 10161a000857bb7eef298efa787699050884f92311feJaime Lopez 10171a000857bb7eef298efa787699050884f92311feJaime Lopezstatic void 10181a000857bb7eef298efa787699050884f92311feJaime Lopezdescribe_subscription_source( ControlClient client ) 10191a000857bb7eef298efa787699050884f92311feJaime Lopez{ 10201a000857bb7eef298efa787699050884f92311feJaime Lopez control_write( client, 10211a000857bb7eef298efa787699050884f92311feJaime Lopez "'cdma ssource <ssource>' allows you to specify where to read the subscription from\r\n" ); 10221a000857bb7eef298efa787699050884f92311feJaime Lopez dump_subscription_sources( client ); 10231a000857bb7eef298efa787699050884f92311feJaime Lopez} 10241a000857bb7eef298efa787699050884f92311feJaime Lopez 10251a000857bb7eef298efa787699050884f92311feJaime Lopezstatic int 10261a000857bb7eef298efa787699050884f92311feJaime Lopezdo_cdma_ssource( ControlClient client, char* args ) 10271a000857bb7eef298efa787699050884f92311feJaime Lopez{ 10281a000857bb7eef298efa787699050884f92311feJaime Lopez int nn; 10291a000857bb7eef298efa787699050884f92311feJaime Lopez if (!args) { 10301a000857bb7eef298efa787699050884f92311feJaime Lopez control_write( client, "KO: missing argument, try 'cdma ssource <source>'\r\n" ); 10311a000857bb7eef298efa787699050884f92311feJaime Lopez return -1; 10321a000857bb7eef298efa787699050884f92311feJaime Lopez } 10331a000857bb7eef298efa787699050884f92311feJaime Lopez 10341a000857bb7eef298efa787699050884f92311feJaime Lopez for (nn = 0; ; nn++) { 10351a000857bb7eef298efa787699050884f92311feJaime Lopez const char* name = _cdma_subscription_sources[nn].name; 10361a000857bb7eef298efa787699050884f92311feJaime Lopez ACdmaSubscriptionSource ssource = _cdma_subscription_sources[nn].source; 10371a000857bb7eef298efa787699050884f92311feJaime Lopez 10381a000857bb7eef298efa787699050884f92311feJaime Lopez if (!name) 10391a000857bb7eef298efa787699050884f92311feJaime Lopez break; 10401a000857bb7eef298efa787699050884f92311feJaime Lopez 10411a000857bb7eef298efa787699050884f92311feJaime Lopez if (!strcasecmp( args, name )) { 10421a000857bb7eef298efa787699050884f92311feJaime Lopez amodem_set_cdma_subscription_source( android_modem, ssource ); 10431a000857bb7eef298efa787699050884f92311feJaime Lopez return 0; 10441a000857bb7eef298efa787699050884f92311feJaime Lopez } 10451a000857bb7eef298efa787699050884f92311feJaime Lopez } 10461a000857bb7eef298efa787699050884f92311feJaime Lopez control_write( client, "KO: Don't know source %s\r\n", args ); 10471a000857bb7eef298efa787699050884f92311feJaime Lopez return -1; 10481a000857bb7eef298efa787699050884f92311feJaime Lopez} 10491a000857bb7eef298efa787699050884f92311feJaime Lopez 10501a000857bb7eef298efa787699050884f92311feJaime Lopezstatic int 10511a000857bb7eef298efa787699050884f92311feJaime Lopezdo_cdma_prl_version( ControlClient client, char * args ) 10521a000857bb7eef298efa787699050884f92311feJaime Lopez{ 10531a000857bb7eef298efa787699050884f92311feJaime Lopez int version = 0; 10541a000857bb7eef298efa787699050884f92311feJaime Lopez char *endptr; 10551a000857bb7eef298efa787699050884f92311feJaime Lopez 10561a000857bb7eef298efa787699050884f92311feJaime Lopez if (!args) { 10571a000857bb7eef298efa787699050884f92311feJaime Lopez control_write( client, "KO: missing argument, try 'cdma prl_version <version>'\r\n"); 10581a000857bb7eef298efa787699050884f92311feJaime Lopez return -1; 10591a000857bb7eef298efa787699050884f92311feJaime Lopez } 10601a000857bb7eef298efa787699050884f92311feJaime Lopez 10611a000857bb7eef298efa787699050884f92311feJaime Lopez version = strtol(args, &endptr, 0); 10621a000857bb7eef298efa787699050884f92311feJaime Lopez if (endptr != args) { 10631a000857bb7eef298efa787699050884f92311feJaime Lopez amodem_set_cdma_prl_version( android_modem, version ); 10641a000857bb7eef298efa787699050884f92311feJaime Lopez } 106580bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner return 0; 10661a000857bb7eef298efa787699050884f92311feJaime Lopez} 10671a000857bb7eef298efa787699050884f92311feJaime Lopez/********************************************************************************************/ 10681a000857bb7eef298efa787699050884f92311feJaime Lopez/********************************************************************************************/ 10691a000857bb7eef298efa787699050884f92311feJaime Lopez/***** ******/ 10708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** G S M M O D E M ******/ 10718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 10728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 10738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 10748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const struct { 10768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* name; 10778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* display; 10788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARegistrationState state; 10798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} _gsm_states[] = { 10808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "unregistered", "no network available", A_REGISTRATION_UNREGISTERED }, 10818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "home", "on local network, non-roaming", A_REGISTRATION_HOME }, 10828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "roaming", "on roaming network", A_REGISTRATION_ROAMING }, 10838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "searching", "searching networks", A_REGISTRATION_SEARCHING }, 10848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "denied", "emergency calls only", A_REGISTRATION_DENIED }, 10858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "off", "same as 'unregistered'", A_REGISTRATION_UNREGISTERED }, 10868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "on", "same as 'home'", A_REGISTRATION_HOME }, 10878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { NULL, NULL, A_REGISTRATION_UNREGISTERED } 10888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 10898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const char* 10918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectgsm_state_to_string( ARegistrationState state ) 10928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 10938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 10948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; _gsm_states[nn].name != NULL; nn++) { 10958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (state == _gsm_states[nn].state) 10968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return _gsm_states[nn].name; 10978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return "<unknown>"; 10998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 11028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_gsm_status( ControlClient client, char* args ) 11038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 11048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (args) { 11058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: no argument required\r\n" ); 11068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 11078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_modem) { 11098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: modem emulation not running\r\n" ); 11108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 11118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "gsm voice state: %s\r\n", 11138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project gsm_state_to_string( 11148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project amodem_get_voice_registration(android_modem) ) ); 11158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "gsm data state: %s\r\n", 11168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project gsm_state_to_string( 11178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project amodem_get_data_registration(android_modem) ) ); 11188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 11198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 11238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecthelp_gsm_data( ControlClient client ) 11248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 11258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 11268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, 11278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "the 'gsm data <state>' allows you to change the state of your GPRS connection\r\n" 11288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "valid values for <state> are the following:\r\n\r\n" ); 11298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; ; nn++) { 11308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* name = _gsm_states[nn].name; 11318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* display = _gsm_states[nn].display; 11328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!name) 11348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 11358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, " %-15s %s\r\n", name, display ); 11378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "\r\n" ); 11398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 11438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_gsm_data( ControlClient client, char* args ) 11448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 11458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 11468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!args) { 11488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: missing argument, try 'gsm data <state>'\r\n" ); 11498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 11508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; ; nn++) { 11538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* name = _gsm_states[nn].name; 11548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARegistrationState state = _gsm_states[nn].state; 11558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!name) 11578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 11588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !strcmp( args, name ) ) { 11608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_modem) { 11618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: modem emulation not running\r\n" ); 11628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 11638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project amodem_set_data_registration( android_modem, state ); 11658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_net_disable = (state != A_REGISTRATION_HOME && 11668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project state != A_REGISTRATION_ROAMING ); 11678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 11688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: bad GSM data state name, try 'help gsm data' for list of valid values\r\n" ); 11718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 11728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 11758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecthelp_gsm_voice( ControlClient client ) 11768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 11778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 11788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, 11798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "the 'gsm voice <state>' allows you to change the state of your GPRS connection\r\n" 11808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "valid values for <state> are the following:\r\n\r\n" ); 11818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; ; nn++) { 11828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* name = _gsm_states[nn].name; 11838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* display = _gsm_states[nn].display; 11848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!name) 11868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 11878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, " %-15s %s\r\n", name, display ); 11898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "\r\n" ); 11918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 11958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_gsm_voice( ControlClient client, char* args ) 11968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 11978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 11988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!args) { 12008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: missing argument, try 'gsm voice <state>'\r\n" ); 12018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 12028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; ; nn++) { 12058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* name = _gsm_states[nn].name; 12068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARegistrationState state = _gsm_states[nn].state; 12078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!name) 12098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 12108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !strcmp( args, name ) ) { 12128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_modem) { 12138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: modem emulation not running\r\n" ); 12148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 12158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project amodem_set_voice_registration( android_modem, state ); 12178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 12188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: bad GSM data state name, try 'help gsm voice' for list of valid values\r\n" ); 12218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 12228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 12238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 12268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectgsm_check_number( char* args ) 12278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 12288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 12298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; args[nn] != 0; nn++) { 12318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int c = args[nn]; 12328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !isdigit(c) && c != '+' && c != '#' ) { 12338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 12348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (nn == 0) 12378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 12388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 12408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 12418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 12438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_gsm_call( ControlClient client, char* args ) 12448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 12458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* check that we have a phone number made of digits */ 12468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!args) { 12478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: missing argument, try 'gsm call <phonenumber>'\r\n" ); 12488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 12498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (gsm_check_number(args)) { 12528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: bad phone number format, use digits, # and + only\r\n" ); 12538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 12548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_modem) { 12578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: modem emulation not running\r\n" ); 12588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 12598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project amodem_add_inbound_call( android_modem, args ); 12618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 12628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 12638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 12658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_gsm_cancel( ControlClient client, char* args ) 12668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 12678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!args) { 12688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: missing argument, try 'gsm call <phonenumber>'\r\n" ); 12698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 12708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (gsm_check_number(args)) { 12728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: bad phone number format, use digits, # and + only\r\n" ); 12738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 12748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_modem) { 12768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: modem emulation not running\r\n" ); 12778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 12788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( amodem_disconnect_call( android_modem, args ) < 0 ) { 12808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: could not cancel this number\r\n" ); 12818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 12828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 12848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 12858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const char* 12888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectcall_state_to_string( ACallState state ) 12898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 12908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (state) { 12918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case A_CALL_ACTIVE: return "active"; 12928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case A_CALL_HELD: return "held"; 12938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case A_CALL_ALERTING: return "ringing"; 12948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case A_CALL_WAITING: return "waiting"; 12958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case A_CALL_INCOMING: return "incoming"; 12968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: return "unknown"; 12978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 12998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 13018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_gsm_list( ControlClient client, char* args ) 13028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 13038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* check that we have a phone number made of digits */ 13048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int count = amodem_get_call_count( android_modem ); 13058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 13068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; nn < count; nn++) { 13078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ACall call = amodem_get_call( android_modem, nn ); 13088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* dir; 13098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (call == NULL) 13118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project continue; 13128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (call->dir == A_CALL_OUTBOUND) 13148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dir = "outbound to "; 13158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 13168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dir = "inbound from"; 13178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "%s %-10s : %s\r\n", dir, 13198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project call->number, call_state_to_string(call->state) ); 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 Projectstatic int 13258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_gsm_busy( ControlClient client, char* args ) 13268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 13278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ACall call; 13288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!args) { 13308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: missing argument, try 'gsm busy <phonenumber>'\r\n" ); 13318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 13328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project call = amodem_find_call_by_number( android_modem, args ); 13348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (call == NULL || call->dir != A_CALL_OUTBOUND) { 13358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: no current outbound call to number '%s' (call %p)\r\n", args, call ); 13368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 13378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( amodem_disconnect_call( android_modem, args ) < 0 ) { 13398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: could not cancel this number\r\n" ); 13408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 13418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 13438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 13448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 13468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_gsm_hold( ControlClient client, char* args ) 13478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 13488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ACall call; 13498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!args) { 13518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: missing argument, try 'gsm out hold <phonenumber>'\r\n" ); 13528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 13538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project call = amodem_find_call_by_number( android_modem, args ); 13558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (call == NULL) { 13568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: no current call to/from number '%s'\r\n", args ); 13578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 13588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( amodem_update_call( android_modem, args, A_CALL_HELD ) < 0 ) { 13608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: could put this call on hold\r\n" ); 13618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 13628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 13648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 13658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 13688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_gsm_accept( ControlClient client, char* args ) 13698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 13708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ACall call; 13718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!args) { 13738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: missing argument, try 'gsm accept <phonenumber>'\r\n" ); 13748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 13758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project call = amodem_find_call_by_number( android_modem, args ); 13778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (call == NULL) { 13788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: no current call to/from number '%s'\r\n", args ); 13798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 13808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( amodem_update_call( android_modem, args, A_CALL_ACTIVE ) < 0 ) { 13828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: could not activate this call\r\n" ); 13838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 13848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 13868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 13878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13884c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstockstatic int 13894c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstockdo_gsm_signal( ControlClient client, char* args ) 13904c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock{ 13914c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock enum { SIGNAL_RSSI = 0, SIGNAL_BER, NUM_SIGNAL_PARAMS }; 13924c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock char* p = args; 13934c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock int top_param = -1; 13944c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock int params[ NUM_SIGNAL_PARAMS ]; 13954c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock 13964c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock static int last_ber = 99; 13974c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock 13984c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock if (!p) 13994c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock p = ""; 14004c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock 14014c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock /* tokenize */ 14024c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock while (*p) { 14034c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock char* end; 14044c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock int val = strtol( p, &end, 10 ); 14054c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock 14064c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock if (end == p) { 14074c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock control_write( client, "KO: argument '%s' is not a number\n", p ); 14084c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock return -1; 14094c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock } 14104c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock 14114c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock params[++top_param] = val; 14124c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock if (top_param + 1 == NUM_SIGNAL_PARAMS) 14134c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock break; 14144c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock 14154c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock p = end; 14164c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock while (*p && (p[0] == ' ' || p[0] == '\t')) 14174c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock p += 1; 14184c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock } 14194c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock 14204c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock /* sanity check */ 14214c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock if (top_param < SIGNAL_RSSI) { 14224c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock control_write( client, "KO: not enough arguments: see 'help gsm signal' for details\r\n" ); 14234c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock return -1; 14244c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock } 14254c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock 14264c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock int rssi = params[SIGNAL_RSSI]; 14274c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock if ((rssi < 0 || rssi > 31) && rssi != 99) { 14284c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock control_write( client, "KO: invalid RSSI - must be 0..31 or 99\r\n"); 14294c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock return -1; 14304c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock } 14314c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock 14324c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock /* check ber is 0..7 or 99 */ 14334c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock if (top_param >= SIGNAL_BER) { 14344c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock int ber = params[SIGNAL_BER]; 14354c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock if ((ber < 0 || ber > 7) && ber != 99) { 14364c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock control_write( client, "KO: invalid BER - must be 0..7 or 99\r\n"); 14374c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock return -1; 14384c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock } 14394c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock last_ber = ber; 14404c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock } 14414c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock 14424c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock amodem_set_signal_strength( android_modem, rssi, last_ber ); 14434c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock 14444c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock return 0; 14454c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock } 14464c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock 14478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if 0 14498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const CommandDefRec gsm_in_commands[] = 14508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 14518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "new", "create a new 'waiting' inbound call", 14528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'gsm in create <phonenumber>' creates a new inbound phone call, placed in\r\n" 14538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "the 'waiting' state by default, until the system answers/holds/closes it\r\n", NULL 14548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_gsm_in_create, NULL }, 14558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "hold", "change the state of an oubtound call to 'held'", 14578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "change the state of an outbound call to 'held'. this is only possible\r\n" 14588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "if the call in the 'waiting' or 'active' state\r\n", NULL, 14598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_gsm_out_hold, NULL }, 14608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "accept", "change the state of an outbound call to 'active'", 14628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "change the state of an outbound call to 'active'. this is only possible\r\n" 14638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "if the call is in the 'waiting' or 'held' state\r\n", NULL, 14648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_gsm_out_accept, NULL }, 14658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { NULL, NULL, NULL, NULL, NULL, NULL } 14678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 14688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 14698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14711a000857bb7eef298efa787699050884f92311feJaime Lopezstatic const CommandDefRec cdma_commands[] = 14721a000857bb7eef298efa787699050884f92311feJaime Lopez{ 14731a000857bb7eef298efa787699050884f92311feJaime Lopez { "ssource", "Set the current CDMA subscription source", 14741a000857bb7eef298efa787699050884f92311feJaime Lopez NULL, describe_subscription_source, 14751a000857bb7eef298efa787699050884f92311feJaime Lopez do_cdma_ssource, NULL }, 147680bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner { "prl_version", "Dump the current PRL version", 147780bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner NULL, NULL, 147880bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner do_cdma_prl_version, NULL }, 14791a000857bb7eef298efa787699050884f92311feJaime Lopez}; 14801a000857bb7eef298efa787699050884f92311feJaime Lopez 14818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const CommandDefRec gsm_commands[] = 14828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 14838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "list", "list current phone calls", 14848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'gsm list' lists all inbound and outbound calls and their state\r\n", NULL, 14858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_gsm_list, NULL }, 14868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "call", "create inbound phone call", 14888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'gsm call <phonenumber>' allows you to simulate a new inbound call\r\n", NULL, 14898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_gsm_call, NULL }, 14908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "busy", "close waiting outbound call as busy", 14928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'gsm busy <remoteNumber>' closes an outbound call, reporting\r\n" 14938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "the remote phone as busy. only possible if the call is 'waiting'.\r\n", NULL, 14948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_gsm_busy, NULL }, 14958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "hold", "change the state of an oubtound call to 'held'", 14978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'gsm hold <remoteNumber>' change the state of a call to 'held'. this is only possible\r\n" 14988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "if the call in the 'waiting' or 'active' state\r\n", NULL, 14998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_gsm_hold, NULL }, 15008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "accept", "change the state of an outbound call to 'active'", 15028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'gsm accept <remoteNumber>' change the state of a call to 'active'. this is only possible\r\n" 15038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "if the call is in the 'waiting' or 'held' state\r\n", NULL, 15048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_gsm_accept, NULL }, 15058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "cancel", "disconnect an inbound or outbound phone call", 15078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'gsm cancel <phonenumber>' allows you to simulate the end of an inbound or outbound call\r\n", NULL, 15088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_gsm_cancel, NULL }, 15098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "data", "modify data connection state", NULL, help_gsm_data, 15118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_gsm_data, NULL }, 15128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "voice", "modify voice connection state", NULL, help_gsm_voice, 15148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_gsm_voice, NULL }, 15158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "status", "display GSM status", 15178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'gsm status' displays the current state of the GSM emulation\r\n", NULL, 15188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_gsm_status, NULL }, 15198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15204c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock { "signal", "set sets the rssi and ber", 15214c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock "'gsm signal <rssi> [<ber>]' changes the reported strength and error rate on next (15s) update.\r\n" 15224c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock "rssi range is 0..31 and 99 for unknown\r\n" 15234c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock "ber range is 0..7 percent and 99 for unknown\r\n", 15244c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock NULL, do_gsm_signal, NULL }, 15254c6b10a4f385c04dbd7226e10a86a1f5cbd34f2aTim Baverstock 15268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { NULL, NULL, NULL, NULL, NULL, NULL } 15278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 15288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 15308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 15318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 15328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** S M S C O M M A N D ******/ 15338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 15348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 15358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 15368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 15388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_sms_send( ControlClient client, char* args ) 15398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 15408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* p; 15418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int textlen; 15428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SmsAddressRec sender; 15438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SmsPDU* pdus; 15448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 15458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* check that we have a phone number made of digits */ 15478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!args) { 15488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project MissingArgument: 15498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: missing argument, try 'sms send <phonenumber> <text message>'\r\n" ); 15508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 15518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = strchr( args, ' ' ); 15538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!p) { 15548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto MissingArgument; 15558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( sms_address_from_str( &sender, args, p - args ) < 0 ) { 15588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: bad phone number format, must be [+](0-9)*\r\n" ); 15598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 15608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* un-secape message text into proper utf-8 (conversion happens in-site) */ 15648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p += 1; 15658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project textlen = strlen(p); 15668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project textlen = sms_utf8_from_message_str( p, textlen, (unsigned char*)p, textlen ); 15678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (textlen < 0) { 15688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "message must be utf8 and can use the following escapes:\r\n" 15698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " \\n for a newline\r\n" 15708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " \\xNN where NN are two hexadecimal numbers\r\n" 15718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " \\uNNNN where NNNN are four hexadecimal numbers\r\n" 15728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " \\\\ to send a '\\' character\r\n\r\n" 15738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " anything else is an error\r\n" 15748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "KO: badly formatted text\r\n" ); 15758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 15768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_modem) { 15798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: modem emulation not running\r\n" ); 15808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 15818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* create a list of SMS PDUs, then send them */ 15848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project pdus = smspdu_create_deliver_utf8( (cbytes_t)p, textlen, &sender, NULL ); 15858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (pdus == NULL) { 15868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: internal error when creating SMS-DELIVER PDUs\n" ); 15878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 15888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; pdus[nn] != NULL; nn++) 15918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project amodem_receive_sms( android_modem, pdus[nn] ); 15928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project smspdu_free_list( pdus ); 15948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 15958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 15968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 15988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_sms_sendpdu( ControlClient client, char* args ) 15998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 16008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SmsPDU pdu; 16018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* check that we have a phone number made of digits */ 16038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!args) { 16048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: missing argument, try 'sms sendpdu <hexstring>'\r\n" ); 16058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 16068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_modem) { 16098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: modem emulation not running\r\n" ); 16108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 16118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project pdu = smspdu_create_from_hex( args, strlen(args) ); 16148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (pdu == NULL) { 16158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: badly formatted <hexstring>\r\n" ); 16168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 16178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project amodem_receive_sms( android_modem, pdu ); 16208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project smspdu_free( pdu ); 16218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 16228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 16238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const CommandDefRec sms_commands[] = 16258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 16268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "send", "send inbound SMS text message", 16278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'sms send <phonenumber> <message>' allows you to simulate a new inbound sms message\r\n", NULL, 16288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_sms_send, NULL }, 16298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "pdu", "send inbound SMS PDU", 16318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'sms pdu <hexstring>' allows you to simulate a new inbound sms PDU\r\n" 16328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "(used internally when one emulator sends SMS messages to another instance).\r\n" 16338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "you probably don't want to play with this at all\r\n", NULL, 16348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_sms_sendpdu, NULL }, 16358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { NULL, NULL, NULL, NULL, NULL, NULL } 16378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 16388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 16408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_control_write(void* data, const char* string) 16418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 16428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write((ControlClient)data, string); 16438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 16448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 16468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_power_display( ControlClient client, char* args ) 16478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 16488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_battery_display(do_control_write, client); 16498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 16508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 16518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 16538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_ac_state( ControlClient client, char* args ) 16548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 16558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (args) { 16568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strcasecmp(args, "on") == 0) { 16578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_battery_set_prop(1, POWER_SUPPLY_PROP_ONLINE, 1); 16588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 16598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strcasecmp(args, "off") == 0) { 16618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_battery_set_prop(1, POWER_SUPPLY_PROP_ONLINE, 0); 16628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 16638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: Usage: \"ac on\" or \"ac off\"\n" ); 16678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 16688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 16698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 16718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_battery_status( ControlClient client, char* args ) 16728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 16738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (args) { 16748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strcasecmp(args, "unknown") == 0) { 16758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_battery_set_prop(0, POWER_SUPPLY_PROP_STATUS, POWER_SUPPLY_STATUS_UNKNOWN); 16768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 16778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strcasecmp(args, "charging") == 0) { 16798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_battery_set_prop(0, POWER_SUPPLY_PROP_STATUS, POWER_SUPPLY_STATUS_CHARGING); 16808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 16818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strcasecmp(args, "discharging") == 0) { 16838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_battery_set_prop(0, POWER_SUPPLY_PROP_STATUS, POWER_SUPPLY_STATUS_DISCHARGING); 16848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 16858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strcasecmp(args, "not-charging") == 0) { 16878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_battery_set_prop(0, POWER_SUPPLY_PROP_STATUS, POWER_SUPPLY_STATUS_NOT_CHARGING); 16888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 16898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strcasecmp(args, "full") == 0) { 16918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_battery_set_prop(0, POWER_SUPPLY_PROP_STATUS, POWER_SUPPLY_STATUS_FULL); 16928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 16938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: Usage: \"status unknown|charging|discharging|not-charging|full\"\n" ); 16978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 16988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 16998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 17018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_battery_present( ControlClient client, char* args ) 17028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 17038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (args) { 17048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strcasecmp(args, "true") == 0) { 17058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_battery_set_prop(0, POWER_SUPPLY_PROP_PRESENT, 1); 17068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 17078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strcasecmp(args, "false") == 0) { 17098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_battery_set_prop(0, POWER_SUPPLY_PROP_PRESENT, 0); 17108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 17118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: Usage: \"present true\" or \"present false\"\n" ); 17158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 17168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 17178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 17198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_battery_health( ControlClient client, char* args ) 17208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 17218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (args) { 17228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strcasecmp(args, "unknown") == 0) { 17238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_battery_set_prop(0, POWER_SUPPLY_PROP_HEALTH, POWER_SUPPLY_HEALTH_UNKNOWN); 17248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 17258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strcasecmp(args, "good") == 0) { 17278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_battery_set_prop(0, POWER_SUPPLY_PROP_HEALTH, POWER_SUPPLY_HEALTH_GOOD); 17288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 17298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strcasecmp(args, "overheat") == 0) { 17318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_battery_set_prop(0, POWER_SUPPLY_PROP_HEALTH, POWER_SUPPLY_HEALTH_OVERHEAT); 17328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 17338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strcasecmp(args, "dead") == 0) { 17358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_battery_set_prop(0, POWER_SUPPLY_PROP_HEALTH, POWER_SUPPLY_HEALTH_DEAD); 17368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 17378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strcasecmp(args, "overvoltage") == 0) { 17398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_battery_set_prop(0, POWER_SUPPLY_PROP_HEALTH, POWER_SUPPLY_HEALTH_OVERVOLTAGE); 17408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 17418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strcasecmp(args, "failure") == 0) { 17438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_battery_set_prop(0, POWER_SUPPLY_PROP_HEALTH, POWER_SUPPLY_HEALTH_UNSPEC_FAILURE); 17448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 17458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: Usage: \"health unknown|good|overheat|dead|overvoltage|failure\"\n" ); 17498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 17508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 17518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 17538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_battery_capacity( ControlClient client, char* args ) 17548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 17558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (args) { 17568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int capacity; 17578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (sscanf(args, "%d", &capacity) == 1 && capacity >= 0 && capacity <= 100) { 17598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_battery_set_prop(0, POWER_SUPPLY_PROP_CAPACITY, capacity); 17608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 17618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: Usage: \"capacity <percentage>\"\n" ); 17658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 17668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 17678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const CommandDefRec power_commands[] = 17708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 17718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "display", "display battery and charger state", 17728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "display battery and charger state\r\n", NULL, 17738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_power_display, NULL }, 17748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "ac", "set AC charging state", 17768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'ac on|off' allows you to set the AC charging state to on or off\r\n", NULL, 17778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_ac_state, NULL }, 17788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "status", "set battery status", 17808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'status unknown|charging|discharging|not-charging|full' allows you to set battery status\r\n", NULL, 17818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_battery_status, NULL }, 17828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "present", "set battery present state", 17848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'present true|false' allows you to set battery present state to true or false\r\n", NULL, 17858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_battery_present, NULL }, 17868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "health", "set battery health state", 17888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'health unknown|good|overheat|dead|overvoltage|failure' allows you to set battery health state\r\n", NULL, 17898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_battery_health, NULL }, 17908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "capacity", "set battery capacity state", 17928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'capacity <percentage>' allows you to set battery capacity to a value 0 - 100\r\n", NULL, 17938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_battery_capacity, NULL }, 17948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { NULL, NULL, NULL, NULL, NULL, NULL } 17968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 17978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 17998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 18008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 18018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** E V E N T C O M M A N D S ******/ 18028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 18038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 18048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 18058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 18088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_event_send( ControlClient client, char* args ) 18098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 18108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* p; 18118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!args) { 18138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: Usage: event send <type>:<code>:<value> ...\r\n" ); 18148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 18158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 18168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = args; 18188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (*p) { 18198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* q; 18208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int type, code, value, ret; 18218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p += strspn( args, " \t" ); /* skip spaces */ 18238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (*p == 0) 18248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 18258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project q = p + strcspn( p, " \t" ); 18278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (q == p) 18298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 18308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = android_event_from_str( p, &type, &code, &value ); 18328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret < 0) { 18338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret == -1) { 18348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, 18358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "KO: invalid event type in '%.*s', try 'event list types' for valid values\r\n", 18368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project q-p, p ); 18378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (ret == -2) { 18388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, 18398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "KO: invalid event code in '%.*s', try 'event list codes <type>' for valid values\r\n", 18408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project q-p, p ); 18418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 18428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, 18438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "KO: invalid event value in '%.*s', must be an integer\r\n", 18448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project q-p, p); 18458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 18468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 18478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 18488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 184934f2974ce7ec7c71beb47b5daf9089d5c8c40c79David 'Digit' Turner user_event_generic( type, code, value ); 18508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = q; 18518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 18528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 18538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 18548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 18568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_event_types( ControlClient client, char* args ) 18578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 18588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int count = android_event_get_type_count(); 18598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 18608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "event <type> can be an integer or one of the following aliases\r\n" ); 18628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; nn < count; nn++) { 18638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char tmp[16]; 18648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* p = tmp; 18658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end = p + sizeof(tmp); 18668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int count2 = android_event_get_code_count( nn );; 18678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = android_event_bufprint_type_str( p, end, nn ); 18698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, " %-8s", tmp ); 18718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (count2 > 0) 18728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, " (%d code aliases)", count2 ); 18738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "\r\n" ); 18758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 18768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 18778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 18788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 18808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_event_codes( ControlClient client, char* args ) 18818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 18828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int count; 18838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn, type, dummy; 18848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!args) { 18868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: argument missing, try 'event codes <type>'\r\n" ); 18878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 18888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 18898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( android_event_from_str( args, &type, &dummy, &dummy ) < 0 ) { 18918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: bad argument, see 'event types' for valid values\r\n" ); 18928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 18938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 18948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project count = android_event_get_code_count( type ); 18968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (count == 0) { 18978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "no code aliases defined for this type\r\n" ); 18988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 18998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "type '%s' accepts the following <code> aliases:\r\n", 19008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args ); 19018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; nn < count; nn++) { 19028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char temp[20], *p = temp, *end = p + sizeof(temp); 19038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_event_bufprint_code_str( p, end, type, nn ); 19048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, " %-12s\r\n", temp ); 19058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 19068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 19078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 19098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 19108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic __inline__ int 19128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectutf8_next( unsigned char* *pp, unsigned char* end ) 19138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 19148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned char* p = *pp; 19158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int result = -1; 19168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p < end) { 19188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int c= *p++; 19198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (c >= 128) { 19208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((c & 0xe0) == 0xc0) 19218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project c &= 0x1f; 19228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if ((c & 0xf0) == 0xe0) 19238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project c &= 0x0f; 19248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 19258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project c &= 0x07; 19268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (p < end && (p[0] & 0xc0) == 0x80) { 19288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project c = (c << 6) | (p[0] & 0x3f); 19298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 19308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 19318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project result = c; 19328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *pp = p; 19338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 19348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return result; 19358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 19368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 19388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_event_text( ControlClient client, char* args ) 19398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 194071bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine AKeycodeBuffer keycodes; 19418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned char* p = (unsigned char*) args; 19428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned char* end = p + strlen(args); 19438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int textlen; 194471bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine const AKeyCharmap* charmap; 19458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!args) { 19478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: argument missing, try 'event text <message>'\r\n" ); 19488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 19498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 195071bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine 195171bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine /* Get default charmap. */ 195243552dc4fa64aad0c9fdb8f4c92ae7ac79406596Vladimir Chtchetkine charmap = android_get_default_charmap(); 195371bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine if (charmap == NULL) { 195471bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine control_write( client, "KO: no character map active in current device layout/config\r\n" ); 19558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 19568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 19578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 195871bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine keycodes.keycode_count = 0; 195971bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine 19608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* un-secape message text into proper utf-8 (conversion happens in-site) */ 19618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project textlen = strlen((char*)p); 19628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project textlen = sms_utf8_from_message_str( args, textlen, (unsigned char*)p, textlen ); 19638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (textlen < 0) { 19648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "message must be utf8 and can use the following escapes:\r\n" 19658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " \\n for a newline\r\n" 19668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " \\xNN where NN are two hexadecimal numbers\r\n" 19678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " \\uNNNN where NNNN are four hexadecimal numbers\r\n" 19688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " \\\\ to send a '\\' character\r\n\r\n" 19698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " anything else is an error\r\n" 19708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "KO: badly formatted text\r\n" ); 19718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 19728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 19738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project end = p + textlen; 19758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (p < end) { 19768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int c = utf8_next( &p, end ); 19778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (c <= 0) 19788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 19798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 198071bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine android_charmap_reverse_map_unicode( NULL, (unsigned)c, 1, &keycodes ); 198171bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine android_charmap_reverse_map_unicode( NULL, (unsigned)c, 0, &keycodes ); 198271bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine android_keycodes_flush( &keycodes ); 19838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 19848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 19868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 19878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const CommandDefRec event_commands[] = 19898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 19908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "send", "send a series of events to the kernel", 19918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'event send <type>:<code>:<value> ...' allows your to send one or more hardware events\r\n" 19928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "to the Android kernel. you can use text names or integers for <type> and <code>\r\n", NULL, 19938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_event_send, NULL }, 19948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "types", "list all <type> aliases", 19968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'event types' list all <type> string aliases supported by the 'event' subcommands\r\n", 19978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, do_event_types, NULL }, 19988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "codes", "list all <code> aliases for a given <type>", 20008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'event codes <type>' lists all <code> string aliases for a given event <type>\r\n", 20018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, do_event_codes, NULL }, 20028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 20038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "text", "simulate keystrokes from a given text", 20048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'event text <message>' allows you to simulate keypresses to generate a given text\r\n" 20058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "message. <message> must be an utf-8 string. Unicode points will be reverse-mapped\r\n" 20068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "according to the current device keyboard. unsupported characters will be discarded\r\n" 20078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "silently\r\n", NULL, do_event_text, NULL }, 20088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 20098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { NULL, NULL, NULL, NULL, NULL, NULL } 20108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 20118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 20122ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije#if CONFIG_ANDROID_SNAPSHOTS 20132ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 20142ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 20152ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije/********************************************************************************************/ 20162ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije/********************************************************************************************/ 20172ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije/***** ******/ 20182ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije/***** S N A P S H O T C O M M A N D S ******/ 20192ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije/***** ******/ 20202ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije/********************************************************************************************/ 20212ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije/********************************************************************************************/ 20222ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 20232ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thijestatic int 20242ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thijecontrol_write_out_cb(void* opaque, const char* fmt, va_list ap) 20252ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije{ 20262ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije ControlClient client = opaque; 20272ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije int ret = control_vwrite(client, fmt, ap); 20282ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije return ret; 20292ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije} 20302ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 20312ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thijestatic int 20322ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thijecontrol_write_err_cb(void* opaque, const char* fmt, va_list ap) 20332ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije{ 20342ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije int ret = 0; 20352ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije ControlClient client = opaque; 20362ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije ret += control_write(client, "KO: "); 20372ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije ret += control_vwrite(client, fmt, ap); 20382ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije return ret; 20392ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije} 20402ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 20412ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thijestatic int 20422ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thijedo_snapshot_list( ControlClient client, char* args ) 20432ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije{ 20442ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije int ret; 20452ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije OutputChannel *out = output_channel_alloc(client, control_write_out_cb); 20462ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije OutputChannel *err = output_channel_alloc(client, control_write_err_cb); 20472ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije do_info_snapshots_oc(out, err); 20482ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije ret = output_channel_written(err); 20492ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije output_channel_free(out); 20502ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije output_channel_free(err); 20512ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 20522ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije return ret > 0; 20532ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije} 20542ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 20552ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thijestatic int 20562ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thijedo_snapshot_save( ControlClient client, char* args ) 20572ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije{ 20582ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije int ret; 20592ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije OutputChannel *err = output_channel_alloc(client, control_write_err_cb); 20602ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije do_savevm_oc(err, args); 20612ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije ret = output_channel_written(err); 20622ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije output_channel_free(err); 20632ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 20642ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije return ret > 0; // no output on error channel indicates success 20652ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije} 20662ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 20672ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thijestatic int 20682ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thijedo_snapshot_load( ControlClient client, char* args ) 20692ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije{ 20702ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije int ret; 20712ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije OutputChannel *err = output_channel_alloc(client, control_write_err_cb); 20722ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije do_loadvm_oc(err, args); 20732ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije ret = output_channel_written(err); 20742ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije output_channel_free(err); 20752ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 20762ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije return ret > 0; 20772ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije} 20782ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 20792ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thijestatic int 20802ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thijedo_snapshot_del( ControlClient client, char* args ) 20812ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije{ 20822ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije int ret; 20832ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije OutputChannel *err = output_channel_alloc(client, control_write_err_cb); 20842ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije do_delvm_oc(err, args); 20852ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije ret = output_channel_written(err); 20862ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije output_channel_free(err); 20872ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 20882ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije return ret > 0; 20892ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije} 20902ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 20912ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thijestatic const CommandDefRec snapshot_commands[] = 20922ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije{ 20932ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije { "list", "list available state snapshots", 20942ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije "'avd snapshot list' will show a list of all state snapshots that can be loaded\r\n", 20952ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije NULL, do_snapshot_list, NULL }, 20962ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 20972ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije { "save", "save state snapshot", 20982ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije "'avd snapshot save <name>' will save the current (run-time) state to a snapshot with the given name\r\n", 20992ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije NULL, do_snapshot_save, NULL }, 21002ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 21012ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije { "load", "load state snapshot", 21022ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije "'avd snapshot load <name>' will load the state snapshot of the given name\r\n", 21032ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije NULL, do_snapshot_load, NULL }, 21042ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 21052ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije { "del", "delete state snapshot", 21062ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije "'avd snapshot del <name>' will delete the state snapshot with the given name\r\n", 21072ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije NULL, do_snapshot_del, NULL }, 21082ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 21092ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije { NULL, NULL, NULL, NULL, NULL, NULL } 21102ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije}; 21112ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 21122ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 21132ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije#endif 21142ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 21158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 21178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 21188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 21198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** V M C O M M A N D S ******/ 21208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 21218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 21228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 21238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 21258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_avd_stop( ControlClient client, char* args ) 21268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 21278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!vm_running) { 21288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: virtual device already stopped\r\n" ); 21298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 21308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 21318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project vm_stop(EXCP_INTERRUPT); 21328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 21338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 21348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 21368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_avd_start( ControlClient client, char* args ) 21378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 21388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (vm_running) { 21398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: virtual device already running\r\n" ); 21408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 21418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 21428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project vm_start(); 21438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 21448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 21458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 21478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_avd_status( ControlClient client, char* args ) 21488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 21498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "virtual device is %s\r\n", vm_running ? "running" : "stopped" ); 21508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 21518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 21528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 21548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_avd_name( ControlClient client, char* args ) 21558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 21568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "%s\r\n", avdInfo_getName(android_avdInfo) ); 21578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 21588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 21598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const CommandDefRec vm_commands[] = 21618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 21628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "stop", "stop the virtual device", 21638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'avd stop' stops the virtual device immediately, use 'avd start' to continue execution\r\n", 21648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, do_avd_stop, NULL }, 21658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "start", "start/restart the virtual device", 21678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'avd start' will start or continue the virtual device, use 'avd stop' to stop it\r\n", 21688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, do_avd_start, NULL }, 21698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "status", "query virtual device status", 21712ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije "'avd status' will indicate whether the virtual device is running or not\r\n", 21728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, do_avd_status, NULL }, 21738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "name", "query virtual device name", 21758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'avd name' will return the name of this virtual device\r\n", 21768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, do_avd_name, NULL }, 21778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21782ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije#if CONFIG_ANDROID_SNAPSHOTS 21792ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije { "snapshot", "state snapshot commands", 21802ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije "allows you to save and restore the virtual device state in snapshots\r\n", 21812ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije NULL, NULL, snapshot_commands }, 21822ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije#endif 21832ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije 21848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { NULL, NULL, NULL, NULL, NULL, NULL } 21858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 21868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 21888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 21898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 21908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** G E O C O M M A N D S ******/ 21918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 21928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 21938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 21948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 21968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_geo_nmea( ControlClient client, char* args ) 21978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 21988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!args) { 21998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: NMEA sentence missing, try 'help geo nmea'\r\n" ); 22008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 22018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 22028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_gps_cs) { 22038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: no GPS emulation in this virtual device\r\n" ); 22048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 22058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 22068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_gps_send_nmea( args ); 22078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 22088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 22098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 22118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_geo_fix( ControlClient client, char* args ) 22128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 22134afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock // GEO_SAT2 provides bug backwards compatibility. 22144afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock enum { GEO_LONG = 0, GEO_LAT, GEO_ALT, GEO_SAT, GEO_SAT2, NUM_GEO_PARAMS }; 22158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* p = args; 22164afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock int top_param = -1; 22174afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock double params[ NUM_GEO_PARAMS ]; 2218657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner int n_satellites = 1; 22198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static int last_time = 0; 22218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static double last_altitude = 0.; 22228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!p) 22248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = ""; 22258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* tokenize */ 22278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (*p) { 22288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 22298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project double val = strtod( p, &end ); 22308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (end == p) { 22328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: argument '%s' is not a number\n", p ); 22338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 22348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 22358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22364afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock params[++top_param] = val; 22374afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock if (top_param + 1 == NUM_GEO_PARAMS) 22388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 22398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = end; 22418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (*p && (p[0] == ' ' || p[0] == '\t')) 22428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p += 1; 22438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 22448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* sanity check */ 22464afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock if (top_param < GEO_LAT) { 22478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: not enough arguments: see 'help geo fix' for details\r\n" ); 22488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 22498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 22508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22514afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock /* check number of satellites, must be integer between 1 and 12 */ 22524afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock if (top_param >= GEO_SAT) { 22534afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock int sat_index = (top_param >= GEO_SAT2) ? GEO_SAT2 : GEO_SAT; 22544afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock n_satellites = (int) params[sat_index]; 22554afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock if (n_satellites != params[sat_index] 22564afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock || n_satellites < 1 || n_satellites > 12) { 2257657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner control_write( client, "KO: invalid number of satellites. Must be an integer between 1 and 12\r\n"); 2258657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner return -1; 2259657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner } 2260657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner } 2261657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner 22628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* generate an NMEA sentence for this fix */ 22638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 22648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project STRALLOC_DEFINE(s); 22658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project double val; 22668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int deg, min; 22678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char hemi; 22688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2269657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner /* format overview: 2270657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner * time of fix 123519 12:35:19 UTC 2271657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner * latitude 4807.038 48 degrees, 07.038 minutes 2272657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner * north/south N or S 2273657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner * longitude 01131.000 11 degrees, 31. minutes 2274657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner * east/west E or W 2275657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner * fix quality 1 standard GPS fix 2276657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner * satellites 1 to 12 number of satellites being tracked 2277657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner * HDOP <dontcare> horizontal dilution 2278657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner * altitude 546. altitude above sea-level 2279657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner * altitude units M to indicate meters 2280657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner * diff <dontcare> height of sea-level above ellipsoid 2281657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner * diff units M to indicate meters (should be <dontcare>) 2282657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner * dgps age <dontcare> time in seconds since last DGPS fix 2283657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner * dgps sid <dontcare> DGPS station id 2284657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner */ 2285657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner 22868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* first, the time */ 22878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project stralloc_add_format( s, "$GPGGA,%06d", last_time ); 22888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project last_time ++; 22898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* then the latitude */ 22918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project hemi = 'N'; 22924afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock val = params[GEO_LAT]; 22938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (val < 0) { 22948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project hemi = 'S'; 22958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project val = -val; 22968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 22978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project deg = (int) val; 2298657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner val = 60*(val - deg); 2299657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner min = (int) val; 2300631f2555ed2b50a07ea19eaefa495a028ab1991aDavid 'Digit' Turner val = 10000*(val - min); 2301657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner stralloc_add_format( s, ",%02d%02d.%04d,%c", deg, min, (int)val, hemi ); 23028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 23038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* the longitude */ 23048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project hemi = 'E'; 23054afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock val = params[GEO_LONG]; 23068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (val < 0) { 23078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project hemi = 'W'; 23088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project val = -val; 23098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 23108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project deg = (int) val; 2311657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner val = 60*(val - deg); 2312657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner min = (int) val; 2313631f2555ed2b50a07ea19eaefa495a028ab1991aDavid 'Digit' Turner val = 10000*(val - min); 2314657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner stralloc_add_format( s, ",%02d%02d.%04d,%c", deg, min, (int)val, hemi ); 23158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2316657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner /* bogus fix quality, satellite count and dilution */ 2317657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner stralloc_add_format( s, ",1,%02d,", n_satellites ); 23188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2319657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner /* optional altitude + bogus diff */ 23204afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock if (top_param >= GEO_ALT) { 23214afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock stralloc_add_format( s, ",%.1g,M,0.,M", params[GEO_ALT] ); 23224afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock last_altitude = params[GEO_ALT]; 23238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 2324657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner stralloc_add_str( s, ",,,," ); 23258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 23268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* bogus rest and checksum */ 23278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project stralloc_add_str( s, ",,,*47" ); 23288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 23298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* send it, then free */ 23308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_gps_send_nmea( stralloc_cstr(s) ); 23318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project stralloc_reset( s ); 23328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 23338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 23348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 23358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 23368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const CommandDefRec geo_commands[] = 23378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 23388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "nmea", "send an GPS NMEA sentence", 23398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'geo nema <sentence>' sends a NMEA 0183 sentence to the emulated device, as\r\n" 23408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "if it came from an emulated GPS modem. <sentence> must begin with '$GP'. only\r\n" 23418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'$GPGGA' and '$GPRCM' sentences are supported at the moment.\r\n", 23428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, do_geo_nmea, NULL }, 23438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 23448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "fix", "send a simple GPS fix", 23454afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock "'geo fix <longitude> <latitude> [<altitude> [<satellites>]]'\r\n" 23464afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock " allows you to send a simple GPS fix to the emulated system.\r\n" 23474afdaf1285ecdcbcfeac6d3e9be0b9b0de0e2b07Tim Baverstock " The parameters are:\r\n\r\n" 23488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " <longitude> longitude, in decimal degrees\r\n" 23498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " <latitude> latitude, in decimal degrees\r\n" 23508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " <altitude> optional altitude in meters\r\n" 2351657a3521a1f4d354b57f0e524b1cd57bed177bb0David 'Digit' Turner " <satellites> number of satellites being tracked (1-12)\r\n" 23528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "\r\n", 23538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, do_geo_fix, NULL }, 23548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 23558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { NULL, NULL, NULL, NULL, NULL, NULL } 23568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 23578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 23588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 23598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 23608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 23618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 23628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** M A I N C O M M A N D S ******/ 23638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 23648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 23658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 23668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 23678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 23688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_window_scale( ControlClient client, char* args ) 23698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 23708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project double scale; 23718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int is_dpi = 0; 23728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 23738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 23748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!args) { 23758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: argument missing, try 'window scale <scale>'\r\n" ); 23768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 23778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 23788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 23798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project scale = strtol( args, &end, 10 ); 23808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (end > args && !memcmp( end, "dpi", 4 )) { 23818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project is_dpi = 1; 23828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 23838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else { 23848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project scale = strtod( args, &end ); 23858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (end == args || end[0]) { 23868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project control_write( client, "KO: argument <scale> must be a real number, or an integer followed by 'dpi'\r\n" ); 23878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 23888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 23898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 23908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 23912fa5173bd1ce7341c50adac676a317945f0969c7Vladimir Chtchetkine android_ui_set_window_scale( scale, is_dpi ); 23928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 23938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 23948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 23958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const CommandDefRec window_commands[] = 23968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 23978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "scale", "change the window scale", 23988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'window scale <scale>' allows you to change the scale of the emulator window at runtime\r\n" 23998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "<scale> must be either a real number between 0.1 and 3.0, or an integer followed by\r\n" 24008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "the 'dpi' prefix (as in '120dpi')\r\n", 24018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, do_window_scale, NULL }, 24028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 24038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { NULL, NULL, NULL, NULL, NULL, NULL } 24048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 24058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 24068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 24078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 24088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 2409e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner/***** Q E M U C O M M A N D S ******/ 2410e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner/***** ******/ 2411e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner/********************************************************************************************/ 2412e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner/********************************************************************************************/ 2413e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner 2414e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turnerstatic int 2415e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turnerdo_qemu_monitor( ControlClient client, char* args ) 2416e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner{ 2417e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner char socketname[32]; 2418e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner int fd; 2419e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner CharDriverState* cs; 2420e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner 2421e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner if (args != NULL) { 2422e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner control_write( client, "KO: no argument for 'qemu monitor'\r\n" ); 2423e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner return -1; 2424e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner } 2425e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner /* Detach the client socket, and re-attach it to a monitor */ 2426e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner fd = control_client_detach(client); 2427e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner snprintf(socketname, sizeof socketname, "tcp:socket=%d", fd); 2428e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner cs = qemu_chr_open("monitor", socketname, NULL); 2429e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner if (cs == NULL) { 2430e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner control_client_reattach(client, fd); 2431e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner control_write( client, "KO: internal error: could not detach from console !\r\n" ); 2432e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner return -1; 2433e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner } 2434e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner monitor_init(cs, MONITOR_USE_READLINE|MONITOR_QUIT_DOESNT_EXIT); 2435e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner control_client_destroy(client); 2436e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner return 0; 2437e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner} 2438e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner 2439d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine/* UI settings, passed to the core via -ui-settings command line parameter. */ 2440d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkineextern char* android_op_ui_settings; 2441d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine 2442d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkinestatic int 2443d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkinedo_attach_ui( ControlClient client, char* args ) 2444d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine{ 2445d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine // Make sure that there are no UI already attached to this console. 2446d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine if (attached_ui_client != NULL) { 2447d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine control_write( client, "KO: Another UI is attached to this core!\r\n" ); 2448d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine control_client_destroy(client); 2449d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine return -1; 2450d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine } 2451d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine 2452d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine attached_ui_client = client; 2453d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine 2454d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine if (android_op_ui_settings != NULL) { 2455d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine // Reply "OK" with the saved -ui-settings property. 2456d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine char reply_buf[4096]; 2457d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine snprintf(reply_buf, sizeof(reply_buf), "OK: %s\r\n", android_op_ui_settings); 2458d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine control_write( client, reply_buf); 2459d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine } else { 2460d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine control_write( client, "OK\r\n"); 2461d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine } 2462d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine 2463d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine return 0; 2464d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine} 2465d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine 2466e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turnerstatic const CommandDefRec qemu_commands[] = 2467e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner{ 2468e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner { "monitor", "enter QEMU monitor", 2469e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner "Enter the QEMU virtual machine monitor\r\n", 2470e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner NULL, do_qemu_monitor, NULL }, 2471e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner 2472d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine { "attach UI", "attach UI to the core", 2473d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine "Attach UI to the core\r\n", 2474d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine NULL, do_attach_ui, NULL }, 2475d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine 2476e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner { NULL, NULL, NULL, NULL, NULL, NULL } 2477e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner}; 2478e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner 2479e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner 2480e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner/********************************************************************************************/ 2481e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner/********************************************************************************************/ 2482e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner/***** ******/ 24838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** M A I N C O M M A N D S ******/ 24848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** ******/ 24858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 24868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/********************************************************************************************/ 24878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 24888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 24898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdo_kill( ControlClient client, char* args ) 24908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2491d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine control_write( client, "OK: killing emulator, bye bye\r\n" ); 2492d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine exit(0); 24938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 24948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 24958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const CommandDefRec main_commands[] = 24968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 24978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "help|h|?", "print a list of commands", NULL, NULL, do_help, NULL }, 24988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 24998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "event", "simulate hardware events", 25008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "allows you to send fake hardware events to the kernel\r\n", NULL, 25018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, event_commands }, 25028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 25038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "geo", "Geo-location commands", 25048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "allows you to change Geo-related settings, or to send GPS NMEA sentences\r\n", NULL, 25058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, geo_commands }, 25068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 25078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "gsm", "GSM related commands", 25088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "allows you to change GSM-related settings, or to make a new inbound phone call\r\n", NULL, 25098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, gsm_commands }, 25108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 25111a000857bb7eef298efa787699050884f92311feJaime Lopez { "cdma", "CDMA related commands", 25121a000857bb7eef298efa787699050884f92311feJaime Lopez "allows you to change CDMA-related settings\r\n", NULL, 25131a000857bb7eef298efa787699050884f92311feJaime Lopez NULL, cdma_commands }, 25141a000857bb7eef298efa787699050884f92311feJaime Lopez 25158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "kill", "kill the emulator instance", NULL, NULL, 2516d87b080495e71ada650b165a1f06616b433e6073Vladimir Chtchetkine do_kill, NULL }, 25178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 25188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "network", "manage network settings", 25198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "allows you to manage the settings related to the network data connection of the\r\n" 25208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "emulated device.\r\n", NULL, 25218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, network_commands }, 25228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 25238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "power", "power related commands", 25248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "allows to change battery and AC power status\r\n", NULL, 25258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, power_commands }, 25268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 25278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "quit|exit", "quit control session", NULL, NULL, 25288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do_quit, NULL }, 25298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 25308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "redir", "manage port redirections", 25318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "allows you to add, list and remove UDP and/or PORT redirection from the host to the device\r\n" 25328b23a6c7e1aee255004dd19098d4c2462b61b849The 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" 25338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "to TCP port 6000 of the emulated device\r\n", NULL, 25348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, redir_commands }, 25358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 25368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "sms", "SMS related commands", 25378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "allows you to simulate an inbound SMS\r\n", NULL, 25388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, sms_commands }, 25398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 25402ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije { "avd", "control virtual device execution", 25412ff39a367738422c0ca1313cac8ff380e1fdd498Ot ten Thije "allows you to control (e.g. start/stop) the execution of the virtual device\r\n", NULL, 25428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, vm_commands }, 25438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 25448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "window", "manage emulator window", 25458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "allows you to modify the emulator window\r\n", NULL, 25468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, window_commands }, 25478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2548e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner { "qemu", "QEMU-specific commands", 2549e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner "allows to connect to the QEMU virtual machine monitor\r\n", NULL, 2550e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner NULL, qemu_commands }, 2551e92bc56ef89ab8b51c4c89d4d9779b64e9491b9bDavid 'Digit' Turner 25528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { NULL, NULL, NULL, NULL, NULL, NULL } 25538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 25548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 25558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 25568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic ControlGlobalRec _g_global; 25578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 25588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint 25598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectcontrol_console_start( int port ) 25608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 25618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return control_global_init( &_g_global, port ); 25628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2563