xref: /reactos/dll/3rdparty/libtirpc/src/wintirpc.c (revision 5100859e)
1 /* NFSv4.1 client for Windows
2  * Copyright � 2012 The Regents of the University of Michigan
3  *
4  * Olga Kornievskaia <aglo@umich.edu>
5  * Casey Bodley <cbodley@umich.edu>
6  *
7  * This library is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU Lesser General Public License as published by
9  * the Free Software Foundation; either version 2.1 of the License, or (at
10  * your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful, but
13  * without any warranty; without even the implied warranty of merchantability
14  * or fitness for a particular purpose.  See the GNU Lesser General Public
15  * License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public License
18  * along with this library; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20  */
21 
22 #include <wintirpc.h>
23 #include <rpc/rpc.h>
24 #include <stdio.h>
25 #ifndef __REACTOS__
26 #include <winsock.h>
27 #else
28 #include <winsock2.h>
29 #endif
30 
31 WSADATA WSAData;
32 
33 static int init = 0;
34 static DWORD dwTlsIndex;
35 
36 extern void multithread_init(void);
37 
38 VOID
39 tirpc_report(LPTSTR lpszMsg)
40 {
41 	WCHAR    chMsg[256];
42 	HANDLE   hEventSource;
43 	LPCWSTR  lpszStrings[2];
44 
45 	// Use event logging to log the error.
46 	//
47 	hEventSource = RegisterEventSource(NULL,
48 									   TEXT("tirpc.dll"));
49 
50 #ifndef __REACTOS__
51 	swprintf_s(chMsg, sizeof(chMsg), L"tirpc report: %d", GetLastError());
52 #else
53 	_snwprintf(chMsg, sizeof(chMsg) / sizeof(WCHAR), L"tirpc report: %d", GetLastError());
54 #endif
55 	lpszStrings[0] = (LPCWSTR)chMsg;
56 	lpszStrings[1] = lpszMsg;
57 
58 	if (hEventSource != NULL) {
59 		ReportEvent(hEventSource, // handle of event source
60 			EVENTLOG_WARNING_TYPE, // event type
61 			0,                    // event category
62 			0,                    // event ID
63 			NULL,                 // current user's SID
64 			2,                    // strings in lpszStrings
65 			0,                    // no bytes of raw data
66 			lpszStrings,          // array of error strings
67 			NULL);                // no raw data
68 
69 		(VOID) DeregisterEventSource(hEventSource);
70 	}
71 }
72 
73 void tirpc_criticalsection_init(void) {
74 	multithread_init();
75 }
76 
77 BOOL winsock_init(void)
78 {
79 	int err;
80 	err = WSAStartup(MAKEWORD( 3, 3 ), &WSAData);	// XXX THIS SHOULD BE FAILING!!!!!!!!!!!!!!!!!
81 	if (err != 0) {
82 		init = 0;
83 		tirpc_report(L"WSAStartup failed!\n");
84 		WSACleanup();
85 		return FALSE;
86 	}
87 	return TRUE;
88 }
89 
90 BOOL winsock_fini(void)
91 {
92 	WSACleanup();
93 	return TRUE;
94 }
95 
96 BOOL WINAPI DllMain/*tirpc_main*/(HINSTANCE hinstDLL,	// DLL module handle
97 					   DWORD fdwReason,	// reason called
98 					   LPVOID lpvReserved)	// reserved
99 {
100 	LPVOID lpvData;
101 	BOOL fIgnore;
102 
103 //	if (init++)
104 //		return TRUE;
105 
106 	// Deal with Thread Local Storage initialization!!
107 	switch (fdwReason)
108     {
109 		// The DLL is loading due to process
110 		// initialization or a call to LoadLibrary.
111         case DLL_PROCESS_ATTACH:
112 
113 			// Initialize socket library
114 			if (winsock_init() == FALSE)
115 				return FALSE;
116 
117 			// Initialize CriticalSections
118 			tirpc_criticalsection_init();
119 
120             // Allocate a TLS index.
121             if ((dwTlsIndex = TlsAlloc()) == TLS_OUT_OF_INDEXES)
122                 return FALSE;
123 
124             // No break: Initialize the index for first thread.
125 
126         // The attached process creates a new thread.
127         case DLL_THREAD_ATTACH:
128 
129             // Initialize the TLS index for this thread
130             lpvData = (LPVOID) LocalAlloc(LPTR, 256);
131             if (lpvData != NULL)
132                 fIgnore = TlsSetValue(dwTlsIndex, lpvData);
133 
134             break;
135 
136         // The thread of the attached process terminates.
137         case DLL_THREAD_DETACH:
138 
139             // Release the allocated memory for this thread.
140             lpvData = TlsGetValue(dwTlsIndex);
141             if (lpvData != NULL)
142                 LocalFree((HLOCAL) lpvData);
143 
144             break;
145 
146         // DLL unload due to process termination or FreeLibrary.
147         case DLL_PROCESS_DETACH:
148 
149             // Release the allocated memory for this thread.
150             lpvData = TlsGetValue(dwTlsIndex);
151             if (lpvData != NULL)
152                 LocalFree((HLOCAL) lpvData);
153 
154             // Release the TLS index.
155             TlsFree(dwTlsIndex);
156 
157 			// Clean up winsock stuff
158 			winsock_fini();
159 
160             break;
161 
162         default:
163             break;
164     }
165 
166 
167 	return TRUE;
168 }
169 
170 int tirpc_exit(void)
171 {
172 	if (init == 0 || --init > 0)
173 		return 0;
174 
175 	return WSACleanup();
176 }
177 
178 
179 void wintirpc_debug(char *fmt, ...)
180 {
181 #ifdef _DEBUG
182 	char buffer[2048];
183 #else
184 	static int triedToOpen = 0;
185 	static FILE *dbgFile = NULL;
186 #endif
187 
188 	va_list vargs;
189 	va_start(vargs, fmt);
190 
191 #ifdef _DEBUG
192 	vsprintf(buffer, fmt, vargs);
193 	OutputDebugStringA(buffer);
194 #else
195 	if (dbgFile == NULL && triedToOpen == 0) {
196 		triedToOpen = 1;
197 		dbgFile = fopen("c:\\etc\\rpcsec_gss_debug.txt", "w");
198 	}
199 	if (dbgFile != NULL) {
200 		vfprintf(dbgFile, fmt, vargs);
201 		fflush(dbgFile);
202 	}
203 #endif
204 
205 	va_end(vargs);
206 }
207