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 #ifdef __REACTOS__ 97 char NETCONFIG[MAX_PATH] = ""; 98 #endif 99 BOOL WINAPI DllMain/*tirpc_main*/(HINSTANCE hinstDLL, // DLL module handle 100 DWORD fdwReason, // reason called 101 LPVOID lpvReserved) // reserved 102 { 103 LPVOID lpvData; 104 BOOL fIgnore; 105 106 // if (init++) 107 // return TRUE; 108 109 // Deal with Thread Local Storage initialization!! 110 switch (fdwReason) 111 { 112 // The DLL is loading due to process 113 // initialization or a call to LoadLibrary. 114 case DLL_PROCESS_ATTACH: 115 #ifdef __REACTOS__ 116 if (!GetSystemDirectoryA(NETCONFIG, ARRAYSIZE(NETCONFIG))) 117 return FALSE; 118 119 lstrcatA(NETCONFIG, "\\drivers\\etc\\netconfig"); 120 #endif 121 122 // Initialize socket library 123 if (winsock_init() == FALSE) 124 return FALSE; 125 126 // Initialize CriticalSections 127 tirpc_criticalsection_init(); 128 129 // Allocate a TLS index. 130 if ((dwTlsIndex = TlsAlloc()) == TLS_OUT_OF_INDEXES) 131 return FALSE; 132 133 // No break: Initialize the index for first thread. 134 135 // The attached process creates a new thread. 136 case DLL_THREAD_ATTACH: 137 138 // Initialize the TLS index for this thread 139 lpvData = (LPVOID) LocalAlloc(LPTR, 256); 140 if (lpvData != NULL) 141 fIgnore = TlsSetValue(dwTlsIndex, lpvData); 142 143 break; 144 145 // The thread of the attached process terminates. 146 case DLL_THREAD_DETACH: 147 148 // Release the allocated memory for this thread. 149 lpvData = TlsGetValue(dwTlsIndex); 150 if (lpvData != NULL) 151 LocalFree((HLOCAL) lpvData); 152 153 break; 154 155 // DLL unload due to process termination or FreeLibrary. 156 case DLL_PROCESS_DETACH: 157 158 // Release the allocated memory for this thread. 159 lpvData = TlsGetValue(dwTlsIndex); 160 if (lpvData != NULL) 161 LocalFree((HLOCAL) lpvData); 162 163 // Release the TLS index. 164 TlsFree(dwTlsIndex); 165 166 // Clean up winsock stuff 167 winsock_fini(); 168 169 break; 170 171 default: 172 break; 173 } 174 175 176 return TRUE; 177 } 178 179 int tirpc_exit(void) 180 { 181 if (init == 0 || --init > 0) 182 return 0; 183 184 return WSACleanup(); 185 } 186 187 188 void wintirpc_debug(char *fmt, ...) 189 { 190 #ifdef _DEBUG 191 char buffer[2048]; 192 #else 193 static int triedToOpen = 0; 194 static FILE *dbgFile = NULL; 195 #endif 196 197 va_list vargs; 198 va_start(vargs, fmt); 199 200 #ifdef _DEBUG 201 vsprintf(buffer, fmt, vargs); 202 OutputDebugStringA(buffer); 203 #else 204 if (dbgFile == NULL && triedToOpen == 0) { 205 triedToOpen = 1; 206 dbgFile = fopen("c:\\etc\\rpcsec_gss_debug.txt", "w"); 207 } 208 if (dbgFile != NULL) { 209 vfprintf(dbgFile, fmt, vargs); 210 fflush(dbgFile); 211 } 212 #endif 213 214 va_end(vargs); 215 } 216