Rework spawn's output pipe to avoid writing rubbish
authorJ. Ali Harlow <ali@juiblex.co.uk>
Wed, 26 Aug 2009 21:34:00 +0000 (22:34 +0100)
committerJ. Ali Harlow <ali@juiblex.co.uk>
Wed, 26 Aug 2009 21:34:00 +0000 (22:34 +0100)
configure.ac
whelk/spawn.c

index 6c16c9e..d0d5ef8 100644 (file)
@@ -27,7 +27,7 @@ AM_CONDITIONAL(WHELK_MINGW,[test -n "$host_mingw"])
 # See http://sources.redhat.com/autobook/autobook/autobook_91.html#SEC91 for details
 #
 LT_CURRENT=1
-LT_REVISION=0
+LT_REVISION=1
 LT_AGE=1
 AC_SUBST(LT_CURRENT)
 AC_SUBST(LT_REVISION)
index ee30c6b..23c0a02 100644 (file)
@@ -109,8 +109,11 @@ int whelk_spawn(lua_State *L)
     whelk_wait_add_object(&wait,stdout_pipe[0]);
     whelk_wait_add_object(&wait,stderr_pipe[0]);
     whelk_wait_add_object(&wait,pi.hProcess);
-    if (standard_input)
+    if (standard_input && stdin_len)
+    {
+       CloseHandle(stdin_pipe[0]);
        whelk_wait_add_object(&wait,stdin_pipe[1]);
+    }
     else
     {
        whelk_close_pipe(stdin_pipe);
@@ -141,21 +144,24 @@ int whelk_spawn(lua_State *L)
            break;
        else if (h==stdin_pipe[1])
        {
-           nb=max(stdin_len,512);
-           WriteFile(stdin_pipe[1],standard_input,nb,NULL,NULL);
-           standard_input+=nb;
-           stdin_len-=nb;
+           if (WriteFile(stdin_pipe[1],standard_input,stdin_len,&nb,NULL))
+           {
+               standard_input+=nb;
+               stdin_len-=nb;
+           }
+           else
+               stdin_len=0;
            if (!stdin_len)
            {
                whelk_wait_remove_object(&wait,stdin_pipe[1]);
-               whelk_close_pipe(stdin_pipe);
-               standard_input=NULL;
+               CloseHandle(stdin_pipe[1]);
+               stdin_pipe[1]=INVALID_HANDLE_VALUE;
            }
        }
     }
     whelk_wait_free(&wait);
-    if (standard_input)
-       whelk_close_pipe(stdin_pipe);
+    if (stdin_pipe[1]!=INVALID_HANDLE_VALUE)
+       CloseHandle(stdin_pipe[1]);
     if (GetExitCodeProcess(pi.hProcess,&nb))
        exitcode=(int)nb;
     else