Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 76e9236a authored by David Pursell's avatar David Pursell Committed by Gerrit Code Review
Browse files

Merge "adb: fix -Tt options to match ssh."

parents b42e7e8f 08a27094
Loading
Loading
Loading
Loading
+40 −4
Original line number Diff line number Diff line
@@ -487,7 +487,11 @@ static void* stdin_read_thread(void* x) {
                    state = 1;
                    break;
                case '~':
                    if(state == 1) state++;
                    if(state == 1) {
                        state++;
                    } else {
                        state = 0;
                    }
                    break;
                case '.':
                    if(state == 2) {
@@ -1351,15 +1355,20 @@ int adb_commandline(int argc, const char **argv) {
        // argv[0] is always "shell".
        --argc;
        ++argv;
        std::string shell_type_arg;
        int t_arg_count = 0;
        while (argc) {
            if (!strcmp(argv[0], "-T") || !strcmp(argv[0], "-t")) {
                if (!CanUseFeature(features, kFeatureShell2)) {
                    fprintf(stderr, "error: target doesn't support PTY args -Tt\n");
                    return 1;
                }
                shell_type_arg = (argv[0][1] == 'T') ? kShellServiceArgRaw
                                                     : kShellServiceArgPty;
                // Like ssh, -t arguments are cumulative so that multiple -t's
                // are needed to force a PTY.
                if (argv[0][1] == 't') {
                    ++t_arg_count;
                } else {
                    t_arg_count = -1;
                }
                --argc;
                ++argv;
            } else if (!strcmp(argv[0], "-x")) {
@@ -1371,6 +1380,33 @@ int adb_commandline(int argc, const char **argv) {
            }
        }

        std::string shell_type_arg;
        if (CanUseFeature(features, kFeatureShell2)) {
            if (t_arg_count < 0) {
                shell_type_arg = kShellServiceArgRaw;
            } else if (t_arg_count == 0) {
                // If stdin isn't a TTY, default to a raw shell; this lets
                // things like `adb shell < my_script.sh` work as expected.
                // Otherwise leave |shell_type_arg| blank which uses PTY for
                // interactive shells and raw for non-interactive.
                if (!isatty(STDIN_FILENO)) {
                    shell_type_arg = kShellServiceArgRaw;
                }
            } else if (t_arg_count == 1) {
                // A single -t arg isn't enough to override implicit -T.
                if (!isatty(STDIN_FILENO)) {
                    fprintf(stderr,
                            "Remote PTY will not be allocated because stdin is not a terminal.\n"
                            "Use multiple -t options to force remote PTY allocation.\n");
                    shell_type_arg = kShellServiceArgRaw;
                } else {
                    shell_type_arg = kShellServiceArgPty;
                }
            } else {
                shell_type_arg = kShellServiceArgPty;
            }
        }

        std::string command;
        if (argc) {
            // We don't escape here, just like ssh(1). http://b/20564385.