aboutsummaryrefslogtreecommitdiff
path: root/lib/libc/mingw/libsrc/wspiapi/WspiapiLoad.c
blob: ea7a7a4c5201398e080c582210ea659fd875c387 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#undef  __CRT__NO_INLINE
#define __CRT__NO_INLINE
#include <winsock2.h>
#include <wspiapi.h>

FARPROC WINAPI
WspiapiLoad (WORD wFunction)
{
  static WINBOOL isinit = FALSE;
  static WSPIAPI_FUNCTION rgtGlobal[] = WSPIAPI_FUNCTION_ARRAY;
  static const int iNumGlobal = (sizeof(rgtGlobal) / sizeof(WSPIAPI_FUNCTION));
  HMODULE hlib = NULL;
  WSPIAPI_FUNCTION rgtLocal[] = WSPIAPI_FUNCTION_ARRAY;
  FARPROC fScratch = NULL;
  int i = 0;

  if (isinit)
    return rgtGlobal[wFunction].pfAddress;

  for (;;)
    {
	CHAR systemdir[MAX_PATH + 1], path[MAX_PATH + 8];

	if (GetSystemDirectoryA (systemdir, MAX_PATH) == 0)
	  break;
	strcpy (path, systemdir);
	strcat (path, "\\ws2_32");
	hlib = LoadLibraryA (path);
	if(hlib != NULL)
	  {
	    fScratch = GetProcAddress (hlib, "getaddrinfo");
	    if (!fScratch)
	      {
		FreeLibrary (hlib);
		hlib = NULL;
	      }
	  }
	if (hlib != NULL)
	  break;
	strcpy (path, systemdir);
	strcat (path, "\\wship6");
	hlib = LoadLibraryA (path);
	if (hlib != NULL)
	  {
	    if ((fScratch = GetProcAddress (hlib, "getaddrinfo")) == NULL)
	      {
		FreeLibrary (hlib);
		hlib = NULL;
	      }
	  }
	break;
    }
  if (hlib != NULL)
    {
	for (i = 0; i < iNumGlobal; i++)
	  {
	    if ((rgtLocal[i].pfAddress = GetProcAddress (hlib, rgtLocal[i].pszName)) == NULL)
	      {
		FreeLibrary (hlib);
		hlib = NULL;
		break;
	      }
	  }
	if (hlib != NULL)
	  {
	    for (i = 0; i < iNumGlobal; i++)
	      rgtGlobal[i].pfAddress = rgtLocal[i].pfAddress;
	  }
    }
  isinit = TRUE;
  return rgtGlobal[wFunction].pfAddress;
}