1 /*
2  * Copyright (C) 2015 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 #include <errno.h>
18 #include <fcntl.h>
19 #include <signal.h>
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <strings.h>
23 
24 #include <android-base/logging.h>
25 #include <android-base/parseint.h>
26 
27 #include "adb.h"
28 #include "adb_auth.h"
29 #include "transport.h"
30 
31 #include "minadbd/types.h"
32 #include "minadbd_services.h"
33 
34 using namespace std::string_literals;
35 
main(int argc,char ** argv)36 int main(int argc, char** argv) {
37   android::base::InitLogging(argv, &android::base::StderrLogger);
38   // TODO(xunchang) implement a command parser
39   if ((argc != 3 && argc != 4) || argv[1] != "--socket_fd"s ||
40       (argc == 4 && argv[3] != "--rescue"s)) {
41     LOG(ERROR) << "minadbd has invalid arguments, argc: " << argc;
42     exit(kMinadbdArgumentsParsingError);
43   }
44 
45   int socket_fd;
46   if (!android::base::ParseInt(argv[2], &socket_fd)) {
47     LOG(ERROR) << "Failed to parse int in " << argv[2];
48     exit(kMinadbdArgumentsParsingError);
49   }
50   if (fcntl(socket_fd, F_GETFD, 0) == -1) {
51     PLOG(ERROR) << "Failed to get minadbd socket";
52     exit(kMinadbdSocketIOError);
53   }
54   SetMinadbdSocketFd(socket_fd);
55 
56   if (argc == 4) {
57     SetMinadbdRescueMode(true);
58     adb_device_banner = "rescue";
59   } else {
60     adb_device_banner = "sideload";
61   }
62 
63   signal(SIGPIPE, SIG_IGN);
64 
65   // We can't require authentication for sideloading. http://b/22025550.
66   auth_required = false;
67 
68   init_transport_registration();
69   usb_init();
70 
71   VLOG(ADB) << "Event loop starting";
72   fdevent_loop();
73 
74   return 0;
75 }
76