Commit 4b0274f710811083abba17b47d8f3787df056ba0

Authored by Perry Werneck
1 parent 66d31e1f
Exists in master and in 1 other branch develop

Working in the win32 delayed loading mechanism for lib3270.

Showing 1 changed file with 94 additions and 51 deletions   Show diff stats
client/src/session/local/session.cc
@@ -65,28 +65,35 @@ @@ -65,28 +65,35 @@
65 namespace TN3270 { 65 namespace TN3270 {
66 66
67 #ifdef _WIN32 67 #ifdef _WIN32
68 - static void write_log(const char *msg, int rc = (int) GetLastError()) {  
69 68
70 - HANDLE hEventLog = RegisterEventSource(NULL, PACKAGE_NAME); 69 + string getUserName() {
71 70
72 - debug(msg," rc=",rc); 71 + char username[UNLEN + 1];
  72 + DWORD szName = sizeof(username);
73 73
74 - if(hEventLog) { 74 + memset(username,0,UNLEN + 1);
  75 +
  76 + if(!GetUserName(username, &szName)) {
  77 + return "?";
  78 + }
75 79
76 - char username[UNLEN + 1];  
77 - DWORD szName = sizeof(username); 80 + return string(username);
78 81
79 - memset(username,0,szName); 82 + }
80 83
81 - if(!GetUserName(username, &szName)) {  
82 - strncpy(username,"?",UNLEN);  
83 - } 84 + static void writeLog(HANDLE hEventLog, const char *msg, int rc = (int) GetLastError()) {
  85 +
  86 +
  87 + debug(msg," rc=",rc);
  88 +
  89 + if(hEventLog) {
84 90
  91 + string username = getUserName();
85 char lasterror[1024]; 92 char lasterror[1024];
86 snprintf(lasterror,sizeof(lasterror),"The error code was %d",rc); 93 snprintf(lasterror,sizeof(lasterror),"The error code was %d",rc);
87 94
88 const char *outMsg[] = { 95 const char *outMsg[] = {
89 - username, 96 + username.c_str(),
90 msg, 97 msg,
91 lasterror 98 lasterror
92 }; 99 };
@@ -97,38 +104,83 @@ @@ -97,38 +104,83 @@
97 1, 104 1,
98 0, 105 0,
99 NULL, 106 NULL,
100 - 3, 107 + (sizeof(outMsg) / sizeof(outMsg[0])),
101 0, 108 0,
102 outMsg, 109 outMsg,
103 NULL 110 NULL
104 ); 111 );
105 112
106 - DeregisterEventSource(hEventLog);  
107 -  
108 } 113 }
109 114
110 } 115 }
111 116
112 - static HKEY openKey() { 117 + static string getInstallLocation(HANDLE hEventLog) {
113 118
114 LSTATUS rc; 119 LSTATUS rc;
115 HKEY hKey = 0; 120 HKEY hKey = 0;
116 121
117 - rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software\\pw3270",0,KEY_QUERY_VALUE,&hKey);  
118 - if(rc == ERROR_SUCCESS) {  
119 - return hKey;  
120 - } 122 + static const char * keys[] = {
  123 +#ifdef LIB3270_NAME
  124 + "Software\\" LIB3270_STRINGIZE_VALUE_OF(LIB3270_NAME),
  125 + "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\" LIB3270_STRINGIZE_VALUE_OF(LIB3270_NAME),
  126 +#endif
  127 + "Software\\pw3270",
  128 + "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\pw3270"
  129 + };
121 130
122 - write_log("Can't open HKLM\\Software\\pw3270", (int) rc); 131 + size_t ix;
123 132
124 - rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\pw3270",0,KEY_QUERY_VALUE,&hKey);  
125 - if(rc == ERROR_SUCCESS) {  
126 - return hKey;  
127 - } 133 + string installLocation;
  134 +
  135 + for(ix = 0; installLocation.empty() && ix < (sizeof(keys)/sizeof(keys[0])); ix++) {
  136 +
  137 + debug(ix,"=",keys[ix]);
  138 +
  139 + rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE,keys[ix],0,KEY_QUERY_VALUE,&hKey);
  140 + if(rc == ERROR_SUCCESS) {
  141 +
  142 + unsigned long datatype; // #defined in winnt.h (predefined types 0-11)
  143 + char datadir[4096];
  144 + unsigned long datalen = sizeof(datadir);
128 145
129 - write_log("Can't open HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\pw3270", (int) rc); 146 + memset(datadir,0,datalen);
130 147
131 - return 0; 148 + rc = RegQueryValueExA(hKey,"InstallLocation",NULL,&datatype,(LPBYTE) datadir,&datalen);
  149 + if(rc == ERROR_SUCCESS) {
  150 +
  151 + debug("Found: ",datadir);
  152 +
  153 + installLocation.assign(datadir);
  154 + string username = getUserName();
  155 +
  156 + const char *outMsg[] = {
  157 + username.c_str(),
  158 + "Found LIB3270 installation",
  159 + keys[ix],
  160 + installLocation.c_str()
  161 + };
  162 +
  163 + ReportEvent(
  164 + hEventLog,
  165 + EVENTLOG_INFORMATION_TYPE,
  166 + 1,
  167 + 0,
  168 + NULL,
  169 + (sizeof(outMsg) / sizeof(outMsg[0])),
  170 + 0,
  171 + outMsg,
  172 + NULL
  173 + );
  174 +
  175 + }
  176 +
  177 + RegCloseKey(hKey);
  178 +
  179 + }
  180 +
  181 + }
  182 +
  183 + return installLocation;
132 } 184 }
133 185
134 #endif // _WIN32 186 #endif // _WIN32
@@ -143,42 +195,31 @@ @@ -143,42 +195,31 @@
143 195
144 if(!initialized) { 196 if(!initialized) {
145 197
146 - // Get application DATADIR  
147 - LSTATUS rc;  
148 -  
149 - char datadir[4096];  
150 - HKEY hKey = openKey();  
151 - unsigned long datalen = sizeof(datadir);  
152 -  
153 - memset(datadir,0,sizeof(datadir)); 198 +#ifdef LIB3270_NAME
  199 + HANDLE hEventLog = RegisterEventSource(NULL, LIB3270_STRINGIZE_VALUE_OF(LIB3270_NAME));
  200 +#else
  201 + HANDLE hEventLog = RegisterEventSource(NULL, PACKAGE_NAME);
  202 +#endif // LIB3270_NAME
154 203
155 - if(hKey) { 204 + string installLocation = getInstallLocation(hEventLog);
156 205
157 - unsigned long datatype; // #defined in winnt.h (predefined types 0-11) 206 + if(installLocation.empty()) {
158 207
159 - rc = RegQueryValueExA(hKey,"InstallLocation",NULL,&datatype,(LPBYTE) datadir,&datalen);  
160 - if(rc != ERROR_SUCCESS) { 208 + writeLog(hEventLog, "Can't identify lib3270 installation path");
161 209
162 - // Can't get DATADIR  
163 - write_log("Can't get Install Location", (int) rc); 210 + } else {
164 211
165 - *datadir = 0;  
166 - }  
167 - RegCloseKey(hKey); 212 + // TODO: Understand why SetDefaultDllDirectories & AddDllDirectory causes failure in DNS resolution.
168 213
169 - }  
170 214
171 -#ifdef DEBUG  
172 - debug("Datadir=\"",datadir,"\"");  
173 -#endif // DEBUG  
174 -  
175 - if(*datadir) { 215 + SetCurrentDirectory(installLocation.c_str());
176 216
  217 +/*
177 wchar_t *path = (wchar_t *) malloc(sizeof(datadir)*sizeof(wchar_t)); 218 wchar_t *path = (wchar_t *) malloc(sizeof(datadir)*sizeof(wchar_t));
178 mbstowcs(path, datadir, 4095); 219 mbstowcs(path, datadir, 4095);
179 220
180 if(!SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_USER_DIRS)) { 221 if(!SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_USER_DIRS)) {
181 - write_log("SetDefaultDllDirectories has failed"); 222 + writeLog(hEventLog,"SetDefaultDllDirectories has failed");
182 } 223 }
183 #ifdef DEBUG 224 #ifdef DEBUG
184 else { 225 else {
@@ -190,7 +231,7 @@ @@ -190,7 +231,7 @@
190 string msg = "Can't add "; 231 string msg = "Can't add ";
191 msg += datadir; 232 msg += datadir;
192 msg += " to directory path"; 233 msg += " to directory path";
193 - write_log(msg.c_str()); 234 + writeLog(hEventLog,msg.c_str());
194 } 235 }
195 #ifdef DEBUG 236 #ifdef DEBUG
196 else { 237 else {
@@ -199,9 +240,11 @@ @@ -199,9 +240,11 @@
199 #endif 240 #endif
200 free(path); 241 free(path);
201 242
  243 +*/
202 } 244 }
203 245
204 initialized = true; 246 initialized = true;
  247 + DeregisterEventSource(hEventLog);
205 248
206 } 249 }
207 250