18c2ecf20Sopenharmony_ci#!/usr/bin/env python3
28c2ecf20Sopenharmony_ci#
38c2ecf20Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
48c2ecf20Sopenharmony_ci#
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ciimport sys, os, os.path, getopt
78c2ecf20Sopenharmony_ciimport socket, time
88c2ecf20Sopenharmony_ciimport subprocess
98c2ecf20Sopenharmony_ciimport select
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_cidef read(sock, n):
128c2ecf20Sopenharmony_ci    buf = b''
138c2ecf20Sopenharmony_ci    while len(buf) < n:
148c2ecf20Sopenharmony_ci        rem = n - len(buf)
158c2ecf20Sopenharmony_ci        try: s = sock.recv(rem)
168c2ecf20Sopenharmony_ci        except (socket.error) as e: return b''
178c2ecf20Sopenharmony_ci        buf += s
188c2ecf20Sopenharmony_ci    return buf
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_cidef send(sock, s):
218c2ecf20Sopenharmony_ci    total = len(s)
228c2ecf20Sopenharmony_ci    count = 0
238c2ecf20Sopenharmony_ci    while count < total:
248c2ecf20Sopenharmony_ci        try: n = sock.send(s)
258c2ecf20Sopenharmony_ci        except (socket.error) as e: n = 0
268c2ecf20Sopenharmony_ci        if n == 0:
278c2ecf20Sopenharmony_ci            return count;
288c2ecf20Sopenharmony_ci        count += n
298c2ecf20Sopenharmony_ci    return count
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ciSERVER_PORT = 12877
338c2ecf20Sopenharmony_ciMAX_PORTS = 2
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ciserverPort = SERVER_PORT
368c2ecf20Sopenharmony_ciserverSocket = None
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ci# create passive socket
398c2ecf20Sopenharmony_ciserverSocket = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_citry: serverSocket.bind(('::1', 0))
428c2ecf20Sopenharmony_ciexcept socket.error as msg:
438c2ecf20Sopenharmony_ci    print('bind fails: ' + str(msg))
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_cisn = serverSocket.getsockname()
468c2ecf20Sopenharmony_ciserverPort = sn[1]
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_cicmdStr = ("./tcp_client.py %d &") % (serverPort)
498c2ecf20Sopenharmony_cios.system(cmdStr)
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_cibuf = b''
528c2ecf20Sopenharmony_cin = 0
538c2ecf20Sopenharmony_ciwhile n < 500:
548c2ecf20Sopenharmony_ci    buf += b'.'
558c2ecf20Sopenharmony_ci    n += 1
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ciserverSocket.listen(MAX_PORTS)
588c2ecf20Sopenharmony_cireadList = [serverSocket]
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_ciwhile True:
618c2ecf20Sopenharmony_ci    readyRead, readyWrite, inError = \
628c2ecf20Sopenharmony_ci        select.select(readList, [], [], 2)
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_ci    if len(readyRead) > 0:
658c2ecf20Sopenharmony_ci        waitCount = 0
668c2ecf20Sopenharmony_ci        for sock in readyRead:
678c2ecf20Sopenharmony_ci            if sock == serverSocket:
688c2ecf20Sopenharmony_ci                (clientSocket, address) = serverSocket.accept()
698c2ecf20Sopenharmony_ci                address = str(address[0])
708c2ecf20Sopenharmony_ci                readList.append(clientSocket)
718c2ecf20Sopenharmony_ci            else:
728c2ecf20Sopenharmony_ci                sock.settimeout(1);
738c2ecf20Sopenharmony_ci                s = read(sock, 1000)
748c2ecf20Sopenharmony_ci                n = send(sock, buf)
758c2ecf20Sopenharmony_ci                sock.close()
768c2ecf20Sopenharmony_ci                serverSocket.close()
778c2ecf20Sopenharmony_ci                sys.exit(0)
788c2ecf20Sopenharmony_ci    else:
798c2ecf20Sopenharmony_ci        print('Select timeout!')
808c2ecf20Sopenharmony_ci        sys.exit(1)
81