From a565bdd57dc4d0d31525fab9a6b4a415d990ac89 Mon Sep 17 00:00:00 2001
From: cody burkard <cody@onlab.us>
Date: Fri, 26 Sep 2014 23:33:59 -0700
Subject: [PATCH] fix popen to work with shell

---
 examples/sshd.py |  3 +--
 mininet/util.py  | 25 +++++++++++++++----------
 2 files changed, 16 insertions(+), 12 deletions(-)

diff --git a/examples/sshd.py b/examples/sshd.py
index bd50e189..ee804163 100755
--- a/examples/sshd.py
+++ b/examples/sshd.py
@@ -60,10 +60,9 @@ def sshd( network, cmd='/usr/sbin/sshd', opts='-D',
     connectToRootNS( network, switch, ip, routes )
     for host in network.hosts:
         host.cmd( cmd + ' ' + opts + '&' )
-    client = network.switches[ 0 ]
     # wait until each host's sshd has started up
     for server in network.hosts:
-        waitListening( client, server, 22, timeout=5 )
+        waitListening( server=server, port=22, timeout=5 )
 
     print
     print "*** Hosts are running sshd at the following addresses:"
diff --git a/mininet/util.py b/mininet/util.py
index 5d741ffc..f8192597 100644
--- a/mininet/util.py
+++ b/mininet/util.py
@@ -10,6 +10,7 @@
 from fcntl import fcntl, F_GETFL, F_SETFL
 from os import O_NONBLOCK
 import os
+from functools import partial
 
 # Command execution support
 
@@ -61,12 +62,6 @@ def errRun( *cmd, **kwargs ):
        stderr: STDOUT to merge stderr with stdout
        shell: run command using shell
        echo: monitor output to console"""
-    # Allow passing in a list or a string
-    if len( cmd ) == 1:
-        cmd = cmd[ 0 ]
-        if isinstance( cmd, str ):
-            cmd = cmd.split( ' ' )
-    cmd = [ str( arg ) for arg in cmd ]
     # By default we separate stderr, don't run in a shell, and don't echo
     stderr = kwargs.get( 'stderr', PIPE )
     shell = kwargs.get( 'shell', False )
@@ -74,6 +69,14 @@ def errRun( *cmd, **kwargs ):
     if echo:
         # cmd goes to stderr, output goes to stdout
         info( cmd, '\n' )
+    if len( cmd ) == 1:
+        cmd = cmd[ 0 ]
+    # Allow passing in a list or a string
+    if isinstance( cmd, str ) and not shell:
+        cmd = cmd.split( ' ' )
+        cmd = [ str( arg ) for arg in cmd ]
+    elif isinstance( cmd, list ) and shell:
+        cmd = " ".join( arg for arg in cmd )
     popen = Popen( cmd, stdout=PIPE, stderr=stderr, shell=shell )
     # We use poll() because select() doesn't work with large fd numbers,
     # and thus communicate() doesn't work either
@@ -539,18 +542,20 @@ def ensureRoot():
         exit( 1 )
     return
 
-def waitListening( client, server, port, timeout=None ):
+def waitListening( client=None, server='127.0.0.1', port=80, timeout=None ):
     "Wait until server is listening on port"
-    if not client.cmd( 'which telnet' ):
+    run = ( client.cmd if client else
+                partial( quietRun, shell=True ) )
+    if not run( 'which telnet' ):
         raise Exception('Could not find telnet' )
     cmd = ( 'sh -c "echo A | telnet -e A %s %s"' %
            ( server.IP(), port ) )
     time = 0
-    while 'Connected' not in client.cmd( cmd ):
+    while 'Connected' not in run( cmd ):
         if timeout:
             if time >= timeout:
                 error( 'could not connect to %s on port %d\n'
-                       % ( client, port ) )
+                       % ( server, port ) )
                 break
         output('waiting for', server,
                'to listen on port', port, '\n')
-- 
GitLab