1
0
mirror of https://blitiri.com.ar/repos/chasquid synced 2025-12-17 14:37:02 +00:00
Files
go-chasquid-smtp/test/util/nc.py
Alberto Bertogli c2ea8a8ef0 test: Use our own netcat implementation :(
Netcat's behaviour after seeing EOF from stdin seems to not be very
portable or consistent, even under the same platform.

This has caused t-05-null_address to break recently under some
conditions, for example depending on the particular Debian version of
netcat-openbsd used, and the current situation is unclear.
See https://bugs.debian.org/854292 and https://bugs.debian.org/849192
for more details.

To stop depending on this brittle behaviour, this patch unfortunately
introduces a simple python3-based netcat for our tests to use.
2017-02-26 01:21:35 +00:00

51 lines
1.1 KiB
Python
Executable File

#!/usr/bin/env python3
#
# Simple "netcat" implementation.
# Unfortunately netcat/nc is not that portable, so this contains a simple
# implementation which fits our needs.
import argparse
import threading
import smtplib
import socket
import sys
ap = argparse.ArgumentParser()
ap.add_argument("-z", action='store_true', help="scan for listening daemons")
ap.add_argument("host", help="host to connect to")
ap.add_argument("port", type=int, help="port to connect to")
args = ap.parse_args()
address = (args.host, args.port)
try:
sock = socket.create_connection(address)
fd = sock.makefile('rw', buffering=1, encoding="utf-8")
except OSError:
# Exit quietly, like nc does.
sys.exit(1)
if args.z:
sys.exit(0)
# stdin -> socket in the background. Do a partial shutdown when done.
def stdin_to_sock():
for line in sys.stdin:
fd.write(line)
fd.flush()
try:
sock.shutdown(socket.SHUT_WR)
except OSError:
pass
t1 = threading.Thread(target=stdin_to_sock, daemon=True)
t1.start()
# socket -> stdout in the foreground; if the socket closes, exit.
for line in fd:
sys.stdout.write(line)
sys.stdout.flush()