main.c revision 9a33e8554225c82cd900208f88e8965bb085ab87
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 207fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine 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" 2734f2974ce7ec7c71beb47b5daf9089d5c8c40c79David 'Digit' Turner#include "user-events.h" 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <SDL.h> 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <SDL_syswm.h> 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "math.h" 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/charmap.h" 358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/debug.h" 368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/resource.h" 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/config.h" 388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/config/config.h" 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/skin/image.h" 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/skin/trackball.h" 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/skin/keyboard.h" 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/skin/file.h" 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/skin/window.h" 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/skin/keyset.h" 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/user-config.h" 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/bufprint.h" 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/dirscanner.h" 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/path.h" 518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/timezone.h" 528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/cmdline-option.h" 548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/help.h" 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "hw/goldfish_nand.h" 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/globals.h" 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 590119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine#include "android/qemulator.h" 60055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner#include "android/display.h" 610119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine 62ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije#include "android/snapshot.h" 63ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "framebuffer.h" 659a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine#include "iolooper.h" 66055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectAndroidRotation android_framebuffer_rotation; 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define STRINGIFY(x) _STRINGIFY(x) 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define _STRINGIFY(x) #x 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 72a383d02cb57dd7dadd382654175e51354073a139David 'Digit' Turner#ifdef ANDROID_SDK_TOOLS_REVISION 73a383d02cb57dd7dadd382654175e51354073a139David 'Digit' Turner# define VERSION_STRING STRINGIFY(ANDROID_SDK_TOOLS_REVISION)".0" 74a383d02cb57dd7dadd382654175e51354073a139David 'Digit' Turner#else 75a383d02cb57dd7dadd382654175e51354073a139David 'Digit' Turner# define VERSION_STRING "standalone" 76a383d02cb57dd7dadd382654175e51354073a139David 'Digit' Turner#endif 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define KEYSET_FILE "default.keyset" 798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectSkinKeyset* android_keyset; 808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define D(...) do { if (VERBOSE_CHECK(init)) dprint(__VA_ARGS__); } while (0) 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern int control_console_start( int port ); /* in control.c */ 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern int qemu_milli_needed; 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* the default device DPI if none is specified by the skin 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define DEFAULT_DEVICE_DPI 165 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if 0 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int opts->flashkeys; /* forward */ 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_TRACE 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void start_tracing(void); 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void stop_tracing(void); 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectunsigned long android_verbose; 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************************/ 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************************/ 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** *****/ 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** U T I L I T Y R O U T I N E S *****/ 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** *****/ 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************************/ 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************************/ 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*** CONFIGURATION 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ***/ 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic AUserConfig* userConfig; 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid 1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectemulator_config_init( void ) 1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project userConfig = auserConfig_new( android_avdInfo ); 1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* only call this function on normal exits, so that ^C doesn't save the configuration */ 1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid 1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectemulator_config_done( void ) 1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int win_x, win_y; 1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!userConfig) { 1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("no user configuration?"); 1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_WM_GetPos( &win_x, &win_y ); 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project auserConfig_setWindowPos(userConfig, win_x, win_y); 1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project auserConfig_save(userConfig); 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid *loadpng(const char *fn, unsigned *_width, unsigned *_height); 1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid *readpng(const unsigned char* base, size_t size, unsigned *_width, unsigned *_height); 1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_DARWIN 1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define ANDROID_ICON_PNG "android_icon_256.png" 1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define ANDROID_ICON_PNG "android_icon_16.png" 1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectsdl_set_window_icon( void ) 1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static int window_icon_set; 1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!window_icon_set) 1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32 1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project HANDLE handle = GetModuleHandle( NULL ); 1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project HICON icon = LoadIcon( handle, MAKEINTRESOURCE(1) ); 1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_SysWMinfo wminfo; 1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_GetWMInfo(&wminfo); 1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SetClassLong( wminfo.window, GCL_HICON, (LONG)icon ); 1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else /* !_WIN32 */ 1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned icon_w, icon_h; 1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project size_t icon_bytes; 1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const unsigned char* icon_data; 1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void* icon_pixels; 1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project window_icon_set = 1; 1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project icon_data = android_icon_find( ANDROID_ICON_PNG, &icon_bytes ); 1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !icon_data ) 1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project icon_pixels = readpng( icon_data, icon_bytes, &icon_w, &icon_h ); 1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !icon_pixels ) 1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* the data is loaded into memory as RGBA bytes by libpng. we want to manage 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * the values as 32-bit ARGB pixels, so swap the bytes accordingly depending 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * on our CPU endianess 1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned* d = icon_pixels; 1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned* d_end = d + icon_w*icon_h; 1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ; d < d_end; d++ ) { 1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned pix = d[0]; 18720894ae3fa98f82da925fbeb72e616eef509758aDavid 'Digit' Turner#if HOST_WORDS_BIGENDIAN 1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* R,G,B,A read as RGBA => ARGB */ 1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project pix = ((pix >> 8) & 0xffffff) | (pix << 24); 1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* R,G,B,A read as ABGR => ARGB */ 1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project pix = (pix & 0xff00ff00) | ((pix >> 16) & 0xff) | ((pix & 0xff) << 16); 1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project d[0] = pix; 1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_Surface* icon = sdl_surface_from_argb32( icon_pixels, icon_w, icon_h ); 1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (icon != NULL) { 2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_WM_SetIcon(icon, NULL); 2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_FreeSurface(icon); 2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project free( icon_pixels ); 2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* !_WIN32 */ 2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 208cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner#define ONE_MB (1024*1024) 209cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 210cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turnerunsigned convertBytesToMB( uint64_t size ) 211cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner{ 212cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (size == 0) 213cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner return 0; 214cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 215cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner size = (size + ONE_MB-1) >> 20; 216cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (size > UINT_MAX) 217cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner size = UINT_MAX; 218cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 219cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner return (unsigned) size; 220cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner} 221cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 222cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turneruint64_t convertMBToBytes( unsigned megaBytes ) 223cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner{ 224cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner return ((uint64_t)megaBytes << 20); 225cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner} 226cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************************/ 2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************************/ 2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** *****/ 2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** S K I N I M A G E S *****/ 2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** *****/ 2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************************/ 2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************************/ 2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void sdl_at_exit(void) 2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator_config_done(); 2370119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine qemulator_done(qemulator_get()); 2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_Quit(); 2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid sdl_display_init(DisplayState *ds, int full_screen, int no_frame) 2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2440119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine QEmulator* emulator = qemulator_get(); 2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinDisplay* disp = skin_layout_get_display(emulator->layout); 2465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int width, height; 247055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner char buf[128]; 2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (disp->rotation & 1) { 2505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner width = disp->rect.size.h; 2515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner height = disp->rect.size.w; 2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 2535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner width = disp->rect.size.w; 2545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner height = disp->rect.size.h; 2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 257055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner snprintf(buf, sizeof buf, "width=%d,height=%d", width, height); 258055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner android_display_init(ds, qframebuffer_fifo_get()); 2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const char* skin_network_speed = NULL; 2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const char* skin_network_delay = NULL; 2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* list of skin aliases */ 2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const struct { 2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* name; 2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* alias; 2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} skin_aliases[] = { 2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "QVGA-L", "320x240" }, 2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "QVGA-P", "240x320" }, 2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "HVGA-L", "480x320" }, 2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "HVGA-P", "320x480" }, 2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "QVGA", "320x240" }, 2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "HVGA", "320x480" }, 2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { NULL, NULL } 2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* this is used by hw/events_device.c to send the charmap name to the system */ 2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst char* android_skin_keycharmap = NULL; 2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid init_skinned_ui(const char *path, const char *name, AndroidOptions* opts) 2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char tmp[1024]; 2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AConfig* root; 2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AConfig* n; 2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int win_x, win_y, flags; 2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project signal(SIGINT, SIG_DFL); 2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef _WIN32 2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project signal(SIGQUIT, SIG_DFL); 2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* we're not a game, so allow the screensaver to run */ 2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project putenv("SDL_VIDEO_ALLOW_SCREENSAVER=1"); 2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project flags = SDL_INIT_NOPARACHUTE; 2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->no_window) 2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project flags |= SDL_INIT_VIDEO; 3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(SDL_Init(flags)){ 3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "SDL init failure, reason is: %s\n", SDL_GetError() ); 3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->no_window) { 3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_EnableUNICODE(!opts->raw_keys); 3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_EnableKeyRepeat(0,0); 3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sdl_set_window_icon(); 3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef _WIN32 3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* prevent SIGTTIN and SIGTTOUT from stopping us. this is necessary to be 3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * able to run the emulator in the background (e.g. "emulator &"). 3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * despite the fact that the emulator should not grab input or try to 3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * write to the output in normal cases, we're stopped on some systems 3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (e.g. OS X) 3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project signal(SIGTTIN, SIG_IGN); 3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project signal(SIGTTOU, SIG_IGN); 3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project atexit(sdl_at_exit); 3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project root = aconfig_node("", ""); 3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(name) { 3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Support skin aliases like QVGA-H QVGA-P, etc... 3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project But first we check if it's a directory that exist before applying 3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project the alias */ 3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int checkAlias = 1; 3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path != NULL) { 3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint(tmp, tmp+sizeof(tmp), "%s/%s", path, name); 3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path_exists(tmp)) { 3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project checkAlias = 0; 3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("there is no '%s' skin in '%s'", name, path); 3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (checkAlias) { 3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; ; nn++ ) { 3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* skin_name = skin_aliases[nn].name; 3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* skin_alias = skin_aliases[nn].alias; 3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !skin_name ) 3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !strcasecmp( skin_name, name ) ) { 3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("skin name '%s' aliased to '%s'", name, skin_alias); 3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project name = skin_alias; 3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Magically support skins like "320x240" */ 3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(isdigit(name[0])) { 3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char *x = strchr(name, 'x'); 3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(x && isdigit(x[1])) { 3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int width = atoi(name); 3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int height = atoi(x + 1); 3685389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine sprintf(tmp,"display {\n width %d\n height %d\n}\n", 3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project width, height); 3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project aconfig_load(root, strdup(tmp)); 3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project path = ":"; 3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto found_a_skin; 3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path == NULL) { 3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror("unknown skin name '%s'", name); 3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sprintf(tmp, "%s/%s/layout", path, name); 3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("trying to load skin file '%s'", tmp); 3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(aconfig_load_file(root, tmp) >= 0) { 3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sprintf(tmp, "%s/%s/", path, name); 3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project path = tmp; 3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto found_a_skin; 3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 3895389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine dwarning("could not load skin file '%s', using built-in one\n", 3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tmp); 3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const unsigned char* layout_base; 3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project size_t layout_size; 3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project name = "<builtin>"; 3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout_base = android_resource_find( "layout", &layout_size ); 4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (layout_base != NULL) { 4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* base = malloc( layout_size+1 ); 4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project memcpy( base, layout_base, layout_size ); 4048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project base[layout_size] = 0; 4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("parsing built-in skin layout file (size=%d)", (int)layout_size); 4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project aconfig_load(root, base); 4088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project path = ":"; 4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "Couldn't load builtin skin\n"); 4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfound_a_skin: 4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project win_x = 10; 4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project win_y = 10; 4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (userConfig) 4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project auserConfig_getWindowPos(userConfig, &win_x, &win_y); 4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4239085a28c14f369d231dbae099a690689179f428avchtchetkine 4240119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine if ( qemulator_init(qemulator_get(), root, path, win_x, win_y, opts ) < 0 ) { 4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "### Error: could not load emulator skin '%s'\n", name); 4268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 4278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4290119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine android_skin_keycharmap = skin_keyboard_charmap_name(qemulator_get()->keyboard); 4308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* the default network speed and latency can now be specified by the device skin */ 4328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project n = aconfig_find(root, "network"); 4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (n != NULL) { 4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_network_speed = aconfig_str(n, "speed", 0); 4358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_network_delay = aconfig_str(n, "delay", 0); 4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if 0 4398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* create a trackball if needed */ 4408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project n = aconfig_find(root, "trackball"); 4418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (n != NULL) { 4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinTrackBallParameters params; 4438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params.x = aconfig_unsigned(n, "x", 0); 4458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params.y = aconfig_unsigned(n, "y", 0); 4468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params.diameter = aconfig_unsigned(n, "diameter", 20); 4478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params.ring = aconfig_unsigned(n, "ring", 1); 4488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params.ball_color = aconfig_unsigned(n, "ball-color", 0xffe0e0e0); 4508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params.dot_color = aconfig_unsigned(n, "dot-color", 0xff202020 ); 4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params.ring_color = aconfig_unsigned(n, "ring-color", 0xff000000 ); 4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_disp->trackball = skin_trackball_create( ¶ms ); 4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_trackball_refresh( qemu_disp->trackball ); 4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* add an onion overlay image if needed */ 4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->onion) { 4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinImage* onion = skin_image_find_simple( opts->onion ); 4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int alpha, rotate; 4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( opts->onion_alpha && 1 == sscanf( opts->onion_alpha, "%d", &alpha ) ) { 4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project alpha = (256*alpha)/100; 4658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else 4668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project alpha = 128; 4678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( opts->onion_rotation && 1 == sscanf( opts->onion_rotation, "%d", &rotate ) ) { 4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project rotate &= 3; 4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else 4718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project rotate = SKIN_ROTATION_0; 4728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4730119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine qemulator_get()->onion = onion; 4740119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine qemulator_get()->onion_alpha = alpha; 4750119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine qemulator_get()->onion_rotation = rotate; 4768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint qemu_main(int argc, char **argv); 4808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* this function dumps the QEMU help */ 4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void help( void ); 4838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void emulator_help( void ); 4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define VERBOSE_OPT(str,var) { str, &var } 4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define _VERBOSE_TAG(x,y) { #x, VERBOSE_##x, y }, 4888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const struct { const char* name; int flag; const char* text; } 4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectverbose_options[] = { 4908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project VERBOSE_TAG_LIST 4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 0, 0, 0 } 4928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 4938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 4958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectload_keyset(const char* path) 4968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path_can_read(path)) { 4988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AConfig* root = aconfig_node("",""); 4998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!aconfig_load_file(root, path)) { 5008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_keyset = skin_keyset_new(root); 5018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (android_keyset != NULL) { 5028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "keyset loaded from: %s", path); 5038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 5048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 5088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 5118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectparse_keyset(const char* keyset, AndroidOptions* opts) 5128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char kname[MAX_PATH]; 5148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char temp[MAX_PATH]; 5158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* p; 5168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 5178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* append .keyset suffix if needed */ 5198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strchr(keyset, '.') == NULL) { 5208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = kname; 5218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project end = p + sizeof(kname); 5228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, "%s.keyset", keyset); 5238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p >= end) { 5248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "keyset name too long: '%s'\n", keyset); 5258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 5268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project keyset = kname; 5288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* look for a the keyset file */ 5318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = temp; 5328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project end = p + sizeof(temp); 5338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint_config_file(p, end, keyset); 5348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p < end && load_keyset(temp) == 0) 5358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 5368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = temp; 5388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, "%s" PATH_SEP "keysets" PATH_SEP "%s", opts->sysdir, keyset); 5398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p < end && load_keyset(temp) == 0) 5408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 5418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = temp; 5438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint_app_dir(p, end); 5448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, PATH_SEP "keysets" PATH_SEP "%s", keyset); 5458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p < end && load_keyset(temp) == 0) 5468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 5478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 5498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 5528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectwrite_default_keyset( void ) 5538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char path[MAX_PATH]; 5558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint_config_file( path, path+sizeof(path), KEYSET_FILE ); 5578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* only write if there is no file here */ 5598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !path_exists(path) ) { 5608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int fd = open( path, O_WRONLY | O_CREAT, 0666 ); 5618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int ret; 5628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* ks = skin_keyset_get_default(); 5638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "writing default keyset file to %s", path ); 5668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (fd < 0) { 5688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "%s: could not create file: %s", __FUNCTION__, strerror(errno) ); 5698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 5708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project CHECKED(ret, write(fd, ks, strlen(ks))); 5728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project close(fd); 5738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid emulator_help( void ) 5778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project STRALLOC_DEFINE(out); 5798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_help_main(out); 5808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf( "%.*s", out->n, out->s ); 5818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project stralloc_reset(out); 5828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 5838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* this function is used to perform auto-detection of the 5868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * system directory in the case of a SDK installation. 5878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 5888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * we want to deal with several historical usages, hence 5898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * the slightly complicated logic. 5908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 5918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * NOTE: the function returns the path to the directory 5928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * containing 'fileName'. this is *not* the full 5938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * path to 'fileName'. 5948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 5958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic char* 5968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project_getSdkImagePath( const char* fileName ) 5978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char temp[MAX_PATH]; 5998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* p = temp; 6008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end = p + sizeof(temp); 6018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* q; 6028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* app; 6038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static const char* const searchPaths[] = { 6058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "", /* program's directory */ 6068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "/lib/images", /* this is for SDK 1.0 */ 6078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "/../platforms/android-1.1/images", /* this is for SDK 1.1 */ 6088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL 6098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project }; 6108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project app = bufprint_app_dir(temp, end); 6128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (app >= end) 6138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 6148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do { 6168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 6178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* first search a few well-known paths */ 6198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; searchPaths[nn] != NULL; nn++) { 6208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(app, end, "%s", searchPaths[nn]); 6218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project q = bufprint(p, end, "/%s", fileName); 6228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (q < end && path_exists(temp)) { 6238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *p = 0; 6248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto FOUND_IT; 6258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* hmmm. let's assume that we are in a post-1.1 SDK 6298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * scan ../platforms if it exists 6308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 6318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(app, end, "/../platforms"); 6328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p < end) { 6338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project DirScanner* scanner = dirScanner_new(temp); 6348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (scanner != NULL) { 6358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int found = 0; 6368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* subdir; 6378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (;;) { 6398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project subdir = dirScanner_next(scanner); 6408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!subdir) break; 6418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project q = bufprint(p, end, "/%s/images/%s", subdir, fileName); 6438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (q >= end || !path_exists(temp)) 6448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project continue; 6458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project found = 1; 6478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, "/%s/images", subdir); 6488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 6498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dirScanner_free(scanner); 6518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (found) 6528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 6538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* I'm out of ideas */ 6578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 6588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } while (0); 6608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectFOUND_IT: 6628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project //D("image auto-detection: %s/%s", temp, fileName); 66318fe86e8245878f3b7a2813bd59b8cfcf636e15cDavid 'Digit' Turner return android_strdup(temp); 6648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic char* 6678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project_getSdkImage( const char* path, const char* file ) 6688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char temp[MAX_PATH]; 6708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char *p = temp, *end = p + sizeof(temp); 6718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(temp, end, "%s/%s", path, file); 6738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p >= end || !path_exists(temp)) 6748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 6758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 67618fe86e8245878f3b7a2813bd59b8cfcf636e15cDavid 'Digit' Turner return android_strdup(temp); 6778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic char* 6808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project_getSdkSystemImage( const char* path, const char* optionName, const char* file ) 6818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* image = _getSdkImage(path, file); 6838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (image == NULL) { 6858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror("Your system directory is missing the '%s' image file.\n" 6868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Please specify one with the '%s <filepath>' option", 6878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project file, optionName); 6888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 6898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return image; 6918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 6945389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine_forceAvdImagePath( AvdImageType imageType, 6955389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine const char* path, 6968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* description, 6978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int required ) 6988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path == NULL) 7008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 7018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (required && !path_exists(path)) { 7038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror("Cannot find %s image file: %s", description, path); 7048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 7058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdParams->forcePaths[imageType] = path; 7078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 709cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turnerstatic uint64_t 710cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner_adjustPartitionSize( const char* description, 711cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner uint64_t imageBytes, 712cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner uint64_t defaultBytes, 713cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner int inAndroidBuild ) 714cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner{ 715cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner char temp[64]; 716cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner unsigned imageMB; 717cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner unsigned defaultMB; 718cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 719cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (imageBytes <= defaultBytes) 720cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner return defaultBytes; 721cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 722cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner imageMB = convertBytesToMB(imageBytes); 723cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner defaultMB = convertBytesToMB(defaultBytes); 724cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 725cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (imageMB > defaultMB) { 726cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner snprintf(temp, sizeof temp, "(%d MB > %d MB)", imageMB, defaultMB); 727cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } else { 728cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner snprintf(temp, sizeof temp, "(%lld bytes > %lld bytes)", imageBytes, defaultBytes); 729cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 730cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 731def0e542c9cc004a7b83ff965103c34097c0960bDavid 'Digit' Turner if (inAndroidBuild) { 732def0e542c9cc004a7b83ff965103c34097c0960bDavid 'Digit' Turner dwarning("%s partition size adjusted to match image file %s\n", description, temp); 733cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 734cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 735cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner return convertMBToBytes(imageMB); 736cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner} 737cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 7389a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine#ifdef CONFIG_STANDALONE_UI 7399a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine 7409a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine// Base console port 7419a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine#define CORE_BASE_PORT 5554 7429a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine 7439a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine// Maximum number of core porocesses running simultaneously on a machine. 7449a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine#define MAX_CORE_PROCS 16 7459a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine 7469a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine// Socket timeout in millisec (set to half a second) 7479a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine#define CORE_PORT_TIMEOUT_MS 500 7489a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine 7499a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine/* Checks if emulator core runs at the end of the given socket. 7509a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine * Param: 7519a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine * sockaddr Socket address addressing emulator's console. 7529a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine * Return: 7539a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine * 0 in case that core has been found for the socket, or -1 otherwise. 7549a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine */ 7559a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkinestatic int 7569a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkinecheck_for_running_core(SockAddress* sockaddr) 7579a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine{ 7589a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine IoLooper* looper = iolooper_new(); 7599a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine int connect_status; 7609a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine char buf[512]; 7619a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine int ret = -1; 7629a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine 7639a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine int fd = socket_create_inet(SOCKET_STREAM); 7649a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine if (fd < 0) { 7659a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine return -1; 7669a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine } 7679a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine 7689a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine socket_set_xreuseaddr(fd); 7699a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine socket_set_nonblock(fd); 7709a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine connect_status = socket_connect(fd, sockaddr); 7719a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine if (connect_status < 0 && errno == EINPROGRESS) { 7729a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine // Wait till connection occurs. 7739a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine iolooper_add_write(looper, fd); 7749a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine connect_status = iolooper_wait(looper, CORE_PORT_TIMEOUT_MS); 7759a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine if (connect_status > 0) { 7769a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine iolooper_del_write(looper, fd); 7779a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine } else { 7789a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine connect_status = -1; 7799a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine } 7809a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine } 7819a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine if (connect_status >= 0) { 7829a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine iolooper_add_read(looper, fd); 7839a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine // Read the handshake message from the core's console. 7849a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine if (iolooper_wait(looper, CORE_PORT_TIMEOUT_MS) > 0 && 7859a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine iolooper_is_read(looper, fd)) { 7869a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine int read_bytes = read(fd, buf, sizeof(buf)); 7879a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine // Check for the console handshake. 7889a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine if (read_bytes > 15 && !strncmp(buf, "Android Console", 15)) { 7899a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine ret = 0; 7909a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine } 7919a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine } 7929a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine } 7939a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine 7949a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine socket_close( fd ); 7959a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine iolooper_free(looper); 7969a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine return ret; 7979a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine} 7989a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine 7999a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine/* List emulator core processes running on the given machine. 8009a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine * This routine is called from main() if -list-cores parameter is set in the 8019a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine * command line. 8029a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine * Param: 8039a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine * host Value passed with -list-core parameter. Must be either "localhost", or 8049a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine * an IP address of a machine where core processes must be enumerated. 8059a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine */ 8069a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkinestatic void 8079a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkinelist_running_cores(const char* host) 8089a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine{ 8099a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine int iter; 8109a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine int port_iter; 8119a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine int found_cores = 0; 8129a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine 8139a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine // Convert host name into socket address list. 8149a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine SockAddress** sockaddr_list = sock_address_list_create(host, NULL, 0); 8159a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine if (sockaddr_list == NULL) { 8169a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine derror("Unable to resolve hostname %s: %s\n", host, errno_str); 8179a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine return; 8189a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine } 8199a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine 8209a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine /* Since core's console is not a UNIX socket, lets make sure that UNIX 8219a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine * socket is not the only family in the list. */ 8229a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine for (iter = 0; sockaddr_list[iter] != NULL; iter++) { 8239a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine if (sock_address_get_family(sockaddr_list[iter]) != SOCKET_UNIX) { 8249a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine break; 8259a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine } 8269a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine } 8279a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine if (sockaddr_list[iter] == NULL) { 8289a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine derror("Unix socket is an invalid parameter for -list-cores option.\n"); 8299a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine sock_address_list_free(sockaddr_list); 8309a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine return; 8319a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine } 8329a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine 8339a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine /* List running core processes. To enum core processes we will loop 8349a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine * through socket ports 5554-5584, where we assume that successful 8359a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine * conection to a socket means that there is a core process running 8369a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine * at the other end of that socket. In order to make sure that it's 8379a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine * emulator console at the other end of that socket, we will read from 8389a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine * the socket, expecting "Android Console" string at the beginning of 8399a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine * the data read from the socket. */ 8409a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine for (port_iter = 0; port_iter < MAX_CORE_PROCS; port_iter++) { 8419a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine int port_num = CORE_BASE_PORT + port_iter * 2; 8429a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine for (iter = 0; sockaddr_list[iter] != NULL; iter++) { 8439a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine if (sock_address_get_family(sockaddr_list[iter]) == SOCKET_UNIX) { 8449a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine continue; 8459a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine } 8469a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine sock_address_set_port(sockaddr_list[iter], port_num); 8479a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine if (!check_for_running_core(sockaddr_list[iter])) { 8489a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine // This is a core process at the other end of the socket. 8499a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine found_cores++; 8509a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine if (found_cores == 1) { 8519a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine fprintf(stdout, "Running emulator core processes:\n"); 8529a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine } 8539a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine fprintf(stdout, "Emulator console port %d\n", port_num); 8549a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine } 8559a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine // Go through this loop just once, for a non-Unix socket address. 8569a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine break; 8579a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine } 8589a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine } 8599a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine 8609a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine sock_address_list_free(sockaddr_list); 8619a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine 8629a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine if (!found_cores) { 8639a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine fprintf(stdout, "There were no running emulator core processes found on %s.\n", 8649a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine host); 8659a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine } 8669a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine} 8679a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine#endif // CONFIG_STANDALONE_UI 8689a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine 8698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint main(int argc, char **argv) 8708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 8718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char tmp[MAX_PATH]; 8728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* tmpend = tmp + sizeof(tmp); 8738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* args[128]; 8748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int n; 8758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* opt; 8768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int use_sdcard_img = 0; 8778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int serial = 0; 8788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int gps_serial = 0; 8798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int radio_serial = 0; 8808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int qemud_serial = 0; 8818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int shell_serial = 0; 8828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned cachePartitionSize = 0; 883cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner unsigned systemPartitionSize = 0; 884cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner unsigned dataPartitionSize = 0; 88549dcc4de79c93de65c20706b798353be1e840915David 'Digit' Turner unsigned defaultPartitionSize = convertMBToBytes(66); 8868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AndroidHwConfig* hw; 888cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner AvdInfo* avd; 8898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project //const char *appdir = get_app_dir(); 8918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* android_build_root = NULL; 8928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* android_build_out = NULL; 8938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AndroidOptions opts[1]; 895b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine /* LCD density value to pass to the core. */ 896b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine char lcd_density[16]; 897b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine /* net.shared_net_ip boot property value. */ 898b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine char boot_prop_ip[64]; 899b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine boot_prop_ip[0] = '\0'; 9008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[0] = argv[0]; 9028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( android_parse_options( &argc, &argv, opts ) < 0 ) { 9048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 9058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (argc-- > 1) { 9088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opt = (++argv)[0]; 9098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(!strcmp(opt, "-qemu")) { 9118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project argc--; 9128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project argv++; 9138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 9148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!strcmp(opt, "-help")) { 9178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator_help(); 9188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!strncmp(opt, "-help-",6)) { 9218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project STRALLOC_DEFINE(out); 9228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opt += 6; 9238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!strcmp(opt, "all")) { 9258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_help_all(out); 9268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (android_help_for_option(opt, out) == 0) { 9288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* ok */ 9298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (android_help_for_topic(opt, out) == 0) { 9318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* ok */ 9328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (out->n > 0) { 9348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf("\n%.*s", out->n, out->s); 9358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(0); 9368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "unknown option: -help-%s\n", opt); 9398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "please use -help for a list of valid topics\n"); 9408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 9418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opt[0] == '-') { 9448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "unknown option: %s\n", opt); 9458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "please use -help for a list of valid options\n"); 9468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 9478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "invalid command-line parameter: %s.\n", opt); 9508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "Hint: use '@foo' to launch a virtual device named 'foo'.\n"); 9518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "please use -help for more information\n"); 9528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 9538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9559a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine#ifdef CONFIG_STANDALONE_UI 9569a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine // Lets see if user just wants to list core process. 9579a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine if (opts->list_cores) { 9589a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine fprintf(stdout, "Enumerating running core processes.\n" 9599a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine "This make take up to %d seconds...\n\n", 9609a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine (MAX_CORE_PROCS * CORE_PORT_TIMEOUT_MS) / 1000 + 1); 9619a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine list_running_cores(opts->list_cores); 9629a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine exit(0); 9639a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine } 9649a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine#endif // CONFIG_STANDALONE_UI 9659a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine 9669085a28c14f369d231dbae099a690689179f428avchtchetkine if (android_charmap_setup(opts->charmap)) { 9679085a28c14f369d231dbae099a690689179f428avchtchetkine exit(1); 9689085a28c14f369d231dbae099a690689179f428avchtchetkine } 9698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->version) { 9718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf("Android emulator version %s\n" 9728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Copyright (C) 2006-2008 The Android Open Source Project and many others.\n" 9738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "This program is a derivative of the QEMU CPU emulator (www.qemu.org).\n\n", 9748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined ANDROID_BUILD_ID 9758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project VERSION_STRING " (build_id " STRINGIFY(ANDROID_BUILD_ID) ")" ); 9768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 9778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project VERSION_STRING); 9788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 9798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf(" This software is licensed under the terms of the GNU General Public\n" 9808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " License version 2, as published by the Free Software Foundation, and\n" 9818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " may be copied, distributed, and modified under those terms.\n\n" 9828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " This program is distributed in the hope that it will be useful,\n" 9838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " but WITHOUT ANY WARRANTY; without even the implied warranty of\n" 9848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" 9858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " GNU General Public License for more details.\n\n"); 9868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(0); 9888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->timezone) { 9918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( timezone_set(opts->timezone) < 0 ) { 9928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "emulator: it seems the timezone '%s' is not in zoneinfo format\n", opts->timezone); 9938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* legacy support: we used to use -system <dir> and -image <file> 9978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * instead of -sysdir <dir> and -system <file>, so handle this by checking 9988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * whether the options point to directories or files. 9998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 10008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->image != NULL) { 10018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->system != NULL) { 10028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->sysdir != NULL) { 10038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "You can't use -sysdir, -system and -image at the same time.\n" 10048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "You should probably use '-sysdir <path> -system <file>'.\n" ); 10058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 10068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dwarning( "Please note that -image is obsolete and that -system is now used to point\n" 10098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "to the system image. Next time, try using '-sysdir <path> -system <file>' instead.\n" ); 10108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->sysdir = opts->system; 10118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->system = opts->image; 10128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->image = NULL; 10138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (opts->system != NULL && path_is_dir(opts->system)) { 10158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->sysdir != NULL) { 10168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "Option -system should now be followed by a file path, not a directory one.\n" 10178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Please use '-sysdir <path>' to point to the system directory.\n" ); 10188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 10198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dwarning( "Please note that the -system option should now be used to point to the initial\n" 10218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "system image (like the obsolete -image option). To point to the system directory\n" 10228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "please now use '-sysdir <path>' instead.\n" ); 10238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->sysdir = opts->system; 10258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->system = NULL; 10268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->nojni) 10298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->no_jni = opts->nojni; 10308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->nocache) 10328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->no_cache = opts->nocache; 10338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->noaudio) 10358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->no_audio = opts->noaudio; 10368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->noskin) 10388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->no_skin = opts->noskin; 10398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->initdata) { 10418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->init_data = opts->initdata; 10428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->initdata = NULL; 10438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* If no AVD name was given, try to find the top of the 10468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Android build tree 10478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 10488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->avd == NULL) { 10498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do { 10508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* out = getenv("ANDROID_PRODUCT_OUT"); 10518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (out == NULL || out[0] == 0) 10538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 10548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!path_exists(out)) { 10569877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project derror("Can't access ANDROID_PRODUCT_OUT as '%s'\n" 10578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "You need to build the Android system before launching the emulator", 10588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project out); 10598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 10608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_build_root = path_parent( out, 4 ); 10638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (android_build_root == NULL || !path_exists(android_build_root)) { 10648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror("Can't find the Android build root from '%s'\n" 10658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Please check the definition of the ANDROID_PRODUCT_OUT variable.\n" 10668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "It should point to your product-specific build output directory.\n", 10678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project out ); 10688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 10698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_build_out = out; 10718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "found Android build root: %s", android_build_root ); 10728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "found Android build out: %s", android_build_out ); 10738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } while (0); 10748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* if no virtual device name is given, and we're not in the 10768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Android build system, we'll need to perform some auto-detection 10778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * magic :-) 10788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 10795389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (opts->avd == NULL && !android_build_out) 10808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 10818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char dataDirIsSystem = 0; 10828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->sysdir) { 10848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->sysdir = _getSdkImagePath("system.img"); 10858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->sysdir) { 10868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( 10878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "You did not specify a virtual device name, and the system\n" 10888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "directory could not be found.\n\n" 10898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "If you are an Android SDK user, please use '@<name>' or '-avd <name>'\n" 10908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "to start a given virtual device (see -help-avd for details).\n\n" 10918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Otherwise, follow the instructions in -help-disk-images to start the emulator\n" 10938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ); 10948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 10958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -sysdir %s", opts->sysdir); 10978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->system) { 11008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->system = _getSdkSystemImage(opts->sysdir, "-image", "system.img"); 11018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -image %s", opts->image); 11028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->kernel) { 11058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->kernel = _getSdkSystemImage(opts->sysdir, "-kernel", "kernel-qemu"); 11068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -kernel %s", opts->kernel); 11078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->ramdisk) { 11108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->ramdisk = _getSdkSystemImage(opts->sysdir, "-ramdisk", "ramdisk.img"); 11118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -ramdisk %s", opts->ramdisk); 11128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* if no data directory is specified, use the system directory */ 11158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->datadir) { 111618fe86e8245878f3b7a2813bd59b8cfcf636e15cDavid 'Digit' Turner opts->datadir = android_strdup(opts->sysdir); 11178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dataDirIsSystem = 1; 11188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -datadir %s", opts->sysdir); 11198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->data) { 11228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* check for userdata-qemu.img in the data directory */ 11238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint(tmp, tmpend, "%s/userdata-qemu.img", opts->datadir); 11248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!path_exists(tmp)) { 11258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( 11268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "You did not provide the name of an Android Virtual Device\n" 11278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "with the '-avd <name>' option. Read -help-avd for more information.\n\n" 11288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "If you *really* want to *NOT* run an AVD, consider using '-data <file>'\n" 11308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "to specify a data partition image file (I hope you know what you're doing).\n" 11318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ); 11328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 11338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 113518fe86e8245878f3b7a2813bd59b8cfcf636e15cDavid 'Digit' Turner opts->data = android_strdup(tmp); 11368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -data %s", opts->data); 11378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->sdcard && opts->datadir) { 11408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint(tmp, tmpend, "%s/sdcard.img", opts->datadir); 11418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path_exists(tmp)) { 114218fe86e8245878f3b7a2813bd59b8cfcf636e15cDavid 'Digit' Turner opts->sdcard = android_strdup(tmp); 11438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -sdcard %s", opts->sdcard); 11448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1146353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije 1147353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije#if CONFIG_ANDROID_SNAPSHOTS 1148353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije if (!opts->snapstorage && opts->datadir) { 1149353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije bufprint(tmp, tmpend, "%s/snapshots.img", opts->datadir); 1150353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije if (path_exists(tmp)) { 1151ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije opts->snapstorage = android_strdup(tmp); 1152353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije D("autoconfig: -snapstorage %s", opts->snapstorage); 1153353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 1154353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 1155ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije#endif // CONFIG_ANDROID_SNAPSHOTS 11568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* setup the virtual device parameters from our options 11598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 11608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->no_cache) { 11618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdParams->flags |= AVDINFO_NO_CACHE; 11628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->wipe_data) { 11648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdParams->flags |= AVDINFO_WIPE_DATA | AVDINFO_WIPE_CACHE; 11658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1166353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije#if CONFIG_ANDROID_SNAPSHOTS 1167353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije if (opts->no_snapstorage) { 1168353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije android_avdParams->flags |= AVDINFO_NO_SNAPSHOTS; 1169353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 1170353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije#endif 11718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* if certain options are set, we can force the path of 11738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * certain kernel/disk image files 11748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1175353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije _forceAvdImagePath(AVD_IMAGE_KERNEL, opts->kernel, "kernel", 1); 1176353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije _forceAvdImagePath(AVD_IMAGE_INITSYSTEM, opts->system, "system", 1); 1177353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije _forceAvdImagePath(AVD_IMAGE_RAMDISK, opts->ramdisk, "ramdisk", 1); 1178353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije _forceAvdImagePath(AVD_IMAGE_USERDATA, opts->data, "user data", 0); 1179353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije _forceAvdImagePath(AVD_IMAGE_CACHE, opts->cache, "cache", 0); 1180353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije _forceAvdImagePath(AVD_IMAGE_SDCARD, opts->sdcard, "SD Card", 0); 1181353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije#if CONFIG_ANDROID_SNAPSHOTS 1182353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije _forceAvdImagePath(AVD_IMAGE_SNAPSHOTS, opts->snapstorage, "snapshots", 0); 1183353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije#endif 11848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* we don't accept -skindir without -skin now 11868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * to simplify the autoconfig stuff with virtual devices 11878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 11888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->no_skin) { 11898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->skin = "320x480"; 11908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->skindir = NULL; 11918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->skindir) { 11948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->skin) { 11958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "the -skindir <path> option requires a -skin <name> option"); 11968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 11978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1199b58c44e55548129243185ef5927bd3abb5903044David Turner android_avdParams->skinName = opts->skin; 1200b58c44e55548129243185ef5927bd3abb5903044David Turner android_avdParams->skinRootPath = opts->skindir; 1201b58c44e55548129243185ef5927bd3abb5903044David Turner 12028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* setup the virtual device differently depending on whether 12038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * we are in the Android build system or not 12048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 12058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->avd != NULL) 12068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 12078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdInfo = avdInfo_new( opts->avd, android_avdParams ); 12088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (android_avdInfo == NULL) { 12098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* an error message has already been printed */ 12108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dprint("could not find virtual device named '%s'", opts->avd); 12118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 12128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 12158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 12168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_build_out) { 12178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_build_out = android_build_root = opts->sysdir; 12188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdInfo = avdInfo_newForAndroidBuild( 12208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_build_root, 12218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_build_out, 12228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdParams ); 12238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(android_avdInfo == NULL) { 12258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("could not start virtual device\n"); 12268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 12278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1230cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner avd = android_avdInfo; 1231cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 12328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* get the skin from the virtual device configuration */ 1233cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner opts->skin = (char*) avdInfo_getSkinName( avd ); 1234cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner opts->skindir = (char*) avdInfo_getSkinDir( avd ); 12358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->skin) { 12378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -skin %s", opts->skin); 12388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->skindir) { 12408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -skindir %s", opts->skindir); 12418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Read hardware configuration */ 12448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project hw = android_hw; 1245cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (avdInfo_getHwConfig(avd, hw) < 0) { 12468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror("could not read hardware configuration ?"); 12478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 12488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->keyset) { 12518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project parse_keyset(opts->keyset, opts); 12528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_keyset) { 12538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, 12548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "emulator: WARNING: could not find keyset file named '%s'," 12558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " using defaults instead\n", 12568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->keyset); 12578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_keyset) { 12608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project parse_keyset("default", opts); 12618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_keyset) { 12628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_keyset = skin_keyset_new_from_text( skin_keyset_get_default() ); 12638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_keyset) { 12648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "PANIC: default keyset file is corrupted !!\n" ); 12658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "PANIC: please update the code in android/skin/keyset.c\n" ); 12668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 12678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->keyset) 12698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project write_default_keyset(); 12708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 127340beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie if (opts->shared_net_id) { 127440beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie char* end; 127540beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie long shared_net_id = strtol(opts->shared_net_id, &end, 0); 127640beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie if (end == NULL || *end || shared_net_id < 1 || shared_net_id > 255) { 127740beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie fprintf(stderr, "option -shared-net-id must be an integer between 1 and 255\n"); 127840beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie exit(1); 127940beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie } 1280b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine snprintf(boot_prop_ip, sizeof(boot_prop_ip), 1281b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine "net.shared_net_ip=10.1.2.%ld", shared_net_id); 128240beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie } 128340beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie 128440beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie 12858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator_config_init(); 12868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project init_skinned_ui(opts->skindir, opts->skin, opts); 12878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->netspeed) { 12898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (skin_network_speed) 12908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("skin network speed: '%s'", skin_network_speed); 12918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->netspeed = (char*)skin_network_speed; 12928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->netdelay) { 12948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (skin_network_delay) 12958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("skin network delay: '%s'", skin_network_delay); 12968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->netdelay = (char*)skin_network_delay; 12978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->trace) { 1300cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner char* tracePath = avdInfo_getTracePath(avd, opts->trace); 13018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int ret; 13028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (tracePath == NULL) { 13048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "bad -trace parameter" ); 13058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 13068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = path_mkdir_if_needed( tracePath, 0755 ); 13088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret < 0) { 13098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "could not create directory '%s'\n", tmp); 13108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 13118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->trace = tracePath; 13138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->no_cache) 13168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->cache = 0; 13178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project n = 1; 13198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* generate arguments for the underlying qemu main() */ 1320238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner { 1321238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner const char* kernelFile = avdInfo_getImageFile(avd, AVD_IMAGE_KERNEL); 1322238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner int kernelFileLen = strlen(kernelFile); 1323238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner 1324238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner args[n++] = "-kernel"; 1325238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner args[n++] = (char*)kernelFile; 1326238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner 1327238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner /* If the kernel image name ends in "-armv7", then change the cpu 1328238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * type automatically. This is a poor man's approach to configuration 1329238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * management, but should allow us to get past building ARMv7 1330238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * system images with dex preopt pass without introducing too many 1331238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * changes to the emulator sources. 1332238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * 1333238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * XXX: 1334238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * A 'proper' change would require adding some sort of hardware-property 1335238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * to each AVD config file, then automatically determine its value for 1336238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * full Android builds (depending on some environment variable), plus 1337238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * some build system changes. I prefer not to do that for now for reasons 1338238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * of simplicity. 1339238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner */ 1340238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner if (kernelFileLen > 6 && !memcmp(kernelFile + kernelFileLen - 6, "-armv7", 6)) { 1341238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner args[n++] = "-cpu"; 1342238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner args[n++] = "cortex-a8"; 1343238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner } 1344238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner } 13458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1346b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine if (boot_prop_ip[0]) { 1347b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine args[n++] = "-boot-property"; 1348b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine args[n++] = boot_prop_ip; 1349b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine } 1350b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine 1351318f17a0050e729bce8545463b657c1d62835b5eVladimir Chtchetkine if (opts->tcpdump) { 1352318f17a0050e729bce8545463b657c1d62835b5eVladimir Chtchetkine args[n++] = "-tcpdump"; 1353318f17a0050e729bce8545463b657c1d62835b5eVladimir Chtchetkine args[n++] = opts->tcpdump; 1354318f17a0050e729bce8545463b657c1d62835b5eVladimir Chtchetkine } 1355318f17a0050e729bce8545463b657c1d62835b5eVladimir Chtchetkine 1356e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine#ifdef CONFIG_NAND_LIMITS 1357e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine if (opts->nand_limits) { 1358e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = "-nand-limits"; 1359e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = opts->nand_limits; 1360e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine } 1361e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine#endif 1362e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine 1363e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine if (opts->netspeed) { 1364e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = "-netspeed"; 1365e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = opts->netspeed; 1366e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine } 1367e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine if (opts->netdelay) { 1368e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = "-netdelay"; 1369e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = opts->netdelay; 1370e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine } 1371e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine if (opts->netfast) { 1372e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = "-netfast"; 1373e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine } 1374e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine 1375b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine /* the purpose of -no-audio is to disable sound output from the emulator, 1376b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine * not to disable Audio emulation. So simply force the 'none' backends */ 1377b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine if (opts->no_audio) 1378b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine opts->audio = "none"; 1379b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine 1380b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine if (opts->audio) { 1381b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = "-audio"; 1382b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = opts->audio; 1383b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine } 1384b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine 1385b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine if (opts->audio_in) { 1386b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = "-audio-in"; 1387b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = opts->audio_in; 1388b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine } 1389b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine if (opts->audio_out) { 1390b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = "-audio-out"; 1391b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = opts->audio_out; 1392b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine } 1393b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine 1394b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine if (opts->cpu_delay) { 1395b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = "-cpu-delay"; 1396b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = opts->cpu_delay; 1397b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine } 1398b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine 13997fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine if (opts->dns_server) { 14007fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine args[n++] = "-dns-server"; 14017fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine args[n++] = opts->dns_server; 14027fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine } 14037fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine 14048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-initrd"; 1405cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner args[n++] = (char*) avdInfo_getImageFile(avd, AVD_IMAGE_RAMDISK); 14068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1407b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project if (opts->partition_size) { 1408b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project char* end; 1409cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner long sizeMB = strtol(opts->partition_size, &end, 0); 1410cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner long minSizeMB = 10; 1411cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner long maxSizeMB = LONG_MAX / ONE_MB; 1412b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project 1413cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (sizeMB < 0 || *end != 0) { 1414b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project derror( "-partition-size must be followed by a positive integer" ); 1415b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project exit(1); 1416b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project } 1417cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (sizeMB < minSizeMB || sizeMB > maxSizeMB) { 1418b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project derror( "partition-size (%d) must be between %dMB and %dMB", 1419cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner sizeMB, minSizeMB, maxSizeMB ); 1420b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project exit(1); 1421b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project } 1422cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner defaultPartitionSize = sizeMB * ONE_MB; 1423cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 1424cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 1425cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner /* Check the size of the system partition image. 1426cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * If we have an AVD, it must be smaller than 1427cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * the disk.systemPartition.size hardware property. 1428cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * 1429cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * Otherwise, we need to adjust the systemPartitionSize 1430cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * automatically, and print a warning. 1431cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * 1432cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner */ 1433cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner { 1434cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner uint64_t systemBytes = avdInfo_getImageFileSize(avd, AVD_IMAGE_INITSYSTEM); 1435def0e542c9cc004a7b83ff965103c34097c0960bDavid 'Digit' Turner uint64_t defaultBytes = defaultPartitionSize; 1436cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 1437cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (defaultBytes == 0 || opts->partition_size) 1438cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner defaultBytes = defaultPartitionSize; 1439cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 1440cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner systemPartitionSize = _adjustPartitionSize("system", systemBytes, defaultBytes, 1441cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner android_build_out != NULL); 1442cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 1443cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 1444cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner /* Check the size of the /data partition. The only interesting cases here are: 1445065242de51ba1e18387ce22a99eb091a859990f7David 'Digit' Turner * - when the USERDATA image already exists and is larger than the default 1446cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * - when we're wiping data and the INITDATA is larger than the default. 1447cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner */ 1448cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 1449cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner { 1450cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner const char* dataPath = avdInfo_getImageFile(avd, AVD_IMAGE_USERDATA); 1451def0e542c9cc004a7b83ff965103c34097c0960bDavid 'Digit' Turner uint64_t defaultBytes = defaultPartitionSize; 1452cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 1453cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (defaultBytes == 0 || opts->partition_size) 1454cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner defaultBytes = defaultPartitionSize; 1455cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 1456cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (dataPath == NULL || !path_exists(dataPath) || opts->wipe_data) { 1457cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner dataPath = avdInfo_getImageFile(avd, AVD_IMAGE_INITDATA); 1458cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 1459cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (dataPath == NULL || !path_exists(dataPath)) { 1460cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner dataPartitionSize = defaultBytes; 1461cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 1462cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner else { 1463cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner uint64_t dataBytes; 1464cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner path_get_size(dataPath, &dataBytes); 1465cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 1466cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner dataPartitionSize = _adjustPartitionSize("data", dataBytes, defaultBytes, 1467cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner android_build_out != NULL); 1468cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 1469b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project } 1470b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project 14718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 14728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* filetype = "file"; 14738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1474cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (avdInfo_isImageReadOnly(avd, AVD_IMAGE_INITSYSTEM)) 14758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project filetype = "initfile"; 14768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint(tmp, tmpend, 1478cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner "system,size=0x%x,%s=%s", systemPartitionSize, filetype, 1479cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner avdInfo_getImageFile(avd, AVD_IMAGE_INITSYSTEM)); 14808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-nand"; 14828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = strdup(tmp); 14838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint(tmp, tmpend, 1486b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project "userdata,size=0x%x,file=%s", 1487cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner dataPartitionSize, 1488cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner avdInfo_getImageFile(avd, AVD_IMAGE_USERDATA)); 14898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-nand"; 14918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = strdup(tmp); 14928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (hw->disk_cachePartition) { 1494cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner opts->cache = (char*) avdInfo_getImageFile(avd, AVD_IMAGE_CACHE); 14958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cachePartitionSize = hw->disk_cachePartition_size; 14968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (opts->cache) { 14988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dwarning( "Emulated hardware doesn't support a cache partition" ); 14998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->cache = NULL; 15008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->no_cache = 1; 15018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->cache) { 15048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* use a specific cache file */ 15058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sprintf(tmp, "cache,size=0x%0x,file=%s", cachePartitionSize, opts->cache); 15068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-nand"; 15078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = strdup(tmp); 15088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!opts->no_cache) { 15108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* create a temporary cache partition file */ 15118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sprintf(tmp, "cache,size=0x%0x", cachePartitionSize); 15128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-nand"; 15138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = strdup(tmp); 15148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 151692568958dd42bf35667cc6451b5edd7f7d1f73a1David 'Digit' Turner if (hw->hw_sdCard != 0) 1517cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner opts->sdcard = (char*) avdInfo_getImageFile(avd, AVD_IMAGE_SDCARD); 151892568958dd42bf35667cc6451b5edd7f7d1f73a1David 'Digit' Turner else if (opts->sdcard) { 15198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dwarning( "Emulated hardware doesn't support SD Cards" ); 15208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->sdcard = NULL; 15218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(opts->sdcard) { 15248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint64_t size; 15258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path_get_size(opts->sdcard, &size) == 0) { 15268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* see if we have an sdcard image. get its size if it exists */ 15278b657e5deaa03b989b0b36791fcf2aa6b2882656David 'Digit' Turner /* due to what looks like limitations of the MMC protocol, one has 15288b657e5deaa03b989b0b36791fcf2aa6b2882656David 'Digit' Turner * to use an SD Card image that is equal or larger than 9 MB 15298b657e5deaa03b989b0b36791fcf2aa6b2882656David 'Digit' Turner */ 15308b657e5deaa03b989b0b36791fcf2aa6b2882656David 'Digit' Turner if (size < 9*1024*1024ULL) { 15318b657e5deaa03b989b0b36791fcf2aa6b2882656David 'Digit' Turner fprintf(stderr, "### WARNING: SD Card files must be at least 9MB, ignoring '%s'\n", opts->sdcard); 15328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 15338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-hda"; 15348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->sdcard; 15358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project use_sdcard_img = 1; 15368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 15388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("no SD Card image at '%s'", opts->sdcard); 15398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1542353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije#if CONFIG_ANDROID_SNAPSHOTS 1543353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije if (!opts->no_snapstorage) { 1544353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije opts->snapstorage = (char*) avdInfo_getImageFile(avd, AVD_IMAGE_SNAPSHOTS); 1545353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije if(opts->snapstorage) { 1546353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije if (path_exists(opts->snapstorage)) { 1547353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije args[n++] = "-hdb"; 1548353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije args[n++] = opts->snapstorage; 1549353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } else { 1550353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije D("no image at '%s', state snapshots disabled", opts->snapstorage); 1551353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 1552353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 1553353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije 1554353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije if (!opts->no_snapshot) { 1555353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije args[n++] = "-loadvm"; 1556353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije if (opts->snapshot) { 1557353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije args[n++] = opts->snapshot; 1558353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } else { 1559353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije // name of state snapshot to load if not specified by user 1560353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije args[n++] = "default-boot"; 1561353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 1562353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } else if (opts->snapshot) { 1563353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije dwarning("option '-no-snapshot' overrides '-snapshot', continuing with boot sequence"); 1564353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 1565353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } else if (opts->snapshot || opts->snapstorage) { 1566353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije dwarning("option '-no-snapstorage' overrides '-snapshot' and '-snapstorage', " 1567353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije "continuing with full boot, state snapshots are disabled"); 1568353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } else if (opts->no_snapshot) { 1569353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije D("ignoring redundant option '-no-snapshot' implied by '-no-snapstorage'"); 1570353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 1571ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije 1572ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije if (opts->snapshot_list) { 1573ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije snapshot_print_and_exit(opts->snapstorage); 1574ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije } 1575ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije#endif // CONFIG_ANDROID_SNAPSHOTS 1576353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije 15778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->logcat || opts->logcat[0] == 0) { 15788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->logcat = getenv("ANDROID_LOG_TAGS"); 15798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->logcat && opts->logcat[0] == 0) 15808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->logcat = NULL; 15818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if 0 15848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->console) { 15858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "option -console is obsolete. please use -shell instead" ); 15868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 15878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 15898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* we always send the kernel messages from ttyS0 to android_kmsg */ 15918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 159213f3b6c53817255217f40db289abace42c3c31a6Vladimir Chtchetkine if (opts->show_kernel) { 159313f3b6c53817255217f40db289abace42c3c31a6Vladimir Chtchetkine args[n++] = "-show-kernel"; 159413f3b6c53817255217f40db289abace42c3c31a6Vladimir Chtchetkine } 15958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 15978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "android-kmsg"; 15988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project serial++; 15998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* XXXX: TODO: implement -shell and -logcat through qemud instead */ 16028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->shell_serial) { 16038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32 16048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->shell_serial = "con:"; 16058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 16068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->shell_serial = "stdio"; 16078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 16088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 16108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->shell = 1; 16118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->shell || opts->logcat) { 16138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 16148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->shell_serial; 16158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project shell_serial = serial++; 16168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->old_system) 16198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 16208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->radio) { 16218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 16228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->radio; 16238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project radio_serial = serial++; 16248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else { 16268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 16278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "android-modem"; 16288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project radio_serial = serial++; 16298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->gps) { 16318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 16328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->gps; 16338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project gps_serial = serial++; 16348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else /* !opts->old_system */ 16378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 16388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 16398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "android-qemud"; 16408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemud_serial = serial++; 16418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->radio) { 1643b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = "-radio"; 1644b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = opts->radio; 16458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->gps) { 1648b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = "-gps"; 1649b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = opts->gps; 16508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->memory) { 16548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 16558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project long ramSize = strtol(opts->memory, &end, 0); 16568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ramSize < 0 || *end != 0) { 16578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "-memory must be followed by a positive integer" ); 16588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 16598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ramSize < 32 || ramSize > 4096) { 16618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "physical memory size must be between 32 and 4096 MB" ); 16628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 16638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->memory) { 16668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint(tmp, tmpend, "%d", hw->hw_ramSize); 166718fe86e8245878f3b7a2813bd59b8cfcf636e15cDavid 'Digit' Turner opts->memory = android_strdup(tmp); 16688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->trace) { 16718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-trace"; 16728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->trace; 16738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-tracing"; 16748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "off"; 16758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1677b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine /* Pass LCD density value to the core. */ 1678b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine snprintf(lcd_density, sizeof(lcd_density), "%d", get_device_dpi(opts)); 1679b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine args[n++] = "-lcd-density"; 1680b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine args[n++] = lcd_density; 1681b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine 1682b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine /* Pass boot properties to the core. */ 1683b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine if (opts->prop != NULL) { 1684b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine ParamList* pl = opts->prop; 1685b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine for ( ; pl != NULL; pl = pl->next ) { 1686b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine args[n++] = "-boot-property"; 1687b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine args[n++] = pl->param; 1688b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine } 1689b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine } 1690b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine 16918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-append"; 16928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->bootchart) { 16948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 16958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int timeout = strtol(opts->bootchart, &end, 10); 16968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (timeout == 0) 16978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->bootchart = NULL; 16988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (timeout < 0 || timeout > 15*60) { 16998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "timeout specified for -bootchart option is invalid.\n" 17008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "please use integers between 1 and 900\n"); 17018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 17028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1705318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner /* Setup the kernel init options 1706318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner */ 17078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 17088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static char params[1024]; 17098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char *p = params, *end = p + sizeof(params); 17108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, "qemu=1 console=ttyS0" ); 17128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->shell || opts->logcat) { 17148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " androidboot.console=ttyS%d", shell_serial ); 17158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->trace) { 17188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " android.tracing=1"); 17198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->no_jni) { 17228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " android.checkjni=1"); 17238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->no_boot_anim) { 17268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint( p, end, " android.bootanim=0" ); 17278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->logcat) { 17308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* q = bufprint(p, end, " androidboot.logcat=%s", opts->logcat); 17318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (q < end) { 17338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* replace any space by a comma ! */ 17348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 17358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 17368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 1; p[nn] != 0; nn++) 17378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p[nn] == ' ' || p[nn] == '\t') 17388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p[nn] = ','; 17398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p += nn; 17408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = q; 17438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->old_system) 17468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 17478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " android.ril=ttyS%d", radio_serial); 17488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->gps) { 17508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " android.gps=ttyS%d", gps_serial); 17518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 17548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 17558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " android.qemud=ttyS%d", qemud_serial); 17568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->bootchart) { 17598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " androidboot.bootchart=%s", opts->bootchart); 17608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p >= end) { 17638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "### ERROR: kernel parameters too long\n"); 17648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 17658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = strdup(params); 17688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1770d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine if (opts->ports) { 1771d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = "-android-ports"; 1772d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = opts->ports; 1773d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine } 1774d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine 1775d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine if (opts->port) { 1776d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = "-android-port"; 1777d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = opts->port; 1778d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine } 1779d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine 1780d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine if (opts->report_console) { 1781d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = "-android-report-console"; 1782d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = opts->report_console; 1783d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine } 1784d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine 1785d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine if (opts->http_proxy) { 1786d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = "-http-proxy"; 1787d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = opts->http_proxy; 1788d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine } 1789d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine 179043552dc4fa64aad0c9fdb8f4c92ae7ac79406596Vladimir Chtchetkine if (opts->charmap) { 179143552dc4fa64aad0c9fdb8f4c92ae7ac79406596Vladimir Chtchetkine args[n++] = "-charmap"; 179243552dc4fa64aad0c9fdb8f4c92ae7ac79406596Vladimir Chtchetkine args[n++] = opts->charmap; 179343552dc4fa64aad0c9fdb8f4c92ae7ac79406596Vladimir Chtchetkine } 179443552dc4fa64aad0c9fdb8f4c92ae7ac79406596Vladimir Chtchetkine 1795b5365f32d7b1dcc6c3e9be7584ce8d4f68b3e7e1Vladimir Chtchetkine if (opts->memcheck) { 1796b5365f32d7b1dcc6c3e9be7584ce8d4f68b3e7e1Vladimir Chtchetkine args[n++] = "-android-memcheck"; 1797b5365f32d7b1dcc6c3e9be7584ce8d4f68b3e7e1Vladimir Chtchetkine args[n++] = opts->memcheck; 1798b5365f32d7b1dcc6c3e9be7584ce8d4f68b3e7e1Vladimir Chtchetkine } 1799b5365f32d7b1dcc6c3e9be7584ce8d4f68b3e7e1Vladimir Chtchetkine 18008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* physical memory */ 18018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-m"; 18028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->memory; 18038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* on Linux, the 'dynticks' clock sometimes doesn't work 18058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * properly. this results in the UI freezing while emulation 18068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * continues, for several seconds... 18078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 18088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef __linux__ 18098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-clock"; 18108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "unix"; 18118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 18128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 181340beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie /* Set up the interfaces for inter-emulator networking */ 181440beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie if (opts->shared_net_id) { 181540beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie unsigned int shared_net_id = atoi(opts->shared_net_id); 181640beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie char nic[37]; 181740beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie 181840beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie args[n++] = "-net"; 181940beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie args[n++] = "nic,vlan=0"; 182040beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie args[n++] = "-net"; 182140beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie args[n++] = "user,vlan=0"; 1822111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie 1823111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie args[n++] = "-net"; 1824111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie snprintf(nic, sizeof nic, "nic,vlan=1,macaddr=52:54:00:12:34:%02x", shared_net_id); 1825111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie args[n++] = strdup(nic); 1826111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie args[n++] = "-net"; 1827111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie args[n++] = "socket,vlan=1,mcast=230.0.0.10:1234"; 182840beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie } 182940beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie 18308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while(argc-- > 0) { 18318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = *argv++; 18328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 18338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n] = 0; 18348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(VERBOSE_CHECK(init)) { 18368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int i; 18378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for(i = 0; i < n; i++) { 18388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stdout, "emulator: argv[%02d] = \"%s\"\n", i, args[i]); 18398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 18408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 18418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return qemu_main(n, args); 18428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1843