From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mout.kundenserver.de (mout.kundenserver.de [217.72.192.73]) by sourceware.org (Postfix) with ESMTPS id D4273384C005 for ; Tue, 28 Jul 2020 16:56:12 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org D4273384C005 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=towo.net Authentication-Results: sourceware.org; spf=none smtp.mailfrom=towo@towo.net Received: from [192.168.178.45] ([95.90.245.244]) by mrelayeu.kundenserver.de (mreue109 [212.227.15.183]) with ESMTPSA (Nemesis) id 1N63NW-1kp8fT2Cmu-016Q9t for ; Tue, 28 Jul 2020 18:56:11 +0200 Subject: Re: stty -cooked not usable since cygwin-3.1.1-1 To: cygwin@cygwin.com References: <20200113200152.5243a304d481677c61c12450@nifty.ne.jp> <12d7cb6e-b900-6780-1d1c-80ed84cc82d5@bahnhof.se> <1ea4e90c-7075-39e8-a518-40bc764a5237@bahnhof.se> <20200729013848.cf6d4d99464e92d92d346029@nifty.ne.jp> From: Thomas Wolff X-Tagtoolbar-Keys: D20200728185606925 Message-ID: Date: Tue, 28 Jul 2020 18:56:06 +0200 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 MIME-Version: 1.0 In-Reply-To: <20200729013848.cf6d4d99464e92d92d346029@nifty.ne.jp> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit X-Provags-ID: V03:K1:pe47G2VxAI5gDmVIYk7F42/SYtSTJCDwxlC+Qz+YVmsvC96TWC4 WUtTyct35pDB3iYBseHORYUHawPQzRctG5wB+Ofz2HCuDxt/sWowV1Tj5vCzUAxJX8sQqN9 fUi1Y6VXU/IREs87TYGQ8NN4lXI8f1Wu3Yn5zsOZdwL3vPRjtuKkx+QC4dIWA6Bc+MCPPIc JHS5ysCNUjZavH5yM/H/g== X-UI-Out-Filterresults: notjunk:1;V03:K0:FNRjD7/rMLQ=:waT12jazGTtUPa2BfhQwF1 IehD1+80OygQxFIg1wfzTnMtY4Or77rJduVErJ6plpJNUV+k1eimqGjQupUGgDqNr7UfZV40q JexaBPtNY9IYw9yVE5HuY6JyyF1Gm7rWO3UTs3abXWkIKtcgsPgsJiU1k6Ux0FP95p/Fqr+T4 UmttP0rjLvbXp6GGgQq/LLWjAiWp2qEzkze1iTtTMXt8BUBVWTFNu8JawlL7UxRYjghSgi9FQ Otymr1Ieh4mTgsy9B1BaG/RUVB0KyRToEfGvmoSMffm60GPw+TP+SdjAw8Oe2+UWB1fMx9DUU dPpPepqPhcK1PPKp3Lm2fNJ0LywoZ+UoqCLcdlUnbf4DppODumWiUVAqri8n0Le3GgnQ5dco7 TyAhDf6I/6HpdTy5H3/ZkFb3ifMp/vIxiF1dusEtgGGnNA1dY332EhrbqRLV760WVPvSBx4Wk LRuNQVyPC2OedmCgWJ8yt4WgHgOx+SFSIQUTY5mn6PBZXiVyI12gPjd047mTTc/TFpKAv8fS5 SrzLKTYK1TCANaExTxwW0opJRCVb9O8aeBrT7Aly3UD3l2IrSxYdrld4aPgbrY65QwnlvnRwM 2VAPmrolmeL45bxTWpeJOrcLc7+kps4iMmvKvQzjd1AogEuOBl3VGcSkzZEpyxjqnVl0pxqx+ Q7vxu+dB7rBm7iVtt0h+CUQAal1oPwJQoWaHTEa9TGBOHOx4yEeg/uFZXTWUjUqfp7bbbZUjG JVHFc/mKWSSM1DbEha6uttvgvWwyILlcMTfCfauTaKXWbiZHYb33dyoobCYqRV8kTDU9217JZ /oLkdfbL4qnmebYIq4xwb+uMyqH0GXKDbSDR0MKzmU0i+ewakZJeT4O0p5Oq+szYjmE8kvs X-Spam-Status: No, score=-6.8 required=5.0 tests=BAYES_00, KAM_DMARC_STATUS, KAM_LAZY_DOMAIN_SECURITY, KAM_NUMSUBJECT, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=no autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: cygwin@cygwin.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: General Cygwin discussions and problem reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 28 Jul 2020 16:56:14 -0000 Am 28.07.2020 um 18:38 schrieb Takashi Yano via Cygwin: > On Tue, 28 Jul 2020 15:56:54 +0200 > Rabbe Fogelholm wrote: >> Rabbe Fogelholm wrote: >>> Takashi Yano wrote: >>>> On Mon, 13 Jan 2020 11:52:43 +0100 >>>> Rabbe Fogelholm wrote: >>>>> I am running a console Java program that is started from a shellscript >>>>> wrapper. Before invoking Java the wrapper calls `stty -cooked'. The Java >>>>> program polls the keyboard using System.in.available() and reads >>>>> characters immediately using System.in.read(), without waiting for the >>>>> Enter key to be pressed. >>>>> >>>>> This way of combining `stty -cooked' and Java has stopped working since >>>>> version 3.1.1-1 of the Cygwin package. The Java thread that reads the >>>>> keyboard hangs until Enter is pressed, which is not desirable. >>>>> >>>>> I had to downgrade to version 3.0.7-1 to resolve the problem. >>>>> >>>>> Versioning information: >>>>> >>>>> java version "1.8.0_202" >>>>> Java(TM) SE Runtime Environment (build 1.8.0_202-b08) >>>>> Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode) >>>>> >>>>> OS Name: Microsoft Windows 10 Pro >>>>> Version: 10.0.17763 Build 17763 >>>>> System Type: x64-based PC >>>>> >>>>> See also the enclosed cygcheck.out. >>>>> >>>>> To demonstrate the issue I enclose a small Java program that should be >>>>> able to read single keystrokes when `stty -cooked' is in effect. >>>> Does your java program work in command prompt? cygwin 3.1.x uses >>>> pseudo console, so the native (non cygwin) program works as if it >>>> is executed in command prompt. >>>> >>> With cygwin 3.1.x I can't find a way to make my program work. >>> >>> When running from within a Cygwin64 terminal the `stty -cooked' command >>> terminates with exit code 0, but the Java program behaves just as if >>> `stty -cooked' is not in effect: It does not handle single keystrokes >>> immediately. >>> >>> When running from a Windows command prompt I can execute the stty >>> program as \cygwin64\bin\stty. However, when given the '-cooked' >>> argument it complains: >>> /usr/bin/stty: 'standard input': unable to perform all requested operations >>> >>> - and here as well the Java program behaves as if `stty -cooked' is not >>> in effect. >> Some time has passed; I am just curious if anyone may have found a >> solution to the "stty -cooked" issue. With cygwin-3.0.* it was possible >> to have a Java program act on single keystrokes, with cygwin-3.1 I don't >> know how to do it. Any ideas welcome! > Solution 1: > Redesign your java program using JNA with kbhit()/getch() instead of > System.in.available()/System.in.read(). > > Solution 2: > Add SetConsoleMode() call with ENABLE_LINE_INPUT flag cleared using JNA. Couldn't cygwin clear this flag when it sets up ConPTY while the pty is in raw mode? Thomas > > Solution 3: > Use a wrappwer instead of stty such as: > > #include > #include > #include > #include > #include > #include > > void *fwd(void *param) > { > FILE *f = (FILE *) param; > char buf[128]; > int len; > while (1) { > if ((len = read(0, buf, sizeof(buf))) <= 0) break; > if (write(fileno(f), buf, len) < len) break; > } > return NULL; > } > > int main(int argc, char *argv[]) > { > FILE *f; > int i; > pthread_t th; > struct termios t, t_orig; > char cmd[1024] = {0, }; > if (argc < 2) return 0; > for (i = 1; i < argc && strlen(cmd)+strlen(argv[i]) < sizeof(cmd)-2; i++) { > sprintf(cmd + strlen(cmd), (i>1)?" %s":"%s", argv[i]); > } > f = popen(cmd, "w"); > tcgetattr(0, &t_orig); > t = t_orig; > cfmakeraw(&t); > tcsetattr(0, TCSANOW, &t); > pthread_create(&th, NULL, fwd, f); > wait(NULL); > tcsetattr(0, TCSANOW, &t_orig); > pclose(f); > return 0; > } >