[LIBTIRPC]
[reactos.git] / reactos / dll / 3rdparty / libtirpc / src / wintirpc.c
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 }