1 /* 2 * Copyright (C) 2007 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #define TRACE_TAG TRACE_ADB 18 19 #include <stdio.h> 20 #include <stdlib.h> 21 #include <ctype.h> 22 #include <stdarg.h> 23 #include <errno.h> 24 #include <string.h> 25 #include <time.h> 26 #include <sys/time.h> 27 28 #include "sysdeps.h" 29 #include "adb.h" 30 31 #if !ADB_HOST 32 #include <private/android_filesystem_config.h> 33 #include <linux/capability.h> 34 #include <linux/prctl.h> 35 #else 36 #include "usb_vendors.h" 37 #endif 38 39 #if ADB_TRACE 40 ADB_MUTEX_DEFINE( D_lock ); 41 #endif 42 43 int HOST = 0; 44 45 static const char *adb_device_banner = "device"; 46 47 void fatal(const char *fmt, ...) 48 { 49 va_list ap; 50 va_start(ap, fmt); 51 fprintf(stderr, "error: "); 52 vfprintf(stderr, fmt, ap); 53 fprintf(stderr, "\n"); 54 va_end(ap); 55 exit(-1); 56 } 57 58 void fatal_errno(const char *fmt, ...) 59 { 60 va_list ap; 61 va_start(ap, fmt); 62 fprintf(stderr, "error: %s: ", strerror(errno)); 63 vfprintf(stderr, fmt, ap); 64 fprintf(stderr, "\n"); 65 va_end(ap); 66 exit(-1); 67 } 68 69 int adb_trace_mask; 70 71 /* read a comma/space/colum/semi-column separated list of tags 72 * from the ADB_TRACE environment variable and build the trace 73 * mask from it. note that '1' and 'all' are special cases to 74 * enable all tracing 75 */ 76 void adb_trace_init(void) 77 { 78 const char* p = getenv("ADB_TRACE"); 79 const char* q; 80 81 static const struct { 82 const char* tag; 83 int flag; 84 } tags[] = { 85 { "1", 0 }, 86 { "all", 0 }, 87 { "adb", TRACE_ADB }, 88 { "sockets", TRACE_SOCKETS }, 89 { "packets", TRACE_PACKETS }, 90 { "rwx", TRACE_RWX }, 91 { "usb", TRACE_USB }, 92 { "sync", TRACE_SYNC }, 93 { "sysdeps", TRACE_SYSDEPS }, 94 { "transport", TRACE_TRANSPORT }, 95 { "jdwp", TRACE_JDWP }, 96 { "services", TRACE_SERVICES }, 97 { NULL, 0 } 98 }; 99 100 if (p == NULL) 101 return; 102 103 /* use a comma/column/semi-colum/space separated list */ 104 while (*p) { 105 int len, tagn; 106 107 q = strpbrk(p, " ,:;"); 108 if (q == NULL) { 109 q = p + strlen(p); 110 } 111 len = q - p; 112 113 for (tagn = 0; tags[tagn].tag != NULL; tagn++) 114 { 115 int taglen = strlen(tags[tagn].tag); 116 117 if (len == taglen && !memcmp(tags[tagn].tag, p, len) ) 118 { 119 int flag = tags[tagn].flag; 120 if (flag == 0) { 121 adb_trace_mask = ~0; 122 return; 123 } 124 adb_trace_mask |= (1 << flag); 125 break; 126 } 127 } 128 p = q; 129 if (*p) 130 p++; 131 } 132 } 133 134 135 apacket *get_apacket(void) 136 { 137 apacket *p = malloc(sizeof(apacket)); 138 if(p == 0) fatal("failed to allocate an apacket"); 139 memset(p, 0, sizeof(apacket) - MAX_PAYLOAD); 140 return p; 141 } 142 143 void put_apacket(apacket *p) 144 { 145 free(p); 146 } 147 148 void handle_online(void) 149 { 150 D("adb: online\n"); 151 } 152 153 void handle_offline(atransport *t) 154 { 155 D("adb: offline\n"); 156 //Close the associated usb 157 run_transport_disconnects(t); 158 } 159 160 #if TRACE_PACKETS 161 #define DUMPMAX 32 162 void print_packet(const char *label, apacket *p) 163 { 164 char *tag; 165 char *x; 166 unsigned count; 167 168 switch(p->msg.command){ 169 case A_SYNC: tag = "SYNC"; break; 170 case A_CNXN: tag = "CNXN" ; break; 171 case A_OPEN: tag = "OPEN"; break; 172 case A_OKAY: tag = "OKAY"; break; 173 case A_CLSE: tag = "CLSE"; break; 174 case A_WRTE: tag = "WRTE"; break; 175 default: tag = "????"; break; 176 } 177 178 fprintf(stderr, "%s: %s %08x %08x %04x \"", 179 label, tag, p->msg.arg0, p->msg.arg1, p->msg.data_length); 180 count = p->msg.data_length; 181 x = (char*) p->data; 182 if(count > DUMPMAX) { 183 count = DUMPMAX; 184 tag = "\n"; 185 } else { 186 tag = "\"\n"; 187 } 188 while(count-- > 0){ 189 if((*x >= ' ') && (*x < 127)) { 190 fputc(*x, stderr); 191 } else { 192 fputc('.', stderr); 193 } 194 x++; 195 } 196 fprintf(stderr, tag); 197 } 198 #endif 199 200 static void send_ready(unsigned local, unsigned remote, atransport *t) 201 { 202 D("Calling send_ready \n"); 203 apacket *p = get_apacket(); 204 p->msg.command = A_OKAY; 205 p->msg.arg0 = local; 206 p->msg.arg1 = remote; 207 send_packet(p, t); 208 } 209 210 static void send_close(unsigned local, unsigned remote, atransport *t) 211 { 212 D("Calling send_close \n"); 213 apacket *p = get_apacket(); 214 p->msg.command = A_CLSE; 215 p->msg.arg0 = local; 216 p->msg.arg1 = remote; 217 send_packet(p, t); 218 } 219 220 static void send_connect(atransport *t) 221 { 222 D("Calling send_connect \n"); 223 apacket *cp = get_apacket(); 224 cp->msg.command = A_CNXN; 225 cp->msg.arg0 = A_VERSION; 226 cp->msg.arg1 = MAX_PAYLOAD; 227 snprintf((char*) cp->data, sizeof cp->data, "%s::", 228 HOST ? "host" : adb_device_banner); 229 cp->msg.data_length = strlen((char*) cp->data) + 1; 230 send_packet(cp, t); 231 #if ADB_HOST 232 /* XXX why sleep here? */ 233 // allow the device some time to respond to the connect message 234 adb_sleep_ms(1000); 235 #endif 236 } 237 238 static char *connection_state_name(atransport *t) 239 { 240 if (t == NULL) { 241 return "unknown"; 242 } 243 244 switch(t->connection_state) { 245 case CS_BOOTLOADER: 246 return "bootloader"; 247 case CS_DEVICE: 248 return "device"; 249 case CS_OFFLINE: 250 return "offline"; 251 default: 252 return "unknown"; 253 } 254 } 255 256 void parse_banner(char *banner, atransport *t) 257 { 258 char *type, *product, *end; 259 260 D("parse_banner: %s\n", banner); 261 type = banner; 262 product = strchr(type, ':'); 263 if(product) { 264 *product++ = 0; 265 } else { 266 product = ""; 267 } 268 269 /* remove trailing ':' */ 270 end = strchr(product, ':'); 271 if(end) *end = 0; 272 273 /* save product name in device structure */ 274 if (t->product == NULL) { 275 t->product = strdup(product); 276 } else if (strcmp(product, t->product) != 0) { 277 free(t->product); 278 t->product = strdup(product); 279 } 280 281 if(!strcmp(type, "bootloader")){ 282 D("setting connection_state to CS_BOOTLOADER\n"); 283 t->connection_state = CS_BOOTLOADER; 284 update_transports(); 285 return; 286 } 287 288 if(!strcmp(type, "device")) { 289 D("setting connection_state to CS_DEVICE\n"); 290 t->connection_state = CS_DEVICE; 291 update_transports(); 292 return; 293 } 294 295 if(!strcmp(type, "recovery")) { 296 D("setting connection_state to CS_RECOVERY\n"); 297 t->connection_state = CS_RECOVERY; 298 update_transports(); 299 return; 300 } 301 302 t->connection_state = CS_HOST; 303 } 304 305 void handle_packet(apacket *p, atransport *t) 306 { 307 asocket *s; 308 309 D("handle_packet() %c%c%c%c\n", ((char*) (&(p->msg.command)))[0], 310 ((char*) (&(p->msg.command)))[1], 311 ((char*) (&(p->msg.command)))[2], 312 ((char*) (&(p->msg.command)))[3]); 313 print_packet("recv", p); 314 315 switch(p->msg.command){ 316 case A_SYNC: 317 if(p->msg.arg0){ 318 send_packet(p, t); 319 if(HOST) send_connect(t); 320 } else { 321 t->connection_state = CS_OFFLINE; 322 handle_offline(t); 323 send_packet(p, t); 324 } 325 return; 326 327 case A_CNXN: /* CONNECT(version, maxdata, "system-id-string") */ 328 /* XXX verify version, etc */ 329 if(t->connection_state != CS_OFFLINE) { 330 t->connection_state = CS_OFFLINE; 331 handle_offline(t); 332 } 333 parse_banner((char*) p->data, t); 334 handle_online(); 335 if(!HOST) send_connect(t); 336 break; 337 338 case A_OPEN: /* OPEN(local-id, 0, "destination") */ 339 if(t->connection_state != CS_OFFLINE) { 340 char *name = (char*) p->data; 341 name[p->msg.data_length > 0 ? p->msg.data_length - 1 : 0] = 0; 342 s = create_local_service_socket(name); 343 if(s == 0) { 344 send_close(0, p->msg.arg0, t); 345 } else { 346 s->peer = create_remote_socket(p->msg.arg0, t); 347 s->peer->peer = s; 348 send_ready(s->id, s->peer->id, t); 349 s->ready(s); 350 } 351 } 352 break; 353 354 case A_OKAY: /* READY(local-id, remote-id, "") */ 355 if(t->connection_state != CS_OFFLINE) { 356 if((s = find_local_socket(p->msg.arg1))) { 357 if(s->peer == 0) { 358 s->peer = create_remote_socket(p->msg.arg0, t); 359 s->peer->peer = s; 360 } 361 s->ready(s); 362 } 363 } 364 break; 365 366 case A_CLSE: /* CLOSE(local-id, remote-id, "") */ 367 if(t->connection_state != CS_OFFLINE) { 368 if((s = find_local_socket(p->msg.arg1))) { 369 s->close(s); 370 } 371 } 372 break; 373 374 case A_WRTE: 375 if(t->connection_state != CS_OFFLINE) { 376 if((s = find_local_socket(p->msg.arg1))) { 377 unsigned rid = p->msg.arg0; 378 p->len = p->msg.data_length; 379 380 if(s->enqueue(s, p) == 0) { 381 D("Enqueue the socket\n"); 382 send_ready(s->id, rid, t); 383 } 384 return; 385 } 386 } 387 break; 388 389 default: 390 printf("handle_packet: what is %08x?!\n", p->msg.command); 391 } 392 393 put_apacket(p); 394 } 395 396 alistener listener_list = { 397 .next = &listener_list, 398 .prev = &listener_list, 399 }; 400 401 static void ss_listener_event_func(int _fd, unsigned ev, void *_l) 402 { 403 asocket *s; 404 405 if(ev & FDE_READ) { 406 struct sockaddr addr; 407 socklen_t alen; 408 int fd; 409 410 alen = sizeof(addr); 411 fd = adb_socket_accept(_fd, &addr, &alen); 412 if(fd < 0) return; 413 414 adb_socket_setbufsize(fd, CHUNK_SIZE); 415 416 s = create_local_socket(fd); 417 if(s) { 418 connect_to_smartsocket(s); 419 return; 420 } 421 422 adb_close(fd); 423 } 424 } 425 426 static void listener_event_func(int _fd, unsigned ev, void *_l) 427 { 428 alistener *l = _l; 429 asocket *s; 430 431 if(ev & FDE_READ) { 432 struct sockaddr addr; 433 socklen_t alen; 434 int fd; 435 436 alen = sizeof(addr); 437 fd = adb_socket_accept(_fd, &addr, &alen); 438 if(fd < 0) return; 439 440 s = create_local_socket(fd); 441 if(s) { 442 s->transport = l->transport; 443 connect_to_remote(s, l->connect_to); 444 return; 445 } 446 447 adb_close(fd); 448 } 449 } 450 451 static void free_listener(alistener* l) 452 { 453 if (l->next) { 454 l->next->prev = l->prev; 455 l->prev->next = l->next; 456 l->next = l->prev = l; 457 } 458 459 // closes the corresponding fd 460 fdevent_remove(&l->fde); 461 462 if (l->local_name) 463 free((char*)l->local_name); 464 465 if (l->connect_to) 466 free((char*)l->connect_to); 467 468 if (l->transport) { 469 remove_transport_disconnect(l->transport, &l->disconnect); 470 } 471 free(l); 472 } 473 474 static void listener_disconnect(void* _l, atransport* t) 475 { 476 alistener* l = _l; 477 478 free_listener(l); 479 } 480 481 int local_name_to_fd(const char *name) 482 { 483 int port; 484 485 if(!strncmp("tcp:", name, 4)){ 486 int ret; 487 port = atoi(name + 4); 488 ret = socket_loopback_server(port, SOCK_STREAM); 489 return ret; 490 } 491 #ifndef HAVE_WIN32_IPC /* no Unix-domain sockets on Win32 */ 492 // It's non-sensical to support the "reserved" space on the adb host side 493 if(!strncmp(name, "local:", 6)) { 494 return socket_local_server(name + 6, 495 ANDROID_SOCKET_NAMESPACE_ABSTRACT, SOCK_STREAM); 496 } else if(!strncmp(name, "localabstract:", 14)) { 497 return socket_local_server(name + 14, 498 ANDROID_SOCKET_NAMESPACE_ABSTRACT, SOCK_STREAM); 499 } else if(!strncmp(name, "localfilesystem:", 16)) { 500 return socket_local_server(name + 16, 501 ANDROID_SOCKET_NAMESPACE_FILESYSTEM, SOCK_STREAM); 502 } 503 504 #endif 505 printf("unknown local portname '%s'\n", name); 506 return -1; 507 } 508 509 static int remove_listener(const char *local_name, const char *connect_to, atransport* transport) 510 { 511 alistener *l; 512 513 for (l = listener_list.next; l != &listener_list; l = l->next) { 514 if (!strcmp(local_name, l->local_name) && 515 !strcmp(connect_to, l->connect_to) && 516 l->transport && l->transport == transport) { 517 518 listener_disconnect(l, transport); 519 return 0; 520 } 521 } 522 523 return -1; 524 } 525 526 static int install_listener(const char *local_name, const char *connect_to, atransport* transport) 527 { 528 alistener *l; 529 530 //printf("install_listener('%s','%s')\n", local_name, connect_to); 531 532 for(l = listener_list.next; l != &listener_list; l = l->next){ 533 if(strcmp(local_name, l->local_name) == 0) { 534 char *cto; 535 536 /* can't repurpose a smartsocket */ 537 if(l->connect_to[0] == '*') { 538 return -1; 539 } 540 541 cto = strdup(connect_to); 542 if(cto == 0) { 543 return -1; 544 } 545 546 //printf("rebinding '%s' to '%s'\n", local_name, connect_to); 547 free((void*) l->connect_to); 548 l->connect_to = cto; 549 if (l->transport != transport) { 550 remove_transport_disconnect(l->transport, &l->disconnect); 551 l->transport = transport; 552 add_transport_disconnect(l->transport, &l->disconnect); 553 } 554 return 0; 555 } 556 } 557 558 if((l = calloc(1, sizeof(alistener))) == 0) goto nomem; 559 if((l->local_name = strdup(local_name)) == 0) goto nomem; 560 if((l->connect_to = strdup(connect_to)) == 0) goto nomem; 561 562 563 l->fd = local_name_to_fd(local_name); 564 if(l->fd < 0) { 565 free((void*) l->local_name); 566 free((void*) l->connect_to); 567 free(l); 568 printf("cannot bind '%s'\n", local_name); 569 return -2; 570 } 571 572 close_on_exec(l->fd); 573 if(!strcmp(l->connect_to, "*smartsocket*")) { 574 fdevent_install(&l->fde, l->fd, ss_listener_event_func, l); 575 } else { 576 fdevent_install(&l->fde, l->fd, listener_event_func, l); 577 } 578 fdevent_set(&l->fde, FDE_READ); 579 580 l->next = &listener_list; 581 l->prev = listener_list.prev; 582 l->next->prev = l; 583 l->prev->next = l; 584 l->transport = transport; 585 586 if (transport) { 587 l->disconnect.opaque = l; 588 l->disconnect.func = listener_disconnect; 589 add_transport_disconnect(transport, &l->disconnect); 590 } 591 return 0; 592 593 nomem: 594 fatal("cannot allocate listener"); 595 return 0; 596 } 597 598 #ifdef HAVE_WIN32_PROC 599 static BOOL WINAPI ctrlc_handler(DWORD type) 600 { 601 exit(STATUS_CONTROL_C_EXIT); 602 return TRUE; 603 } 604 #endif 605 606 static void adb_cleanup(void) 607 { 608 usb_cleanup(); 609 } 610 611 void start_logging(void) 612 { 613 #ifdef HAVE_WIN32_PROC 614 char temp[ MAX_PATH ]; 615 FILE* fnul; 616 FILE* flog; 617 618 GetTempPath( sizeof(temp) - 8, temp ); 619 strcat( temp, "adb.log" ); 620 621 /* Win32 specific redirections */ 622 fnul = fopen( "NUL", "rt" ); 623 if (fnul != NULL) 624 stdin[0] = fnul[0]; 625 626 flog = fopen( temp, "at" ); 627 if (flog == NULL) 628 flog = fnul; 629 630 setvbuf( flog, NULL, _IONBF, 0 ); 631 632 stdout[0] = flog[0]; 633 stderr[0] = flog[0]; 634 fprintf(stderr,"--- adb starting (pid %d) ---\n", getpid()); 635 #else 636 int fd; 637 638 fd = unix_open("/dev/null", O_RDONLY); 639 dup2(fd, 0); 640 adb_close(fd); 641 642 fd = unix_open("/tmp/adb.log", O_WRONLY | O_CREAT | O_APPEND, 0640); 643 if(fd < 0) { 644 fd = unix_open("/dev/null", O_WRONLY); 645 } 646 dup2(fd, 1); 647 dup2(fd, 2); 648 adb_close(fd); 649 fprintf(stderr,"--- adb starting (pid %d) ---\n", getpid()); 650 #endif 651 } 652 653 #if !ADB_HOST 654 void start_device_log(void) 655 { 656 int fd; 657 char path[PATH_MAX]; 658 struct tm now; 659 time_t t; 660 char value[PROPERTY_VALUE_MAX]; 661 662 // read the trace mask from persistent property persist.adb.trace_mask 663 // give up if the property is not set or cannot be parsed 664 property_get("persist.adb.trace_mask", value, ""); 665 if (sscanf(value, "%x", &adb_trace_mask) != 1) 666 return; 667 668 adb_mkdir("/data/adb", 0775); 669 tzset(); 670 time(&t); 671 localtime_r(&t, &now); 672 strftime(path, sizeof(path), 673 "/data/adb/adb-%Y-%m-%d-%H-%M-%S.txt", 674 &now); 675 fd = unix_open(path, O_WRONLY | O_CREAT | O_TRUNC, 0640); 676 if (fd < 0) 677 return; 678 679 // redirect stdout and stderr to the log file 680 dup2(fd, 1); 681 dup2(fd, 2); 682 fprintf(stderr,"--- adb starting (pid %d) ---\n", getpid()); 683 adb_close(fd); 684 685 fd = unix_open("/dev/null", O_RDONLY); 686 dup2(fd, 0); 687 adb_close(fd); 688 } 689 #endif 690 691 #if ADB_HOST 692 int launch_server(int server_port) 693 { 694 #ifdef HAVE_WIN32_PROC 695 /* we need to start the server in the background */ 696 /* we create a PIPE that will be used to wait for the server's "OK" */ 697 /* message since the pipe handles must be inheritable, we use a */ 698 /* security attribute */ 699 HANDLE pipe_read, pipe_write; 700 SECURITY_ATTRIBUTES sa; 701 STARTUPINFO startup; 702 PROCESS_INFORMATION pinfo; 703 char program_path[ MAX_PATH ]; 704 int ret; 705 706 sa.nLength = sizeof(sa); 707 sa.lpSecurityDescriptor = NULL; 708 sa.bInheritHandle = TRUE; 709 710 /* create pipe, and ensure its read handle isn't inheritable */ 711 ret = CreatePipe( &pipe_read, &pipe_write, &sa, 0 ); 712 if (!ret) { 713 fprintf(stderr, "CreatePipe() failure, error %ld\n", GetLastError() ); 714 return -1; 715 } 716 717 SetHandleInformation( pipe_read, HANDLE_FLAG_INHERIT, 0 ); 718 719 ZeroMemory( &startup, sizeof(startup) ); 720 startup.cb = sizeof(startup); 721 startup.hStdInput = GetStdHandle( STD_INPUT_HANDLE ); 722 startup.hStdOutput = pipe_write; 723 startup.hStdError = GetStdHandle( STD_ERROR_HANDLE ); 724 startup.dwFlags = STARTF_USESTDHANDLES; 725 726 ZeroMemory( &pinfo, sizeof(pinfo) ); 727 728 /* get path of current program */ 729 GetModuleFileName( NULL, program_path, sizeof(program_path) ); 730 731 ret = CreateProcess( 732 program_path, /* program path */ 733 "adb fork-server server", 734 /* the fork-server argument will set the 735 debug = 2 in the child */ 736 NULL, /* process handle is not inheritable */ 737 NULL, /* thread handle is not inheritable */ 738 TRUE, /* yes, inherit some handles */ 739 DETACHED_PROCESS, /* the new process doesn't have a console */ 740 NULL, /* use parent's environment block */ 741 NULL, /* use parent's starting directory */ 742 &startup, /* startup info, i.e. std handles */ 743 &pinfo ); 744 745 CloseHandle( pipe_write ); 746 747 if (!ret) { 748 fprintf(stderr, "CreateProcess failure, error %ld\n", GetLastError() ); 749 CloseHandle( pipe_read ); 750 return -1; 751 } 752 753 CloseHandle( pinfo.hProcess ); 754 CloseHandle( pinfo.hThread ); 755 756 /* wait for the "OK\n" message */ 757 { 758 char temp[3]; 759 DWORD count; 760 761 ret = ReadFile( pipe_read, temp, 3, &count, NULL ); 762 CloseHandle( pipe_read ); 763 if ( !ret ) { 764 fprintf(stderr, "could not read ok from ADB Server, error = %ld\n", GetLastError() ); 765 return -1; 766 } 767 if (count != 3 || temp[0] != 'O' || temp[1] != 'K' || temp[2] != '\n') { 768 fprintf(stderr, "ADB server didn't ACK\n" ); 769 return -1; 770 } 771 } 772 #elif defined(HAVE_FORKEXEC) 773 char path[PATH_MAX]; 774 int fd[2]; 775 776 // set up a pipe so the child can tell us when it is ready. 777 // fd[0] will be parent's end, and fd[1] will get mapped to stderr in the child. 778 if (pipe(fd)) { 779 fprintf(stderr, "pipe failed in launch_server, errno: %d\n", errno); 780 return -1; 781 } 782 get_my_path(path, PATH_MAX); 783 pid_t pid = fork(); 784 if(pid < 0) return -1; 785 786 if (pid == 0) { 787 // child side of the fork 788 789 // redirect stderr to the pipe 790 // we use stderr instead of stdout due to stdout's buffering behavior. 791 adb_close(fd[0]); 792 dup2(fd[1], STDERR_FILENO); 793 adb_close(fd[1]); 794 795 // child process 796 int result = execl(path, "adb", "fork-server", "server", NULL); 797 // this should not return 798 fprintf(stderr, "OOPS! execl returned %d, errno: %d\n", result, errno); 799 } else { 800 // parent side of the fork 801 802 char temp[3]; 803 804 temp[0] = 'A'; temp[1] = 'B'; temp[2] = 'C'; 805 // wait for the "OK\n" message 806 adb_close(fd[1]); 807 int ret = adb_read(fd[0], temp, 3); 808 int saved_errno = errno; 809 adb_close(fd[0]); 810 if (ret < 0) { 811 fprintf(stderr, "could not read ok from ADB Server, errno = %d\n", saved_errno); 812 return -1; 813 } 814 if (ret != 3 || temp[0] != 'O' || temp[1] != 'K' || temp[2] != '\n') { 815 fprintf(stderr, "ADB server didn't ACK\n" ); 816 return -1; 817 } 818 819 setsid(); 820 } 821 #else 822 #error "cannot implement background server start on this platform" 823 #endif 824 return 0; 825 } 826 #endif 827 828 /* Constructs a local name of form tcp:port. 829 * target_str points to the target string, it's content will be overwritten. 830 * target_size is the capacity of the target string. 831 * server_port is the port number to use for the local name. 832 */ 833 void build_local_name(char* target_str, size_t target_size, int server_port) 834 { 835 snprintf(target_str, target_size, "tcp:%d", server_port); 836 } 837 838 int adb_main(int is_daemon, int server_port) 839 { 840 #if !ADB_HOST 841 int secure = 0; 842 int port; 843 char value[PROPERTY_VALUE_MAX]; 844 #endif 845 846 atexit(adb_cleanup); 847 #ifdef HAVE_WIN32_PROC 848 SetConsoleCtrlHandler( ctrlc_handler, TRUE ); 849 #elif defined(HAVE_FORKEXEC) 850 // No SIGCHLD. Let the service subproc handle its children. 851 signal(SIGPIPE, SIG_IGN); 852 #endif 853 854 init_transport_registration(); 855 856 857 #if ADB_HOST 858 HOST = 1; 859 usb_vendors_init(); 860 usb_init(); 861 local_init(DEFAULT_ADB_LOCAL_TRANSPORT_PORT); 862 863 char local_name[30]; 864 build_local_name(local_name, sizeof(local_name), server_port); 865 if(install_listener(local_name, "*smartsocket*", NULL)) { 866 exit(1); 867 } 868 #else 869 /* run adbd in secure mode if ro.secure is set and 870 ** we are not in the emulator 871 */ 872 property_get("ro.kernel.qemu", value, ""); 873 if (strcmp(value, "1") != 0) { 874 property_get("ro.secure", value, "1"); 875 if (strcmp(value, "1") == 0) { 876 // don't run as root if ro.secure is set... 877 secure = 1; 878 879 // ... except we allow running as root in userdebug builds if the 880 // service.adb.root property has been set by the "adb root" command 881 property_get("ro.debuggable", value, ""); 882 if (strcmp(value, "1") == 0) { 883 property_get("service.adb.root", value, ""); 884 if (strcmp(value, "1") == 0) { 885 secure = 0; 886 } 887 } 888 } 889 } 890 891 /* don't listen on a port (default 5037) if running in secure mode */ 892 /* don't run as root if we are running in secure mode */ 893 if (secure) { 894 struct __user_cap_header_struct header; 895 struct __user_cap_data_struct cap; 896 897 if (prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0) != 0) { 898 exit(1); 899 } 900 901 /* add extra groups: 902 ** AID_ADB to access the USB driver 903 ** AID_LOG to read system logs (adb logcat) 904 ** AID_INPUT to diagnose input issues (getevent) 905 ** AID_INET to diagnose network issues (netcfg, ping) 906 ** AID_GRAPHICS to access the frame buffer 907 ** AID_NET_BT and AID_NET_BT_ADMIN to diagnose bluetooth (hcidump) 908 ** AID_SDCARD_RW to allow writing to the SD card 909 ** AID_MOUNT to allow unmounting the SD card before rebooting 910 ** AID_NET_BW_STATS to read out qtaguid statistics 911 */ 912 gid_t groups[] = { AID_ADB, AID_LOG, AID_INPUT, AID_INET, AID_GRAPHICS, 913 AID_NET_BT, AID_NET_BT_ADMIN, AID_SDCARD_RW, AID_MOUNT, 914 AID_NET_BW_STATS }; 915 if (setgroups(sizeof(groups)/sizeof(groups[0]), groups) != 0) { 916 exit(1); 917 } 918 919 /* then switch user and group to "shell" */ 920 if (setgid(AID_SHELL) != 0) { 921 exit(1); 922 } 923 if (setuid(AID_SHELL) != 0) { 924 exit(1); 925 } 926 927 /* set CAP_SYS_BOOT capability, so "adb reboot" will succeed */ 928 header.version = _LINUX_CAPABILITY_VERSION; 929 header.pid = 0; 930 cap.effective = cap.permitted = (1 << CAP_SYS_BOOT); 931 cap.inheritable = 0; 932 capset(&header, &cap); 933 934 D("Local port disabled\n"); 935 } else { 936 char local_name[30]; 937 build_local_name(local_name, sizeof(local_name), server_port); 938 if(install_listener(local_name, "*smartsocket*", NULL)) { 939 exit(1); 940 } 941 } 942 943 /* for the device, start the usb transport if the 944 ** android usb device exists and the "service.adb.tcp.port" and 945 ** "persist.adb.tcp.port" properties are not set. 946 ** Otherwise start the network transport. 947 */ 948 property_get("service.adb.tcp.port", value, ""); 949 if (!value[0]) 950 property_get("persist.adb.tcp.port", value, ""); 951 if (sscanf(value, "%d", &port) == 1 && port > 0) { 952 // listen on TCP port specified by service.adb.tcp.port property 953 local_init(port); 954 } else if (access("/dev/android_adb", F_OK) == 0) { 955 // listen on USB 956 usb_init(); 957 } else { 958 // listen on default port 959 local_init(DEFAULT_ADB_LOCAL_TRANSPORT_PORT); 960 } 961 D("adb_main(): pre init_jdwp()\n"); 962 init_jdwp(); 963 D("adb_main(): post init_jdwp()\n"); 964 #endif 965 966 if (is_daemon) 967 { 968 // inform our parent that we are up and running. 969 #ifdef HAVE_WIN32_PROC 970 DWORD count; 971 WriteFile( GetStdHandle( STD_OUTPUT_HANDLE ), "OK\n", 3, &count, NULL ); 972 #elif defined(HAVE_FORKEXEC) 973 fprintf(stderr, "OK\n"); 974 #endif 975 start_logging(); 976 } 977 D("Event loop starting\n"); 978 979 fdevent_loop(); 980 981 usb_cleanup(); 982 983 return 0; 984 } 985 986 #if ADB_HOST 987 void connect_device(char* host, char* buffer, int buffer_size) 988 { 989 int port, fd; 990 char* portstr = strchr(host, ':'); 991 char hostbuf[100]; 992 char serial[100]; 993 994 strncpy(hostbuf, host, sizeof(hostbuf) - 1); 995 if (portstr) { 996 if (portstr - host >= sizeof(hostbuf)) { 997 snprintf(buffer, buffer_size, "bad host name %s", host); 998 return; 999 } 1000 // zero terminate the host at the point we found the colon 1001 hostbuf[portstr - host] = 0; 1002 if (sscanf(portstr + 1, "%d", &port) == 0) { 1003 snprintf(buffer, buffer_size, "bad port number %s", portstr); 1004 return; 1005 } 1006 } else { 1007 port = DEFAULT_ADB_LOCAL_TRANSPORT_PORT; 1008 } 1009 1010 snprintf(serial, sizeof(serial), "%s:%d", hostbuf, port); 1011 if (find_transport(serial)) { 1012 snprintf(buffer, buffer_size, "already connected to %s", serial); 1013 return; 1014 } 1015 1016 fd = socket_network_client(hostbuf, port, SOCK_STREAM); 1017 if (fd < 0) { 1018 snprintf(buffer, buffer_size, "unable to connect to %s:%d", host, port); 1019 return; 1020 } 1021 1022 D("client: connected on remote on fd %d\n", fd); 1023 close_on_exec(fd); 1024 disable_tcp_nagle(fd); 1025 register_socket_transport(fd, serial, port, 0); 1026 snprintf(buffer, buffer_size, "connected to %s", serial); 1027 } 1028 1029 void connect_emulator(char* port_spec, char* buffer, int buffer_size) 1030 { 1031 char* port_separator = strchr(port_spec, ','); 1032 if (!port_separator) { 1033 snprintf(buffer, buffer_size, 1034 "unable to parse '%s' as <console port>,<adb port>", 1035 port_spec); 1036 return; 1037 } 1038 1039 // Zero-terminate console port and make port_separator point to 2nd port. 1040 *port_separator++ = 0; 1041 int console_port = strtol(port_spec, NULL, 0); 1042 int adb_port = strtol(port_separator, NULL, 0); 1043 if (!(console_port > 0 && adb_port > 0)) { 1044 *(port_separator - 1) = ','; 1045 snprintf(buffer, buffer_size, 1046 "Invalid port numbers: Expected positive numbers, got '%s'", 1047 port_spec); 1048 return; 1049 } 1050 1051 /* Check if the emulator is already known. 1052 * Note: There's a small but harmless race condition here: An emulator not 1053 * present just yet could be registered by another invocation right 1054 * after doing this check here. However, local_connect protects 1055 * against double-registration too. From here, a better error message 1056 * can be produced. In the case of the race condition, the very specific 1057 * error message won't be shown, but the data doesn't get corrupted. */ 1058 atransport* known_emulator = find_emulator_transport_by_adb_port(adb_port); 1059 if (known_emulator != NULL) { 1060 snprintf(buffer, buffer_size, 1061 "Emulator on port %d already registered.", adb_port); 1062 return; 1063 } 1064 1065 /* Check if more emulators can be registered. Similar unproblematic 1066 * race condition as above. */ 1067 int candidate_slot = get_available_local_transport_index(); 1068 if (candidate_slot < 0) { 1069 snprintf(buffer, buffer_size, "Cannot accept more emulators."); 1070 return; 1071 } 1072 1073 /* Preconditions met, try to connect to the emulator. */ 1074 if (!local_connect_arbitrary_ports(console_port, adb_port)) { 1075 snprintf(buffer, buffer_size, 1076 "Connected to emulator on ports %d,%d", console_port, adb_port); 1077 } else { 1078 snprintf(buffer, buffer_size, 1079 "Could not connect to emulator on ports %d,%d", 1080 console_port, adb_port); 1081 } 1082 } 1083 #endif 1084 1085 int handle_host_request(char *service, transport_type ttype, char* serial, int reply_fd, asocket *s) 1086 { 1087 atransport *transport = NULL; 1088 char buf[4096]; 1089 1090 if(!strcmp(service, "kill")) { 1091 fprintf(stderr,"adb server killed by remote request\n"); 1092 fflush(stdout); 1093 adb_write(reply_fd, "OKAY", 4); 1094 usb_cleanup(); 1095 exit(0); 1096 } 1097 1098 #if ADB_HOST 1099 // "transport:" is used for switching transport with a specified serial number 1100 // "transport-usb:" is used for switching transport to the only USB transport 1101 // "transport-local:" is used for switching transport to the only local transport 1102 // "transport-any:" is used for switching transport to the only transport 1103 if (!strncmp(service, "transport", strlen("transport"))) { 1104 char* error_string = "unknown failure"; 1105 transport_type type = kTransportAny; 1106 1107 if (!strncmp(service, "transport-usb", strlen("transport-usb"))) { 1108 type = kTransportUsb; 1109 } else if (!strncmp(service, "transport-local", strlen("transport-local"))) { 1110 type = kTransportLocal; 1111 } else if (!strncmp(service, "transport-any", strlen("transport-any"))) { 1112 type = kTransportAny; 1113 } else if (!strncmp(service, "transport:", strlen("transport:"))) { 1114 service += strlen("transport:"); 1115 serial = service; 1116 } 1117 1118 transport = acquire_one_transport(CS_ANY, type, serial, &error_string); 1119 1120 if (transport) { 1121 s->transport = transport; 1122 adb_write(reply_fd, "OKAY", 4); 1123 } else { 1124 sendfailmsg(reply_fd, error_string); 1125 } 1126 return 1; 1127 } 1128 1129 // return a list of all connected devices 1130 if (!strcmp(service, "devices")) { 1131 char buffer[4096]; 1132 memset(buf, 0, sizeof(buf)); 1133 memset(buffer, 0, sizeof(buffer)); 1134 D("Getting device list \n"); 1135 list_transports(buffer, sizeof(buffer)); 1136 snprintf(buf, sizeof(buf), "OKAY%04x%s",(unsigned)strlen(buffer),buffer); 1137 D("Wrote device list \n"); 1138 writex(reply_fd, buf, strlen(buf)); 1139 return 0; 1140 } 1141 1142 // add a new TCP transport, device or emulator 1143 if (!strncmp(service, "connect:", 8)) { 1144 char buffer[4096]; 1145 char* host = service + 8; 1146 if (!strncmp(host, "emu:", 4)) { 1147 connect_emulator(host + 4, buffer, sizeof(buffer)); 1148 } else { 1149 connect_device(host, buffer, sizeof(buffer)); 1150 } 1151 // Send response for emulator and device 1152 snprintf(buf, sizeof(buf), "OKAY%04x%s",(unsigned)strlen(buffer), buffer); 1153 writex(reply_fd, buf, strlen(buf)); 1154 return 0; 1155 } 1156 1157 // remove TCP transport 1158 if (!strncmp(service, "disconnect:", 11)) { 1159 char buffer[4096]; 1160 memset(buffer, 0, sizeof(buffer)); 1161 char* serial = service + 11; 1162 if (serial[0] == 0) { 1163 // disconnect from all TCP devices 1164 unregister_all_tcp_transports(); 1165 } else { 1166 char hostbuf[100]; 1167 // assume port 5555 if no port is specified 1168 if (!strchr(serial, ':')) { 1169 snprintf(hostbuf, sizeof(hostbuf) - 1, "%s:5555", serial); 1170 serial = hostbuf; 1171 } 1172 atransport *t = find_transport(serial); 1173 1174 if (t) { 1175 unregister_transport(t); 1176 } else { 1177 snprintf(buffer, sizeof(buffer), "No such device %s", serial); 1178 } 1179 } 1180 1181 snprintf(buf, sizeof(buf), "OKAY%04x%s",(unsigned)strlen(buffer), buffer); 1182 writex(reply_fd, buf, strlen(buf)); 1183 return 0; 1184 } 1185 1186 // returns our value for ADB_SERVER_VERSION 1187 if (!strcmp(service, "version")) { 1188 char version[12]; 1189 snprintf(version, sizeof version, "%04x", ADB_SERVER_VERSION); 1190 snprintf(buf, sizeof buf, "OKAY%04x%s", (unsigned)strlen(version), version); 1191 writex(reply_fd, buf, strlen(buf)); 1192 return 0; 1193 } 1194 1195 if(!strncmp(service,"get-serialno",strlen("get-serialno"))) { 1196 char *out = "unknown"; 1197 transport = acquire_one_transport(CS_ANY, ttype, serial, NULL); 1198 if (transport && transport->serial) { 1199 out = transport->serial; 1200 } 1201 snprintf(buf, sizeof buf, "OKAY%04x%s",(unsigned)strlen(out),out); 1202 writex(reply_fd, buf, strlen(buf)); 1203 return 0; 1204 } 1205 // indicates a new emulator instance has started 1206 if (!strncmp(service,"emulator:",9)) { 1207 int port = atoi(service+9); 1208 local_connect(port); 1209 /* we don't even need to send a reply */ 1210 return 0; 1211 } 1212 #endif // ADB_HOST 1213 1214 if(!strncmp(service,"forward:",8) || !strncmp(service,"killforward:",12)) { 1215 char *local, *remote, *err; 1216 int r; 1217 atransport *transport; 1218 1219 int createForward = strncmp(service,"kill",4); 1220 1221 local = service + (createForward ? 8 : 12); 1222 remote = strchr(local,';'); 1223 if(remote == 0) { 1224 sendfailmsg(reply_fd, "malformed forward spec"); 1225 return 0; 1226 } 1227 1228 *remote++ = 0; 1229 if((local[0] == 0) || (remote[0] == 0) || (remote[0] == '*')){ 1230 sendfailmsg(reply_fd, "malformed forward spec"); 1231 return 0; 1232 } 1233 1234 transport = acquire_one_transport(CS_ANY, ttype, serial, &err); 1235 if (!transport) { 1236 sendfailmsg(reply_fd, err); 1237 return 0; 1238 } 1239 1240 if (createForward) { 1241 r = install_listener(local, remote, transport); 1242 } else { 1243 r = remove_listener(local, remote, transport); 1244 } 1245 if(r == 0) { 1246 /* 1st OKAY is connect, 2nd OKAY is status */ 1247 writex(reply_fd, "OKAYOKAY", 8); 1248 return 0; 1249 } 1250 1251 if (createForward) { 1252 sendfailmsg(reply_fd, (r == -1) ? "cannot rebind smartsocket" : "cannot bind socket"); 1253 } else { 1254 sendfailmsg(reply_fd, "cannot remove listener"); 1255 } 1256 return 0; 1257 } 1258 1259 if(!strncmp(service,"get-state",strlen("get-state"))) { 1260 transport = acquire_one_transport(CS_ANY, ttype, serial, NULL); 1261 char *state = connection_state_name(transport); 1262 snprintf(buf, sizeof buf, "OKAY%04x%s",(unsigned)strlen(state),state); 1263 writex(reply_fd, buf, strlen(buf)); 1264 return 0; 1265 } 1266 return -1; 1267 } 1268 1269 #if !ADB_HOST 1270 int recovery_mode = 0; 1271 #endif 1272 1273 int main(int argc, char **argv) 1274 { 1275 #if ADB_HOST 1276 adb_sysdeps_init(); 1277 adb_trace_init(); 1278 D("Handling commandline()\n"); 1279 return adb_commandline(argc - 1, argv + 1); 1280 #else 1281 if((argc > 1) && (!strcmp(argv[1],"recovery"))) { 1282 adb_device_banner = "recovery"; 1283 recovery_mode = 1; 1284 } 1285 1286 start_device_log(); 1287 D("Handling main()\n"); 1288 return adb_main(0, DEFAULT_ADB_PORT); 1289 #endif 1290 } 1291