main.c revision 9877e2e3e3c2df64de306b48f80a4f5d0b028d95
18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Copyright (C) 2006-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#include <signal.h> 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <unistd.h> 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <string.h> 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <sys/time.h> 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <process.h> 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "libslirp.h" 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "sockets.h" 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/android.h" 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "qemu-common.h" 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "sysemu.h" 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "console.h" 278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <SDL.h> 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <SDL_syswm.h> 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "math.h" 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/charmap.h" 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "modem_driver.h" 358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "shaper.h" 368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "proxy_http.h" 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/debug.h" 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/resource.h" 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/config.h" 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/config/config.h" 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/skin/image.h" 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/skin/trackball.h" 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/skin/keyboard.h" 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/skin/file.h" 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/skin/window.h" 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/skin/keyset.h" 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/gps.h" 519877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project#include "android/hw-qemud.h" 528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/hw-kmsg.h" 538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/hw-control.h" 549877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project#include "android/hw-sensors.h" 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/user-config.h" 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/bufprint.h" 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/dirscanner.h" 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/path.h" 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/timezone.h" 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/display.h" 618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/cmdline-option.h" 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/help.h" 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "hw/goldfish_nand.h" 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/globals.h" 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "tcpdump.h" 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* in vl.c */ 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void qemu_help(int code); 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "framebuffer.h" 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectAndroidRotation android_framebuffer_rotation; 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define STRINGIFY(x) _STRINGIFY(x) 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define _STRINGIFY(x) #x 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define VERSION_STRING STRINGIFY(ANDROID_VERSION_MAJOR)"."STRINGIFY(ANDROID_VERSION_MINOR) 798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define KEYSET_FILE "default.keyset" 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectSkinKeyset* android_keyset; 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define D(...) do { if (VERBOSE_CHECK(init)) dprint(__VA_ARGS__); } while (0) 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern int control_console_start( int port ); /* in control.c */ 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern int qemu_milli_needed; 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* the default device DPI if none is specified by the skin 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define DEFAULT_DEVICE_DPI 165 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const AKeyCharmap* android_charmap; 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint android_base_port; 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if 0 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int opts->flashkeys; /* forward */ 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void handle_key_command( void* opaque, SkinKeyCommand command, int param ); 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_TRACE 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void start_tracing(void); 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void stop_tracing(void); 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectunsigned long android_verbose; 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint qemu_cpu_delay = 0; 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint qemu_cpu_delay_count; 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************************/ 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************************/ 1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** *****/ 1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** U T I L I T Y R O U T I N E S *****/ 1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** *****/ 1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************************/ 1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************************/ 1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*** APPLICATION DIRECTORY 1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *** Where are we ? 1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ***/ 1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst char* get_app_dir(void) 1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char buffer[1024]; 1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* p = buffer; 1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end = p + sizeof(buffer); 1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint_app_dir(p, end); 1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p >= end) 1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return strdup(buffer); 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*** CONFIGURATION 1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ***/ 1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic AUserConfig* userConfig; 1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid 1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectemulator_config_init( void ) 1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project userConfig = auserConfig_new( android_avdInfo ); 1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* only call this function on normal exits, so that ^C doesn't save the configuration */ 1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid 1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectemulator_config_done( void ) 1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int win_x, win_y; 1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!userConfig) { 1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("no user configuration?"); 1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_WM_GetPos( &win_x, &win_y ); 1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project auserConfig_setWindowPos(userConfig, win_x, win_y); 1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project auserConfig_save(userConfig); 1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid *loadpng(const char *fn, unsigned *_width, unsigned *_height); 1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid *readpng(const unsigned char* base, size_t size, unsigned *_width, unsigned *_height); 1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_DARWIN 1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define ANDROID_ICON_PNG "android_icon_256.png" 1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define ANDROID_ICON_PNG "android_icon_16.png" 1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectsdl_set_window_icon( void ) 1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static int window_icon_set; 1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!window_icon_set) 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32 1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project HANDLE handle = GetModuleHandle( NULL ); 1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project HICON icon = LoadIcon( handle, MAKEINTRESOURCE(1) ); 1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_SysWMinfo wminfo; 1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_GetWMInfo(&wminfo); 1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SetClassLong( wminfo.window, GCL_HICON, (LONG)icon ); 1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else /* !_WIN32 */ 1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned icon_w, icon_h; 1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project size_t icon_bytes; 1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const unsigned char* icon_data; 1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void* icon_pixels; 1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project window_icon_set = 1; 1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project icon_data = android_icon_find( ANDROID_ICON_PNG, &icon_bytes ); 1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !icon_data ) 1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project icon_pixels = readpng( icon_data, icon_bytes, &icon_w, &icon_h ); 2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !icon_pixels ) 2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* the data is loaded into memory as RGBA bytes by libpng. we want to manage 2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * the values as 32-bit ARGB pixels, so swap the bytes accordingly depending 2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * on our CPU endianess 2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned* d = icon_pixels; 2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned* d_end = d + icon_w*icon_h; 2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ; d < d_end; d++ ) { 2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned pix = d[0]; 2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if WORDS_BIGENDIAN 2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* R,G,B,A read as RGBA => ARGB */ 2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project pix = ((pix >> 8) & 0xffffff) | (pix << 24); 2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* R,G,B,A read as ABGR => ARGB */ 2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project pix = (pix & 0xff00ff00) | ((pix >> 16) & 0xff) | ((pix & 0xff) << 16); 2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project d[0] = pix; 2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_Surface* icon = sdl_surface_from_argb32( icon_pixels, icon_w, icon_h ); 2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (icon != NULL) { 2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_WM_SetIcon(icon, NULL); 2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_FreeSurface(icon); 2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project free( icon_pixels ); 2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* !_WIN32 */ 2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************************/ 2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************************/ 2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** *****/ 2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** S K I N I M A G E S *****/ 2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** *****/ 2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************************/ 2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************************/ 2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid send_key_event(unsigned code, unsigned down) 2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(code == 0) { 2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (VERBOSE_CHECK(keys)) 2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf(">> KEY [0x%03x,%s]\n", (code & 0x1ff), down ? "down" : " up " ); 2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project kbd_put_keycode((code & 0x1ff) | (down ? 0x200 : 0)); 2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct { 2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AConfig* aconfig; 2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinFile* layout_file; 2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinLayout* layout; 2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinKeyboard* keyboard; 2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinWindow* window; 2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int win_x; 2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int win_y; 2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int show_trackball; 2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinTrackBall* trackball; 2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int lcd_brightness; 2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinImage* onion; 2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinRotation onion_rotation; 2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int onion_alpha; 2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AndroidOptions opts[1]; /* copy of options */ 2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} QEmulator; 2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic QEmulator qemulator[1]; 2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqemulator_done( QEmulator* emulator ) 2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (emulator->window) { 2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_window_free(emulator->window); 2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator->window = NULL; 2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (emulator->trackball) { 2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_trackball_destroy(emulator->trackball); 2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator->trackball = NULL; 2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (emulator->keyboard) { 2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_keyboard_free(emulator->keyboard); 2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator->keyboard = NULL; 2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator->layout = NULL; 2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (emulator->layout_file) { 2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_file_free(emulator->layout_file); 2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator->layout_file = NULL; 2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqemulator_setup( QEmulator* emulator ); 3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqemulator_fb_update( void* _emulator, int x, int y, int w, int h ) 3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QEmulator* emulator = _emulator; 3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (emulator->window) 3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_window_update_display( emulator->window, x, y, w, h ); 3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqemulator_fb_rotate( void* _emulator, int rotation ) 3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QEmulator* emulator = _emulator; 3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemulator_setup( emulator ); 3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqemulator_init( QEmulator* emulator, 3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AConfig* aconfig, 3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* basepath, 3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int x, 3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int y, 3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AndroidOptions* opts ) 3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator->aconfig = aconfig; 3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator->layout_file = skin_file_create_from_aconfig(aconfig, basepath); 3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator->layout = emulator->layout_file->layouts; 3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator->keyboard = skin_keyboard_create_from_aconfig(aconfig, opts->raw_keys); 3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator->window = NULL; 3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator->win_x = x; 3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator->win_y = y; 3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator->opts[0] = opts[0]; 3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* register as a framebuffer clients for all displays defined in the skin file */ 3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_FILE_LOOP_PARTS( emulator->layout_file, part ) 3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinDisplay* disp = part->display; 3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (disp->valid) { 3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qframebuffer_add_client( disp->qfbuff, 3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator, 3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemulator_fb_update, 3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemulator_fb_rotate, 3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL ); 3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_FILE_LOOP_END_PARTS 3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic AndroidKeyCode 3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqemulator_rotate_keycode( QEmulator* emulator, 3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AndroidKeyCode sym ) 3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (skin_layout_get_dpad_rotation(emulator->layout)) { 3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case SKIN_ROTATION_90: 3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (sym) { 3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case kKeyCodeDpadLeft: sym = kKeyCodeDpadDown; break; 3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case kKeyCodeDpadRight: sym = kKeyCodeDpadUp; break; 3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case kKeyCodeDpadUp: sym = kKeyCodeDpadLeft; break; 3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case kKeyCodeDpadDown: sym = kKeyCodeDpadRight; break; 3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: ; 3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case SKIN_ROTATION_180: 3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (sym) { 3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case kKeyCodeDpadLeft: sym = kKeyCodeDpadRight; break; 3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case kKeyCodeDpadRight: sym = kKeyCodeDpadLeft; break; 3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case kKeyCodeDpadUp: sym = kKeyCodeDpadDown; break; 3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case kKeyCodeDpadDown: sym = kKeyCodeDpadUp; break; 3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: ; 3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case SKIN_ROTATION_270: 3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (sym) { 3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case kKeyCodeDpadLeft: sym = kKeyCodeDpadUp; break; 3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case kKeyCodeDpadRight: sym = kKeyCodeDpadDown; break; 3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case kKeyCodeDpadUp: sym = kKeyCodeDpadRight; break; 3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case kKeyCodeDpadDown: sym = kKeyCodeDpadLeft; break; 3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: ; 3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: ; 3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return sym; 3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectget_device_dpi( AndroidOptions* opts ) 3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int dpi_device = DEFAULT_DEVICE_DPI; 3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->dpi_device != NULL) { 3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dpi_device = strtol( opts->dpi_device, &end, 0 ); 4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (end == NULL || *end != 0 || dpi_device <= 0) { 4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "argument for -dpi-device must be a positive integer. Aborting\n" ); 4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 4048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return dpi_device; 4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic double 4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectget_default_scale( AndroidOptions* opts ) 4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int dpi_device = get_device_dpi( opts ); 4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int dpi_monitor = -1; 4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project double scale = 0.0; 4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* possible values for the 'scale' option are 4178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 'auto' : try to determine the scale automatically 4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * '<number>dpi' : indicates the host monitor dpi, compute scale accordingly 4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * '<fraction>' : use direct scale coefficient 4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->scale) { 4238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!strcmp(opts->scale, "auto")) 4248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* we need to get the host dpi resolution ? */ 4268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int xdpi, ydpi; 4278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( get_monitor_resolution( &xdpi, &ydpi ) < 0 ) { 4298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "could not get monitor DPI resolution from system. please use -dpi-monitor to specify one\n" ); 4308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "system reported monitor resolutions: xdpi=%d ydpi=%d\n", xdpi, ydpi); 4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dpi_monitor = (xdpi + ydpi+1)/2; 4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project scale = strtod( opts->scale, &end ); 4398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (end && end[0] == 'd' && end[1] == 'p' && end[2] == 'i' && end[3] == 0) { 4418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( scale < 20 || scale > 1000 ) { 4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "emulator: ignoring bad -scale argument '%s': %s\n", opts->scale, 4438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "host dpi number must be between 20 and 1000" ); 4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 4458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dpi_monitor = scale; 4478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project scale = 0.0; 4488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (end == NULL || *end != 0) { 4508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "emulator: ignoring bad -scale argument '%s': %s\n", opts->scale, 4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "not a number or the 'auto' keyword" ); 4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 4538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if ( scale < 0.1 || scale > 3. ) { 4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "emulator: ignoring bad -window-scale argument '%s': %s\n", opts->scale, 4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "must be between 0.1 and 3.0" ); 4578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 4588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (scale == 0.0 && dpi_monitor > 0) 4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project scale = dpi_monitor*1.0/dpi_device; 4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (scale == 0.0) 4668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project scale = 1.0; 4678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return scale; 4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid 4728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectandroid_emulator_set_window_scale( double scale, int is_dpi ) 4738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QEmulator* emulator = qemulator; 4758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (is_dpi) 4778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project scale /= get_device_dpi( emulator->opts ); 4788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (emulator->window) 4808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_window_set_scale( emulator->window, scale ); 4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqemulator_set_title( QEmulator* emulator ) 4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char temp[64]; 4888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (emulator->window == NULL) 4908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project snprintf( temp, sizeof(temp), "Android Emulator (%s:%d)", 4938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project avdInfo_getName( android_avdInfo ), 4948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_base_port ); 4958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_window_set_title( emulator->window, temp ); 4978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* called by the emulated framebuffer device each time the content of the 5008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * framebuffer has changed. the rectangle is the bounding box of all changes 5018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 5028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 5038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectsdl_update(DisplayState *ds, int x, int y, int w, int h) 5048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* this function is being called from the console code that is currently inactive 5068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** simple totally ignore it... 5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 5088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (void)ds; 5098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (void)x; 5108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (void)y; 5118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (void)w; 5128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (void)h; 5138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 5188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqemulator_light_brightness( void* opaque, const char* light, int value ) 5198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QEmulator* emulator = opaque; 5218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project VERBOSE_PRINT(hw_control,"%s: light='%s' value=%d window=%p", __FUNCTION__, light, value, emulator->window); 5238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !strcmp(light, "lcd_backlight") ) { 5248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator->lcd_brightness = value; 5258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (emulator->window) 5268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_window_set_lcd_brightness( emulator->window, value ); 5278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 5288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 5338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqemulator_setup( QEmulator* emulator ) 5348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AndroidOptions* opts = emulator->opts; 5368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !emulator->window && !opts->no_window ) { 5388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinLayout* layout = emulator->layout; 5398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project double scale = get_default_scale(emulator->opts); 5408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator->window = skin_window_create( layout, emulator->win_x, emulator->win_y, scale, 0); 5428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (emulator->window == NULL) 5438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 5448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinTrackBall* ball; 5478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinTrackBallParameters params; 5488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params.diameter = 30; 5508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params.ring = 2; 5518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params.ball_color = 0xffe0e0e0; 5528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params.dot_color = 0xff202020; 5538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params.ring_color = 0xff000000; 5548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ball = skin_trackball_create( ¶ms ); 5568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator->trackball = ball; 5578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_window_set_trackball( emulator->window, ball ); 5588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator->lcd_brightness = 128; /* 50% */ 5608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_window_set_lcd_brightness( emulator->window, emulator->lcd_brightness ); 5618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( emulator->onion != NULL ) 5648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_window_set_onion( emulator->window, 5658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator->onion, 5668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator->onion_rotation, 5678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator->onion_alpha ); 5688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemulator_set_title( emulator ); 5708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_window_enable_touch ( emulator->window, android_hw->hw_touchScreen != 0 ); 5728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_window_enable_dpad ( emulator->window, android_hw->hw_dPad != 0 ); 5738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_window_enable_qwerty( emulator->window, android_hw->hw_keyboard != 0 ); 5748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_window_enable_trackball( emulator->window, android_hw->hw_trackBall != 0 ); 5758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* initialize hardware control support */ 5788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AndroidHwControlFuncs funcs; 5808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project funcs.light_brightness = qemulator_light_brightness; 5828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_hw_control_init( emulator, &funcs ); 5838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* called by the emulated framebuffer device each time the framebuffer 5888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * is resized or rotated */ 5898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 5908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectsdl_resize(DisplayState *ds, int w, int h) 5918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "weird, sdl_resize being called with framebuffer interface\n"); 5938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 5948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void sdl_refresh(DisplayState *ds) 5988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QEmulator* emulator = ds->opaque; 6008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_Event ev; 6018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinWindow* window = emulator->window; 6028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinKeyboard* keyboard = emulator->keyboard; 6038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* this will eventually call sdl_update if the content of the VGA framebuffer 6058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * has changed */ 6068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qframebuffer_check_updates(); 6078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (window == NULL) 6098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 6108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while(SDL_PollEvent(&ev)){ 6128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch(ev.type){ 6138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case SDL_VIDEOEXPOSE: 6148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_window_redraw( window, NULL ); 6158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 6168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case SDL_KEYDOWN: 6188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32 6198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* special code to deal with Alt-F4 properly */ 6208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ev.key.keysym.sym == SDLK_F4 && 6218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ev.key.keysym.mod & KMOD_ALT) { 6228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto CleanExit; 6238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 6258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef __APPLE__ 6268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* special code to deal with Command-Q properly */ 6278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ev.key.keysym.sym == SDLK_q && 6288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ev.key.keysym.mod & KMOD_META) { 6298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto CleanExit; 6308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 6328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_keyboard_process_event( keyboard, &ev, 1 ); 6338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 6348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case SDL_KEYUP: 6368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_keyboard_process_event( keyboard, &ev, 0 ); 6378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 6388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case SDL_MOUSEMOTION: 6408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_window_process_event( window, &ev ); 6418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 6428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case SDL_MOUSEBUTTONDOWN: 6448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case SDL_MOUSEBUTTONUP: 6458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int down = (ev.type == SDL_MOUSEBUTTONDOWN); 6478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ev.button.button == 4) 6488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* scroll-wheel simulates DPad up */ 6508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AndroidKeyCode kcode; 6518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project kcode = qemulator_rotate_keycode(emulator, kKeyCodeDpadUp); 6538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project send_key_event( kcode, down ); 6548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (ev.button.button == 5) 6568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* scroll-wheel simulates DPad down */ 6588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AndroidKeyCode kcode; 6598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project kcode = qemulator_rotate_keycode(emulator, kKeyCodeDpadDown); 6618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project send_key_event( kcode, down ); 6628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (ev.button.button == SDL_BUTTON_LEFT) { 6648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_window_process_event( window, &ev ); 6658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if 0 6678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else { 6688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "... mouse button %s: button=%d state=%04x x=%d y=%d\n", 6698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project down ? "down" : "up ", 6708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ev.button.button, ev.button.state, ev.button.x, ev.button.y); 6718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 6738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 6758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case SDL_QUIT: 6778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined _WIN32 || defined __APPLE__ 6788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project CleanExit: 6798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 6808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* only save emulator config through clean exit */ 6818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemulator_done( emulator ); 6828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_system_shutdown_request(); 6838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 6848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_keyboard_flush( keyboard ); 6888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* used to respond to a given keyboard command shortcut 6928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 6938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 6948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecthandle_key_command( void* opaque, SkinKeyCommand command, int down ) 6958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static const struct { SkinKeyCommand cmd; AndroidKeyCode kcode; } keycodes[] = 6978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { SKIN_KEY_COMMAND_BUTTON_CALL, kKeyCodeCall }, 6998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { SKIN_KEY_COMMAND_BUTTON_HOME, kKeyCodeHome }, 7008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { SKIN_KEY_COMMAND_BUTTON_BACK, kKeyCodeBack }, 7018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { SKIN_KEY_COMMAND_BUTTON_HANGUP, kKeyCodeEndCall }, 7028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { SKIN_KEY_COMMAND_BUTTON_POWER, kKeyCodePower }, 7038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { SKIN_KEY_COMMAND_BUTTON_SEARCH, kKeyCodeSearch }, 7048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { SKIN_KEY_COMMAND_BUTTON_MENU, kKeyCodeMenu }, 7058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { SKIN_KEY_COMMAND_BUTTON_DPAD_UP, kKeyCodeDpadUp }, 7068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { SKIN_KEY_COMMAND_BUTTON_DPAD_LEFT, kKeyCodeDpadLeft }, 7078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { SKIN_KEY_COMMAND_BUTTON_DPAD_RIGHT, kKeyCodeDpadRight }, 7088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { SKIN_KEY_COMMAND_BUTTON_DPAD_DOWN, kKeyCodeDpadDown }, 7098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { SKIN_KEY_COMMAND_BUTTON_DPAD_CENTER, kKeyCodeDpadCenter }, 7108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { SKIN_KEY_COMMAND_BUTTON_VOLUME_UP, kKeyCodeVolumeUp }, 7118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { SKIN_KEY_COMMAND_BUTTON_VOLUME_DOWN, kKeyCodeVolumeDown }, 712b059facee5eb498c78c573617c62cc13eddc8644The Android Open Source Project { SKIN_KEY_COMMAND_BUTTON_CAMERA, kKeyCodeCamera }, 7138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { SKIN_KEY_COMMAND_NONE, 0 } 7148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project }; 7158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 7168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_TRACE 7178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static int tracing = 0; 7188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 7198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QEmulator* emulator = opaque; 7208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; keycodes[nn].kcode != 0; nn++) { 7238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (command == keycodes[nn].cmd) { 7248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned code = keycodes[nn].kcode; 7258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (down) 7268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project code |= 0x200; 7278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project kbd_put_keycode( code ); 7288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 7298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // for the show-trackball command, handle down events to enable, and 7338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // up events to disable 7348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (command == SKIN_KEY_COMMAND_SHOW_TRACKBALL) { 7358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator->show_trackball = (down != 0); 7368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_window_show_trackball( emulator->window, emulator->show_trackball ); 7378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project //qemulator_set_title( emulator ); 7388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 7398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // only handle down events for the rest 7428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (down == 0) 7438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 7448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (command) 7468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 7478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case SKIN_KEY_COMMAND_TOGGLE_NETWORK: 7488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 7498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_net_disable = !qemu_net_disable; 7508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (android_modem) { 7518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project amodem_set_data_registration( 7528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_modem, 7538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_net_disable ? A_REGISTRATION_UNREGISTERED 7548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project : A_REGISTRATION_HOME); 7558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "network is now %s", qemu_net_disable ? "disconnected" : "connected" ); 7578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 7598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case SKIN_KEY_COMMAND_TOGGLE_FULLSCREEN: 7618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (emulator->window) { 7628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_window_toggle_fullscreen(emulator->window); 7638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 7658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case SKIN_KEY_COMMAND_TOGGLE_TRACING: 7678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 7688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_TRACE 7698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tracing = !tracing; 7708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (tracing) 7718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project start_tracing(); 7728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 7738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project stop_tracing(); 7748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 7758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 7778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case SKIN_KEY_COMMAND_TOGGLE_TRACKBALL: 7798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator->show_trackball = !emulator->show_trackball; 7808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_window_show_trackball( emulator->window, emulator->show_trackball ); 7818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 7828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case SKIN_KEY_COMMAND_ONION_ALPHA_UP: 7848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case SKIN_KEY_COMMAND_ONION_ALPHA_DOWN: 7858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (emulator->onion) 7868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 7878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int alpha = emulator->onion_alpha; 7888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (command == SKIN_KEY_COMMAND_ONION_ALPHA_UP) 7908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project alpha += 16; 7918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 7928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project alpha -= 16; 7938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (alpha > 256) 7958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project alpha = 256; 7968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (alpha < 0) 7978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project alpha = 0; 7988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator->onion_alpha = alpha; 8008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_window_set_onion( emulator->window, emulator->onion, emulator->onion_rotation, alpha ); 8018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_window_redraw( emulator->window, NULL ); 8028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project //dprint( "onion alpha set to %d (%.f %%)", alpha, alpha/2.56 ); 8038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 8058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case SKIN_KEY_COMMAND_CHANGE_LAYOUT_PREV: 8078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case SKIN_KEY_COMMAND_CHANGE_LAYOUT_NEXT: 8088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 8098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinLayout* layout = NULL; 8108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (command == SKIN_KEY_COMMAND_CHANGE_LAYOUT_NEXT) { 8128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout = emulator->layout->next; 8138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (layout == NULL) 8148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout = emulator->layout_file->layouts; 8158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (command == SKIN_KEY_COMMAND_CHANGE_LAYOUT_PREV) { 8178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout = emulator->layout_file->layouts; 8188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (layout->next && layout->next != emulator->layout) 8198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout = layout->next; 8208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (layout != NULL) { 8228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinRotation rotation; 8238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator->layout = layout; 8258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_window_reset( emulator->window, layout ); 8268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project rotation = skin_layout_get_dpad_rotation( layout ); 8288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (emulator->keyboard) 8308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_keyboard_set_rotation( emulator->keyboard, rotation ); 8318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (emulator->trackball) { 8338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_trackball_set_rotation( emulator->trackball, rotation ); 8348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_window_set_trackball( emulator->window, emulator->trackball ); 8358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_window_show_trackball( emulator->window, emulator->show_trackball ); 8368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_window_set_lcd_brightness( emulator->window, emulator->lcd_brightness ); 8398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qframebuffer_invalidate_all(); 8418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qframebuffer_check_updates(); 8428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 8458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: 8478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* XXX: TODO ? */ 8488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ; 8498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void sdl_at_exit(void) 8548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 8558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator_config_done(); 8568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemulator_done( qemulator ); 8578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_Quit(); 8588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid sdl_display_init(DisplayState *ds, int full_screen, int no_frame) 8628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 8638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QEmulator* emulator = qemulator; 8648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinDisplay* disp = skin_layout_get_display(emulator->layout); 8658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// fprintf(stderr,"*** sdl_display_init ***\n"); 8678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ds->opaque = emulator; 8688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (disp->rotation & 1) { 8708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ds->width = disp->rect.size.h; 8718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ds->height = disp->rect.size.w; 8728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 8738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ds->width = disp->rect.size.w; 8748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ds->height = disp->rect.size.h; 8758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ds->dpy_update = sdl_update; 8788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ds->dpy_resize = sdl_resize; 8798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ds->dpy_refresh = sdl_refresh; 8808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_keyboard_enable( emulator->keyboard, 1 ); 8828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_keyboard_on_command( emulator->keyboard, handle_key_command, emulator ); 8838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern SkinKeyboard* android_emulator_get_keyboard(void) 8878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 8888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return qemulator->keyboard; 8898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const char* skin_network_speed = NULL; 8928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const char* skin_network_delay = NULL; 8938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* list of skin aliases */ 8958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const struct { 8968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* name; 8978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* alias; 8988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} skin_aliases[] = { 8998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "QVGA-L", "320x240" }, 9008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "QVGA-P", "240x320" }, 9018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "HVGA-L", "480x320" }, 9028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "HVGA-P", "320x480" }, 9038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "QVGA", "320x240" }, 9048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "HVGA", "320x480" }, 9058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { NULL, NULL } 9068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 9078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* this is used by hw/events_device.c to send the charmap name to the system */ 9098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst char* android_skin_keycharmap = NULL; 9108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid init_skinned_ui(const char *path, const char *name, AndroidOptions* opts) 9128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 9138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char tmp[1024]; 9148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AConfig* root; 9158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AConfig* n; 9168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int win_x, win_y, flags; 9178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project signal(SIGINT, SIG_DFL); 9198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef _WIN32 9208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project signal(SIGQUIT, SIG_DFL); 9218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 9228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* we're not a game, so allow the screensaver to run */ 9248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project putenv("SDL_VIDEO_ALLOW_SCREENSAVER=1"); 9258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project flags = SDL_INIT_NOPARACHUTE; 9278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->no_window) 9288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project flags |= SDL_INIT_VIDEO; 9298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(SDL_Init(flags)){ 9318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "SDL init failure, reason is: %s\n", SDL_GetError() ); 9328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 9338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->no_window) { 9368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_EnableUNICODE(!opts->raw_keys); 9378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_EnableKeyRepeat(0,0); 9388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sdl_set_window_icon(); 9408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 9428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef _WIN32 9448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* prevent SIGTTIN and SIGTTOUT from stopping us. this is necessary to be 9458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * able to run the emulator in the background (e.g. "emulator &"). 9468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * despite the fact that the emulator should not grab input or try to 9478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * write to the output in normal cases, we're stopped on some systems 9488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (e.g. OS X) 9498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 9508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project signal(SIGTTIN, SIG_IGN); 9518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project signal(SIGTTOU, SIG_IGN); 9528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 9538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project atexit(sdl_at_exit); 9558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project root = aconfig_node("", ""); 9578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(name) { 9598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Support skin aliases like QVGA-H QVGA-P, etc... 9608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project But first we check if it's a directory that exist before applying 9618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project the alias */ 9628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int checkAlias = 1; 9638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path != NULL) { 9658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint(tmp, tmp+sizeof(tmp), "%s/%s", path, name); 9668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path_exists(tmp)) { 9678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project checkAlias = 0; 9688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 9698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("there is no '%s' skin in '%s'", name, path); 9708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (checkAlias) { 9748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 9758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; ; nn++ ) { 9778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* skin_name = skin_aliases[nn].name; 9788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* skin_alias = skin_aliases[nn].alias; 9798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !skin_name ) 9818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 9828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !strcasecmp( skin_name, name ) ) { 9848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("skin name '%s' aliased to '%s'", name, skin_alias); 9858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project name = skin_alias; 9868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 9878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Magically support skins like "320x240" */ 9928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(isdigit(name[0])) { 9938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char *x = strchr(name, 'x'); 9948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(x && isdigit(x[1])) { 9958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int width = atoi(name); 9968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int height = atoi(x + 1); 9978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sprintf(tmp,"display {\n width %d\n height %d\n}\n", 9988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project width, height); 9998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project aconfig_load(root, strdup(tmp)); 10008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project path = ":"; 10018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto found_a_skin; 10028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path == NULL) { 10068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror("unknown skin name '%s'", name); 10078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 10088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sprintf(tmp, "%s/%s/layout", path, name); 10118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("trying to load skin file '%s'", tmp); 10128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(aconfig_load_file(root, tmp) >= 0) { 10148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sprintf(tmp, "%s/%s/", path, name); 10158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project path = tmp; 10168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto found_a_skin; 10178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 10188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dwarning("could not load skin file '%s', using built-in one\n", 10198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tmp); 10208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 10248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const unsigned char* layout_base; 10258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project size_t layout_size; 10268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project name = "<builtin>"; 10288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout_base = android_resource_find( "layout", &layout_size ); 10308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (layout_base != NULL) { 10318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* base = malloc( layout_size+1 ); 10328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project memcpy( base, layout_base, layout_size ); 10338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project base[layout_size] = 0; 10348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("parsing built-in skin layout file (size=%d)", (int)layout_size); 10368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project aconfig_load(root, base); 10378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project path = ":"; 10388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 10398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "Couldn't load builtin skin\n"); 10408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 10418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfound_a_skin: 10458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 10468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project win_x = 10; 10478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project win_y = 10; 10488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (userConfig) 10508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project auserConfig_getWindowPos(userConfig, &win_x, &win_y); 10518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( qemulator_init( qemulator, root, path, win_x, win_y, opts ) < 0 ) { 10538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "### Error: could not load emulator skin '%s'\n", name); 10548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 10558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_skin_keycharmap = skin_keyboard_charmap_name(qemulator->keyboard); 10588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* the default network speed and latency can now be specified by the device skin */ 10608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project n = aconfig_find(root, "network"); 10618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (n != NULL) { 10628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_network_speed = aconfig_str(n, "speed", 0); 10638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_network_delay = aconfig_str(n, "delay", 0); 10648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if 0 10678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* create a trackball if needed */ 10688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project n = aconfig_find(root, "trackball"); 10698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (n != NULL) { 10708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinTrackBallParameters params; 10718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params.x = aconfig_unsigned(n, "x", 0); 10738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params.y = aconfig_unsigned(n, "y", 0); 10748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params.diameter = aconfig_unsigned(n, "diameter", 20); 10758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params.ring = aconfig_unsigned(n, "ring", 1); 10768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params.ball_color = aconfig_unsigned(n, "ball-color", 0xffe0e0e0); 10788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params.dot_color = aconfig_unsigned(n, "dot-color", 0xff202020 ); 10798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params.ring_color = aconfig_unsigned(n, "ring-color", 0xff000000 ); 10808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_disp->trackball = skin_trackball_create( ¶ms ); 10828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_trackball_refresh( qemu_disp->trackball ); 10838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 10858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* add an onion overlay image if needed */ 10878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->onion) { 10888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinImage* onion = skin_image_find_simple( opts->onion ); 10898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int alpha, rotate; 10908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( opts->onion_alpha && 1 == sscanf( opts->onion_alpha, "%d", &alpha ) ) { 10928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project alpha = (256*alpha)/100; 10938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else 10948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project alpha = 128; 10958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( opts->onion_rotation && 1 == sscanf( opts->onion_rotation, "%d", &rotate ) ) { 10978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project rotate &= 3; 10988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else 10998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project rotate = SKIN_ROTATION_0; 11008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemulator->onion = onion; 11028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemulator->onion_alpha = alpha; 11038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemulator->onion_rotation = rotate; 11048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint qemu_main(int argc, char **argv); 11088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* this function dumps the QEMU help */ 11108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void help( void ); 11118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void emulator_help( void ); 11128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define VERBOSE_OPT(str,var) { str, &var } 11148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define _VERBOSE_TAG(x,y) { #x, VERBOSE_##x, y }, 11168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const struct { const char* name; int flag; const char* text; } 11178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectverbose_options[] = { 11188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project VERBOSE_TAG_LIST 11198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 0, 0, 0 } 11208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 11218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint 11238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectandroid_parse_network_speed(const char* speed) 11248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 11258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int n; 11268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 11278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project double sp; 11288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (speed == NULL || speed[0] == 0) { 11308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project speed = DEFAULT_NETSPEED; 11318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (n = 0; android_netspeeds[n].name != NULL; n++) { 11348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!strcmp(android_netspeeds[n].name, speed)) { 11358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_net_download_speed = android_netspeeds[n].download; 11368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_net_upload_speed = android_netspeeds[n].upload; 11378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 11388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* is this a number ? */ 11428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sp = strtod(speed, &end); 11438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (end == speed) { 11448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 11458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_net_download_speed = qemu_net_upload_speed = sp*1000.; 11488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (*end == ':') { 11498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project speed = end+1; 11508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sp = strtod(speed, &end); 11518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (end > speed) { 11528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_net_download_speed = sp*1000.; 11538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (android_modem) 11578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project amodem_set_data_network_type( android_modem, 11588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_parse_network_type(speed) ); 11598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 11608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint 11648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectandroid_parse_network_latency(const char* delay) 11658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 11668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int n; 11678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 11688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project double sp; 11698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (delay == NULL || delay[0] == 0) 11718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project delay = DEFAULT_NETDELAY; 11728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (n = 0; android_netdelays[n].name != NULL; n++) { 11748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !strcmp( android_netdelays[n].name, delay ) ) { 11758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_net_min_latency = android_netdelays[n].min_ms; 11768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_net_max_latency = android_netdelays[n].max_ms; 11778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 11788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* is this a number ? */ 11828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sp = strtod(delay, &end); 11838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (end == delay) { 11848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 11858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_net_min_latency = qemu_net_max_latency = (int)sp; 11888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (*end == ':') { 11898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project delay = (const char*)end+1; 11908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sp = strtod(delay, &end); 11918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (end > delay) { 11928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_net_max_latency = (int)sp; 11938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 11968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 12008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectload_keyset(const char* path) 12018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 12028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path_can_read(path)) { 12038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AConfig* root = aconfig_node("",""); 12048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!aconfig_load_file(root, path)) { 12058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_keyset = skin_keyset_new(root); 12068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (android_keyset != NULL) { 12078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "keyset loaded from: %s", path); 12088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 12098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 12138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 12148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 12168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectparse_keyset(const char* keyset, AndroidOptions* opts) 12178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 12188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char kname[MAX_PATH]; 12198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char temp[MAX_PATH]; 12208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* p; 12218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 12228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* append .keyset suffix if needed */ 12248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strchr(keyset, '.') == NULL) { 12258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = kname; 12268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project end = p + sizeof(kname); 12278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, "%s.keyset", keyset); 12288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p >= end) { 12298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "keyset name too long: '%s'\n", keyset); 12308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 12318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project keyset = kname; 12338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* look for a the keyset file */ 12368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = temp; 12378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project end = p + sizeof(temp); 12388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint_config_file(p, end, keyset); 12398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p < end && load_keyset(temp) == 0) 12408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 12418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = temp; 12438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, "%s" PATH_SEP "keysets" PATH_SEP "%s", opts->sysdir, keyset); 12448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p < end && load_keyset(temp) == 0) 12458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 12468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = temp; 12488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint_app_dir(p, end); 12498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, PATH_SEP "keysets" PATH_SEP "%s", keyset); 12508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p < end && load_keyset(temp) == 0) 12518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 12528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 12548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 12558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 12578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectwrite_default_keyset( void ) 12588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 12598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char path[MAX_PATH]; 12608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint_config_file( path, path+sizeof(path), KEYSET_FILE ); 12628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* only write if there is no file here */ 12648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !path_exists(path) ) { 12658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int fd = open( path, O_WRONLY | O_CREAT, 0666 ); 12668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int ret; 12678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* ks = skin_keyset_get_default(); 12688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "writing default keyset file to %s", path ); 12718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (fd < 0) { 12738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "%s: could not create file: %s", __FUNCTION__, strerror(errno) ); 12748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 12758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project CHECKED(ret, write(fd, ks, strlen(ks))); 12778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project close(fd); 12788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 12808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_NAND_LIMITS 12828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic uint64_t 12848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectparse_nand_rw_limit( const char* value ) 12858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 12868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 12878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint64_t val = strtoul( value, &end, 0 ); 12888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (end == value) { 12908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "bad parameter value '%s': expecting unsigned integer", value ); 12918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 12928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (end[0]) { 12958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 'K': val <<= 10; break; 12968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 'M': val <<= 20; break; 12978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 'G': val <<= 30; break; 12988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 0: break; 12998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: 13008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "bad read/write limit suffix: use K, M or G" ); 13018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 13028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return val; 13048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 13058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 13078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectparse_nand_limits(char* limits) 13088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 13098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int pid = -1, signal = -1; 13108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int64_t reads = 0, writes = 0; 13118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* item = limits; 13128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* parse over comma-separated items */ 13148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (item && *item) { 13158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* next = strchr(item, ','); 13168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 13178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (next == NULL) { 13198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project next = item + strlen(item); 13208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 13218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *next++ = 0; 13228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !memcmp(item, "pid=", 4) ) { 13258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project pid = strtol(item+4, &end, 10); 13268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (end == NULL || *end) { 13278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "bad parameter, expecting pid=<number>, got '%s'", 13288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project item ); 13298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 13308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (pid <= 0) { 13328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "bad parameter: process identifier must be > 0" ); 13338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 13348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if ( !memcmp(item, "signal=", 7) ) { 13378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project signal = strtol(item+7,&end, 10); 13388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (end == NULL || *end) { 13398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "bad parameter: expecting signal=<number>, got '%s'", 13408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project item ); 13418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 13428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (signal <= 0) { 13448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "bad parameter: signal number must be > 0" ); 13458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 13468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if ( !memcmp(item, "reads=", 6) ) { 13498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project reads = parse_nand_rw_limit(item+6); 13508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if ( !memcmp(item, "writes=", 7) ) { 13528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project writes = parse_nand_rw_limit(item+7); 13538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else { 13558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "bad parameter '%s' (see -help-nand-limits)", item ); 13568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 13578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project item = next; 13598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (pid < 0) { 13618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "bad paramater: missing pid=<number>" ); 13628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 13638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (signal < 0) { 13658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "bad parameter: missing signal=<number>" ); 13668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 13678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (reads == 0 && writes == 0) { 13698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dwarning( "no read or write limit specified. ignoring -nand-limits" ); 13708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 13718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project nand_threshold* t; 13728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project t = &android_nand_read_threshold; 13748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project t->pid = pid; 13758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project t->signal = signal; 13768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project t->counter = 0; 13778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project t->limit = reads; 13788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project t = &android_nand_write_threshold; 13808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project t->pid = pid; 13818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project t->signal = signal; 13828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project t->counter = 0; 13838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project t->limit = writes; 13848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 13868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* CONFIG_NAND_LIMITS */ 13878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid emulator_help( void ) 13898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 13908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project STRALLOC_DEFINE(out); 13918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_help_main(out); 13928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf( "%.*s", out->n, out->s ); 13938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project stralloc_reset(out); 13948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 13958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 13968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 13988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectadd_dns_server( const char* server_name ) 13998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 14008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SockAddress addr; 14018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (sock_address_init_resolve( &addr, server_name, 55, 0 ) < 0) { 14038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, 14048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "### WARNING: can't resolve DNS server name '%s'\n", 14058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project server_name ); 14068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 14078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "DNS server name '%s' resolved to %s", server_name, sock_address_to_string(&addr) ); 14108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( slirp_add_dns_server( &addr ) < 0 ) { 14128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, 14138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "### WARNING: could not add DNS server '%s' to the network stack\n", server_name); 14148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 14158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 14178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 14188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectenum { 14218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project REPORT_CONSOLE_SERVER = (1 << 0), 14228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project REPORT_CONSOLE_MAX = (1 << 1) 14238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 14248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 14268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectget_report_console_options( char* end, int *maxtries ) 14278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 14288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int flags = 0; 14298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (end == NULL || *end == 0) 14318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 14328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (end[0] != ',') { 14348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "socket port/path can be followed by [,<option>]+ only\n"); 14358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(3); 14368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project end += 1; 14388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (*end) { 14398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* p = strchr(end, ','); 14408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p == NULL) 14418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = end + strlen(end); 14428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (memcmp( end, "server", p-end ) == 0) 14448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project flags |= REPORT_CONSOLE_SERVER; 14458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (memcmp( end, "max=", 4) == 0) { 14468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project end += 4; 14478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *maxtries = strtol( end, NULL, 10 ); 14488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project flags |= REPORT_CONSOLE_MAX; 14498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 14508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "socket port/path can be followed by [,server][,max=<count>] only\n"); 14518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(3); 14528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project end = p; 14558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (*end) 14568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project end += 1; 14578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return flags; 14598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 14608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 14628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectreport_console( const char* proto_port, int console_port ) 14638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 14648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int s = -1, s2; 14658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int maxtries = 10; 14668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int flags = 0; 14678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project signal_state_t sigstate; 14688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project disable_sigalrm( &sigstate ); 14708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !strncmp( proto_port, "tcp:", 4) ) { 14728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 14738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project long port = strtol(proto_port + 4, &end, 10); 14748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project flags = get_report_console_options( end, &maxtries ); 14768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (flags & REPORT_CONSOLE_SERVER) { 14788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s = socket_loopback_server( port, SOCKET_STREAM ); 14798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (s < 0) { 14808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "could not create server socket on TCP:%ld: %s\n", 14818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project port, errno_str); 14828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(3); 14838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 14858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ; maxtries > 0; maxtries-- ) { 14868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("trying to find console-report client on tcp:%d", port); 14878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s = socket_loopback_client( port, SOCKET_STREAM ); 14888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (s >= 0) 14898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 14908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sleep_ms(1000); 14928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (s < 0) { 14948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "could not connect to server on TCP:%ld: %s\n", 14958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project port, errno_str); 14968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(3); 14978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if ( !strncmp( proto_port, "unix:", 5) ) { 15008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32 15018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "sorry, the unix: protocol is not supported on Win32\n"); 15028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(3); 15038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 15048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* path = strdup(proto_port+5); 15058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end = strchr(path, ','); 15068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (end != NULL) { 15078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project flags = get_report_console_options( end, &maxtries ); 15088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *end = 0; 15098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (flags & REPORT_CONSOLE_SERVER) { 15118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s = socket_unix_server( path, SOCKET_STREAM ); 15128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (s < 0) { 15138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "could not bind unix socket on '%s': %s\n", 15148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project proto_port+5, errno_str); 15158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(3); 15168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 15188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ; maxtries > 0; maxtries-- ) { 15198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s = socket_unix_client( path, SOCKET_STREAM ); 15208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (s >= 0) 15218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 15228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sleep_ms(1000); 15248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (s < 0) { 15268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "could not connect to unix socket on '%s': %s\n", 15278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project path, errno_str); 15288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(3); 15298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project free(path); 15328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 15338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 15348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "-report-console must be followed by a 'tcp:<port>' or 'unix:<path>'\n"); 15358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(3); 15368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (flags & REPORT_CONSOLE_SERVER) { 15398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int tries = 3; 15408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "waiting for console-reporting client" ); 15418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do { 15428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s2 = socket_accept(s, NULL); 15438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } while (s2 < 0 && --tries > 0); 15448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (s2 < 0) { 15468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "could not accept console-reporting client connection: %s\n", 15478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project errno_str); 15488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(3); 15498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project socket_close(s); 15528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s = s2; 15538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* simply send the console port in text */ 15568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 15578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char temp[12]; 15588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project snprintf( temp, sizeof(temp), "%d", console_port ); 15598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (socket_send(s, temp, strlen(temp)) < 0) { 15618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "could not send console number report: %d: %s\n", 15628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project errno, errno_str ); 15638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(3); 15648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project socket_close(s); 15668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "console port number sent to remote. resuming boot" ); 15688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project restore_sigalrm (&sigstate); 15708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 15718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* this function is used to perform auto-detection of the 15738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * system directory in the case of a SDK installation. 15748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 15758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * we want to deal with several historical usages, hence 15768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * the slightly complicated logic. 15778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 15788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * NOTE: the function returns the path to the directory 15798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * containing 'fileName'. this is *not* the full 15808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * path to 'fileName'. 15818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 15828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic char* 15838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project_getSdkImagePath( const char* fileName ) 15848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 15858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char temp[MAX_PATH]; 15868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* p = temp; 15878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end = p + sizeof(temp); 15888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* q; 15898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* app; 15908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static const char* const searchPaths[] = { 15928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "", /* program's directory */ 15938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "/lib/images", /* this is for SDK 1.0 */ 15948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "/../platforms/android-1.1/images", /* this is for SDK 1.1 */ 15958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL 15968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project }; 15978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project app = bufprint_app_dir(temp, end); 15998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (app >= end) 16008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 16018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do { 16038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 16048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* first search a few well-known paths */ 16068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; searchPaths[nn] != NULL; nn++) { 16078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(app, end, "%s", searchPaths[nn]); 16088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project q = bufprint(p, end, "/%s", fileName); 16098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (q < end && path_exists(temp)) { 16108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *p = 0; 16118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto FOUND_IT; 16128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* hmmm. let's assume that we are in a post-1.1 SDK 16168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * scan ../platforms if it exists 16178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 16188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(app, end, "/../platforms"); 16198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p < end) { 16208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project DirScanner* scanner = dirScanner_new(temp); 16218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (scanner != NULL) { 16228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int found = 0; 16238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* subdir; 16248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (;;) { 16268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project subdir = dirScanner_next(scanner); 16278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!subdir) break; 16288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project q = bufprint(p, end, "/%s/images/%s", subdir, fileName); 16308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (q >= end || !path_exists(temp)) 16318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project continue; 16328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project found = 1; 16348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, "/%s/images", subdir); 16358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 16368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dirScanner_free(scanner); 16388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (found) 16398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 16408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* I'm out of ideas */ 16448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 16458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } while (0); 16478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectFOUND_IT: 16498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project //D("image auto-detection: %s/%s", temp, fileName); 16508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return qemu_strdup(temp); 16518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 16528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic char* 16548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project_getSdkImage( const char* path, const char* file ) 16558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 16568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char temp[MAX_PATH]; 16578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char *p = temp, *end = p + sizeof(temp); 16588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(temp, end, "%s/%s", path, file); 16608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p >= end || !path_exists(temp)) 16618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 16628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return qemu_strdup(temp); 16648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 16658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic char* 16678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project_getSdkSystemImage( const char* path, const char* optionName, const char* file ) 16688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 16698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* image = _getSdkImage(path, file); 16708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (image == NULL) { 16728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror("Your system directory is missing the '%s' image file.\n" 16738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Please specify one with the '%s <filepath>' option", 16748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project file, optionName); 16758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 16768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return image; 16788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 16798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 16818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project_forceAvdImagePath( AvdImageType imageType, 16828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* path, 16838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* description, 16848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int required ) 16858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 16868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path == NULL) 16878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 16888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (required && !path_exists(path)) { 16908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror("Cannot find %s image file: %s", description, path); 16918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 16928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdParams->forcePaths[imageType] = path; 16948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 16958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32 16978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef main /* we don't want SDL to define main */ 16988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 16998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint main(int argc, char **argv) 17018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 17028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char tmp[MAX_PATH]; 17038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* tmpend = tmp + sizeof(tmp); 17048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* args[128]; 17058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int n; 17068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* opt; 17078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int use_sdcard_img = 0; 17088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int serial = 0; 17098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int gps_serial = 0; 17108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int radio_serial = 0; 17118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int qemud_serial = 0; 17128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int shell_serial = 0; 17138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int dns_count = 0; 17148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned cachePartitionSize = 0; 1715b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project unsigned defaultPartitionSize = 0x4200000; 17168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AndroidHwConfig* hw; 17188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project //const char *appdir = get_app_dir(); 17208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* android_build_root = NULL; 17218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* android_build_out = NULL; 17228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AndroidOptions opts[1]; 17248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[0] = argv[0]; 17268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( android_parse_options( &argc, &argv, opts ) < 0 ) { 17288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 17298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (argc-- > 1) { 17328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opt = (++argv)[0]; 17338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(!strcmp(opt, "-qemu")) { 17358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project argc--; 17368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project argv++; 17378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 17388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!strcmp(opt, "-help")) { 17418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator_help(); 17428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!strncmp(opt, "-help-",6)) { 17458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project STRALLOC_DEFINE(out); 17468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opt += 6; 17478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!strcmp(opt, "all")) { 17498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_help_all(out); 17508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (android_help_for_option(opt, out) == 0) { 17528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* ok */ 17538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (android_help_for_topic(opt, out) == 0) { 17558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* ok */ 17568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (out->n > 0) { 17588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf("\n%.*s", out->n, out->s); 17598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(0); 17608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "unknown option: -help-%s\n", opt); 17638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "please use -help for a list of valid topics\n"); 17648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 17658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opt[0] == '-') { 17688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "unknown option: %s\n", opt); 17698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "please use -help for a list of valid options\n"); 17708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 17718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "invalid command-line parameter: %s.\n", opt); 17748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "Hint: use '@foo' to launch a virtual device named 'foo'.\n"); 17758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "please use -help for more information\n"); 17768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 17778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* special case, if -qemu -h is used, directly invoke the QEMU-specific help */ 17808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (argc > 0) { 17818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 17828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; nn < argc; nn++) 17838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!strcmp(argv[nn], "-h")) { 17848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_help(0); 17858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 17868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_charmap = android_charmaps[0]; 17908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->version) { 17928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf("Android emulator version %s\n" 17938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Copyright (C) 2006-2008 The Android Open Source Project and many others.\n" 17948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "This program is a derivative of the QEMU CPU emulator (www.qemu.org).\n\n", 17958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined ANDROID_BUILD_ID 17968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project VERSION_STRING " (build_id " STRINGIFY(ANDROID_BUILD_ID) ")" ); 17978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 17988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project VERSION_STRING); 17998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 18008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf(" This software is licensed under the terms of the GNU General Public\n" 18018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " License version 2, as published by the Free Software Foundation, and\n" 18028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " may be copied, distributed, and modified under those terms.\n\n" 18038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " This program is distributed in the hope that it will be useful,\n" 18048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " but WITHOUT ANY WARRANTY; without even the implied warranty of\n" 18058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" 18068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " GNU General Public License for more details.\n\n"); 18078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(0); 18098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 18108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->timezone) { 18128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( timezone_set(opts->timezone) < 0 ) { 18138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "emulator: it seems the timezone '%s' is not in zoneinfo format\n", opts->timezone); 18148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 18158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 18168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* legacy support: we used to use -system <dir> and -image <file> 18188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * instead of -sysdir <dir> and -system <file>, so handle this by checking 18198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * whether the options point to directories or files. 18208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 18218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->image != NULL) { 18228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->system != NULL) { 18238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->sysdir != NULL) { 18248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "You can't use -sysdir, -system and -image at the same time.\n" 18258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "You should probably use '-sysdir <path> -system <file>'.\n" ); 18268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 18278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 18288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 18298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dwarning( "Please note that -image is obsolete and that -system is now used to point\n" 18308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "to the system image. Next time, try using '-sysdir <path> -system <file>' instead.\n" ); 18318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->sysdir = opts->system; 18328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->system = opts->image; 18338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->image = NULL; 18348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 18358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (opts->system != NULL && path_is_dir(opts->system)) { 18368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->sysdir != NULL) { 18378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "Option -system should now be followed by a file path, not a directory one.\n" 18388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Please use '-sysdir <path>' to point to the system directory.\n" ); 18398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 18408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 18418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dwarning( "Please note that the -system option should now be used to point to the initial\n" 18428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "system image (like the obsolete -image option). To point to the system directory\n" 18438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "please now use '-sysdir <path>' instead.\n" ); 18448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->sysdir = opts->system; 18468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->system = NULL; 18478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 18488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->nojni) 18508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->no_jni = opts->nojni; 18518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->nocache) 18538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->no_cache = opts->nocache; 18548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->noaudio) 18568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->no_audio = opts->noaudio; 18578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->noskin) 18598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->no_skin = opts->noskin; 18608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->initdata) { 18628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->init_data = opts->initdata; 18638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->initdata = NULL; 18648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 18658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* If no AVD name was given, try to find the top of the 18678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Android build tree 18688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 18698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->avd == NULL) { 18708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do { 18718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* out = getenv("ANDROID_PRODUCT_OUT"); 18728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (out == NULL || out[0] == 0) 18748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 18758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!path_exists(out)) { 18779877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project derror("Can't access ANDROID_PRODUCT_OUT as '%s'\n" 18788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "You need to build the Android system before launching the emulator", 18798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project out); 18808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 18818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 18828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_build_root = path_parent( out, 4 ); 18848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (android_build_root == NULL || !path_exists(android_build_root)) { 18858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror("Can't find the Android build root from '%s'\n" 18868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Please check the definition of the ANDROID_PRODUCT_OUT variable.\n" 18878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "It should point to your product-specific build output directory.\n", 18888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project out ); 18898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 18908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 18918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_build_out = out; 18928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "found Android build root: %s", android_build_root ); 18938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "found Android build out: %s", android_build_out ); 18948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } while (0); 18958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 18968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* if no virtual device name is given, and we're not in the 18978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Android build system, we'll need to perform some auto-detection 18988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * magic :-) 18998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 19008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->avd == NULL && !android_build_out) 19018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 19028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char dataDirIsSystem = 0; 19038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->sysdir) { 19058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->sysdir = _getSdkImagePath("system.img"); 19068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->sysdir) { 19078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( 19088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "You did not specify a virtual device name, and the system\n" 19098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "directory could not be found.\n\n" 19108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "If you are an Android SDK user, please use '@<name>' or '-avd <name>'\n" 19118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "to start a given virtual device (see -help-avd for details).\n\n" 19128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Otherwise, follow the instructions in -help-disk-images to start the emulator\n" 19148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ); 19158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 19168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 19178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -sysdir %s", opts->sysdir); 19188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 19198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->system) { 19218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->system = _getSdkSystemImage(opts->sysdir, "-image", "system.img"); 19228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -image %s", opts->image); 19238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 19248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->kernel) { 19268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->kernel = _getSdkSystemImage(opts->sysdir, "-kernel", "kernel-qemu"); 19278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -kernel %s", opts->kernel); 19288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 19298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->ramdisk) { 19318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->ramdisk = _getSdkSystemImage(opts->sysdir, "-ramdisk", "ramdisk.img"); 19328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -ramdisk %s", opts->ramdisk); 19338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 19348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* if no data directory is specified, use the system directory */ 19368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->datadir) { 19378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->datadir = qemu_strdup(opts->sysdir); 19388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dataDirIsSystem = 1; 19398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -datadir %s", opts->sysdir); 19408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 19418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->data) { 19438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* check for userdata-qemu.img in the data directory */ 19448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint(tmp, tmpend, "%s/userdata-qemu.img", opts->datadir); 19458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!path_exists(tmp)) { 19468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( 19478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "You did not provide the name of an Android Virtual Device\n" 19488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "with the '-avd <name>' option. Read -help-avd for more information.\n\n" 19498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "If you *really* want to *NOT* run an AVD, consider using '-data <file>'\n" 19518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "to specify a data partition image file (I hope you know what you're doing).\n" 19528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ); 19538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 19548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 19558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->data = qemu_strdup(tmp); 19578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -data %s", opts->data); 19588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 19598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->sdcard && opts->datadir) { 19618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint(tmp, tmpend, "%s/sdcard.img", opts->datadir); 19628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path_exists(tmp)) { 19638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->sdcard = qemu_strdup(tmp); 19648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -sdcard %s", opts->sdcard); 19658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 19668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 19678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 19688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* setup the virtual device parameters from our options 19708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 19718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->no_cache) { 19728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdParams->flags |= AVDINFO_NO_CACHE; 19738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 19748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->wipe_data) { 19758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdParams->flags |= AVDINFO_WIPE_DATA | AVDINFO_WIPE_CACHE; 19768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 19778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* if certain options are set, we can force the path of 19798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * certain kernel/disk image files 19808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 19818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _forceAvdImagePath(AVD_IMAGE_KERNEL, opts->kernel, "kernel", 1); 19828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _forceAvdImagePath(AVD_IMAGE_INITSYSTEM, opts->system, "system", 1); 19838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _forceAvdImagePath(AVD_IMAGE_RAMDISK, opts->ramdisk,"ramdisk", 1); 19848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _forceAvdImagePath(AVD_IMAGE_USERDATA, opts->data, "user data", 0); 19858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _forceAvdImagePath(AVD_IMAGE_CACHE, opts->cache, "cache", 0); 19868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _forceAvdImagePath(AVD_IMAGE_SDCARD, opts->sdcard, "SD Card", 0); 19878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* we don't accept -skindir without -skin now 19898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * to simplify the autoconfig stuff with virtual devices 19908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 19918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->no_skin) { 19928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->skin = "320x480"; 19938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->skindir = NULL; 19948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 19958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->skindir) { 19978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->skin) { 19988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "the -skindir <path> option requires a -skin <name> option"); 19998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 20008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 20018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 20028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else { 20038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->skin && android_build_out) { 20048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* select default skin based on product type */ 20058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* p = strrchr(android_build_out,'/'); 20068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p) { 20078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p[1] == 's') { 20088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->skin = "HVGA"; /* used to be QVGA-L */ 20098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (p[1] == 'd') { 20108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->skin = "HVGA"; 20118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 20128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 20138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -skin %s", opts->skin); 20148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 20158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdParams->skinName = opts->skin; 20168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 20178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* setup the virtual device differently depending on whether 20188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * we are in the Android build system or not 20198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 20208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->avd != NULL) 20218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 20228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdInfo = avdInfo_new( opts->avd, android_avdParams ); 20238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (android_avdInfo == NULL) { 20248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* an error message has already been printed */ 20258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dprint("could not find virtual device named '%s'", opts->avd); 20268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 20278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 20288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 20298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 20308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 20318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_build_out) { 20328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_build_out = android_build_root = opts->sysdir; 20338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 20348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdInfo = avdInfo_newForAndroidBuild( 20358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_build_root, 20368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_build_out, 20378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdParams ); 20388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 20398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(android_avdInfo == NULL) { 20408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("could not start virtual device\n"); 20418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 20428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 20438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 20448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 20458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* get the skin from the virtual device configuration */ 20468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->skin = (char*) avdInfo_getSkinName( android_avdInfo ); 20478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->skindir = (char*) avdInfo_getSkinDir( android_avdInfo ); 20488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 20498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->skin) { 20508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -skin %s", opts->skin); 20518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 20528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->skindir) { 20538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -skindir %s", opts->skindir); 20548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 20558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 20568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Read hardware configuration */ 20578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project hw = android_hw; 20588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (avdInfo_getHwConfig(android_avdInfo, hw) < 0) { 20598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror("could not read hardware configuration ?"); 20608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 20618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 20628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 20638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_NAND_LIMITS 20648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->nand_limits) 20658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project parse_nand_limits(opts->nand_limits); 20668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 20678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 20688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->keyset) { 20698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project parse_keyset(opts->keyset, opts); 20708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_keyset) { 20718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, 20728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "emulator: WARNING: could not find keyset file named '%s'," 20738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " using defaults instead\n", 20748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->keyset); 20758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 20768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 20778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_keyset) { 20788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project parse_keyset("default", opts); 20798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_keyset) { 20808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_keyset = skin_keyset_new_from_text( skin_keyset_get_default() ); 20818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_keyset) { 20828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "PANIC: default keyset file is corrupted !!\n" ); 20838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "PANIC: please update the code in android/skin/keyset.c\n" ); 20848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 20858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 20868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->keyset) 20878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project write_default_keyset(); 20888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 20898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 20908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 209192c7311b1cb354745ec7b59b0e03910b3fe4c205The Android Open Source Project /* the purpose of -no-audio is to disable sound output from the emulator, 209292c7311b1cb354745ec7b59b0e03910b3fe4c205The Android Open Source Project * not to disable Audio emulation. So simply force the 'none' backends */ 209392c7311b1cb354745ec7b59b0e03910b3fe4c205The Android Open Source Project if (opts->no_audio) 209492c7311b1cb354745ec7b59b0e03910b3fe4c205The Android Open Source Project opts->audio = "none"; 209592c7311b1cb354745ec7b59b0e03910b3fe4c205The Android Open Source Project 20968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->audio) { 20978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->audio_in || opts->audio_out) { 20988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "you can't use -audio with -audio-in or -audio-out\n" ); 20998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 21008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 21018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !audio_check_backend_name( 0, opts->audio ) ) { 21028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "'%s' is not a valid audio output backend. see -help-audio-out\n", 21038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->audio); 21048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 21058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 21068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->audio_out = opts->audio; 21078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->audio_in = opts->audio; 21088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !audio_check_backend_name( 1, opts->audio ) ) { 21108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, 21118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "emulator: warning: '%s' is not a valid audio input backend. audio record disabled\n", 21128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->audio); 21138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->audio_in = "none"; 21148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 21158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 21168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->audio_in) { 21188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static char env[64]; /* note: putenv needs a static unique string buffer */ 21198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !audio_check_backend_name( 1, opts->audio_in ) ) { 21208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "'%s' is not a valid audio input backend. see -help-audio-in\n", 21218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->audio_in); 21228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 21238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 21248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint( env, env+sizeof(env), "QEMU_AUDIO_IN_DRV=%s", opts->audio_in ); 21258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project putenv( env ); 21268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!hw->hw_audioInput) { 21288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dwarning( "Emulated hardware doesn't have audio input."); 21298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 21308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 21318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->audio_out) { 21328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static char env[64]; /* note: putenv needs a static unique string buffer */ 21338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !audio_check_backend_name( 0, opts->audio_out ) ) { 21348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "'%s' is not a valid audio output backend. see -help-audio-out\n", 21358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->audio_out); 21368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 21378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 21388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint( env, env+sizeof(env), "QEMU_AUDIO_OUT_DRV=%s", opts->audio_out ); 21398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project putenv( env ); 21408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!hw->hw_audioOutput) { 21418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dwarning( "Emulated hardware doesn't have audio output"); 21428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 21438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 21448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->cpu_delay) { 21468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 21478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project long delay = strtol(opts->cpu_delay, &end, 0); 21488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (end == NULL || *end || delay < 0 || delay > 1000 ) { 21498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "option -cpu-delay must be an integer between 0 and 1000\n" ); 21508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 21518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 21528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (delay > 0) 21538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project delay = (1000-delay); 21548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_cpu_delay = (int) delay; 21568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 21578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator_config_init(); 21598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project init_skinned_ui(opts->skindir, opts->skin, opts); 21608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->netspeed) { 21628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (skin_network_speed) 21638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("skin network speed: '%s'", skin_network_speed); 21648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->netspeed = (char*)skin_network_speed; 21658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 21668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->netdelay) { 21678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (skin_network_delay) 21688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("skin network delay: '%s'", skin_network_delay); 21698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->netdelay = (char*)skin_network_delay; 21708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 21718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( android_parse_network_speed(opts->netspeed) < 0 ) { 21738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "invalid -netspeed parameter '%s', see emulator -usage\n", opts->netspeed); 21748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator_help(); 21758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 21768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( android_parse_network_latency(opts->netdelay) < 0 ) { 21788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "invalid -netdelay parameter '%s', see emulator -usage\n", opts->netdelay); 21798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator_help(); 21808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 21818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->netfast) { 21838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_net_download_speed = 0; 21848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_net_upload_speed = 0; 21858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_net_min_latency = 0; 21868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_net_max_latency = 0; 21878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 21888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->trace) { 21908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* tracePath = avdInfo_getTracePath(android_avdInfo, opts->trace); 21918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int ret; 21928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (tracePath == NULL) { 21948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "bad -trace parameter" ); 21958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 21968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 21978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = path_mkdir_if_needed( tracePath, 0755 ); 21988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret < 0) { 21998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "could not create directory '%s'\n", tmp); 22008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 22018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 22028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->trace = tracePath; 22038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 22048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->tcpdump) { 22068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (qemu_tcpdump_start(opts->tcpdump) < 0) { 22078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dwarning( "could not start packet capture: %s", strerror(errno)); 22088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 22098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 22108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->no_cache) 22128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->cache = 0; 22138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->dns_server) { 22158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* x = strchr(opts->dns_server, ','); 22168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dns_count = 0; 22178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (x == NULL) 22188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 22198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( add_dns_server( opts->dns_server ) == 0 ) 22208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dns_count = 1; 22218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 22228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 22238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 22248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project x = strdup(opts->dns_server); 22258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (*x) { 22268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* y = strchr(x, ','); 22278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (y != NULL) 22298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *y = 0; 22308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (y == NULL || y > x) { 22328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( add_dns_server( x ) == 0 ) 22338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dns_count += 1; 22348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 22358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (y == NULL) 22378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 22388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project x = y+1; 22408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 22418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 22428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (dns_count == 0) 22438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf( stderr, "### WARNING: will use system default DNS server\n" ); 22448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 22458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (dns_count == 0) 22478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dns_count = slirp_get_system_dns_servers(); 22488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project n = 1; 22508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* generate arguments for the underlying qemu main() */ 22518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-kernel"; 22528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = (char*) avdInfo_getImageFile(android_avdInfo, AVD_IMAGE_KERNEL); 22538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-initrd"; 22558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = (char*) avdInfo_getImageFile(android_avdInfo, AVD_IMAGE_RAMDISK); 22568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2257b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project if (opts->partition_size) { 2258b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project char* end; 2259b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project long size = strtol(opts->partition_size, &end, 0); 2260b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project long maxSize = LONG_MAX / (1024*1024); 2261b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project long defaultMB = (defaultPartitionSize + (512*1024)) / (1024*1024); 2262b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project 2263b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project if (size < 0 || *end != 0) { 2264b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project derror( "-partition-size must be followed by a positive integer" ); 2265b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project exit(1); 2266b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project } 2267b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project if (size < defaultMB || size > maxSize) { 2268b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project derror( "partition-size (%d) must be between %dMB and %dMB", 2269b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project size, defaultMB, maxSize ); 2270b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project exit(1); 2271b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project } 2272b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project defaultPartitionSize = size * 1024*1024; 2273b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project } 2274b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project 22758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 22768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* filetype = "file"; 22778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (avdInfo_isImageReadOnly(android_avdInfo, AVD_IMAGE_INITSYSTEM)) 22798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project filetype = "initfile"; 22808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint(tmp, tmpend, 2282b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project "system,size=0x%x,%s=%s", defaultPartitionSize, filetype, 22838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project avdInfo_getImageFile(android_avdInfo, AVD_IMAGE_INITSYSTEM)); 22848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-nand"; 22868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = strdup(tmp); 22878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 22888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint(tmp, tmpend, 2290b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project "userdata,size=0x%x,file=%s", 2291b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project defaultPartitionSize, 22928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project avdInfo_getImageFile(android_avdInfo, AVD_IMAGE_USERDATA)); 22938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-nand"; 22958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = strdup(tmp); 22968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (hw->disk_cachePartition) { 22988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->cache = (char*) avdInfo_getImageFile(android_avdInfo, AVD_IMAGE_CACHE); 22998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cachePartitionSize = hw->disk_cachePartition_size; 23008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 23018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (opts->cache) { 23028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dwarning( "Emulated hardware doesn't support a cache partition" ); 23038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->cache = NULL; 23048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->no_cache = 1; 23058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 23068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 23078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->cache) { 23088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* use a specific cache file */ 23098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sprintf(tmp, "cache,size=0x%0x,file=%s", cachePartitionSize, opts->cache); 23108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-nand"; 23118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = strdup(tmp); 23128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 23138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!opts->no_cache) { 23148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* create a temporary cache partition file */ 23158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sprintf(tmp, "cache,size=0x%0x", cachePartitionSize); 23168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-nand"; 23178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = strdup(tmp); 23188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 23198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 23208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (hw->hw_sdCard != 0) 23218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->sdcard = (char*) avdInfo_getImageFile(android_avdInfo, AVD_IMAGE_SDCARD); 23228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (opts->sdcard) { 23238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dwarning( "Emulated hardware doesn't support SD Cards" ); 23248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->sdcard = NULL; 23258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 23268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 23278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(opts->sdcard) { 23288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint64_t size; 23298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path_get_size(opts->sdcard, &size) == 0) { 23308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* see if we have an sdcard image. get its size if it exists */ 23318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (size < 8*1024*1024ULL) { 23328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "### WARNING: SD Card files must be at least 8 MB, ignoring '%s'\n", opts->sdcard); 23338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 23348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-hda"; 23358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->sdcard; 23368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project use_sdcard_img = 1; 23378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 23388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 23398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("no SD Card image at '%s'", opts->sdcard); 23408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 23418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 23428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 23438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->logcat || opts->logcat[0] == 0) { 23448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->logcat = getenv("ANDROID_LOG_TAGS"); 23458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->logcat && opts->logcat[0] == 0) 23468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->logcat = NULL; 23478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 23488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 23498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if 0 23508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->console) { 23518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "option -console is obsolete. please use -shell instead" ); 23528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 23538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 23548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 23558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 23568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* we always send the kernel messages from ttyS0 to android_kmsg */ 23578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 23588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AndroidKmsgFlags flags = 0; 23598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 23608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->show_kernel) 23618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project flags |= ANDROID_KMSG_PRINT_MESSAGES; 23628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 23638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_kmsg_init( flags ); 23648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 23658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "android-kmsg"; 23668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project serial++; 23678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 23688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 23698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* XXXX: TODO: implement -shell and -logcat through qemud instead */ 23708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->shell_serial) { 23718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32 23728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->shell_serial = "con:"; 23738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 23748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->shell_serial = "stdio"; 23758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 23768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 23778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 23788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->shell = 1; 23798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 23808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->shell || opts->logcat) { 23818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 23828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->shell_serial; 23838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project shell_serial = serial++; 23848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 23858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 23868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->old_system) 23878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 23888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->radio) { 23898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 23908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->radio; 23918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project radio_serial = serial++; 23928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 23938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else { 23948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 23958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "android-modem"; 23968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project radio_serial = serial++; 23978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 23988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->gps) { 23998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 24008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->gps; 24018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project gps_serial = serial++; 24028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 24038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 24048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else /* !opts->old_system */ 24058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 24068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 24078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "android-qemud"; 24088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemud_serial = serial++; 24098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 24108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->radio) { 24118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project CharDriverState* cs = qemu_chr_open(opts->radio); 24128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (cs == NULL) { 24138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "unsupported character device specification: %s\n" 24148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "used -help-char-devices for list of available formats\n", opts->radio ); 24158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 24168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 24178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_qemud_set_channel( ANDROID_QEMUD_GSM, cs); 24188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 24198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if ( hw->hw_gsmModem != 0 ) { 24208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( android_qemud_get_channel( ANDROID_QEMUD_GSM, &android_modem_cs ) < 0 ) { 24218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "could not initialize qemud 'gsm' channel" ); 24228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 24238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 24248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 24258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 24268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->gps) { 24278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project CharDriverState* cs = qemu_chr_open(opts->gps); 24288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (cs == NULL) { 24298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "unsupported character device specification: %s\n" 24308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "used -help-char-devices for list of available formats\n", opts->gps ); 24318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 24328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 24338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_qemud_set_channel( ANDROID_QEMUD_GPS, cs); 24348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 24358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if ( hw->hw_gps != 0 ) { 24368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( android_qemud_get_channel( "gps", &android_gps_cs ) < 0 ) { 24378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "could not initialize qemud 'gps' channel" ); 24388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 24398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 24408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 24418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 24428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 24438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->memory) { 24448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 24458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project long ramSize = strtol(opts->memory, &end, 0); 24468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ramSize < 0 || *end != 0) { 24478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "-memory must be followed by a positive integer" ); 24488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 24498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 24508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ramSize < 32 || ramSize > 4096) { 24518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "physical memory size must be between 32 and 4096 MB" ); 24528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 24538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 24548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 24558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->memory) { 24568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint(tmp, tmpend, "%d", hw->hw_ramSize); 24578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->memory = qemu_strdup(tmp); 24588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 24598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 24608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->trace) { 24618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-trace"; 24628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->trace; 24638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-tracing"; 24648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "off"; 24658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 24668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 24678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-append"; 24688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 24698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->bootchart) { 24708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 24718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int timeout = strtol(opts->bootchart, &end, 10); 24728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (timeout == 0) 24738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->bootchart = NULL; 24748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (timeout < 0 || timeout > 15*60) { 24758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "timeout specified for -bootchart option is invalid.\n" 24768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "please use integers between 1 and 900\n"); 24778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 24788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 24798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 24808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 24818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 24828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static char params[1024]; 24838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char *p = params, *end = p + sizeof(params); 24848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 24858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, "qemu=1 console=ttyS0" ); 24868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 24878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->shell || opts->logcat) { 24888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " androidboot.console=ttyS%d", shell_serial ); 24898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 24908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 24918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->trace) { 24928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " android.tracing=1"); 24938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 24948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 24958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->no_jni) { 24968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " android.checkjni=1"); 24978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 24988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 24998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->no_boot_anim) { 25008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint( p, end, " android.bootanim=0" ); 25018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 25028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 25038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->logcat) { 25048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* q = bufprint(p, end, " androidboot.logcat=%s", opts->logcat); 25058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 25068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (q < end) { 25078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* replace any space by a comma ! */ 25088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 25098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 25108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 1; p[nn] != 0; nn++) 25118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p[nn] == ' ' || p[nn] == '\t') 25128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p[nn] = ','; 25138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p += nn; 25148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 25158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 25168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = q; 25178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 25188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 25198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->old_system) 25208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 25218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " android.ril=ttyS%d", radio_serial); 25228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 25238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->gps) { 25248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " android.gps=ttyS%d", gps_serial); 25258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 25268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 25278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 25288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 25298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " android.qemud=ttyS%d", qemud_serial); 25308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 25318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 25328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (dns_count > 0) { 25338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " android.ndns=%d", dns_count); 25348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 25358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 25368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->bootchart) { 25378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " androidboot.bootchart=%s", opts->bootchart); 25388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 25398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 25408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p >= end) { 25418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "### ERROR: kernel parameters too long\n"); 25428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 25438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 25448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 25458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = strdup(params); 25468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 25478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 25488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* physical memory */ 25498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-m"; 25508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->memory; 25518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 25528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* on Linux, the 'dynticks' clock sometimes doesn't work 25538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * properly. this results in the UI freezing while emulation 25548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * continues, for several seconds... 25558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 25568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef __linux__ 25578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-clock"; 25588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "unix"; 25598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 25608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 25618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while(argc-- > 0) { 25628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = *argv++; 25638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 25648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n] = 0; 25658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 25668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(VERBOSE_CHECK(init)) { 25678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int i; 25688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for(i = 0; i < n; i++) { 25698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stdout, "emulator: argv[%02d] = \"%s\"\n", i, args[i]); 25708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 25718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 25728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return qemu_main(n, args); 25738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 25748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 25758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* this function is called from qemu_main() once all arguments have been parsed 25768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * it should be used to setup any Android-specific items in the emulation before the 25778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * main loop runs 25788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 25798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid android_emulation_setup( void ) 25808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 25818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int tries = 16; 25828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int base_port = 5554; 25838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int success = 0; 25848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int s; 25858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t guest_ip; 25868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 25878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AndroidOptions* opts = qemulator->opts; 25888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 25898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project inet_strtoip("10.0.2.15", &guest_ip); 25908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 25918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if 0 25928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->adb_port) { 25938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf( stderr, "option -adb-port is obsolete, use -port instead\n" ); 25948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 25958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 25968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 25978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 25988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->port && opts->ports) { 25998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf( stderr, "options -port and -ports cannot be used together.\n"); 26008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 26018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 26028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 26038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->ports) { 26048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* comma_location; 26058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 26068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int console_port = strtol( opts->ports, &comma_location, 0 ); 26078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 26088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( comma_location == NULL || *comma_location != ',' ) { 26098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "option -ports must be followed by two comma separated positive integer numbers" ); 26108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 26118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 26128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 26138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int adb_port = strtol( comma_location+1, &end, 0 ); 26148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 26158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( end == NULL || *end ) { 26168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "option -ports must be followed by two comma separated positive integer numbers" ); 26178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 26188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 26198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 26208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( console_port == adb_port ) { 26218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "option -ports must be followed by two different integer numbers" ); 26228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 26238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 26248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 26258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project slirp_redir( 0, adb_port, guest_ip, 5555 ); 26268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( control_console_start( console_port ) < 0 ) { 26278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project slirp_unredir( 0, adb_port ); 26288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 26298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 26308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project base_port = console_port; 26318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 26328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->port) { 26338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 26348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int port = strtol( opts->port, &end, 0 ); 26358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( end == NULL || *end || 26368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (unsigned)((port - base_port) >> 1) >= (unsigned)tries ) { 26378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "option -port must be followed by an even integer number between %d and %d\n", 26388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project base_port, base_port + (tries-1)*2 ); 26398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 26408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 26418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( (port & 1) != 0 ) { 26428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project port &= ~1; 26438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dwarning( "option -port must be followed by an even integer, using port number %d\n", 26448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project port ); 26458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 26468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project base_port = port; 26478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tries = 1; 26488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 26498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 26508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ; tries > 0; tries--, base_port += 2 ) { 26518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 26528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* setup first redirection for ADB, the Android Debug Bridge */ 26538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( slirp_redir( 0, base_port+1, guest_ip, 5555 ) < 0 ) 26548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project continue; 26558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 26568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* setup second redirection for the emulator console */ 26578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( control_console_start( base_port ) < 0 ) { 26588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project slirp_unredir( 0, base_port+1 ); 26598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project continue; 26608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 26618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 26628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "control console listening on port %d, ADB on port %d", base_port, base_port+1 ); 26638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project success = 1; 26648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 26658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 26668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 26678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!success) { 26688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "it seems too many emulator instances are running on this machine. Aborting\n" ); 26698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 26708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 26718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 26728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 26738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->report_console) { 26748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project report_console(opts->report_console, base_port); 26758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 26768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 26778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_modem_init( base_port ); 26788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 26798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_base_port = base_port; 26808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* send a simple message to the ADB host server to tell it we just started. 26818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * it should be listening on port 5037. if we can't reach it, don't bother 26828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 26838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do 26848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 26858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SockAddress addr; 26868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char tmp[32]; 26878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 26888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s = socket_create_inet( SOCKET_STREAM ); 26898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (s < 0) { 26908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("can't create socket to talk to the ADB server"); 26918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 26928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 26938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 26948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sock_address_init_inet( &addr, SOCK_ADDRESS_INET_LOOPBACK, 5037 ); 26958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (socket_connect( s, &addr ) < 0) { 26968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("can't connect to ADB server: %s", errno_str ); 26978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 26988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 26998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 27008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sprintf(tmp,"0012host:emulator:%d",base_port+1); 27018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project socket_send(s, tmp, 18+4); 27028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("sent '%s' to ADB server", tmp); 27038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 27048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (0); 27058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 27068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (s >= 0) 27078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project socket_close(s); 27088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 27098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* setup the http proxy, if any */ 27108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (VERBOSE_CHECK(proxy)) 27118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project proxy_set_verbose(1); 27128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 27138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->http_proxy) { 27148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->http_proxy = getenv("http_proxy"); 27158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 27168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 27178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do 27188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 27198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* env = opts->http_proxy; 27208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int envlen; 27218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ProxyOption option_tab[4]; 27228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ProxyOption* option = option_tab; 27238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* p; 27248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* q; 27258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* proxy_name; 27268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int proxy_name_len; 27278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int proxy_port; 27288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 27298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!env) 27308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 27318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 27328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project envlen = strlen(env); 27338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 27348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* skip the 'http://' header, if present */ 27358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (envlen >= 7 && !memcmp(env, "http://", 7)) { 27368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project env += 7; 27378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project envlen -= 7; 27388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 27398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 27408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* do we have a username:password pair ? */ 27418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = strchr(env, '@'); 27428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p != 0) { 27438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project q = strchr(env, ':'); 27448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (q == NULL) { 27458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project BadHttpProxyFormat: 27468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dprint("http_proxy format unsupported, try 'proxy:port' or 'username:password@proxy:port'"); 27478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 27488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 27498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 27508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project option->type = PROXY_OPTION_AUTH_USERNAME; 27518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project option->string = env; 27528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project option->string_len = q - env; 27538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project option++; 27548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 27558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project option->type = PROXY_OPTION_AUTH_PASSWORD; 27568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project option->string = q+1; 27578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project option->string_len = p - (q+1); 27588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project option++; 27598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 27608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project env = p+1; 27618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 27628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 27638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = strchr(env,':'); 27648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p == NULL) 27658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto BadHttpProxyFormat; 27668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 27678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project proxy_name = env; 27688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project proxy_name_len = p - env; 27698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project proxy_port = atoi(p+1); 27708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 27718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "setting up http proxy: server=%.*s port=%d", 27728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project proxy_name_len, proxy_name, proxy_port ); 27738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 27748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( proxy_http_setup( proxy_name, proxy_name_len, proxy_port, 27758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project option - option_tab, option_tab ) < 0 ) 27768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 27778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dprint( "http proxy setup failed, check your $http_proxy variable"); 27788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 27798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 27808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (0); 27818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 27829877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project /* initialize sensors, this must be done here due to timer issues */ 27839877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project android_hw_sensors_init(); 27849877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project 27858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* cool, now try to run the "ddms ping" command, which will take care of pinging usage 27868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * if the user agreed for it. the emulator itself never sends anything to any outside 27878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * machine 27888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 27898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 27908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32 27918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define _ANDROID_PING_PROGRAM "ddms.bat" 27928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 27938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define _ANDROID_PING_PROGRAM "ddms" 27948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 27958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 27968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char tmp[PATH_MAX]; 27978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* appdir = get_app_dir(); 27988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 27998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (snprintf( tmp, PATH_MAX, "%s%s%s", appdir, PATH_SEP, 28008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _ANDROID_PING_PROGRAM ) >= PATH_MAX) { 28018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dprint( "Application directory too long: %s", appdir); 28028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 28038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 28048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 28058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* if the program isn't there, don't bother */ 28068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "ping program: %s", tmp); 28078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path_exists(tmp)) { 28088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32 28098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project STARTUPINFO startup; 28108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PROCESS_INFORMATION pinfo; 28118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 28128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ZeroMemory( &startup, sizeof(startup) ); 28138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project startup.cb = sizeof(startup); 28148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project startup.dwFlags = STARTF_USESHOWWINDOW; 28158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project startup.wShowWindow = SW_SHOWMINIMIZED; 28168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 28178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ZeroMemory( &pinfo, sizeof(pinfo) ); 28188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 28198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* comspec = getenv("COMSPEC"); 28208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!comspec) comspec = "cmd.exe"; 28218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 28228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Run 28238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char args[PATH_MAX + 30]; 28248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (snprintf( args, PATH_MAX, "/C \"%s\" ping emulator " VERSION_STRING, 28258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tmp) >= PATH_MAX ) { 28268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "DDMS path too long: %s", tmp); 28278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 28288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 28298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 28308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project CreateProcess( 28318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project comspec, /* program path */ 28328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args, /* command line args */ 28338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, /* process handle is not inheritable */ 28348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, /* thread handle is not inheritable */ 28358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project FALSE, /* no, don't inherit any handles */ 28368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project DETACHED_PROCESS, /* the new process doesn't have a console */ 28378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, /* use parent's environment block */ 28388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL, /* use parent's starting directory */ 28398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project &startup, /* startup info, i.e. std handles */ 28408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project &pinfo ); 28418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 28428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "ping command: %s %s", comspec, args ); 28438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 284492c7311b1cb354745ec7b59b0e03910b3fe4c205The Android Open Source Project int pid; 284592c7311b1cb354745ec7b59b0e03910b3fe4c205The Android Open Source Project 284692c7311b1cb354745ec7b59b0e03910b3fe4c205The Android Open Source Project /* disable SIGALRM for the fork(), the periodic signal seems to 284792c7311b1cb354745ec7b59b0e03910b3fe4c205The Android Open Source Project * interefere badly with the fork() implementation on Linux running 284892c7311b1cb354745ec7b59b0e03910b3fe4c205The Android Open Source Project * under VMWare. 284992c7311b1cb354745ec7b59b0e03910b3fe4c205The Android Open Source Project */ 285092c7311b1cb354745ec7b59b0e03910b3fe4c205The Android Open Source Project BEGIN_NOSIGALRM 285192c7311b1cb354745ec7b59b0e03910b3fe4c205The Android Open Source Project pid = fork(); 285292c7311b1cb354745ec7b59b0e03910b3fe4c205The Android Open Source Project END_NOSIGALRM 285392c7311b1cb354745ec7b59b0e03910b3fe4c205The Android Open Source Project 28548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (pid == 0) { 28558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int fd = open("/dev/null", O_WRONLY); 28568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dup2(fd, 1); 28578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dup2(fd, 2); 28588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project execl( tmp, _ANDROID_PING_PROGRAM, "ping", "emulator", VERSION_STRING, NULL ); 28598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 28608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* don't do anything in the parent or in case of error */ 28618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project strncat( tmp, " ping emulator " VERSION_STRING, PATH_MAX - strlen(tmp) ); 28628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "ping command: %s", tmp ); 28638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 28648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 28658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 28668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 28678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 28688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 28698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid android_emulation_teardown( void ) 28708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 28718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2872