Rainer Jung wrote:
> On 21.01.2009 18:33, William A. Rowe, Jr. wrote:
>> William A. Rowe, Jr. wrote:
>>> Rainer Jung wrote:
>>>> Could be, that there's something wrong with the code that copies the
>>>> listen sockets from the main process to the child.
>>> Exactly; one of the primary possibilities is that a well documented API,
>>> WSADuplicateSocket does not behave for a given socket provider.
>>
>> It's also possible that there is an [un]obvious bug. I hate this
>> particular
>> tracing, but I'm off to check this out from the parent/child this
>> afternoon.
>> Yes - my own testing initially has been -X - it explains our discrepancy.
>
> Looks like I solved it:
>
> In r730828 Win9x code was removed. At least in one function, the Win9x
> code was kept and instead the more modern code was removed, namely in
> file mpm_winnt.c, function get_listeners_from_parent():
>
> @@ -480,30 +466,12 @@
> exit(APEXIT_CHILDINIT);
> }
>
> - if (osver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) {
> - HANDLE hProcess = GetCurrentProcess();
> - HANDLE dup;
> - if (DuplicateHandle(hProcess, (HANDLE) nsd, hProcess, &dup,
> - 0, FALSE, DUPLICATE_SAME_ACCESS)) {
> ...
> - }
> - }
> - else {
> ...
> - if (!SetHandleInformation((HANDLE)nsd, HANDLE_FLAG_INHERIT,
> 0)) {
> ...
> - }
> + if (DuplicateHandle(hProcess, (HANDLE) nsd, hProcess, &dup,
> + 0, FALSE, DUPLICATE_SAME_ACCESS)) {
> + closesocket(nsd);
> + nsd = (SOCKET) dup;
> }
> +
> apr_os_sock_put(&lr->sd, &nsd, s->process->pool);
> }
>
> In effect, the "if" part is still there and the else part has been
> removed. As far as MSDN tells me, osver.dwPlatformId ==
> VER_PLATFORM_WIN32_WINDOWS is true for Win9x, so the if part is the one
> to remove, and the else part is the one we might want to keep.
>
> When I undo this change, it works again :)
>
> By adding some logging, I see, that my XP system takes the else branch.
Feel free to commit - fantastic sleuthing --- Thanks!!!
If you don't beat me to it the fix will be in my next round of commits :)
Bill