From 4f6e8d7a00cbeda1e70cc15be9c4af1018bdad53 Mon Sep 17 00:00:00 2001 From: The Android Open Source Project Date: Tue, 21 Oct 2008 07:00:00 -0700 Subject: [PATCH] Initial Contribution --- Android.mk | 28 + README | 20 + adb/Android.mk | 116 + adb/adb.c | 1093 +++++++++ adb/adb.h | 402 ++++ adb/adb_client.c | 318 +++ adb/adb_client.h | 49 + adb/commandline.c | 1371 ++++++++++++ adb/console.c | 45 + adb/file_sync_client.c | 1022 +++++++++ adb/file_sync_service.c | 412 ++++ adb/file_sync_service.h | 87 + adb/framebuffer_service.c | 69 + adb/get_my_path_darwin.c | 31 + adb/get_my_path_linux.c | 33 + adb/get_my_path_windows.c | 31 + adb/history.h | 13 + adb/jdwp_service.c | 709 ++++++ adb/kdbg.c | 474 ++++ adb/log_service.c | 92 + adb/mutex_list.h | 14 + adb/protocol.txt | 252 +++ adb/remount_service.c | 103 + adb/services.c | 370 ++++ adb/shlist.c | 185 ++ adb/shlist.h | 34 + adb/sockets.c | 733 +++++++ adb/sockets.dia | Bin 0 -> 2333 bytes adb/sysdeps.h | 473 ++++ adb/sysdeps_win32.c | 1953 +++++++++++++++++ adb/test_track_devices.c | 97 + adb/test_track_jdwp.c | 97 + adb/transport.c | 958 ++++++++ adb/transport_local.c | 262 +++ adb/transport_usb.c | 147 ++ adb/usb_linux.c | 653 ++++++ adb/usb_linux_client.c | 156 ++ adb/usb_osx.c | 536 +++++ adb/usb_windows.c | 513 +++++ cpio/Android.mk | 13 + cpio/mkbootfs.c | 220 ++ debuggerd/Android.mk | 22 + debuggerd/MODULE_LICENSE_APACHE2 | 0 debuggerd/NOTICE | 190 ++ debuggerd/crasher.c | 105 + debuggerd/crashglue.S | 28 + debuggerd/debuggerd.c | 852 +++++++ debuggerd/getevent.c | 219 ++ debuggerd/pr-support.c | 345 +++ debuggerd/unwind-arm.c | 618 ++++++ debuggerd/utility.c | 78 + debuggerd/utility.h | 56 + fastboot/Android.mk | 57 + fastboot/bootimg.c | 85 + fastboot/engine.c | 289 +++ fastboot/engineering_key.p12 | Bin 0 -> 2610 bytes fastboot/fastboot.c | 657 ++++++ fastboot/fastboot.h | 57 + fastboot/genkey.sh | 25 + fastboot/p12topem.sh | 9 + fastboot/protocol.c | 181 ++ fastboot/signfile.sh | 10 + fastboot/usb.h | 64 + fastboot/usb_linux.c | 373 ++++ fastboot/usb_osx.c | 538 +++++ fastboot/usb_windows.c | 375 ++++ fastboot/usbtest.c | 212 ++ fastboot/util_linux.c | 52 + fastboot/util_osx.c | 47 + fastboot/util_windows.c | 93 + include/arch/darwin-x86/AndroidConfig.h | 260 +++ include/arch/linux-arm/AndroidConfig.h | 294 +++ include/arch/linux-x86/AndroidConfig.h | 286 +++ include/arch/windows/AndroidConfig.h | 290 +++ include/ctest/ctest.h | 70 + include/cutils/adb_networking.h | 35 + include/cutils/array.h | 67 + include/cutils/ashmem.h | 42 + include/cutils/atomic.h | 79 + include/cutils/config_utils.h | 61 + include/cutils/cpu_info.h | 34 + include/cutils/dir_hash.h | 26 + include/cutils/event_tag_map.h | 50 + include/cutils/fdevent.h | 74 + include/cutils/hashmap.h | 150 ++ include/cutils/jstring.h | 43 + include/cutils/log.h | 346 +++ include/cutils/logd.h | 78 + include/cutils/logprint.h | 156 ++ include/cutils/memory.h | 42 + include/cutils/misc.h | 48 + include/cutils/mq.h | 124 ++ include/cutils/mspace.h | 117 + include/cutils/process_name.h | 42 + include/cutils/properties.h | 70 + include/cutils/record_stream.h | 43 + include/cutils/selector.h | 130 ++ include/cutils/sockets.h | 100 + include/cutils/threads.h | 146 ++ include/cutils/tztime.h | 32 + include/cutils/uio.h | 48 + include/cutils/zygote.h | 32 + include/mincrypt/rsa.h | 56 + include/mincrypt/sha.h | 56 + include/pixelflinger/format.h | 126 ++ include/pixelflinger/pixelflinger.h | 330 +++ include/private/android_filesystem_config.h | 209 ++ include/private/pixelflinger/ggl_context.h | 542 +++++ include/private/pixelflinger/ggl_fixed.h | 302 +++ include/zipfile/zipfile.h | 58 + init/Android.mk | 33 + init/MODULE_LICENSE_APACHE2 | 0 init/NOTICE | 190 ++ init/README.BOOTCHART | 34 + init/bootchart.c | 337 +++ init/builtins.c | 402 ++++ init/devices.c | 622 ++++++ init/devices.h | 27 + init/grab-bootchart.sh | 22 + init/init.c | 891 ++++++++ init/init.h | 167 ++ init/keywords.h | 75 + init/logo.c | 163 ++ init/parser.c | 755 +++++++ init/property_service.c | 502 +++++ init/property_service.h | 28 + init/readme.txt | 290 +++ init/util.c | 211 ++ libctest/Android.mk | 7 + libctest/ctest.c | 161 ++ libcutils/Android.mk | 106 + libcutils/MODULE_LICENSE_APACHE2 | 0 libcutils/NOTICE | 190 ++ libcutils/adb_networking.c | 172 ++ libcutils/array.c | 155 ++ libcutils/ashmem-dev.c | 85 + libcutils/ashmem-host.c | 94 + libcutils/atomic-android-arm.S | 222 ++ libcutils/atomic-android-armv6.S | 169 ++ libcutils/atomic.c | 335 +++ libcutils/buffer.c | 116 + libcutils/buffer.h | 112 + libcutils/config_utils.c | 317 +++ libcutils/cpu_info.c | 83 + libcutils/dir_hash.c | 334 +++ libcutils/dlmalloc_stubs.c | 29 + libcutils/fdevent.c | 506 +++++ libcutils/hashmap.c | 350 +++ libcutils/load_file.c | 51 + libcutils/loghack.h | 38 + libcutils/memory.c | 87 + libcutils/memset32.S | 93 + libcutils/mq.c | 1357 ++++++++++++ libcutils/mspace.c | 246 +++ libcutils/private.h | 368 ++++ libcutils/process_name.c | 75 + libcutils/properties.c | 368 ++++ libcutils/record_stream.c | 186 ++ libcutils/selector.c | 263 +++ libcutils/socket_inaddr_any_server.c | 70 + libcutils/socket_local.h | 39 + libcutils/socket_local_client.c | 167 ++ libcutils/socket_local_server.c | 124 ++ libcutils/socket_loopback_client.c | 59 + libcutils/socket_loopback_server.c | 71 + libcutils/socket_network_client.c | 65 + libcutils/strdup16to8.c | 104 + libcutils/strdup8to16.c | 209 ++ libcutils/threads.c | 84 + libcutils/tzfile.h | 180 ++ libcutils/tztime.c | 1915 ++++++++++++++++ libcutils/uio.c | 76 + libcutils/zygote.c | 267 +++ liblog/Android.mk | 72 + liblog/event_tag_map.c | 438 ++++ liblog/fake_log_device.c | 677 ++++++ liblog/logd_write.c | 229 ++ liblog/logprint.c | 972 ++++++++ libmincrypt/Android.mk | 11 + libmincrypt/rsa.c | 198 ++ libmincrypt/sha.c | 142 ++ libmincrypt/tools/Android.mk | 21 + libmincrypt/tools/DumpPublicKey.java | 130 ++ libmincrypt/tools/DumpPublicKey.mf | 1 + libnetutils/Android.mk | 23 + libnetutils/dhcp_utils.c | 186 ++ libnetutils/dhcpclient.c | 562 +++++ libnetutils/dhcpmsg.c | 100 + libnetutils/dhcpmsg.h | 106 + libnetutils/ifc_utils.c | 428 ++++ libnetutils/ifc_utils.h | 35 + libnetutils/packet.c | 239 ++ libnetutils/packet.h | 25 + libpixelflinger/Android.mk | 87 + libpixelflinger/MODULE_LICENSE_APACHE2 | 0 libpixelflinger/NOTICE | 190 ++ libpixelflinger/buffer.cpp | 384 ++++ libpixelflinger/buffer.h | 39 + libpixelflinger/clear.cpp | 171 ++ libpixelflinger/clear.h | 30 + libpixelflinger/codeflinger/ARMAssembler.cpp | 428 ++++ libpixelflinger/codeflinger/ARMAssembler.h | 155 ++ .../codeflinger/ARMAssemblerInterface.cpp | 173 ++ .../codeflinger/ARMAssemblerInterface.h | 324 +++ .../codeflinger/ARMAssemblerProxy.cpp | 200 ++ .../codeflinger/ARMAssemblerProxy.h | 123 ++ libpixelflinger/codeflinger/CodeCache.cpp | 151 ++ libpixelflinger/codeflinger/CodeCache.h | 134 ++ libpixelflinger/codeflinger/GGLAssembler.cpp | 1135 ++++++++++ libpixelflinger/codeflinger/GGLAssembler.h | 549 +++++ libpixelflinger/codeflinger/armreg.h | 300 +++ libpixelflinger/codeflinger/blending.cpp | 676 ++++++ libpixelflinger/codeflinger/disassem.c | 702 ++++++ libpixelflinger/codeflinger/disassem.h | 65 + libpixelflinger/codeflinger/load_store.cpp | 378 ++++ libpixelflinger/codeflinger/texturing.cpp | 1208 ++++++++++ libpixelflinger/fixed.cpp | 339 +++ libpixelflinger/format.cpp | 67 + libpixelflinger/picker.cpp | 173 ++ libpixelflinger/picker.h | 31 + libpixelflinger/pixelflinger.cpp | 843 +++++++ libpixelflinger/raster.cpp | 217 ++ libpixelflinger/raster.h | 33 + libpixelflinger/rotate90CW_4x4_16v6.S | 62 + libpixelflinger/scanline.cpp | 1487 +++++++++++++ libpixelflinger/scanline.h | 32 + libpixelflinger/t32cb16blend.S | 171 ++ libpixelflinger/tinyutils/KeyedVector.h | 193 ++ libpixelflinger/tinyutils/SharedBuffer.cpp | 106 + libpixelflinger/tinyutils/SharedBuffer.h | 138 ++ libpixelflinger/tinyutils/TypeHelpers.h | 245 +++ libpixelflinger/tinyutils/Vector.h | 352 +++ libpixelflinger/tinyutils/VectorImpl.cpp | 552 +++++ libpixelflinger/tinyutils/VectorImpl.h | 185 ++ libpixelflinger/tinyutils/smartpointer.h | 170 ++ libpixelflinger/trap.cpp | 1173 ++++++++++ libpixelflinger/trap.h | 31 + libzipfile/Android.mk | 48 + libzipfile/MODULE_LICENSE_APACHE2 | 0 libzipfile/NOTICE | 190 ++ libzipfile/centraldir.c | 256 +++ libzipfile/private.h | 45 + libzipfile/test_zipfile.c | 92 + libzipfile/zipfile.c | 160 ++ logcat/Android.mk | 27 + logcat/MODULE_LICENSE_APACHE2 | 0 logcat/NOTICE | 190 ++ logcat/event-log-tags | 305 +++ logcat/logcat.cpp | 569 +++++ logwrapper/Android.mk | 7 + logwrapper/logwrapper.c | 126 ++ mkbootimg/Android.mk | 11 + mkbootimg/bootimg.h | 97 + mkbootimg/mkbootimg.c | 257 +++ mountd/Android.mk | 19 + mountd/AutoMount.c | 924 ++++++++ mountd/MODULE_LICENSE_APACHE2 | 0 mountd/NOTICE | 190 ++ mountd/ProcessKiller.c | 209 ++ mountd/Server.c | 232 ++ mountd/mountd.c | 106 + mountd/mountd.h | 159 ++ netcfg/Android.mk | 16 + netcfg/MODULE_LICENSE_APACHE2 | 0 netcfg/NOTICE | 190 ++ netcfg/netcfg.c | 175 ++ rootdir/Android.mk | 57 + rootdir/etc/dbus.conf | 67 + rootdir/etc/hcid.conf | 64 + rootdir/etc/hosts | 1 + rootdir/etc/init.goldfish.rc | 53 + rootdir/etc/init.goldfish.sh | 39 + rootdir/etc/init.gprs-pppd | 23 + rootdir/etc/init.testmenu | 322 +++ rootdir/etc/mountd.conf | 13 + rootdir/etc/ppp/chap-secrets | 2 + rootdir/etc/ppp/ip-down | 14 + rootdir/etc/ppp/ip-up | 24 + rootdir/init.rc | 235 ++ sh/Android.mk | 49 + sh/MODULE_LICENSE_BSD | 0 sh/NOTICE | 31 + sh/TOUR | 357 +++ sh/alias.c | 273 +++ sh/alias.h | 50 + sh/arith.c | 1587 ++++++++++++++ sh/arith.h | 25 + sh/arith.y | 199 ++ sh/arith_lex.c | 1890 ++++++++++++++++ sh/arith_lex.l | 103 + sh/bltin/bltin.h | 94 + sh/bltin/echo.1 | 109 + sh/bltin/echo.c | 116 + sh/builtins.c | 61 + sh/builtins.def | 94 + sh/builtins.h | 56 + sh/cd.c | 446 ++++ sh/cd.h | 35 + sh/error.c | 366 +++ sh/error.h | 117 + sh/eval.c | 1257 +++++++++++ sh/eval.h | 64 + sh/exec.c | 1063 +++++++++ sh/exec.h | 79 + sh/expand.c | 1559 +++++++++++++ sh/expand.h | 72 + sh/funcs/cmv | 50 + sh/funcs/dirs | 74 + sh/funcs/kill | 50 + sh/funcs/login | 39 + sh/funcs/newgrp | 38 + sh/funcs/popd | 74 + sh/funcs/pushd | 74 + sh/funcs/suspend | 42 + sh/histedit.c | 540 +++++ sh/init.c | 1090 +++++++++ sh/init.h | 39 + sh/input.c | 531 +++++ sh/input.h | 62 + sh/jobs.c | 1487 +++++++++++++ sh/jobs.h | 106 + sh/machdep.h | 47 + sh/main.c | 394 ++++ sh/main.h | 43 + sh/memalloc.c | 307 +++ sh/memalloc.h | 77 + sh/miscbltin.c | 447 ++++ sh/miscbltin.h | 31 + sh/mkbuiltins | 136 ++ sh/mkinit.sh | 197 ++ sh/mknodes.sh | 217 ++ sh/mktokens | 92 + sh/myhistedit.h | 49 + sh/mystring.c | 133 ++ sh/mystring.h | 45 + sh/nodes.c | 347 +++ sh/nodes.c.pat | 166 ++ sh/nodes.h | 159 ++ sh/nodetypes | 143 ++ sh/options.c | 530 +++++ sh/options.h | 131 ++ sh/output.c | 516 +++++ sh/output.h | 81 + sh/parser.c | 1651 ++++++++++++++ sh/parser.h | 82 + sh/redir.c | 389 ++++ sh/redir.h | 48 + sh/sh.1 | 1928 ++++++++++++++++ sh/shell.h | 83 + sh/show.c | 425 ++++ sh/show.h | 45 + sh/syntax.c | 102 + sh/syntax.h | 83 + sh/token.h | 112 + sh/trap.c | 470 ++++ sh/trap.h | 46 + sh/var.c | 825 +++++++ sh/var.h | 131 ++ toolbox/Android.mk | 85 + toolbox/MODULE_LICENSE_BSD | 0 toolbox/NOTICE | 131 ++ toolbox/alarm.c | 190 ++ toolbox/cat.c | 291 +++ toolbox/chmod.c | 40 + toolbox/cmp.c | 90 + toolbox/date.c | 132 ++ toolbox/dd.c | 1358 ++++++++++++ toolbox/dd.h | 91 + toolbox/df.c | 63 + toolbox/dmesg.c | 43 + toolbox/exists.c | 16 + toolbox/getevent.c | 427 ++++ toolbox/getprop.c | 34 + toolbox/hd.c | 95 + toolbox/id.c | 51 + toolbox/ifconfig.c | 139 ++ toolbox/iftop.c | 278 +++ toolbox/insmod.c | 81 + toolbox/ioctl.c | 125 ++ toolbox/kill.c | 35 + toolbox/ln.c | 34 + toolbox/log.c | 145 ++ toolbox/ls.c | 285 +++ toolbox/lsmod.c | 10 + toolbox/mkdir.c | 29 + toolbox/mkdosfs.c | 849 +++++++ toolbox/mount.c | 273 +++ toolbox/mv.c | 59 + toolbox/netstat.c | 120 + toolbox/notify.c | 144 ++ toolbox/powerd.c | 441 ++++ toolbox/printenv.c | 29 + toolbox/ps.c | 214 ++ toolbox/r.c | 74 + toolbox/readtty.c | 183 ++ toolbox/reboot.c | 56 + toolbox/renice.c | 144 ++ toolbox/rm.c | 92 + toolbox/rmdir.c | 29 + toolbox/rmmod.c | 42 + toolbox/rotatefb.c | 71 + toolbox/route.c | 97 + toolbox/schedtop.c | 335 +++ toolbox/sendevent.c | 80 + toolbox/setconsole.c | 164 ++ toolbox/setkey.c | 89 + toolbox/setprop.c | 18 + toolbox/sleep.c | 64 + toolbox/smd.c | 40 + toolbox/start.c | 20 + toolbox/stop.c | 20 + toolbox/sync.c | 7 + toolbox/syren.c | 154 ++ toolbox/toolbox.c | 57 + toolbox/top.c | 516 +++++ toolbox/umount.c | 74 + toolbox/vmstat.c | 247 +++ toolbox/watchprops.c | 76 + toolbox/wipe.c | 176 ++ 419 files changed, 98588 insertions(+) create mode 100644 Android.mk create mode 100644 README create mode 100644 adb/Android.mk create mode 100644 adb/adb.c create mode 100644 adb/adb.h create mode 100644 adb/adb_client.c create mode 100644 adb/adb_client.h create mode 100644 adb/commandline.c create mode 100644 adb/console.c create mode 100644 adb/file_sync_client.c create mode 100644 adb/file_sync_service.c create mode 100644 adb/file_sync_service.h create mode 100644 adb/framebuffer_service.c create mode 100644 adb/get_my_path_darwin.c create mode 100644 adb/get_my_path_linux.c create mode 100644 adb/get_my_path_windows.c create mode 100755 adb/history.h create mode 100644 adb/jdwp_service.c create mode 100644 adb/kdbg.c create mode 100644 adb/log_service.c create mode 100644 adb/mutex_list.h create mode 100644 adb/protocol.txt create mode 100644 adb/remount_service.c create mode 100644 adb/services.c create mode 100755 adb/shlist.c create mode 100755 adb/shlist.h create mode 100644 adb/sockets.c create mode 100644 adb/sockets.dia create mode 100644 adb/sysdeps.h create mode 100644 adb/sysdeps_win32.c create mode 100644 adb/test_track_devices.c create mode 100644 adb/test_track_jdwp.c create mode 100644 adb/transport.c create mode 100644 adb/transport_local.c create mode 100644 adb/transport_usb.c create mode 100644 adb/usb_linux.c create mode 100644 adb/usb_linux_client.c create mode 100644 adb/usb_osx.c create mode 100644 adb/usb_windows.c create mode 100644 cpio/Android.mk create mode 100644 cpio/mkbootfs.c create mode 100644 debuggerd/Android.mk create mode 100644 debuggerd/MODULE_LICENSE_APACHE2 create mode 100644 debuggerd/NOTICE create mode 100644 debuggerd/crasher.c create mode 100644 debuggerd/crashglue.S create mode 100644 debuggerd/debuggerd.c create mode 100644 debuggerd/getevent.c create mode 100644 debuggerd/pr-support.c create mode 100644 debuggerd/unwind-arm.c create mode 100644 debuggerd/utility.c create mode 100644 debuggerd/utility.h create mode 100644 fastboot/Android.mk create mode 100644 fastboot/bootimg.c create mode 100644 fastboot/engine.c create mode 100644 fastboot/engineering_key.p12 create mode 100644 fastboot/fastboot.c create mode 100644 fastboot/fastboot.h create mode 100755 fastboot/genkey.sh create mode 100755 fastboot/p12topem.sh create mode 100644 fastboot/protocol.c create mode 100755 fastboot/signfile.sh create mode 100644 fastboot/usb.h create mode 100644 fastboot/usb_linux.c create mode 100644 fastboot/usb_osx.c create mode 100644 fastboot/usb_windows.c create mode 100644 fastboot/usbtest.c create mode 100644 fastboot/util_linux.c create mode 100644 fastboot/util_osx.c create mode 100644 fastboot/util_windows.c create mode 100644 include/arch/darwin-x86/AndroidConfig.h create mode 100644 include/arch/linux-arm/AndroidConfig.h create mode 100644 include/arch/linux-x86/AndroidConfig.h create mode 100644 include/arch/windows/AndroidConfig.h create mode 100644 include/ctest/ctest.h create mode 100755 include/cutils/adb_networking.h create mode 100644 include/cutils/array.h create mode 100644 include/cutils/ashmem.h create mode 100644 include/cutils/atomic.h create mode 100644 include/cutils/config_utils.h create mode 100644 include/cutils/cpu_info.h create mode 100644 include/cutils/dir_hash.h create mode 100644 include/cutils/event_tag_map.h create mode 100644 include/cutils/fdevent.h create mode 100644 include/cutils/hashmap.h create mode 100644 include/cutils/jstring.h create mode 100644 include/cutils/log.h create mode 100644 include/cutils/logd.h create mode 100644 include/cutils/logprint.h create mode 100644 include/cutils/memory.h create mode 100644 include/cutils/misc.h create mode 100644 include/cutils/mq.h create mode 100644 include/cutils/mspace.h create mode 100644 include/cutils/process_name.h create mode 100644 include/cutils/properties.h create mode 100644 include/cutils/record_stream.h create mode 100644 include/cutils/selector.h create mode 100644 include/cutils/sockets.h create mode 100644 include/cutils/threads.h create mode 100644 include/cutils/tztime.h create mode 100644 include/cutils/uio.h create mode 100644 include/cutils/zygote.h create mode 100644 include/mincrypt/rsa.h create mode 100644 include/mincrypt/sha.h create mode 100644 include/pixelflinger/format.h create mode 100644 include/pixelflinger/pixelflinger.h create mode 100644 include/private/android_filesystem_config.h create mode 100644 include/private/pixelflinger/ggl_context.h create mode 100644 include/private/pixelflinger/ggl_fixed.h create mode 100644 include/zipfile/zipfile.h create mode 100644 init/Android.mk create mode 100644 init/MODULE_LICENSE_APACHE2 create mode 100644 init/NOTICE create mode 100644 init/README.BOOTCHART create mode 100644 init/bootchart.c create mode 100644 init/builtins.c create mode 100644 init/devices.c create mode 100644 init/devices.h create mode 100755 init/grab-bootchart.sh create mode 100644 init/init.c create mode 100644 init/init.h create mode 100644 init/keywords.h create mode 100644 init/logo.c create mode 100644 init/parser.c create mode 100644 init/property_service.c create mode 100644 init/property_service.h create mode 100644 init/readme.txt create mode 100644 init/util.c create mode 100644 libctest/Android.mk create mode 100644 libctest/ctest.c create mode 100644 libcutils/Android.mk create mode 100644 libcutils/MODULE_LICENSE_APACHE2 create mode 100644 libcutils/NOTICE create mode 100644 libcutils/adb_networking.c create mode 100644 libcutils/array.c create mode 100644 libcutils/ashmem-dev.c create mode 100644 libcutils/ashmem-host.c create mode 100644 libcutils/atomic-android-arm.S create mode 100644 libcutils/atomic-android-armv6.S create mode 100644 libcutils/atomic.c create mode 100644 libcutils/buffer.c create mode 100644 libcutils/buffer.h create mode 100644 libcutils/config_utils.c create mode 100644 libcutils/cpu_info.c create mode 100644 libcutils/dir_hash.c create mode 100644 libcutils/dlmalloc_stubs.c create mode 100644 libcutils/fdevent.c create mode 100644 libcutils/hashmap.c create mode 100644 libcutils/load_file.c create mode 100644 libcutils/loghack.h create mode 100644 libcutils/memory.c create mode 100644 libcutils/memset32.S create mode 100644 libcutils/mq.c create mode 100644 libcutils/mspace.c create mode 100644 libcutils/private.h create mode 100644 libcutils/process_name.c create mode 100644 libcutils/properties.c create mode 100644 libcutils/record_stream.c create mode 100644 libcutils/selector.c create mode 100644 libcutils/socket_inaddr_any_server.c create mode 100644 libcutils/socket_local.h create mode 100644 libcutils/socket_local_client.c create mode 100644 libcutils/socket_local_server.c create mode 100644 libcutils/socket_loopback_client.c create mode 100644 libcutils/socket_loopback_server.c create mode 100644 libcutils/socket_network_client.c create mode 100644 libcutils/strdup16to8.c create mode 100644 libcutils/strdup8to16.c create mode 100644 libcutils/threads.c create mode 100644 libcutils/tzfile.h create mode 100644 libcutils/tztime.c create mode 100644 libcutils/uio.c create mode 100644 libcutils/zygote.c create mode 100644 liblog/Android.mk create mode 100644 liblog/event_tag_map.c create mode 100644 liblog/fake_log_device.c create mode 100644 liblog/logd_write.c create mode 100644 liblog/logprint.c create mode 100644 libmincrypt/Android.mk create mode 100644 libmincrypt/rsa.c create mode 100644 libmincrypt/sha.c create mode 100644 libmincrypt/tools/Android.mk create mode 100644 libmincrypt/tools/DumpPublicKey.java create mode 100644 libmincrypt/tools/DumpPublicKey.mf create mode 100644 libnetutils/Android.mk create mode 100644 libnetutils/dhcp_utils.c create mode 100644 libnetutils/dhcpclient.c create mode 100644 libnetutils/dhcpmsg.c create mode 100644 libnetutils/dhcpmsg.h create mode 100644 libnetutils/ifc_utils.c create mode 100644 libnetutils/ifc_utils.h create mode 100644 libnetutils/packet.c create mode 100644 libnetutils/packet.h create mode 100644 libpixelflinger/Android.mk create mode 100644 libpixelflinger/MODULE_LICENSE_APACHE2 create mode 100644 libpixelflinger/NOTICE create mode 100644 libpixelflinger/buffer.cpp create mode 100644 libpixelflinger/buffer.h create mode 100644 libpixelflinger/clear.cpp create mode 100644 libpixelflinger/clear.h create mode 100644 libpixelflinger/codeflinger/ARMAssembler.cpp create mode 100644 libpixelflinger/codeflinger/ARMAssembler.h create mode 100644 libpixelflinger/codeflinger/ARMAssemblerInterface.cpp create mode 100644 libpixelflinger/codeflinger/ARMAssemblerInterface.h create mode 100644 libpixelflinger/codeflinger/ARMAssemblerProxy.cpp create mode 100644 libpixelflinger/codeflinger/ARMAssemblerProxy.h create mode 100644 libpixelflinger/codeflinger/CodeCache.cpp create mode 100644 libpixelflinger/codeflinger/CodeCache.h create mode 100644 libpixelflinger/codeflinger/GGLAssembler.cpp create mode 100644 libpixelflinger/codeflinger/GGLAssembler.h create mode 100644 libpixelflinger/codeflinger/armreg.h create mode 100644 libpixelflinger/codeflinger/blending.cpp create mode 100644 libpixelflinger/codeflinger/disassem.c create mode 100644 libpixelflinger/codeflinger/disassem.h create mode 100644 libpixelflinger/codeflinger/load_store.cpp create mode 100644 libpixelflinger/codeflinger/texturing.cpp create mode 100644 libpixelflinger/fixed.cpp create mode 100644 libpixelflinger/format.cpp create mode 100644 libpixelflinger/picker.cpp create mode 100644 libpixelflinger/picker.h create mode 100644 libpixelflinger/pixelflinger.cpp create mode 100644 libpixelflinger/raster.cpp create mode 100644 libpixelflinger/raster.h create mode 100644 libpixelflinger/rotate90CW_4x4_16v6.S create mode 100644 libpixelflinger/scanline.cpp create mode 100644 libpixelflinger/scanline.h create mode 100644 libpixelflinger/t32cb16blend.S create mode 100644 libpixelflinger/tinyutils/KeyedVector.h create mode 100644 libpixelflinger/tinyutils/SharedBuffer.cpp create mode 100644 libpixelflinger/tinyutils/SharedBuffer.h create mode 100644 libpixelflinger/tinyutils/TypeHelpers.h create mode 100644 libpixelflinger/tinyutils/Vector.h create mode 100644 libpixelflinger/tinyutils/VectorImpl.cpp create mode 100644 libpixelflinger/tinyutils/VectorImpl.h create mode 100644 libpixelflinger/tinyutils/smartpointer.h create mode 100644 libpixelflinger/trap.cpp create mode 100644 libpixelflinger/trap.h create mode 100644 libzipfile/Android.mk create mode 100644 libzipfile/MODULE_LICENSE_APACHE2 create mode 100644 libzipfile/NOTICE create mode 100644 libzipfile/centraldir.c create mode 100644 libzipfile/private.h create mode 100644 libzipfile/test_zipfile.c create mode 100644 libzipfile/zipfile.c create mode 100644 logcat/Android.mk create mode 100644 logcat/MODULE_LICENSE_APACHE2 create mode 100644 logcat/NOTICE create mode 100644 logcat/event-log-tags create mode 100644 logcat/logcat.cpp create mode 100644 logwrapper/Android.mk create mode 100644 logwrapper/logwrapper.c create mode 100644 mkbootimg/Android.mk create mode 100644 mkbootimg/bootimg.h create mode 100644 mkbootimg/mkbootimg.c create mode 100644 mountd/Android.mk create mode 100644 mountd/AutoMount.c create mode 100644 mountd/MODULE_LICENSE_APACHE2 create mode 100644 mountd/NOTICE create mode 100644 mountd/ProcessKiller.c create mode 100644 mountd/Server.c create mode 100644 mountd/mountd.c create mode 100644 mountd/mountd.h create mode 100644 netcfg/Android.mk create mode 100644 netcfg/MODULE_LICENSE_APACHE2 create mode 100644 netcfg/NOTICE create mode 100644 netcfg/netcfg.c create mode 100644 rootdir/Android.mk create mode 100644 rootdir/etc/dbus.conf create mode 100644 rootdir/etc/hcid.conf create mode 100644 rootdir/etc/hosts create mode 100644 rootdir/etc/init.goldfish.rc create mode 100755 rootdir/etc/init.goldfish.sh create mode 100755 rootdir/etc/init.gprs-pppd create mode 100755 rootdir/etc/init.testmenu create mode 100644 rootdir/etc/mountd.conf create mode 100644 rootdir/etc/ppp/chap-secrets create mode 100755 rootdir/etc/ppp/ip-down create mode 100755 rootdir/etc/ppp/ip-up create mode 100644 rootdir/init.rc create mode 100644 sh/Android.mk create mode 100644 sh/MODULE_LICENSE_BSD create mode 100644 sh/NOTICE create mode 100644 sh/TOUR create mode 100644 sh/alias.c create mode 100644 sh/alias.h create mode 100644 sh/arith.c create mode 100644 sh/arith.h create mode 100644 sh/arith.y create mode 100644 sh/arith_lex.c create mode 100644 sh/arith_lex.l create mode 100644 sh/bltin/bltin.h create mode 100644 sh/bltin/echo.1 create mode 100644 sh/bltin/echo.c create mode 100644 sh/builtins.c create mode 100644 sh/builtins.def create mode 100644 sh/builtins.h create mode 100644 sh/cd.c create mode 100644 sh/cd.h create mode 100644 sh/error.c create mode 100644 sh/error.h create mode 100644 sh/eval.c create mode 100644 sh/eval.h create mode 100644 sh/exec.c create mode 100644 sh/exec.h create mode 100644 sh/expand.c create mode 100644 sh/expand.h create mode 100644 sh/funcs/cmv create mode 100644 sh/funcs/dirs create mode 100644 sh/funcs/kill create mode 100644 sh/funcs/login create mode 100644 sh/funcs/newgrp create mode 100644 sh/funcs/popd create mode 100644 sh/funcs/pushd create mode 100644 sh/funcs/suspend create mode 100644 sh/histedit.c create mode 100644 sh/init.c create mode 100644 sh/init.h create mode 100644 sh/input.c create mode 100644 sh/input.h create mode 100644 sh/jobs.c create mode 100644 sh/jobs.h create mode 100644 sh/machdep.h create mode 100644 sh/main.c create mode 100644 sh/main.h create mode 100644 sh/memalloc.c create mode 100644 sh/memalloc.h create mode 100644 sh/miscbltin.c create mode 100644 sh/miscbltin.h create mode 100644 sh/mkbuiltins create mode 100644 sh/mkinit.sh create mode 100644 sh/mknodes.sh create mode 100644 sh/mktokens create mode 100644 sh/myhistedit.h create mode 100644 sh/mystring.c create mode 100644 sh/mystring.h create mode 100644 sh/nodes.c create mode 100644 sh/nodes.c.pat create mode 100644 sh/nodes.h create mode 100644 sh/nodetypes create mode 100644 sh/options.c create mode 100644 sh/options.h create mode 100644 sh/output.c create mode 100644 sh/output.h create mode 100644 sh/parser.c create mode 100644 sh/parser.h create mode 100644 sh/redir.c create mode 100644 sh/redir.h create mode 100644 sh/sh.1 create mode 100644 sh/shell.h create mode 100644 sh/show.c create mode 100644 sh/show.h create mode 100644 sh/syntax.c create mode 100644 sh/syntax.h create mode 100644 sh/token.h create mode 100644 sh/trap.c create mode 100644 sh/trap.h create mode 100644 sh/var.c create mode 100644 sh/var.h create mode 100644 toolbox/Android.mk create mode 100644 toolbox/MODULE_LICENSE_BSD create mode 100644 toolbox/NOTICE create mode 100644 toolbox/alarm.c create mode 100644 toolbox/cat.c create mode 100644 toolbox/chmod.c create mode 100644 toolbox/cmp.c create mode 100644 toolbox/date.c create mode 100644 toolbox/dd.c create mode 100644 toolbox/dd.h create mode 100644 toolbox/df.c create mode 100644 toolbox/dmesg.c create mode 100644 toolbox/exists.c create mode 100644 toolbox/getevent.c create mode 100644 toolbox/getprop.c create mode 100644 toolbox/hd.c create mode 100644 toolbox/id.c create mode 100644 toolbox/ifconfig.c create mode 100644 toolbox/iftop.c create mode 100644 toolbox/insmod.c create mode 100644 toolbox/ioctl.c create mode 100644 toolbox/kill.c create mode 100644 toolbox/ln.c create mode 100644 toolbox/log.c create mode 100644 toolbox/ls.c create mode 100644 toolbox/lsmod.c create mode 100644 toolbox/mkdir.c create mode 100644 toolbox/mkdosfs.c create mode 100644 toolbox/mount.c create mode 100644 toolbox/mv.c create mode 100644 toolbox/netstat.c create mode 100644 toolbox/notify.c create mode 100644 toolbox/powerd.c create mode 100644 toolbox/printenv.c create mode 100644 toolbox/ps.c create mode 100644 toolbox/r.c create mode 100644 toolbox/readtty.c create mode 100644 toolbox/reboot.c create mode 100644 toolbox/renice.c create mode 100644 toolbox/rm.c create mode 100644 toolbox/rmdir.c create mode 100644 toolbox/rmmod.c create mode 100644 toolbox/rotatefb.c create mode 100644 toolbox/route.c create mode 100644 toolbox/schedtop.c create mode 100644 toolbox/sendevent.c create mode 100644 toolbox/setconsole.c create mode 100644 toolbox/setkey.c create mode 100644 toolbox/setprop.c create mode 100644 toolbox/sleep.c create mode 100644 toolbox/smd.c create mode 100644 toolbox/start.c create mode 100644 toolbox/stop.c create mode 100644 toolbox/sync.c create mode 100644 toolbox/syren.c create mode 100644 toolbox/toolbox.c create mode 100644 toolbox/top.c create mode 100644 toolbox/umount.c create mode 100644 toolbox/vmstat.c create mode 100644 toolbox/watchprops.c create mode 100644 toolbox/wipe.c diff --git a/Android.mk b/Android.mk new file mode 100644 index 000000000..44ea560be --- /dev/null +++ b/Android.mk @@ -0,0 +1,28 @@ +# +# Copyright (C) 2008 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +LOCAL_PATH := $(my-dir) + +ifneq ($(TARGET_SIMULATOR),true) + include $(call first-makefiles-under,$(LOCAL_PATH)) +else + include $(addprefix $(LOCAL_PATH)/,$(addsuffix /Android.mk, \ + libcutils \ + liblog \ + libnetutils \ + libpixelflinger \ + libzipfile \ + )) +endif diff --git a/README b/README new file mode 100644 index 000000000..0083247ac --- /dev/null +++ b/README @@ -0,0 +1,20 @@ + +The system/ directory is intended for pieces of the world that are the +core of the embedded linux platform at the heart of Android. These +essential bits are required for basic booting, operation, and debugging. + +They should not depend on libraries outside of system/... (some of them +do currently -- they need to be updated or changed) and they should not +be required for the simulator build. + +The license for all these pieces should be clean (Apache2, BSD, or MIT). + +Currently system/bluetooth/... and system/extra/... have some pieces +with GPL/LGPL licensed code. + +Assorted Issues: + +- pppd depends on libutils for logging +- pppd depends on libcrypt/libcrypto +- init, linker, debuggerd, toolbox, usbd depend on libcutils +- should probably rename bionic to libc diff --git a/adb/Android.mk b/adb/Android.mk new file mode 100644 index 000000000..8ac5eb437 --- /dev/null +++ b/adb/Android.mk @@ -0,0 +1,116 @@ +# Copyright 2005 The Android Open Source Project +# +# Android.mk for adb +# + +LOCAL_PATH:= $(call my-dir) + +# adb host tool +# ========================================================= +include $(CLEAR_VARS) + +# Default to a virtual (sockets) usb interface +USB_SRCS := +EXTRA_SRCS := + +ifeq ($(HOST_OS),linux) + USB_SRCS := usb_linux.c + EXTRA_SRCS := get_my_path_linux.c + LOCAL_LDLIBS += -lrt -lncurses -lpthread +endif + +ifeq ($(HOST_OS),darwin) + USB_SRCS := usb_osx.c + EXTRA_SRCS := get_my_path_darwin.c + LOCAL_LDLIBS += -lpthread -framework CoreFoundation -framework IOKit -framework Carbon +endif + +ifeq ($(HOST_OS),windows) + USB_SRCS := usb_windows.c + EXTRA_SRCS := get_my_path_windows.c + EXTRA_STATIC_LIBS := AdbWinApi + LOCAL_C_INCLUDES += /usr/include/w32api/ddk $(LOCAL_PATH)/../windows/usb/api + ifneq ($(strip $(USE_CYGWIN)),) + LOCAL_LDLIBS += -lpthread + else + LOCAL_LDLIBS += -lws2_32 + USE_SYSDEPS_WIN32 := 1 + endif +endif + +LOCAL_SRC_FILES := \ + adb.c \ + console.c \ + transport.c \ + transport_local.c \ + transport_usb.c \ + commandline.c \ + adb_client.c \ + sockets.c \ + services.c \ + file_sync_client.c \ + $(EXTRA_SRCS) \ + $(USB_SRCS) \ + shlist.c + + +ifneq ($(USE_SYSDEPS_WIN32),) + LOCAL_SRC_FILES += sysdeps_win32.c +endif + +LOCAL_CFLAGS += -O2 -g -DADB_HOST=1 -Wall -Wno-unused-parameter +LOCAL_CFLAGS += -D_XOPEN_SOURCE -D_GNU_SOURCE -DSH_HISTORY +LOCAL_MODULE := adb + +LOCAL_STATIC_LIBRARIES := libzipfile libunz $(EXTRA_STATIC_LIBS) +ifeq ($(USE_SYSDEPS_WIN32),) + LOCAL_STATIC_LIBRARIES += libcutils +endif + +include $(BUILD_HOST_EXECUTABLE) + +ifeq ($(HOST_OS),windows) +$(LOCAL_INSTALLED_MODULE): $(HOST_OUT_EXECUTABLES)/AdbWinApi.dll +endif + +ifeq ($(HOST_OS),linux) +include $(CLEAR_VARS) +LOCAL_SRC_FILES := \ + kdbg.c +LOCAL_MODULE := kdbg +include $(BUILD_HOST_EXECUTABLE) +endif + + +# adbd device daemon +# ========================================================= +ifeq ($(TARGET_ARCH),arm) +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := \ + adb.c \ + transport.c \ + transport_local.c \ + transport_usb.c \ + sockets.c \ + services.c \ + file_sync_service.c \ + jdwp_service.c \ + framebuffer_service.c \ + remount_service.c \ + usb_linux_client.c \ + log_service.c + + +LOCAL_CFLAGS := -O2 -g -DADB_HOST=0 -DANDROID_GADGET=1 -Wall -Wno-unused-parameter +LOCAL_CFLAGS += -D_XOPEN_SOURCE -D_GNU_SOURCE +LOCAL_MODULE := adbd + +LOCAL_FORCE_STATIC_EXECUTABLE := true +LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT_SBIN) +LOCAL_UNSTRIPPED_PATH := $(TARGET_ROOT_OUT_SBIN_UNSTRIPPED) + +LOCAL_STATIC_LIBRARIES := libcutils libc + +include $(BUILD_EXECUTABLE) +endif diff --git a/adb/adb.c b/adb/adb.c new file mode 100644 index 000000000..a50ef334b --- /dev/null +++ b/adb/adb.c @@ -0,0 +1,1093 @@ +/* + * Copyright (C) 2007 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define TRACE_TAG TRACE_ADB + +#include +#include +#include +#include +#include +#include +#include + +#include "sysdeps.h" +#include "adb.h" + +#if !ADB_HOST +#include +#endif + + +int HOST = 0; + +static const char *adb_device_banner = "device"; + +void fatal(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + fprintf(stderr, "error: "); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + va_end(ap); + exit(-1); +} + +void fatal_errno(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + fprintf(stderr, "error: %s: ", strerror(errno)); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + va_end(ap); + exit(-1); +} + +int adb_trace_mask; + +/* read a comma/space/colum/semi-column separated list of tags + * from the ADB_TRACE environment variable and build the trace + * mask from it. note that '1' and 'all' are special cases to + * enable all tracing + */ +void adb_trace_init(void) +{ + const char* p = getenv("ADB_TRACE"); + const char* q; + + static const struct { + const char* tag; + int flag; + } tags[] = { + { "1", 0 }, + { "all", 0 }, + { "adb", TRACE_ADB }, + { "sockets", TRACE_SOCKETS }, + { "packets", TRACE_PACKETS }, + { "rwx", TRACE_RWX }, + { "usb", TRACE_USB }, + { "sync", TRACE_SYNC }, + { "sysdeps", TRACE_SYSDEPS }, + { "transport", TRACE_TRANSPORT }, + { "jdwp", TRACE_JDWP }, + { NULL, 0 } + }; + + if (p == NULL) + return; + + /* use a comma/column/semi-colum/space separated list */ + while (*p) { + int len, tagn; + + q = strpbrk(p, " ,:;"); + if (q == NULL) { + q = p + strlen(p); + } + len = q - p; + + for (tagn = 0; tags[tagn].tag != NULL; tagn++) + { + int taglen = strlen(tags[tagn].tag); + + if (len == taglen && !memcmp(tags[tagn].tag, p, len) ) + { + int flag = tags[tagn].flag; + if (flag == 0) { + adb_trace_mask = ~0; + return; + } + adb_trace_mask |= (1 << flag); + break; + } + } + p = q; + if (*p) + p++; + } +} + + +apacket *get_apacket(void) +{ + apacket *p = malloc(sizeof(apacket)); + if(p == 0) fatal("failed to allocate an apacket"); + memset(p, 0, sizeof(apacket) - MAX_PAYLOAD); + return p; +} + +void put_apacket(apacket *p) +{ + free(p); +} + +void handle_online(void) +{ + D("adb: online\n"); +#if !ADB_HOST + property_set("adb.connected","1"); +#endif +} + +void handle_offline(atransport *t) +{ + D("adb: offline\n"); + //Close the associated usb + run_transport_disconnects(t); +#if !ADB_HOST + property_set("adb.connected",""); +#endif +} + +#if TRACE_PACKETS +#define DUMPMAX 32 +void print_packet(const char *label, apacket *p) +{ + char *tag; + char *x; + unsigned count; + + switch(p->msg.command){ + case A_SYNC: tag = "SYNC"; break; + case A_CNXN: tag = "CNXN" ; break; + case A_OPEN: tag = "OPEN"; break; + case A_OKAY: tag = "OKAY"; break; + case A_CLSE: tag = "CLSE"; break; + case A_WRTE: tag = "WRTE"; break; + default: tag = "????"; break; + } + + fprintf(stderr, "%s: %s %08x %08x %04x \"", + label, tag, p->msg.arg0, p->msg.arg1, p->msg.data_length); + count = p->msg.data_length; + x = (char*) p->data; + if(count > DUMPMAX) { + count = DUMPMAX; + tag = "\n"; + } else { + tag = "\"\n"; + } + while(count-- > 0){ + if((*x >= ' ') && (*x < 127)) { + fputc(*x, stderr); + } else { + fputc('.', stderr); + } + x++; + } + fprintf(stderr, tag); +} +#endif + +static void send_ready(unsigned local, unsigned remote, atransport *t) +{ + D("Calling send_ready \n"); + apacket *p = get_apacket(); + p->msg.command = A_OKAY; + p->msg.arg0 = local; + p->msg.arg1 = remote; + send_packet(p, t); +} + +static void send_close(unsigned local, unsigned remote, atransport *t) +{ + D("Calling send_close \n"); + apacket *p = get_apacket(); + p->msg.command = A_CLSE; + p->msg.arg0 = local; + p->msg.arg1 = remote; + send_packet(p, t); +} + +static void send_connect(atransport *t) +{ + D("Calling send_connect \n"); + apacket *cp = get_apacket(); + cp->msg.command = A_CNXN; + cp->msg.arg0 = A_VERSION; + cp->msg.arg1 = MAX_PAYLOAD; + snprintf((char*) cp->data, sizeof cp->data, "%s::", + HOST ? "host" : adb_device_banner); + cp->msg.data_length = strlen((char*) cp->data) + 1; + send_packet(cp, t); +#if ADB_HOST + /* XXX why sleep here? */ + // allow the device some time to respond to the connect message + adb_sleep_ms(1000); +#endif +} + +static char *connection_state_name(atransport *t) +{ + if (t == NULL) { + return "unknown"; + } + + switch(t->connection_state) { + case CS_BOOTLOADER: + return "bootloader"; + case CS_DEVICE: + return "device"; + case CS_OFFLINE: + return "offline"; + default: + return "unknown"; + } +} + +void parse_banner(char *banner, atransport *t) +{ + char *type, *product, *end; + + D("parse_banner: %s\n", banner); + type = banner; + product = strchr(type, ':'); + if(product) { + *product++ = 0; + } else { + product = ""; + } + + /* remove trailing ':' */ + end = strchr(product, ':'); + if(end) *end = 0; + + /* save product name in device structure */ + if (t->product == NULL) { + t->product = strdup(product); + } else if (strcmp(product, t->product) != 0) { + free(t->product); + t->product = strdup(product); + } + + if(!strcmp(type, "bootloader")){ + D("setting connection_state to CS_BOOTLOADER\n"); + t->connection_state = CS_BOOTLOADER; + update_transports(); + return; + } + + if(!strcmp(type, "device")) { + D("setting connection_state to CS_DEVICE\n"); + t->connection_state = CS_DEVICE; + update_transports(); + return; + } + + if(!strcmp(type, "recovery")) { + D("setting connection_state to CS_RECOVERY\n"); + t->connection_state = CS_RECOVERY; + update_transports(); + return; + } + + t->connection_state = CS_HOST; +} + +void handle_packet(apacket *p, atransport *t) +{ + asocket *s; + + D("handle_packet() %d\n", p->msg.command); + + print_packet("recv", p); + + switch(p->msg.command){ + case A_SYNC: + if(p->msg.arg0){ + send_packet(p, t); + if(HOST) send_connect(t); + } else { + t->connection_state = CS_OFFLINE; + handle_offline(t); + send_packet(p, t); + } + return; + + case A_CNXN: /* CONNECT(version, maxdata, "system-id-string") */ + /* XXX verify version, etc */ + if(t->connection_state != CS_OFFLINE) { + t->connection_state = CS_OFFLINE; + handle_offline(t); + } + parse_banner((char*) p->data, t); + handle_online(); + if(!HOST) send_connect(t); + break; + + case A_OPEN: /* OPEN(local-id, 0, "destination") */ + if(t->connection_state != CS_OFFLINE) { + char *name = (char*) p->data; + name[p->msg.data_length > 0 ? p->msg.data_length - 1 : 0] = 0; + s = create_local_service_socket(name); + if(s == 0) { + send_close(0, p->msg.arg0, t); + } else { + s->peer = create_remote_socket(p->msg.arg0, t); + s->peer->peer = s; + send_ready(s->id, s->peer->id, t); + s->ready(s); + } + } + break; + + case A_OKAY: /* READY(local-id, remote-id, "") */ + if(t->connection_state != CS_OFFLINE) { + if((s = find_local_socket(p->msg.arg1))) { + if(s->peer == 0) { + s->peer = create_remote_socket(p->msg.arg0, t); + s->peer->peer = s; + } + s->ready(s); + } + } + break; + + case A_CLSE: /* CLOSE(local-id, remote-id, "") */ + if(t->connection_state != CS_OFFLINE) { + if((s = find_local_socket(p->msg.arg1))) { + s->close(s); + } + } + break; + + case A_WRTE: + if(t->connection_state != CS_OFFLINE) { + if((s = find_local_socket(p->msg.arg1))) { + unsigned rid = p->msg.arg0; + p->len = p->msg.data_length; + + if(s->enqueue(s, p) == 0) { + D("Enqueue the socket\n"); + send_ready(s->id, rid, t); + } + return; + } + } + break; + + default: + printf("handle_packet: what is %08x?!\n", p->msg.command); + } + + put_apacket(p); +} + +alistener listener_list = { + .next = &listener_list, + .prev = &listener_list, +}; + +static void ss_listener_event_func(int _fd, unsigned ev, void *_l) +{ + asocket *s; + + if(ev & FDE_READ) { + struct sockaddr addr; + socklen_t alen; + int fd; + + alen = sizeof(addr); + fd = adb_socket_accept(_fd, &addr, &alen); + if(fd < 0) return; + + adb_socket_setbufsize(fd, CHUNK_SIZE); + + s = create_local_socket(fd); + if(s) { + connect_to_smartsocket(s); + return; + } + + adb_close(fd); + } +} + +static void listener_event_func(int _fd, unsigned ev, void *_l) +{ + alistener *l = _l; + asocket *s; + + if(ev & FDE_READ) { + struct sockaddr addr; + socklen_t alen; + int fd; + + alen = sizeof(addr); + fd = adb_socket_accept(_fd, &addr, &alen); + if(fd < 0) return; + + s = create_local_socket(fd); + if(s) { + s->transport = l->transport; + connect_to_remote(s, l->connect_to); + return; + } + + adb_close(fd); + } +} + +static void free_listener(alistener* l) +{ + if (l->next) { + l->next->prev = l->prev; + l->prev->next = l->next; + l->next = l->prev = l; + } + + // closes the corresponding fd + fdevent_remove(&l->fde); + + if (l->local_name) + free((char*)l->local_name); + + if (l->connect_to) + free((char*)l->connect_to); + + if (l->transport) { + remove_transport_disconnect(l->transport, &l->disconnect); + } + free(l); +} + +static void listener_disconnect(void* _l, atransport* t) +{ + alistener* l = _l; + + free_listener(l); +} + +int local_name_to_fd(const char *name) +{ + int port; + + if(!strncmp("tcp:", name, 4)){ + int ret; + port = atoi(name + 4); + ret = socket_loopback_server(port, SOCK_STREAM); + return ret; + } +#ifndef HAVE_WIN32_IPC /* no Unix-domain sockets on Win32 */ + // It's non-sensical to support the "reserved" space on the adb host side + if(!strncmp(name, "local:", 6)) { + return socket_local_server(name + 6, + ANDROID_SOCKET_NAMESPACE_ABSTRACT, SOCK_STREAM); + } else if(!strncmp(name, "localabstract:", 14)) { + return socket_local_server(name + 14, + ANDROID_SOCKET_NAMESPACE_ABSTRACT, SOCK_STREAM); + } else if(!strncmp(name, "localfilesystem:", 16)) { + return socket_local_server(name + 16, + ANDROID_SOCKET_NAMESPACE_FILESYSTEM, SOCK_STREAM); + } + +#endif + printf("unknown local portname '%s'\n", name); + return -1; +} + +static int remove_listener(const char *local_name, const char *connect_to, atransport* transport) +{ + alistener *l; + + for (l = listener_list.next; l != &listener_list; l = l->next) { + if (!strcmp(local_name, l->local_name) && + !strcmp(connect_to, l->connect_to) && + l->transport && l->transport == transport) { + + listener_disconnect(l, transport); + return 0; + } + } + + return -1; +} + +static int install_listener(const char *local_name, const char *connect_to, atransport* transport) +{ + alistener *l; + + //printf("install_listener('%s','%s')\n", local_name, connect_to); + + for(l = listener_list.next; l != &listener_list; l = l->next){ + if(strcmp(local_name, l->local_name) == 0) { + char *cto; + + /* can't repurpose a smartsocket */ + if(l->connect_to[0] == '*') { + return -1; + } + + cto = strdup(connect_to); + if(cto == 0) { + return -1; + } + + //printf("rebinding '%s' to '%s'\n", local_name, connect_to); + free((void*) l->connect_to); + l->connect_to = cto; + if (l->transport != transport) { + remove_transport_disconnect(l->transport, &l->disconnect); + l->transport = transport; + add_transport_disconnect(l->transport, &l->disconnect); + } + return 0; + } + } + + if((l = calloc(1, sizeof(alistener))) == 0) goto nomem; + if((l->local_name = strdup(local_name)) == 0) goto nomem; + if((l->connect_to = strdup(connect_to)) == 0) goto nomem; + + + l->fd = local_name_to_fd(local_name); + if(l->fd < 0) { + free((void*) l->local_name); + free((void*) l->connect_to); + free(l); + printf("cannot bind '%s'\n", local_name); + return -2; + } + + close_on_exec(l->fd); + if(!strcmp(l->connect_to, "*smartsocket*")) { + fdevent_install(&l->fde, l->fd, ss_listener_event_func, l); + } else { + fdevent_install(&l->fde, l->fd, listener_event_func, l); + } + fdevent_set(&l->fde, FDE_READ); + + l->next = &listener_list; + l->prev = listener_list.prev; + l->next->prev = l; + l->prev->next = l; + l->transport = transport; + + if (transport) { + l->disconnect.opaque = l; + l->disconnect.func = listener_disconnect; + add_transport_disconnect(transport, &l->disconnect); + } + return 0; + +nomem: + fatal("cannot allocate listener"); + return 0; +} + +#ifdef HAVE_FORKEXEC +static void sigchld_handler(int n) +{ + int status; + while(waitpid(-1, &status, WNOHANG) > 0) ; +} +#endif + +#ifdef HAVE_WIN32_PROC +static BOOL WINAPI ctrlc_handler(DWORD type) +{ + exit(STATUS_CONTROL_C_EXIT); + return TRUE; +} +#endif + +static void adb_cleanup(void) +{ + usb_cleanup(); +} + +void start_logging(void) +{ +#ifdef HAVE_WIN32_PROC + char temp[ MAX_PATH ]; + FILE* fnul; + FILE* flog; + + GetTempPath( sizeof(temp) - 8, temp ); + strcat( temp, "adb.log" ); + + /* Win32 specific redirections */ + fnul = fopen( "NUL", "rt" ); + if (fnul != NULL) + stdin[0] = fnul[0]; + + flog = fopen( temp, "at" ); + if (flog == NULL) + flog = fnul; + + setvbuf( flog, NULL, _IONBF, 0 ); + + stdout[0] = flog[0]; + stderr[0] = flog[0]; + fprintf(stderr,"--- adb starting (pid %d) ---\n", getpid()); +#else + int fd; + + fd = unix_open("/dev/null", O_RDONLY); + dup2(fd, 0); + + fd = unix_open("/tmp/adb.log", O_WRONLY | O_CREAT | O_APPEND, 0640); + if(fd < 0) { + fd = unix_open("/dev/null", O_WRONLY); + } + dup2(fd, 1); + dup2(fd, 2); + fprintf(stderr,"--- adb starting (pid %d) ---\n", getpid()); +#endif +} + +#if !ADB_HOST +void start_device_log(void) +{ + int fd; + char path[100]; + + snprintf(path, sizeof path, "/data/adb_%ld.txt", (long)time(NULL)); + fd = unix_open(path, O_WRONLY | O_CREAT | O_APPEND, 0640); + if (fd < 0) + return; + + // redirect stdout and stderr to the log file + dup2(fd, 1); + dup2(fd, 2); + fprintf(stderr,"--- adb starting (pid %d) ---\n", getpid()); + + fd = unix_open("/dev/null", O_RDONLY); + dup2(fd, 0); + + // log everything + adb_trace_mask = ~0; + // except TRACE_RWX is a bit too verbose + adb_trace_mask &= ~TRACE_RWX; +} +#endif + +#if ADB_HOST +int launch_server() +{ +#ifdef HAVE_WIN32_PROC + /* we need to start the server in the background */ + /* we create a PIPE that will be used to wait for the server's "OK" */ + /* message since the pipe handles must be inheritable, we use a */ + /* security attribute */ + HANDLE pipe_read, pipe_write; + SECURITY_ATTRIBUTES sa; + STARTUPINFO startup; + PROCESS_INFORMATION pinfo; + char program_path[ MAX_PATH ]; + int ret; + + sa.nLength = sizeof(sa); + sa.lpSecurityDescriptor = NULL; + sa.bInheritHandle = TRUE; + + /* create pipe, and ensure its read handle isn't inheritable */ + ret = CreatePipe( &pipe_read, &pipe_write, &sa, 0 ); + if (!ret) { + fprintf(stderr, "CreatePipe() failure, error %ld\n", GetLastError() ); + return -1; + } + + SetHandleInformation( pipe_read, HANDLE_FLAG_INHERIT, 0 ); + + ZeroMemory( &startup, sizeof(startup) ); + startup.cb = sizeof(startup); + startup.hStdInput = GetStdHandle( STD_INPUT_HANDLE ); + startup.hStdOutput = pipe_write; + startup.hStdError = GetStdHandle( STD_ERROR_HANDLE ); + startup.dwFlags = STARTF_USESTDHANDLES; + + ZeroMemory( &pinfo, sizeof(pinfo) ); + + /* get path of current program */ + GetModuleFileName( NULL, program_path, sizeof(program_path) ); + + ret = CreateProcess( + program_path, /* program path */ + "adb fork-server server", + /* the fork-server argument will set the + debug = 2 in the child */ + NULL, /* process handle is not inheritable */ + NULL, /* thread handle is not inheritable */ + TRUE, /* yes, inherit some handles */ + DETACHED_PROCESS, /* the new process doesn't have a console */ + NULL, /* use parent's environment block */ + NULL, /* use parent's starting directory */ + &startup, /* startup info, i.e. std handles */ + &pinfo ); + + CloseHandle( pipe_write ); + + if (!ret) { + fprintf(stderr, "CreateProcess failure, error %ld\n", GetLastError() ); + CloseHandle( pipe_read ); + return -1; + } + + CloseHandle( pinfo.hProcess ); + CloseHandle( pinfo.hThread ); + + /* wait for the "OK\n" message */ + { + char temp[3]; + DWORD count; + + ret = ReadFile( pipe_read, temp, 3, &count, NULL ); + CloseHandle( pipe_read ); + if ( !ret ) { + fprintf(stderr, "could not read ok from ADB Server, error = %ld\n", GetLastError() ); + return -1; + } + if (count != 3 || temp[0] != 'O' || temp[1] != 'K' || temp[2] != '\n') { + fprintf(stderr, "ADB server didn't ACK\n" ); + return -1; + } + } +#elif defined(HAVE_FORKEXEC) + char path[PATH_MAX]; + int fd[2]; + + // set up a pipe so the child can tell us when it is ready. + // fd[0] will be parent's end, and fd[1] will get mapped to stderr in the child. + if (pipe(fd)) { + fprintf(stderr, "pipe failed in launch_server, errno: %d\n", errno); + return -1; + } + get_my_path(path); + pid_t pid = fork(); + if(pid < 0) return -1; + + if (pid == 0) { + // child side of the fork + + // redirect stderr to the pipe + // we use stderr instead of stdout due to stdout's buffering behavior. + adb_close(fd[0]); + dup2(fd[1], STDERR_FILENO); + adb_close(fd[1]); + + // child process + int result = execl(path, "adb", "fork-server", "server", NULL); + // this should not return + fprintf(stderr, "OOPS! execl returned %d, errno: %d\n", result, errno); + } else { + // parent side of the fork + + char temp[3]; + + temp[0] = 'A'; temp[1] = 'B'; temp[2] = 'C'; + // wait for the "OK\n" message + adb_close(fd[1]); + int ret = adb_read(fd[0], temp, 3); + adb_close(fd[0]); + if (ret < 0) { + fprintf(stderr, "could not read ok from ADB Server, errno = %d\n", errno); + return -1; + } + if (ret != 3 || temp[0] != 'O' || temp[1] != 'K' || temp[2] != '\n') { + fprintf(stderr, "ADB server didn't ACK\n" ); + return -1; + } + + setsid(); + } +#else +#error "cannot implement background server start on this platform" +#endif + return 0; +} +#endif + +int adb_main(int is_daemon) +{ +#if !ADB_HOST + int secure = 0; + char value[PROPERTY_VALUE_MAX]; + + // prevent the OOM killer from killing us + char text[64]; + snprintf(text, sizeof text, "/proc/%d/oom_adj", (int)getpid()); + int fd = adb_open(text, O_WRONLY); + if (fd >= 0) { + // -17 should make us immune to OOM + snprintf(text, sizeof text, "%d", -17); + adb_write(fd, text, strlen(text)); + adb_close(fd); + } else { + D("adb: unable to open %s\n", text); + } +#endif + + atexit(adb_cleanup); +#ifdef HAVE_WIN32_PROC + SetConsoleCtrlHandler( ctrlc_handler, TRUE ); +#elif defined(HAVE_FORKEXEC) + signal(SIGCHLD, sigchld_handler); + signal(SIGPIPE, SIG_IGN); +#endif + + init_transport_registration(); + + +#if ADB_HOST + HOST = 1; + usb_init(); + local_init(); + + if(install_listener("tcp:5037", "*smartsocket*", NULL)) { + exit(1); + } +#else + /* run adbd in secure mode if ro.secure is set and + ** we are not in the emulator + */ + property_get("ro.kernel.qemu", value, ""); + if (strcmp(value, "1") != 0) { + property_get("ro.secure", value, ""); + if (strcmp(value, "1") == 0) + secure = 1; + } + + /* don't listen on port 5037 if we are running in secure mode */ + /* don't run as root if we are running in secure mode */ + if (secure) { + /* add extra groups: + ** AID_ADB to access the USB driver + ** AID_LOG to read system logs (adb logcat) + ** AID_INPUT to diagnose input issues (getevent) + ** AID_INET to diagnose network issues (netcfg, ping) + ** AID_GRAPHICS to access the frame buffer + */ + gid_t groups[] = { AID_ADB, AID_LOG, AID_INPUT, AID_INET, AID_GRAPHICS }; + setgroups(sizeof(groups)/sizeof(groups[0]), groups); + + /* then switch user and group to "shell" */ + setgid(AID_SHELL); + setuid(AID_SHELL); + + D("Local port 5037 disabled\n"); + } else { + if(install_listener("tcp:5037", "*smartsocket*", NULL)) { + exit(1); + } + } + + /* for the device, start the usb transport if the + ** android usb device exists, otherwise start the + ** network transport. + */ + if(access("/dev/android_adb", F_OK) == 0 || + access("/dev/android", F_OK) == 0) { + usb_init(); + } else { + local_init(); + } + init_jdwp(); +#endif + + if (is_daemon) + { + // inform our parent that we are up and running. +#ifdef HAVE_WIN32_PROC + DWORD count; + WriteFile( GetStdHandle( STD_OUTPUT_HANDLE ), "OK\n", 3, &count, NULL ); +#elif defined(HAVE_FORKEXEC) + fprintf(stderr, "OK\n"); +#endif + start_logging(); + } + + fdevent_loop(); + + usb_cleanup(); + + return 0; +} + +int handle_host_request(char *service, transport_type ttype, char* serial, int reply_fd, asocket *s) +{ + atransport *transport = NULL; + char buf[4096]; + + if(!strcmp(service, "kill")) { + fprintf(stderr,"adb server killed by remote request\n"); + fflush(stdout); + adb_write(reply_fd, "OKAY", 4); + usb_cleanup(); + exit(0); + } + +#if ADB_HOST + // "transport:" is used for switching transport with a specified serial number + // "transport-usb:" is used for switching transport to the only USB transport + // "transport-local:" is used for switching transport to the only local transport + // "transport-any:" is used for switching transport to the only transport + if (!strncmp(service, "transport", strlen("transport"))) { + char* error_string = "unknown failure"; + transport_type type = kTransportAny; + + if (!strncmp(service, "transport-usb", strlen("transport-usb"))) { + type = kTransportUsb; + } else if (!strncmp(service, "transport-local", strlen("transport-local"))) { + type = kTransportLocal; + } else if (!strncmp(service, "transport-any", strlen("transport-any"))) { + type = kTransportAny; + } else if (!strncmp(service, "transport:", strlen("transport:"))) { + service += strlen("transport:"); + serial = strdup(service); + } + + transport = acquire_one_transport(CS_ANY, type, serial, &error_string); + + if (transport) { + s->transport = transport; + adb_write(reply_fd, "OKAY", 4); + } else { + sendfailmsg(reply_fd, error_string); + } + return 1; + } + + // return a list of all connected devices + if (!strcmp(service, "devices")) { + char buffer[4096]; + memset(buf, 0, sizeof(buf)); + memset(buffer, 0, sizeof(buffer)); + D("Getting device list \n"); + list_transports(buffer, sizeof(buffer)); + snprintf(buf, sizeof(buf), "OKAY%04x%s",(unsigned)strlen(buffer),buffer); + D("Wrote device list \n"); + writex(reply_fd, buf, strlen(buf)); + return 0; + } + + // returns our value for ADB_SERVER_VERSION + if (!strcmp(service, "version")) { + char version[12]; + snprintf(version, sizeof version, "%04x", ADB_SERVER_VERSION); + snprintf(buf, sizeof buf, "OKAY%04x%s", (unsigned)strlen(version), version); + writex(reply_fd, buf, strlen(buf)); + return 0; + } + + if(!strncmp(service,"get-product",strlen("get-product"))) { + char *out = "unknown"; + transport = acquire_one_transport(CS_ANY, ttype, serial, NULL); + if (transport && transport->product) { + out = transport->product; + } + snprintf(buf, sizeof buf, "OKAY%04x%s",(unsigned)strlen(out),out); + writex(reply_fd, buf, strlen(buf)); + return 0; + } + if(!strncmp(service,"get-serialno",strlen("get-serialno"))) { + char *out = "unknown"; + transport = acquire_one_transport(CS_ANY, ttype, serial, NULL); + if (transport && transport->serial) { + out = transport->serial; + } + snprintf(buf, sizeof buf, "OKAY%04x%s",(unsigned)strlen(out),out); + writex(reply_fd, buf, strlen(buf)); + return 0; + } + // indicates a new emulator instance has started + if (!strncmp(service,"emulator:",9)) { + int port = atoi(service+9); + local_connect(port); + /* we don't even need to send a reply */ + return 0; + } +#endif // ADB_HOST + + if(!strncmp(service,"forward:",8) || !strncmp(service,"killforward:",12)) { + char *local, *remote, *err; + int r; + atransport *transport; + + int createForward = strncmp(service,"kill",4); + + local = service + (createForward ? 8 : 12); + remote = strchr(local,';'); + if(remote == 0) { + sendfailmsg(reply_fd, "malformed forward spec"); + return 0; + } + + *remote++ = 0; + if((local[0] == 0) || (remote[0] == 0) || (remote[0] == '*')){ + sendfailmsg(reply_fd, "malformed forward spec"); + return 0; + } + + transport = acquire_one_transport(CS_ANY, ttype, serial, &err); + if (!transport) { + sendfailmsg(reply_fd, err); + return 0; + } + + if (createForward) { + r = install_listener(local, remote, transport); + } else { + r = remove_listener(local, remote, transport); + } + if(r == 0) { + /* 1st OKAY is connect, 2nd OKAY is status */ + writex(reply_fd, "OKAYOKAY", 8); + return 0; + } + + if (createForward) { + sendfailmsg(reply_fd, (r == -1) ? "cannot rebind smartsocket" : "cannot bind socket"); + } else { + sendfailmsg(reply_fd, "cannot remove listener"); + } + return 0; + } + + if(!strncmp(service,"get-state",strlen("get-state"))) { + transport = acquire_one_transport(CS_ANY, ttype, serial, NULL); + char *state = connection_state_name(transport); + snprintf(buf, sizeof buf, "OKAY%04x%s",(unsigned)strlen(state),state); + writex(reply_fd, buf, strlen(buf)); + return 0; + } + return -1; +} + +#if !ADB_HOST +int recovery_mode = 0; +#endif + +int main(int argc, char **argv) +{ + adb_trace_init(); +#if ADB_HOST + adb_sysdeps_init(); + return adb_commandline(argc - 1, argv + 1); +#else + if((argc > 1) && (!strcmp(argv[1],"recovery"))) { + adb_device_banner = "recovery"; + recovery_mode = 1; + } +#if ADB_DEVICE_LOG + start_device_log(); +#endif + return adb_main(0); +#endif +} + diff --git a/adb/adb.h b/adb/adb.h new file mode 100644 index 000000000..5a74b7b9a --- /dev/null +++ b/adb/adb.h @@ -0,0 +1,402 @@ +/* + * Copyright (C) 2007 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __ADB_H +#define __ADB_H + +#include + +#define MAX_PAYLOAD 4096 + +#define A_SYNC 0x434e5953 +#define A_CNXN 0x4e584e43 +#define A_OPEN 0x4e45504f +#define A_OKAY 0x59414b4f +#define A_CLSE 0x45534c43 +#define A_WRTE 0x45545257 + +#define A_VERSION 0x01000000 // ADB protocol version + +#define ADB_VERSION_MAJOR 1 // Used for help/version information +#define ADB_VERSION_MINOR 0 // Used for help/version information + +#define ADB_SERVER_VERSION 20 // Increment this when we want to force users to start a new adb server + +typedef struct amessage amessage; +typedef struct apacket apacket; +typedef struct asocket asocket; +typedef struct alistener alistener; +typedef struct aservice aservice; +typedef struct atransport atransport; +typedef struct adisconnect adisconnect; +typedef struct usb_handle usb_handle; + +struct amessage { + unsigned command; /* command identifier constant */ + unsigned arg0; /* first argument */ + unsigned arg1; /* second argument */ + unsigned data_length; /* length of payload (0 is allowed) */ + unsigned data_check; /* checksum of data payload */ + unsigned magic; /* command ^ 0xffffffff */ +}; + +struct apacket +{ + apacket *next; + + unsigned len; + unsigned char *ptr; + + amessage msg; + unsigned char data[MAX_PAYLOAD]; +}; + +/* An asocket represents one half of a connection between a local and +** remote entity. A local asocket is bound to a file descriptor. A +** remote asocket is bound to the protocol engine. +*/ +struct asocket { + /* chain pointers for the local/remote list of + ** asockets that this asocket lives in + */ + asocket *next; + asocket *prev; + + /* the unique identifier for this asocket + */ + unsigned id; + + /* the asocket we are connected to + */ + + asocket *peer; + + /* For local asockets, the fde is used to bind + ** us to our fd event system. For remote asockets + ** these fields are not used. + */ + fdevent fde; + int fd; + + /* queue of apackets waiting to be written + */ + apacket *pkt_first; + apacket *pkt_last; + + /* enqueue is called by our peer when it has data + ** for us. It should return 0 if we can accept more + ** data or 1 if not. If we return 1, we must call + ** peer->ready() when we once again are ready to + ** receive data. + */ + int (*enqueue)(asocket *s, apacket *pkt); + + /* ready is called by the peer when it is ready for + ** us to send data via enqueue again + */ + void (*ready)(asocket *s); + + /* close is called by the peer when it has gone away. + ** we are not allowed to make any further calls on the + ** peer once our close method is called. + */ + void (*close)(asocket *s); + + /* socket-type-specific extradata */ + void *extra; + + /* A socket is bound to atransport */ + atransport *transport; +}; + + +/* the adisconnect structure is used to record a callback that +** will be called whenever a transport is disconnected (e.g. by the user) +** this should be used to cleanup objects that depend on the +** transport (e.g. remote sockets, listeners, etc...) +*/ +struct adisconnect +{ + void (*func)(void* opaque, atransport* t); + void* opaque; + adisconnect* next; + adisconnect* prev; +}; + + +/* a transport object models the connection to a remote device or emulator +** there is one transport per connected device/emulator. a "local transport" +** connects through TCP (for the emulator), while a "usb transport" through +** USB (for real devices) +** +** note that kTransportHost doesn't really correspond to a real transport +** object, it's a special value used to indicate that a client wants to +** connect to a service implemented within the ADB server itself. +*/ +typedef enum transport_type { + kTransportUsb, + kTransportLocal, + kTransportAny, + kTransportHost, +} transport_type; + +struct atransport +{ + atransport *next; + atransport *prev; + + int (*read_from_remote)(apacket *p, atransport *t); + int (*write_to_remote)(apacket *p, atransport *t); + void (*close)(atransport *t); + void (*kick)(atransport *t); + + int fd; + int transport_socket; + fdevent transport_fde; + int ref_count; + unsigned sync_token; + int connection_state; + transport_type type; + + /* usb handle or socket fd as needed */ + usb_handle *usb; + int sfd; + + /* used to identify transports for clients */ + char *serial; + char *product; + + /* a list of adisconnect callbacks called when the transport is kicked */ + int kicked; + adisconnect disconnects; +}; + + +/* A listener is an entity which binds to a local port +** and, upon receiving a connection on that port, creates +** an asocket to connect the new local connection to a +** specific remote service. +** +** TODO: some listeners read from the new connection to +** determine what exact service to connect to on the far +** side. +*/ +struct alistener +{ + alistener *next; + alistener *prev; + + fdevent fde; + int fd; + + const char *local_name; + const char *connect_to; + atransport *transport; + adisconnect disconnect; +}; + + +void print_packet(const char *label, apacket *p); + +asocket *find_local_socket(unsigned id); +void install_local_socket(asocket *s); +void remove_socket(asocket *s); +void close_all_sockets(atransport *t); + +#define LOCAL_CLIENT_PREFIX "emulator-" + +asocket *create_local_socket(int fd); +asocket *create_local_service_socket(const char *destination); + +asocket *create_remote_socket(unsigned id, atransport *t); +void connect_to_remote(asocket *s, const char *destination); +void connect_to_smartsocket(asocket *s); + +void fatal(const char *fmt, ...); +void fatal_errno(const char *fmt, ...); + +void handle_packet(apacket *p, atransport *t); +void send_packet(apacket *p, atransport *t); + +void get_my_path(char s[PATH_MAX]); +int launch_server(); +int adb_main(int is_daemon); + + +/* transports are ref-counted +** get_device_transport does an acquire on your behalf before returning +*/ +void init_transport_registration(void); +int list_transports(char *buf, size_t bufsize); +void update_transports(void); + +asocket* create_device_tracker(void); + +/* Obtain a transport from the available transports. +** If state is != CS_ANY, only transports in that state are considered. +** If serial is non-NULL then only the device with that serial will be chosen. +** If no suitable transport is found, error is set. +*/ +atransport *acquire_one_transport(int state, transport_type ttype, const char* serial, char **error_out); +void add_transport_disconnect( atransport* t, adisconnect* dis ); +void remove_transport_disconnect( atransport* t, adisconnect* dis ); +void run_transport_disconnects( atransport* t ); +void kick_transport( atransport* t ); + +/* initialize a transport object's func pointers and state */ +int init_socket_transport(atransport *t, int s, int port); +void init_usb_transport(atransport *t, usb_handle *usb); + +/* for MacOS X cleanup */ +void close_usb_devices(); + +/* cause new transports to be init'd and added to the list */ +void register_socket_transport(int s, const char *serial, int port); +void register_usb_transport(usb_handle *h, const char *serial); + +int service_to_fd(const char *name); +#if ADB_HOST +asocket *host_service_to_socket(const char* name, const char *serial); +#endif + +#if !ADB_HOST +int init_jdwp(void); +asocket* create_jdwp_service_socket(); +asocket* create_jdwp_tracker_service_socket(); +int create_jdwp_connection_fd(int jdwp_pid); +#endif + +#if !ADB_HOST +void framebuffer_service(int fd, void *cookie); +void log_service(int fd, void *cookie); +void remount_service(int fd, void *cookie); +char * get_log_file_path(const char * log_name); +#endif + +/* packet allocator */ +apacket *get_apacket(void); +void put_apacket(apacket *p); + +int check_header(apacket *p); +int check_data(apacket *p); + +/* convenience wrappers around read/write that will retry on +** EINTR and/or short read/write. Returns 0 on success, -1 +** on error or EOF. +*/ +int readx(int fd, void *ptr, size_t len); +int writex(int fd, const void *ptr, size_t len); + +/* define ADB_TRACE to 1 to enable tracing support, or 0 to disable it */ + +#define ADB_TRACE 1 + +/* IMPORTANT: if you change the following list, don't + * forget to update the corresponding 'tags' table in + * the adb_trace_init() function implemented in adb.c + */ +typedef enum { + TRACE_ADB = 0, + TRACE_SOCKETS, + TRACE_PACKETS, + TRACE_TRANSPORT, + TRACE_RWX, + TRACE_USB, + TRACE_SYNC, + TRACE_SYSDEPS, + TRACE_JDWP, +} AdbTrace; + +#if ADB_TRACE + + int adb_trace_mask; + + void adb_trace_init(void); + +# define ADB_TRACING ((adb_trace_mask & (1 << TRACE_TAG)) != 0) + + /* you must define TRACE_TAG before using this macro */ + #define D(...) \ + do { \ + if (ADB_TRACING) \ + fprintf(stderr, __VA_ARGS__ ); \ + } while (0) +#else +# define D(...) ((void)0) +# define ADB_TRACING 0 +#endif + + +/* set this to log to /data/adb/adb_