# module Chef::Mixin::Command::Windows

### Public Instance Methods

popen4(cmd, args={}, &b) click to toggle source

    # File lib/chef/mixin/command/windows.rb, line 31
    def popen4(cmd, args={}, &b)

      # By default, we are waiting before we yield the block.
      args[:waitlast] ||= false

      #XXX :user, :group, :environment support?

      Open3.popen3(cmd) do |stdin,stdout,stderr,cid|
        if b
          if args[:waitlast]
            b[cid, stdin, stdout, stderr]
            # send EOF so that if the child process is reading from STDIN
            # it will actually finish up and exit
            stdin.close_write
          else
            o = StringIO.new
            e = StringIO.new

            stdin.close

            stdout.sync = true
            stderr.sync = true

            line = stdout.gets(nil)
            if line
              o.write(line)
            end
            line = stderr.gets(nil)
            if line
              e.write(line)
            end
            o.rewind
            e.rewind
            b[cid, stdin, o, e]
          end
        else
          [cid, stdin, stdout, stderr]
        end
      end
      $?
    end