Blocking a sonata on stdin

I have a bash script as shown on the AIX host, myscript.sh:

MODE="$1"
if [ "$MODE" == "start" ]; then
    socat -T100 -lf $LOGF -d -d -d -x TCP4-LISTEN:$LISTENINGPORT,bind=$LISTENINGADDR,reuseaddr,fork EXEC:"$0 proxy" &
    PID=$!
    echo $PID > $PIDFILE
    echo "$0 $MODE started (pid=$PID)"

elif [ "$MODE" == "proxy" ]; then
    cat - > $TMPFILE
    # process $TMPFILE before the SSL connection.
    cat $TMPFILE | socat -T 100 -lf $LOGF -d - OPENSSL:$HOST
    rm -f $TMPFILE

      

Everything is fine when I run:

$ cat somefile | myscript.sh proxy | xxd

      

The problem occurs when I connect to a socat listener with a test script:

my $file = $ARGV[0];
my $fsize = -s $file;
my $socket = IO::Socket::INET->new("127.0.0.1:$port")
    or die "Couldn't connect to remote host: $!";
$socket->autoflush(1);
binmode($socket);
open (FILE,$file);
binmode(FILE);
my $buffer ;
while(sysread(FILE, $buffer, $blocksize)) {
    print $socket $buffer ;
}
print "sent\n" ;
close (FILE) ;

my $answer = <$socket>;
if (defined($answer)) {
    print $answer; # never reached
print "...\n" ;
} else {
    die "connection reset by peer\n";
}

      

In myscript.sh, it blocks at line:

cat - > $TMPFILE

      

In the test script, it blocks the line:

my $answer = <$socket>;

      

At this point, data has been received by the socat listener (verified with tcpdump).

However, when I Ctrl+ ctest the script before the socat timeout, the data goes through the channel (i.e. ultimately the SSL server).

What am I doing wrong?

Update: Thanks for the tips about the cat and the EOF. At the moment I have been working on the problem as follows:

timeout 0.2 cat -u - > $TMPFILE 2>>/dev/null
# process $TMPFILE before the SSL connection.
cat $TMPFILE | socat -T 100 -lf $LOGF -d - OPENSSL:$HOST

      

It's ugly and a waste of 0.2 seconds, I hope to find a better solution. But now it works. Part 2 -> / dev / null is that AIX is complaining about an invalid counter (associated with the timeout command).

+3


source to share


1 answer


My first thought is that there is no newline in the data you are trying to retrieve with cat -

or <STDIN>

. Both commands, in their default behavior, return data after their newline, or their file descriptor buffers are full (default on Linux 4K).



+1


source







All Articles