From 47e178190744e65079a821f40148eebcaa92bf76 Mon Sep 17 00:00:00 2001 From: Max Date: Wed, 11 Jan 2017 15:10:16 +0100 Subject: [PATCH] bsc_control.py: fix blocking Previously reading from socket would block if no data were sent by the server. Use non-blocking read for set and get operations. Change-Id: I706d54a4a7ceef62683bf9a2fe63fc9ab331c24e --- openbsc/contrib/bsc_control.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/openbsc/contrib/bsc_control.py b/openbsc/contrib/bsc_control.py index 66a41eb98..3a7964de6 100755 --- a/openbsc/contrib/bsc_control.py +++ b/openbsc/contrib/bsc_control.py @@ -30,8 +30,14 @@ def get_var(sck, var): (_, _, v) = do_set_get(sck, var) return v -def _leftovers(sck): - data = sck.recv(1024) +def _leftovers(sck, fl): + """ + Read outstanding data if any according to flags + """ + try: + data = sck.recv(1024, fl) + except socket.error as (s_errno, strerror): + return False if len(data) != 0: tail = data while True: @@ -75,19 +81,19 @@ if __name__ == '__main__': if options.cmd_set: if len(args) < 2: parser.error("Set requires var and value arguments") - _leftovers(sock) + _leftovers(sock, socket.MSG_DONTWAIT) print "Got message:", set_var(sock, args[0], ' '.join(args[1:])) if options.cmd_get: if len(args) != 1: parser.error("Get requires the var argument") - _leftovers(sock) + _leftovers(sock, socket.MSG_DONTWAIT) (a, _, _) = do_set_get(sock, args[0]) print "Got message:", a if options.monitor: while True: - if not _leftovers(sock): + if not _leftovers(sock, 0): print "Connection is gone." break sock.close()