ReactOS 0.4.15-dev-7961-gdcf9eb0
wintirpc.c
Go to the documentation of this file.
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
32
33static int init = 0;
35
36extern void multithread_init(void);
37
38VOID
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
75}
76
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
91{
92 WSACleanup();
93 return TRUE;
94}
95
96#ifdef __REACTOS__
97char NETCONFIG[MAX_PATH] = "";
98#endif
99BOOL 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.
115#ifdef __REACTOS__
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
128
129 // Allocate a TLS index.
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.
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
179int tirpc_exit(void)
180{
181 if (init == 0 || --init > 0)
182 return 0;
183
184 return WSACleanup();
185}
186
187
188void 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);
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}
#define VOID
Definition: acefi.h:82
char * va_list
Definition: acmsvcex.h:78
#define va_end(ap)
Definition: acmsvcex.h:90
#define va_start(ap, A)
Definition: acmsvcex.h:91
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
BOOL WINAPI DeregisterEventSource(IN HANDLE hEventLog)
Definition: eventlog.c:473
#define DLL_THREAD_DETACH
Definition: compat.h:133
#define DLL_PROCESS_ATTACH
Definition: compat.h:131
#define DLL_PROCESS_DETACH
Definition: compat.h:130
#define MAX_PATH
Definition: compat.h:34
#define DLL_THREAD_ATTACH
Definition: compat.h:132
UINT WINAPI GetSystemDirectoryA(OUT LPSTR lpBuffer, IN UINT uSize)
Definition: path.c:2283
LPVOID WINAPI TlsGetValue(IN DWORD Index)
Definition: thread.c:1240
DWORD WINAPI TlsAlloc(VOID)
Definition: thread.c:1100
BOOL WINAPI TlsSetValue(IN DWORD Index, IN LPVOID Value)
Definition: thread.c:1276
BOOL WINAPI TlsFree(IN DWORD Index)
Definition: thread.c:1166
INT WINAPI WSAStartup(IN WORD wVersionRequested, OUT LPWSADATA lpWSAData)
Definition: startup.c:113
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint buffer
Definition: glext.h:5915
HLOCAL NTAPI LocalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:1390
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1594
void WINAPI SHIM_OBJ_NAME() OutputDebugStringA(LPCSTR lpOutputString)
Definition: ignoredbgout.c:18
_Check_return_opt_ _CRTIMP int __cdecl fflush(_Inout_opt_ FILE *_File)
_Check_return_opt_ _CRTIMP int __cdecl vfprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format, va_list _ArgList)
_Check_return_ _CRTIMP FILE *__cdecl fopen(_In_z_ const char *_Filename, _In_z_ const char *_Mode)
int __cdecl vsprintf(char *_Dest, const char *_Format, va_list _Args)
Definition: sprintf.c:733
#define TEXT(s)
Definition: k32.h:26
static IN DWORD IN LPVOID lpvReserved
LPSTR WINAPI lstrcatA(LPSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:123
int _snwprintf(wchar_t *buffer, size_t count, const wchar_t *format,...)
#define NETCONFIG
Definition: netconfig.h:11
#define LPVOID
Definition: nt_native.h:45
#define L(x)
Definition: ntvdm.h:50
#define err(...)
Definition: dsound.c:943
#define MAKEWORD(a, b)
Definition: typedefs.h:248
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define ReportEvent
Definition: winbase.h:3899
#define LPTR
Definition: winbase.h:381
#define TLS_OUT_OF_INDEXES
Definition: winbase.h:549
#define RegisterEventSource
Definition: winbase.h:3894
#define WINAPI
Definition: msvc.h:6
#define EVENTLOG_WARNING_TYPE
Definition: winnt_old.h:2835
int PASCAL FAR WSACleanup(void)
Definition: startup.c:60
void multithread_init(void)
BOOL winsock_init(void)
Definition: wintirpc.c:77
VOID tirpc_report(LPTSTR lpszMsg)
Definition: wintirpc.c:39
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
Definition: wintirpc.c:99
void tirpc_criticalsection_init(void)
Definition: wintirpc.c:73
static int init
Definition: wintirpc.c:33
BOOL winsock_fini(void)
Definition: wintirpc.c:90
static DWORD dwTlsIndex
Definition: wintirpc.c:34
void wintirpc_debug(char *fmt,...)
Definition: wintirpc.c:188
int tirpc_exit(void)
Definition: wintirpc.c:179
WSADATA WSAData
Definition: wintirpc.c:31
__wchar_t WCHAR
Definition: xmlstorage.h:180
CHAR * LPTSTR
Definition: xmlstorage.h:192
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185