]> git.e2factory.org Git - e2factory.git/commitdiff
Adjust callcmd() to the new poll() interface
authorTobias Ulmer <tu@emlix.com>
Thu, 16 Jan 2014 19:22:38 +0000 (20:22 +0100)
committerTobias Ulmer <tu@emlix.com>
Wed, 16 Nov 2016 14:41:17 +0000 (15:41 +0100)
Signed-off-by: Tobias Ulmer <tu@emlix.com>
generic/e2lib.lua

index 3f40738429a2aa2edc145174bc71857e267e06d7..929b461cd5151b963e40c0321c43b8c3c6b6f147 100644 (file)
@@ -1161,7 +1161,7 @@ function e2lib.callcmd(argv, fdctv, workdir, envdict)
             end
         end
 
-        local rc, re, fdvec, fdpos, pollin, pollout, fdvec, fdct
+        local rc, re, fdvec, pollvec, fdvec, fdct
 
         fdvec = {}
         for _,fdct in ipairs(fdctv) do
@@ -1171,49 +1171,50 @@ function e2lib.callcmd(argv, fdctv, workdir, envdict)
         end
 
         while #fdvec > 0 do
-            fdpos, pollin, pollout = e2lib.poll(-1, fdvec)
-            if fdpos == 0 then
+            pollvec, re = e2lib.poll(-1, fdvec)
+            if not pollvec then
+                return false, re
+            elseif #pollvec == 0 then
                 return false, err.new("poll timeout")
-            elseif fdpos < 0 then
-                return false, err.new("poll error %d", fdpos)
             end
 
-            if pollin then
-                fdct = fd_find_writefunc_by_readfd(fdctv, fdvec[fdpos])
-                if fdct then
-                    local data, readsz
-
-                    while true do
-                        readsz = 64*1024
-                        data, re = eio.fread(fdct._p.readfo, readsz)
-                        if not data then
-                            return false, re
-                        elseif data == "" then
-                            break
-                        end
-
-                        if fdct.linebuffer then
-                            fd_linebuffer(fdct, data)
-                        else
-                            fdct.callfn(data)
+            for _,ptab in ipairs(pollvec) do
+                if ptab.POLLIN then
+                    fdct = fd_find_writefunc_by_readfd(fdctv, ptab.fd)
+                    if fdct then
+                        local data, readsz
+
+                        while true do
+                            readsz = 64*1024
+                            data, re = eio.fread(fdct._p.readfo, readsz)
+                            if not data then
+                                return false, re
+                            elseif data == "" then
+                                break
+                            end
+
+                            if fdct.linebuffer then
+                                fd_linebuffer(fdct, data)
+                            else
+                                fdct.callfn(data)
+                            end
                         end
                     end
-                end
-            elseif pollout then
-                return false, err.new("poll returned POLLOUT")
-            else
-                -- Neither POLLIN or POLLOUT are set. Probably
-                -- because POLLHUP occured. On Linux it indicates
-                -- the pipe was closed by the child.
-
-                -- Flush remaining buffers if linebuffer is enabled
-                -- and the last fread did not end with \n.
-                fdct = fd_find_writefunc_by_readfd(fdctv, fdvec[fdpos])
-                if fdct then
-                    fd_linebuffer_final(fdct)
-                end
+                elseif ptab.POLLOUT then
+                    return false, err.new("poll unexpectedly returned POLLOUT")
+                else
+                    -- Nothing to read, nothing to write, file descriptor
+                    -- was closed.
+                    --
+                    -- Flush remaining buffers if linebuffer is enabled
+                    -- and the last fread did not end with \n.
+                    fdct = fd_find_writefunc_by_readfd(fdctv, ptab.fd)
+                    if fdct then
+                        fd_linebuffer_final(fdct)
+                    end
 
-                table.remove(fdvec, fdpos)
+                    table.remove(fdvec, ptab.fdvecpos)
+                end
             end
         end