(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:HIJACKING)
          op: assign_op.Equal
          rhs: {(DQ <'env LD_PRELOAD=/usr/lib/librumphijack.so RUMPHIJACK=sysctl=yes'>)}
          spids: [89]
        )
      ]
    )
    (command.ShFunction
      name: extract_new_packets
      body: 
        (BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'bus='> ($ Id.VSub_Number '$1')})
            (C {<local>} {<Id.Lit_VarLike 'old='> <'./.__old'>})
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} {<-f>} 
                              {($ Id.VSub_DollarName '$old')} {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:old)
                          op: assign_op.Equal
                          rhs: {<'/dev/null'>}
                          spids: [131]
                        )
                      ]
                    )
                  ]
                  spids: [115 128]
                )
              ]
            )
            (command.Pipeline
              children: [
                (command.Simple
                  words: [{<shmif_dumpbus>} {<-p>} {<->} {($ Id.VSub_DollarName '$bus')}]
                  redirects: [
                    (redir
                      op: <Id.Redir_Great '2>'>
                      loc: (redir_loc.Fd fd:2)
                      arg: {<'/dev/null'>}
                    )
                  ]
                  do_fork: T
                )
                (command.Simple
                  words: [{<tcpdump>} {<-n>} {<-e>} {<-r>} {<->}]
                  redirects: [
                    (redir
                      op: <Id.Redir_Great '2>'>
                      loc: (redir_loc.Fd fd:2)
                      arg: {<'/dev/null'>}
                    )
                    (redir
                      op: <Id.Redir_Great '>'>
                      loc: (redir_loc.Fd fd:1)
                      arg: {<'./.__new'>}
                    )
                  ]
                  do_fork: T
                )
              ]
              negated: F
            )
            (command.Pipeline
              children: [
                (C {<diff>} {<-u>} {($ Id.VSub_DollarName '$old')} {<'./.__new'>})
                (C {<grep>} {(SQ <'^+'>)})
                (command.Simple
                  words: [{<cut>} {<-d>} {(SQ <'+'>)} {<-f>} {<2>}]
                  redirects: [
                    (redir
                      op: <Id.Redir_Great '>'>
                      loc: (redir_loc.Fd fd:1)
                      arg: {<'./.__diff'>}
                    )
                  ]
                  do_fork: T
                )
              ]
              negated: F
            )
            (C {<mv>} {<-f>} {<'./.__new'>} {<'./.__old'>})
            (C {<cat>} {<'./.__diff'>})
          ]
        )
    )
    (command.ShFunction
      name: check_route
      body: 
        (BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'target='> ($ Id.VSub_Number '$1')})
            (C {<local>} {<Id.Lit_VarLike 'gw='> ($ Id.VSub_Number '$2')})
            (C {<local>} 
              {<Id.Lit_VarLike 'flags='> 
                (braced_var_sub
                  token: <Id.VSub_Number 3>
                  suffix_op: 
                    (suffix_op.Unary
                      tok: <Id.VTest_ColonHyphen ':-'>
                      arg_word: 
                        {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\.'>) 
                          (word_part.EscapedLiteral
                            token: <Id.Lit_EscapedChar '\\+'>
                          )
                        }
                    )
                )
              }
            )
            (C {<local>} 
              {<Id.Lit_VarLike 'ifname='> 
                (braced_var_sub
                  token: <Id.VSub_Number 4>
                  suffix_op: 
                    (suffix_op.Unary
                      tok: <Id.VTest_ColonHyphen ':-'>
                      arg_word: 
                        {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\.'>) 
                          (word_part.EscapedLiteral
                            token: <Id.Lit_EscapedChar '\\+'>
                          )
                        }
                    )
                )
              }
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:target)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (command_sub
                        left_token: <Id.Left_DollarParen '$('>
                        child: 
                          (command.Pipeline
                            children: [
                              (C {<echo>} {($ Id.VSub_DollarName '$target')})
                              (C {<sed>} {(SQ <'s/\\./\\\\./g'>)})
                            ]
                            negated: F
                          )
                      )
                    }
                  spids: [262]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$gw'))} 
                              {<Id.Lit_Equals '='>} {(DQ )} {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:gw)
                          op: assign_op.Equal
                          rhs: {(DQ <'.+'>)}
                          spids: [296]
                        )
                      ]
                    )
                  ]
                  spids: [277 293]
                )
              ]
              else_action: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:gw)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (command_sub
                            left_token: <Id.Left_DollarParen '$('>
                            child: 
                              (command.Pipeline
                                children: [
                                  (C {<echo>} {($ Id.VSub_DollarName '$gw')})
                                  (C {<sed>} {(SQ <'s/\\./\\\\./g'>)})
                                ]
                                negated: F
                              )
                          )
                        }
                      spids: [305]
                    )
                  ]
                )
              ]
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-e>} {<ignore>} 
              {<-o>} 
              {<match> <Id.Lit_Colon ':'> 
                (DQ <'^'> ($ Id.VSub_DollarName '$target') <' +'> ($ Id.VSub_DollarName '$gw') <' +'> 
                  ($ Id.VSub_DollarName '$flags') <' +- +- +.+ +'> ($ Id.VSub_DollarName '$ifname')
                )
              } {<rump.netstat>} {<-rn>}
            )
          ]
        )
    )
    (command.ShFunction
      name: check_route_flags
      body: 
        (BraceGroup
          children: [
            (C {<check_route>} {(DQ ($ Id.VSub_Number '$1'))} {(DQ )} {(DQ ($ Id.VSub_Number '$2'))} {(DQ )})
          ]
        )
    )
    (command.ShFunction
      name: check_route_gw
      body: 
        (BraceGroup
          children: [(C {<check_route>} {(DQ ($ Id.VSub_Number '$1'))} {(DQ ($ Id.VSub_Number '$2'))} {(DQ )} {(DQ )})]
        )
    )
    (command.ShFunction
      name: check_route_no_entry
      body: 
        (BraceGroup
          children: [
            (C {<local>} 
              {<Id.Lit_VarLike 'target='> 
                (command_sub
                  left_token: <Id.Left_DollarParen '$('>
                  child: 
                    (command.Pipeline
                      children: [
                        (C {<echo>} {($ Id.VSub_Number '$1')})
                        (C {<sed>} {(SQ <'s/\\./\\\\./g'>)})
                      ]
                      negated: F
                    )
                )
              }
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-e>} {<ignore>} 
              {<-o>} {<not-match> <Id.Lit_Colon ':'> (DQ <'^'> ($ Id.VSub_DollarName '$target'))} {<rump.netstat>} {<-rn>}
            )
          ]
        )
    )
    (command.ShFunction
      name: get_linklocal_addr
      body: 
        (BraceGroup
          children: [
            (C {<export>} {<Id.Lit_VarLike 'RUMP_SERVER='> (${ Id.VSub_Number 1)})
            (command.Pipeline
              children: [
                (C {<rump.ifconfig>} {(${ Id.VSub_Number 2)} {<inet6>})
                (C {<awk>} 
                  {
                    (DQ <'/fe80/ {sub(/%'> ($ Id.VSub_Number '$2') <'/, '> 
                      (word_part.EscapedLiteral
                        token: <Id.Lit_EscapedChar '\\"'>
                      ) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) <'); sub(/'> 
                      (word_part.EscapedLiteral
                        token: <Id.Lit_EscapedChar '\\\\'>
                      ) <'/[0-9]*/, '> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) 
                      (word_part.EscapedLiteral
                        token: <Id.Lit_EscapedChar '\\"'>
                      ) <'); print '> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\$'>) <'2;}'>
                    )
                  }
                )
              ]
              negated: F
            )
            (C {<unset>} {<RUMP_SERVER>})
            (command.ControlFlow token:<Id.ControlFlow_Return return> arg_word:{<0>})
          ]
        )
    )
    (command.ShFunction
      name: get_macaddr
      body: 
        (BraceGroup
          children: [
            (command.Pipeline
              children: [
                (C {<env>} {<Id.Lit_VarLike 'RUMP_SERVER='> (${ Id.VSub_Number 1)} {<rump.ifconfig>} 
                  {(${ Id.VSub_Number 2)}
                )
                (C {<awk>} {(SQ <'/address/ {print $2;}'>)})
              ]
              negated: F
            )
          ]
        )
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:HTTPD_PID)
          op: assign_op.Equal
          rhs: {<'./.__httpd.pid'>}
          spids: [563]
        )
      ]
    )
    (command.ShFunction
      name: start_httpd
      body: 
        (BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'sock='> ($ Id.VSub_Number '$1')})
            (C {<local>} {<Id.Lit_VarLike 'ip='> ($ Id.VSub_Number '$2')})
            (C {<local>} {<Id.Lit_VarLike 'backup='> ($ Id.VSub_DollarName '$RUMP_SERVER')})
            (C {<export>} {<Id.Lit_VarLike 'RUMP_SERVER='> ($ Id.VSub_DollarName '$sock')})
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<env>} 
              {<Id.Lit_VarLike 'LD_PRELOAD='> <'/usr/lib/librumphijack.so'>} {<'/usr/libexec/httpd'>} {<-P>} {($ Id.VSub_DollarName '$HTTPD_PID')} {<-i>} 
              {($ Id.VSub_DollarName '$ip')} {<-b>} {<-s>} {(command_sub left_token:<Id.Left_DollarParen '$('> child:(C {<pwd>}))}
            )
            (C {<export>} {<Id.Lit_VarLike 'RUMP_SERVER='> ($ Id.VSub_DollarName '$backup')})
            (C {<sleep>} {<3>})
          ]
        )
    )
    (command.ShFunction
      name: stop_httpd
      body: 
        (BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-f>} {($ Id.VSub_DollarName '$HTTPD_PID')} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<kill>} {<-9>} 
                      {
                        (command_sub
                          left_token: <Id.Left_DollarParen '$('>
                          child: (C {<cat>} {($ Id.VSub_DollarName '$HTTPD_PID')})
                        )
                      }
                    )
                    (C {<rm>} {<-f>} {($ Id.VSub_DollarName '$HTTPD_PID')})
                    (C {<sleep>} {<1>})
                  ]
                  spids: [660 671]
                )
              ]
            )
          ]
        )
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:BASIC_LIBS)
          op: assign_op.Equal
          rhs: {(DQ <'-lrumpnet -lrumpnet_net -lrumpnet_netinet '> <'    -lrumpnet_shmif -lrumpdev'>)}
          spids: [702]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:FS_LIBS)
          op: assign_op.Equal
          rhs: {(DQ ($ Id.VSub_DollarName '$BASIC_LIBS') <' -lrumpvfs -lrumpfs_ffs'>)}
          spids: [709]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:_rump_server_socks)
          op: assign_op.Equal
          rhs: {<'./.__socks'>}
          spids: [719]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:_rump_server_ifaces)
          op: assign_op.Equal
          rhs: {<'./.__ifaces'>}
          spids: [722]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:_rump_server_buses)
          op: assign_op.Equal
          rhs: {<'./.__buses'>}
          spids: [725]
        )
      ]
    )
    (command.ShFunction
      name: _rump_server_start_common
      body: 
        (BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'sock='> ($ Id.VSub_Number '$1')})
            (C {<local>} {<Id.Lit_VarLike 'libs='>})
            (C {<shift>} {<1>})
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:libs)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_Star '$*'))}
                  spids: [753]
                )
              ]
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<rump_server>} 
              {($ Id.VSub_DollarName '$libs')} {($ Id.VSub_DollarName '$sock')}
            )
            (command.Simple
              words: [{<echo>} {($ Id.VSub_DollarName '$sock')}]
              redirects: [
                (redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$_rump_server_socks')}
                )
              ]
              do_fork: T
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {($ Id.VSub_DollarName '$DEBUG')})
                (C {<cat>} {($ Id.VSub_DollarName '$_rump_server_socks')})
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: rump_server_start
      body: 
        (BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'sock='> ($ Id.VSub_Number '$1')})
            (C {<local>} {<Id.Lit_VarLike '_libs='>})
            (C {<local>} {<Id.Lit_VarLike 'libs='> (DQ ($ Id.VSub_DollarName '$BASIC_LIBS'))})
            (C {<shift>} {<1>})
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_libs)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_Star '$*'))}
                  spids: [828]
                )
              ]
            )
            (command.ForEach
              iter_names: [lib]
              iterable: (for_iter.Words words:[{($ Id.VSub_DollarName '$_libs')}])
              body: 
                (command.DoGroup
                  children: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:libs)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (DQ ($ Id.VSub_DollarName '$libs') <' -lrumpnet_'> 
                                ($ Id.VSub_DollarName '$lib')
                              )
                            }
                          spids: [847]
                        )
                      ]
                    )
                  ]
                )
            )
            (C {<_rump_server_start_common>} {($ Id.VSub_DollarName '$sock')} 
              {($ Id.VSub_DollarName '$libs')}
            )
            (command.ControlFlow token:<Id.ControlFlow_Return return> arg_word:{<0>})
          ]
        )
    )
    (command.ShFunction
      name: rump_server_fs_start
      body: 
        (BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'sock='> ($ Id.VSub_Number '$1')})
            (C {<local>} {<Id.Lit_VarLike '_libs='>})
            (C {<local>} {<Id.Lit_VarLike 'libs='> (DQ ($ Id.VSub_DollarName '$FS_LIBS'))})
            (C {<shift>} {<1>})
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_libs)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_Star '$*'))}
                  spids: [906]
                )
              ]
            )
            (command.ForEach
              iter_names: [lib]
              iterable: (for_iter.Words words:[{($ Id.VSub_DollarName '$_libs')}])
              body: 
                (command.DoGroup
                  children: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:libs)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (DQ ($ Id.VSub_DollarName '$libs') <' -lrumpnet_'> 
                                ($ Id.VSub_DollarName '$lib')
                              )
                            }
                          spids: [925]
                        )
                      ]
                    )
                  ]
                )
            )
            (C {<_rump_server_start_common>} {($ Id.VSub_DollarName '$sock')} 
              {($ Id.VSub_DollarName '$libs')}
            )
            (command.ControlFlow token:<Id.ControlFlow_Return return> arg_word:{<0>})
          ]
        )
    )
    (command.ShFunction
      name: rump_server_add_iface
      body: 
        (BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'sock='> ($ Id.VSub_Number '$1')})
            (C {<local>} {<Id.Lit_VarLike 'ifname='> ($ Id.VSub_Number '$2')})
            (C {<local>} {<Id.Lit_VarLike 'bus='> ($ Id.VSub_Number '$3')})
            (C {<local>} {<Id.Lit_VarLike 'backup='> ($ Id.VSub_DollarName '$RUMP_SERVER')})
            (C {<export>} {<Id.Lit_VarLike 'RUMP_SERVER='> ($ Id.VSub_DollarName '$sock')})
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<rump.ifconfig>} 
              {($ Id.VSub_DollarName '$ifname')} {<create>}
            )
            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<rump.ifconfig>} 
              {($ Id.VSub_DollarName '$ifname')} {<linkstr>} {($ Id.VSub_DollarName '$bus')}
            )
            (C {<export>} {<Id.Lit_VarLike 'RUMP_SERVER='> ($ Id.VSub_DollarName '$backup')})
            (command.Simple
              words: [{<echo>} {($ Id.VSub_DollarName '$sock')} {($ Id.VSub_DollarName '$ifname')}]
              redirects: [
                (redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$_rump_server_ifaces')}
                )
              ]
              do_fork: T
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {($ Id.VSub_DollarName '$DEBUG')})
                (C {<cat>} {($ Id.VSub_DollarName '$_rump_server_ifaces')})
              ]
            )
            (command.Simple
              words: [{<echo>} {($ Id.VSub_DollarName '$bus')}]
              redirects: [
                (redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$_rump_server_buses')}
                )
              ]
              do_fork: T
            )
            (command.Pipeline
              children: [
                (C {<cat>} {($ Id.VSub_DollarName '$_rump_server_buses')})
                (command.Simple
                  words: [{<sort>} {<-u>}]
                  redirects: [
                    (redir
                      op: <Id.Redir_Great '>'>
                      loc: (redir_loc.Fd fd:1)
                      arg: {<'./.__tmp'>}
                    )
                  ]
                  do_fork: T
                )
              ]
              negated: F
            )
            (C {<mv>} {<-f>} {<'./.__tmp'>} {($ Id.VSub_DollarName '$_rump_server_buses')})
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {($ Id.VSub_DollarName '$DEBUG')})
                (C {<cat>} {($ Id.VSub_DollarName '$_rump_server_buses')})
              ]
            )
            (command.ControlFlow token:<Id.ControlFlow_Return return> arg_word:{<0>})
          ]
        )
    )
    (command.ShFunction
      name: rump_server_destroy_ifaces
      body: 
        (BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'backup='> ($ Id.VSub_DollarName '$RUMP_SERVER')})
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {($ Id.VSub_DollarName '$DEBUG')})
                (C {<cat>} {($ Id.VSub_DollarName '$_rump_server_ifaces')})
              ]
            )
            (command.ForEach
              iter_names: [sock]
              iterable: 
                (for_iter.Words
                  words: [
                    {
                      (command_sub
                        left_token: <Id.Left_DollarParen '$('>
                        child: (C {<cat>} {($ Id.VSub_DollarName '$_rump_server_socks')})
                      )
                    }
                  ]
                )
              body: 
                (command.DoGroup
                  children: [
                    (C {<export>} {<Id.Lit_VarLike 'RUMP_SERVER='> ($ Id.VSub_DollarName '$sock')})
                    (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
                      {<ignore>} {<rump.ifconfig>}
                    )
                    (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
                      {<ignore>} {<rump.netstat>} {<-nr>}
                    )
                    (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
                      {<ignore>} {($ Id.VSub_DollarName '$HIJACKING')} {<rump.netstat>} {<-i>} {<-a>}
                    )
                    (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
                      {<ignore>} {<rump.arp>} {<-na>}
                    )
                    (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
                      {<ignore>} {<rump.ndp>} {<-na>}
                    )
                    (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
                      {<ignore>} {($ Id.VSub_DollarName '$HIJACKING')} {<ifmcstat>}
                    )
                  ]
                )
            )
            (command.WhileUntil
              keyword: <Id.KW_While while>
              cond: 
                (condition.Shell
                  commands: [
                    (command.Sentence
                      child: (C {<read>} {<sock>} {<ifname>})
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                )
              body: 
                (command.DoGroup
                  children: [
                    (C {<export>} {<Id.Lit_VarLike 'RUMP_SERVER='> ($ Id.VSub_DollarName '$sock')})
                    (command.If
                      arms: [
                        (if_arm
                          cond: 
                            (condition.Shell
                              commands: [
                                (command.Sentence
                                  child: 
                                    (command.Pipeline
                                      children: [
                                        (C {<rump.ifconfig>} {<-l>})
                                        (C {<grep>} {<-q>} {($ Id.VSub_DollarName '$ifname')})
                                      ]
                                      negated: F
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          action: [
                            (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} 
                              {<rump.ifconfig>} {($ Id.VSub_DollarName '$ifname')} {<destroy>}
                            )
                          ]
                          spids: [1286 1300]
                        )
                      ]
                    )
                    (C {<atf_check>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<-o>} 
                      {<ignore>} {<rump.ifconfig>}
                    )
                  ]
                )
              redirects: [
                (redir
                  op: <Id.Redir_Less '<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: {($ Id.VSub_DollarName '$_rump_server_ifaces')}
                )
              ]
            )
            (C {<export>} {<Id.Lit_VarLike 'RUMP_SERVER='> ($ Id.VSub_DollarName '$backup')})
            (command.ControlFlow token:<Id.ControlFlow_Return return> arg_word:{<0>})
          ]
        )
    )
    (command.ShFunction
      name: rump_server_halt_servers
      body: 
        (BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'backup='> ($ Id.VSub_DollarName '$RUMP_SERVER')})
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {($ Id.VSub_DollarName '$DEBUG')})
                (C {<cat>} {($ Id.VSub_DollarName '$_rump_server_socks')})
              ]
            )
            (command.ForEach
              iter_names: [sock]
              iterable: 
                (for_iter.Words
                  words: [
                    {
                      (command_sub
                        left_token: <Id.Left_DollarParen '$('>
                        child: (C {<cat>} {($ Id.VSub_DollarName '$_rump_server_socks')})
                      )
                    }
                  ]
                )
              body: 
                (command.DoGroup
                  children: [
                    (C {<env>} {<Id.Lit_VarLike 'RUMP_SERVER='> ($ Id.VSub_DollarName '$sock')} 
                      {<rump.halt>}
                    )
                  ]
                )
            )
            (C {<export>} {<Id.Lit_VarLike 'RUMP_SERVER='> ($ Id.VSub_DollarName '$backup')})
            (command.ControlFlow token:<Id.ControlFlow_Return return> arg_word:{<0>})
          ]
        )
    )
    (command.ShFunction
      name: rump_server_dump_servers
      body: 
        (BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'backup='> ($ Id.VSub_DollarName '$RUMP_SERVER')})
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {($ Id.VSub_DollarName '$DEBUG')})
                (C {<cat>} {($ Id.VSub_DollarName '$_rump_server_socks')})
              ]
            )
            (command.ForEach
              iter_names: [sock]
              iterable: 
                (for_iter.Words
                  words: [
                    {
                      (command_sub
                        left_token: <Id.Left_DollarParen '$('>
                        child: (C {<cat>} {($ Id.VSub_DollarName '$_rump_server_socks')})
                      )
                    }
                  ]
                )
              body: 
                (command.DoGroup
                  children: [
                    (C {<echo>} {(DQ <'### Dumping '> ($ Id.VSub_DollarName '$sock'))})
                    (C {<export>} {<Id.Lit_VarLike 'RUMP_SERVER='> ($ Id.VSub_DollarName '$sock')})
                    (C {<rump.ifconfig>})
                    (C {<rump.netstat>} {<-nr>})
                    (C {($ Id.VSub_DollarName '$HIJACKING')} {<rump.netstat>} {<-i>} {<-a>})
                    (C {<rump.arp>} {<-na>})
                    (C {<rump.ndp>} {<-na>})
                    (C {($ Id.VSub_DollarName '$HIJACKING')} {<ifmcstat>})
                    (C {($ Id.VSub_DollarName '$HIJACKING')} {<dmesg>})
                  ]
                )
            )
            (C {<export>} {<Id.Lit_VarLike 'RUMP_SERVER='> ($ Id.VSub_DollarName '$backup')})
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-f>} {<rump_server.core>} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<gdb>} {<-ex>} {<bt>} {<'/usr/bin/rump_server'>} {<rump_server.core>})
                    (command.Pipeline
                      children: [(C {<strings>} {<rump_server.core>}) (C {<grep>} {<panic>})]
                      negated: F
                    )
                  ]
                  spids: [1525 1536]
                )
              ]
            )
            (command.ControlFlow token:<Id.ControlFlow_Return return> arg_word:{<0>})
          ]
        )
    )
    (command.ShFunction
      name: rump_server_dump_buses
      body: 
        (BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} {<-f>} 
                              {($ Id.VSub_DollarName '$_rump_server_buses')} {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [(command.ControlFlow token:<Id.ControlFlow_Return return> arg_word:{<0>})]
                  spids: [1578 1591]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {($ Id.VSub_DollarName '$DEBUG')})
                (C {<cat>} {($ Id.VSub_DollarName '$_rump_server_buses')})
              ]
            )
            (command.ForEach
              iter_names: [bus]
              iterable: 
                (for_iter.Words
                  words: [
                    {
                      (command_sub
                        left_token: <Id.Left_DollarParen '$('>
                        child: (C {<cat>} {($ Id.VSub_DollarName '$_rump_server_buses')})
                      )
                    }
                  ]
                )
              body: 
                (command.DoGroup
                  children: [
                    (C {<echo>} {(DQ <'### Dumping '> ($ Id.VSub_DollarName '$bus'))})
                    (command.Pipeline
                      children: [
                        (command.Simple
                          words: [{<shmif_dumpbus>} {<-p>} {<->} {($ Id.VSub_DollarName '$bus')}]
                          redirects: [
                            (redir
                              op: <Id.Redir_Great '2>'>
                              loc: (redir_loc.Fd fd:2)
                              arg: {<'/dev/null'>}
                            )
                          ]
                          do_fork: T
                        )
                        (C {<tcpdump>} {<-n>} {<-e>} {<-r>} {<->})
                      ]
                      negated: F
                    )
                  ]
                )
            )
            (command.ControlFlow token:<Id.ControlFlow_Return return> arg_word:{<0>})
          ]
        )
    )
    (command.ShFunction
      name: cleanup
      body: (BraceGroup children:[(C {<rump_server_halt_servers>})])
    )
    (command.ShFunction
      name: dump
      body: (BraceGroup children:[(C {<rump_server_dump_servers>}) (C {<rump_server_dump_buses>})])
    )
  ]
)