/* SPDX-License-Identifier: LGPL-3.0-or-later */ /* * Copyright (C) 2008 Banco do Brasil S.A. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ /* * Contatos: * * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) * */ /** * @brief Init/Deinit lib3270 internals. */ #ifdef _WIN32 #include #include #endif // _WIN32 #include #include #ifdef HAVE_LIBCURL #include #endif // HAVE_LIBCURL #include #ifdef _WIN32 #include #include #include "winversc.h" #endif // _WIN32 #include #include #ifdef HAVE_SYSLOG #include #endif // HAVE_SYSLOG #if defined WIN32 BOOL WINAPI DllMain(HANDLE hinst, DWORD dwcallpurpose, LPVOID lpvResvd); #else int lib3270_loaded(void) __attribute__((constructor)); int lib3270_unloaded(void) __attribute__((destructor)); #endif /*---[ Globals ]--------------------------------------------------------------------------------------------------------------*/ #ifdef _WIN32 /// @brief Windows Event Log Handler. HANDLE hEventLog = 0; HANDLE hModule = 0; #endif // _WIN32 /** * @brief Parse an stty control-character specification; a cheap, non-complaining implementation. */ static char parse_ctlchar(char *s) { if (!s || !*s) return 0; if ((int) strlen(s) > 1) { if (*s != '^') return 0; else if (*(s+1) == '?') return 0177; else return *(s+1) - '@'; } else return *s; } int lib3270_loaded(void) { trace("%s",__FUNCTION__); ansictl.vintr = parse_ctlchar("^C"); ansictl.vquit = parse_ctlchar("^\\"); ansictl.verase = parse_ctlchar("^H"); ansictl.vkill = parse_ctlchar("^U"); ansictl.veof = parse_ctlchar("^D"); ansictl.vwerase = parse_ctlchar("^W"); ansictl.vrprnt = parse_ctlchar("^R"); ansictl.vlnext = parse_ctlchar("^V"); #ifdef _WIN32 { char lpFilename[4096]; memset(lpFilename,0,sizeof(lpFilename)); DWORD szPath = GetModuleFileName(hModule,lpFilename,sizeof(lpFilename)); lpFilename[szPath] = 0; char * ptr = strrchr(lpFilename,'\\'); if(ptr) ptr[1] = 0; strncat(lpFilename,"locale",4095); bindtextdomain(GETTEXT_PACKAGE,lpFilename); } #else bindtextdomain(GETTEXT_PACKAGE, LIB3270_STRINGIZE_VALUE_OF(LOCALEDIR)); #endif // _WIN32 bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); #ifdef HAVE_LIBCURL trace("%s.curl_global_init",__FUNCTION__); curl_global_init(CURL_GLOBAL_DEFAULT); #endif // HAVE_LIBCURL return 0; } int lib3270_unloaded(void) { trace("%s",__FUNCTION__); #ifdef HAVE_LIBCURL trace("%s.curl_global_cleanup",__FUNCTION__); curl_global_cleanup(); #endif // HAVE_LIBCURL #ifdef HAVE_SYSLOG if(use_syslog) { closelog(); } #endif // HAVE_SYSLOG return 0; } #if defined WIN32 BOOL WINAPI DllMain(HANDLE hInstance, DWORD dwcallpurpose, LPVOID GNUC_UNUSED(lpvResvd)) { debug("%s starts",__FUNCTION__); switch(dwcallpurpose) { case DLL_PROCESS_ATTACH: hModule = hInstance; hEventLog = RegisterEventSource(NULL, LIB3270_STRINGIZE_VALUE_OF(PRODUCT_NAME)); get_version_info(); lib3270_loaded(); break; case DLL_PROCESS_DETACH: lib3270_unloaded(); if(hEventLog) { DeregisterEventSource(hEventLog); } hEventLog = NULL; break; } debug("%s ends",__FUNCTION__); return TRUE; } #endif