git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v3 01/14] mingw: add network-wrappers for daemon

From
Erik Faye-Lund <kusmabite@gmail.com>
Date
Oct 10, 2010, 20:20 UTC
Message-ID
<AANLkTinP7RKOhLFZs71P5dpmA1p1OsjikSmVv5WkkL1z@mail.gmail.com>
In-Reply-To
<4CB216C2.1060608@gmail.com>
On Sun, Oct 10, 2010 at 9:40 PM, Eric Sunshine <ericsunshine@gmail.com> wrote:
Show 42 quoted lines
> On 10/10/2010 9:20 AM, Erik Faye-Lund wrote:
>>
>> From: Mike Pape<dotzenlabs@gmail.com>
>>
>> git-daemon requires some socket-functionality that is not yet
>> supported in the Windows-port. This patch adds said functionality,
>> and makes sure WSAStartup gets called by socket(), since it is the
>> first network-call in git-daemon. In addition, a check is added to
>> prevent WSAStartup (and WSACleanup, though atexit) from being
>> called more than once, since git-daemon calls both socket() and
>> gethostbyname().
>>
>> Signed-off-by: Mike Pape<dotzenlabs@gmail.com>
>> Signed-off-by: Erik Faye-Lund<kusmabite@gmail.com>
>> ---
>> diff --git a/compat/mingw.c b/compat/mingw.c
>> index 6590f33..563ef1f 100644
>> --- a/compat/mingw.c
>> +++ b/compat/mingw.c
>> +#undef accept
>> +int mingw_accept(int sockfd1, struct sockaddr *sa, socklen_t *sz)
>> +{
>> +       int sockfd2;
>> +
>> +       SOCKET s1 = (SOCKET)_get_osfhandle(sockfd1);
>> +       SOCKET s2 = accept(s1, sa, sz);
>> +
>> +       /* convert into a file descriptor */
>> +       if ((sockfd2 = _open_osfhandle(s2, O_RDWR|O_BINARY))<  0) {
>> +               closesocket(s2);
>> +               return error("unable to make a socket file descriptor:
>> %s",
>> +                       strerror(errno));
>
> Is 'errno' from _open_osfhandle() still valid when handed to strerror() or
> has it been clobbered by closesocket()?
>
> Corollary: Does _open_osfhandle() indeed set 'errno', or is it more
> appropriate to call WSAGetLastError()? (The documentation I read for
> _open_osfhandle() did not say anything about how to determine the reason for
> failure.)
>

_open_osfhandle seems to set both errno and the winsock-error. closesocket() sets the winsock-error but not the CRT. I've just tested with a very simple application:

---8<--- #include <winsock2.h> #include <io.h> #include <fcntl.h> #include <stdio.h>

const char *win32_strerror(DWORD dw)
{
	static char tmp[4096];
	FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, dw,
	    MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),
	    tmp, sizeof(tmp), NULL);
	return tmp;
}
int main()
{
	WSADATA wsa = {0};
	WSAStartup(MAKEWORD(2, 0), &wsa);
	printf("errno: '%s'\nWSAGetLastError: '%s'\n",
	    strerror(errno), win32_strerror(WSAGetLastError()));
	errno = 0;
	_open_osfhandle(-1, O_RDWR | O_BINARY);
	printf("errno: '%s'\nWSAGetLastError: '%s'\n",
	    strerror(errno), win32_strerror(WSAGetLastError()));
	errno = 0;
	closesocket(-1);
	printf("errno: '%s'\nWSAGetLastError: '%s'\n",
	    strerror(errno), win32_strerror(WSAGetLastError()));
	return 0;
}
---8<---
The output is:
---8<---
errno: 'Result too large'
WSAGetLastError: 'The operation completed successfully.
'
errno: 'Bad file descriptor'
WSAGetLastError: 'The handle is invalid.
'
errno: 'No error'
WSAGetLastError: 'An operation was attempted on something that is not a socket.
'
---8<---

So, it seems that WSAGetLastError() gets clobbered by closesocket(), but not errno.

Previous: Eric SunshineNext: Eric Sunshine
Message 4 of 43 in “daemon-win32”
  1. 00/14 daemon-win32Erik Faye-Lund, Oct 10, 2010
  2. 01/14 mingw: add network-wrappers for daemonErik Faye-Lund, Oct 10, 2010
  3. Eric SunshineOct 10, 2010
  4. Erik Faye-LundOct 10, 2010
  5. Eric SunshineOct 10, 2010
  6. 02/14 mingw: implement syslogErik Faye-Lund, Oct 10, 2010
  7. Eric SunshineOct 10, 2010
  8. Erik Faye-LundOct 10, 2010
  9. Johannes SixtOct 10, 2010
  10. Erik Faye-LundOct 10, 2010
  11. Eric SunshineOct 10, 2010
  12. Erik Faye-LundOct 10, 2010
  13. Erik Faye-LundOct 10, 2010
  14. Eric SunshineOct 10, 2010
  15. Erik Faye-LundOct 11, 2010
  16. Erik Faye-LundOct 11, 2010
  17. 03/14 compat: add inet_pton and inet_ntop prototypesErik Faye-Lund, Oct 10, 2010
  18. 04/14 inet_ntop: fix a couple of old-style declsErik Faye-Lund, Oct 10, 2010
  19. 05/14 mingw: use real pidErik Faye-Lund, Oct 10, 2010
  20. Eric SunshineOct 10, 2010
  21. Erik Faye-LundOct 10, 2010
  22. Eric SunshineOct 10, 2010
  23. 06/14 mingw: support waitpid with pid > 0 and WNOHANGErik Faye-Lund, Oct 10, 2010
  24. 07/14 mingw: add kill emulationErik Faye-Lund, Oct 10, 2010
  25. 08/14 daemon: use run-command api for async servingErik Faye-Lund, Oct 10, 2010
  26. Eric SunshineOct 10, 2010
  27. Erik Faye-LundOct 10, 2010
  28. 09/14 daemon: use full buffered mode for stderrErik Faye-Lund, Oct 10, 2010
  29. 10/14 Improve the mingw getaddrinfo stub to handle more use casesErik Faye-Lund, Oct 10, 2010
  30. 11/14 daemon: report connection from root-processErik Faye-Lund, Oct 10, 2010
  31. Johannes SixtOct 10, 2010
  32. Erik Faye-LundOct 10, 2010
  33. Erik Faye-LundOct 10, 2010
  34. Ævar Arnfjörð BjarmasonOct 10, 2010
  35. Erik Faye-LundOct 10, 2010
  36. 12/14 mingw: import poll-emulation from gnulibErik Faye-Lund, Oct 10, 2010
  37. Ævar Arnfjörð BjarmasonOct 10, 2010
  38. Erik Faye-LundOct 10, 2010
  39. Erik Faye-LundOct 10, 2010
  40. Ævar Arnfjörð BjarmasonOct 10, 2010
  41. 13/14 mingw: use poll-emulation from gnulibErik Faye-Lund, Oct 10, 2010
  42. 14/14 daemon: only use posix features on posix systemsErik Faye-Lund, Oct 10, 2010
  43. Ævar Arnfjörð BjarmasonOct 10, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.