delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2020/07/28/12:40:06

X-Recipient: archive-cygwin AT delorie DOT com
DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A8136386F809
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cygwin.com;
s=default; t=1595954360;
bh=ds/qo71CcMIRf+E+88GkVv9C+zW4BwEJHbHrv78rYTw=;
h=Date:To:Subject:In-Reply-To:References:List-Id:List-Unsubscribe:
List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:
From;
b=SH9iJkEYqLYULztTjw54mHofPRoVb8PNaidu7rYImdniIYuZhwVHazLnDr5HOsXIx
56qpCeYAfdiBHUWIUA376Qalgk3rb0Pk5cNv2xYGh1BOnwClHDbM1XKmcV21pl7HIe
BBPJjiUgENUQbOa3NAOFBdKzkUW9ybrChbWPucnc=
X-Original-To: cygwin AT cygwin DOT com
Delivered-To: cygwin AT cygwin DOT com
DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org E5CF63857C5A
DKIM-Filter: OpenDKIM Filter v2.10.3 conssluserg-05.nifty.com 06SGcfZR023657
X-Nifty-SrcIP: [124.155.38.192]
Date: Wed, 29 Jul 2020 01:38:48 +0900
To: cygwin AT cygwin DOT com
Subject: Re: stty -cooked not usable since cygwin-3.1.1-1
Message-Id: <20200729013848.cf6d4d99464e92d92d346029@nifty.ne.jp>
In-Reply-To: <1ea4e90c-7075-39e8-a518-40bc764a5237@bahnhof.se>
References: <ad285b65-fed9-e6e5-eb3f-432fadc95daf AT bahnhof DOT se>
<20200113200152 DOT 5243a304d481677c61c12450 AT nifty DOT ne DOT jp>
<12d7cb6e-b900-6780-1d1c-80ed84cc82d5 AT bahnhof DOT se>
<1ea4e90c-7075-39e8-a518-40bc764a5237 AT bahnhof DOT se>
X-Mailer: Sylpheed 3.7.0 (GTK+ 2.24.30; i686-pc-mingw32)
Mime-Version: 1.0
X-Spam-Status: No, score=-0.8 required=5.0 tests=BAYES_00, DKIM_SIGNED,
DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, KAM_NUMSUBJECT,
RCVD_IN_BARRACUDACENTRAL, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS,
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 AT cygwin DOT com
X-Mailman-Version: 2.1.29
List-Id: General Cygwin discussions and problem reports <cygwin.cygwin.com>
List-Unsubscribe: <https://cygwin.com/mailman/options/cygwin>,
<mailto:cygwin-request AT cygwin DOT com?subject=unsubscribe>
List-Archive: <https://cygwin.com/pipermail/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-request AT cygwin DOT com?subject=help>
List-Subscribe: <https://cygwin.com/mailman/listinfo/cygwin>,
<mailto:cygwin-request AT cygwin DOT com?subject=subscribe>
From: Takashi Yano via Cygwin <cygwin AT cygwin DOT com>
Reply-To: Takashi Yano <takashi DOT yano AT nifty DOT ne DOT jp>
Errors-To: cygwin-bounces AT cygwin DOT com
Sender: "Cygwin" <cygwin-bounces AT cygwin DOT com>

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. 

Solution 3:
Use a wrappwer instead of stty such as:

#include <stdio.h>
#include <unistd.h>
#include <termios.h>
#include <string.h>
#include <pthread.h>
#include <sys/wait.h>

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;
}

-- 
Takashi Yano <takashi DOT yano AT nifty DOT ne DOT jp>
--
Problem reports:      https://cygwin.com/problems.html
FAQ:                  https://cygwin.com/faq/
Documentation:        https://cygwin.com/docs.html
Unsubscribe info:     https://cygwin.com/ml/#unsubscribe-simple

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019