Commit 1c9cd360b3957f1381fac2033dbbaaa75a4d29bb
Committed by
GitHub
Exists in
master
and in
2 other branches
Merge pull request #14 from PerryWerneck/develop
Bug fixes and updates.
Showing
46 changed files
with
279 additions
and
1036 deletions
Show diff stats
lib3270.cbp
... | ... | @@ -255,7 +255,6 @@ |
255 | 255 | </Unit> |
256 | 256 | <Unit filename="src/include/3270ds.h" /> |
257 | 257 | <Unit filename="src/include/X11keysym.h" /> |
258 | - <Unit filename="src/include/action_table.h" /> | |
259 | 258 | <Unit filename="src/include/ansic.h" /> |
260 | 259 | <Unit filename="src/include/arpa_telnet.h" /> |
261 | 260 | <Unit filename="src/include/array.h" /> |
... | ... | @@ -271,7 +270,6 @@ |
271 | 270 | <Unit filename="src/include/hostc.h" /> |
272 | 271 | <Unit filename="src/include/internals.h" /> |
273 | 272 | <Unit filename="src/include/kybdc.h" /> |
274 | - <Unit filename="src/include/lib3270++.h" /> | |
275 | 273 | <Unit filename="src/include/lib3270.h" /> |
276 | 274 | <Unit filename="src/include/lib3270/actions.h" /> |
277 | 275 | <Unit filename="src/include/lib3270/charset.h" /> | ... | ... |
locale/pt_BR.po
... | ... | @@ -6,7 +6,7 @@ msgstr "" |
6 | 6 | "Project-Id-Version: pw3270 5.0\n" |
7 | 7 | "Report-Msgid-Bugs-To: \n" |
8 | 8 | "POT-Creation-Date: 2020-10-17 11:58-0300\n" |
9 | -"PO-Revision-Date: 2020-09-03 18:36-0300\n" | |
9 | +"PO-Revision-Date: 2020-11-04 20:42-0300\n" | |
10 | 10 | "Last-Translator: Perry Werneck <perry.werneck@gmail.com>\n" |
11 | 11 | "Language-Team: Português <>\n" |
12 | 12 | "Language: pt_BR\n" |
... | ... | @@ -16,8 +16,7 @@ msgstr "" |
16 | 16 | "X-Poedit-Language: Portuguese\n" |
17 | 17 | "X-Poedit-Country: BRAZIL\n" |
18 | 18 | "X-Poedit-SourceCharset: utf-8\n" |
19 | -"Plural-Forms: nplurals=4; plural= (n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != " | |
20 | -"11) ? 2 : 3;\n" | |
19 | +"Plural-Forms: nplurals=2; plural=(n != 1);\n" | |
21 | 20 | "X-Generator: Gtranslator 2.91.7\n" |
22 | 21 | |
23 | 22 | #: src/core/ctlr.c:187 |
... | ... | @@ -898,12 +897,10 @@ msgid "Keyboard lock status" |
898 | 897 | msgstr "Estado de bloqueio do teclado" |
899 | 898 | |
900 | 899 | #: src/core/windows/ldap.c:193 |
901 | -#, fuzzy | |
902 | 900 | msgid "LDAP Search did not produce any attributes." |
903 | 901 | msgstr "Pesquisa LDAP não produziu nenhum atributo." |
904 | 902 | |
905 | 903 | #: src/core/windows/ldap.c:201 |
906 | -#, fuzzy | |
907 | 904 | msgid "LDAPSearch did not produce any values." |
908 | 905 | msgstr "Pesquisa LDAP não produziu nenhum valor." |
909 | 906 | ... | ... |
src/core/actions/table.c
src/core/ansi.c
src/core/charset/utf8.c
... | ... | @@ -39,7 +39,7 @@ |
39 | 39 | // #include "api.h" |
40 | 40 | |
41 | 41 | #include "popupsc.h" |
42 | -#include "utf8c.h" | |
42 | +//#include "utf8c.h" | |
43 | 43 | |
44 | 44 | // char *locale_codeset = CN; |
45 | 45 | |
... | ... | @@ -350,6 +350,7 @@ static char *utf8_tab[U_MAX][96] = { |
350 | 350 | * character set. |
351 | 351 | * Returns 0 if the lookup fails. |
352 | 352 | */ |
353 | + /* | |
353 | 354 | unsigned char utf8_lookup(char GNUC_UNUSED(*mbs), enum ulfail *fail, int GNUC_UNUSED(*consumed)) |
354 | 355 | { |
355 | 356 | if (fail != NULL) |
... | ... | @@ -357,3 +358,4 @@ unsigned char utf8_lookup(char GNUC_UNUSED(*mbs), enum ulfail *fail, int GNUC_UN |
357 | 358 | |
358 | 359 | return 0; |
359 | 360 | } |
361 | +*/ | ... | ... |
src/core/connect.c
... | ... | @@ -49,36 +49,10 @@ |
49 | 49 | lib3270_set_url(hSession,url); |
50 | 50 | } |
51 | 51 | |
52 | - return lib3270_reconnect(hSession, seconds); | |
52 | + return hSession->cbk.reconnect(hSession, seconds); | |
53 | 53 | |
54 | 54 | } |
55 | 55 | |
56 | -/* | |
57 | - void connection_failed(H3270 *hSession, const char *message) | |
58 | - { | |
59 | - lib3270_disconnect(hSession); | |
60 | - | |
61 | - lib3270_autoptr(char) summary = lib3270_strdup_printf( | |
62 | - _( "Can't connect to %s:%s"), | |
63 | - hSession->host.current, | |
64 | - hSession->host.srvc | |
65 | - ); | |
66 | - | |
67 | - LIB3270_POPUP popup = { | |
68 | - .name = "CantConnect", | |
69 | -// .title = _( "Connection failed" ), | |
70 | - .type = LIB3270_NOTIFY_INFO, | |
71 | - .summary = summary, | |
72 | - .body = message, | |
73 | - .label = _("Try again") | |
74 | - }; | |
75 | - | |
76 | - if(hSession->cbk.popup(hSession,&popup,!hSession->auto_reconnect_inprogress) == 0) | |
77 | - lib3270_activate_auto_reconnect(hSession,1000); | |
78 | - | |
79 | - } | |
80 | -*/ | |
81 | - | |
82 | 56 | int lib3270_allow_reconnect(const H3270 *hSession) |
83 | 57 | { |
84 | 58 | // |
... | ... | @@ -103,7 +77,8 @@ |
103 | 77 | // Do I have a defined host? |
104 | 78 | if(!(hSession->host.current && hSession->host.srvc && *hSession->host.current && *hSession->host.srvc)) |
105 | 79 | { |
106 | - errno = EINVAL; | |
80 | + debug("%s('%s')",__FUNCTION__,hSession->host.url); | |
81 | + errno = ENODATA; | |
107 | 82 | return 0; |
108 | 83 | } |
109 | 84 | ... | ... |
src/core/ctlr.c
... | ... | @@ -46,7 +46,7 @@ |
46 | 46 | #include <stdlib.h> |
47 | 47 | #include "3270ds.h" |
48 | 48 | #include "screen.h" |
49 | -#include "resources.h" | |
49 | +//#include "resources.h" | |
50 | 50 | |
51 | 51 | #include "ctlrc.h" |
52 | 52 | #include "ftc.h" |
... | ... | @@ -205,7 +205,7 @@ void ctlr_set_rows_cols(H3270 *session, int mn, int ovc, int ovr) |
205 | 205 | // popup_an_error(session,"Invalid %s %dx%d:\nToo big",ResOversize, ovc, ovr); |
206 | 206 | |
207 | 207 | } |
208 | - else if (ovc > 0 && ovc < session->max.cols) | |
208 | + else if (ovc < session->max.cols) | |
209 | 209 | { |
210 | 210 | |
211 | 211 | lib3270_popup_dialog( |
... | ... | @@ -219,7 +219,7 @@ void ctlr_set_rows_cols(H3270 *session, int mn, int ovc, int ovr) |
219 | 219 | |
220 | 220 | // popup_an_error(session,"Invalid %s cols (%d):\nLess than model %d cols (%d)",ResOversize, ovc, session->model_num, session->maxCOLS); |
221 | 221 | } |
222 | - else if (ovr > 0 && ovr < session->max.rows) | |
222 | + else if (ovr < session->max.rows) | |
223 | 223 | { |
224 | 224 | |
225 | 225 | lib3270_popup_dialog( | ... | ... |
src/core/host.c
... | ... | @@ -43,7 +43,7 @@ |
43 | 43 | |
44 | 44 | #include <internals.h> |
45 | 45 | #include <stdlib.h> |
46 | -#include "resources.h" | |
46 | +//#include "resources.h" | |
47 | 47 | |
48 | 48 | #include "hostc.h" |
49 | 49 | #include "statusc.h" |
... | ... | @@ -74,7 +74,7 @@ static int check_for_auto_reconnect(H3270 *hSession, void GNUC_UNUSED(*userdata) |
74 | 74 | { |
75 | 75 | lib3270_write_log(hSession,"3270","Starting auto-reconnect on %s",lib3270_get_url(hSession)); |
76 | 76 | hSession->auto_reconnect_inprogress = 0; // Reset "in-progress" to allow reconnection. |
77 | - if(lib3270_reconnect(hSession,0)) | |
77 | + if(hSession->cbk.reconnect(hSession,0)) | |
78 | 78 | lib3270_write_log(hSession,"3270","Auto-reconnect fails: %s",strerror(errno)); |
79 | 79 | } |
80 | 80 | ... | ... |
src/core/iocalls.c
... | ... | @@ -465,9 +465,10 @@ LIB3270_EXPORT int lib3270_run_task(H3270 *hSession, int(*callback)(H3270 *h, vo |
465 | 465 | CHECK_SESSION_HANDLE(hSession); |
466 | 466 | |
467 | 467 | hSession->cbk.set_timer(hSession,1); |
468 | + hSession->tasks++; | |
468 | 469 | rc = run_task(hSession,callback,parm); |
469 | 470 | hSession->cbk.set_timer(hSession,0); |
470 | - | |
471 | + hSession->tasks--; | |
471 | 472 | return rc; |
472 | 473 | |
473 | 474 | } | ... | ... |
src/core/keyboard/actions.c
... | ... | @@ -57,7 +57,7 @@ struct ta; |
57 | 57 | |
58 | 58 | #include <fcntl.h> |
59 | 59 | #include "3270ds.h" |
60 | -#include "resources.h" | |
60 | +//#include "resources.h" | |
61 | 61 | |
62 | 62 | #include "ansic.h" |
63 | 63 | #include "ctlrc.h" |
... | ... | @@ -71,7 +71,7 @@ struct ta; |
71 | 71 | #include "telnetc.h" |
72 | 72 | #include "togglesc.h" |
73 | 73 | #include "trace_dsc.h" |
74 | -#include "utf8c.h" | |
74 | +//#include "utf8c.h" | |
75 | 75 | #include "utilc.h" |
76 | 76 | #if defined(X3270_DBCS) /*[*/ |
77 | 77 | #include "widec.h" | ... | ... |
src/core/keyboard/kybd.c
... | ... | @@ -58,7 +58,7 @@ struct ta; |
58 | 58 | |
59 | 59 | #include <fcntl.h> |
60 | 60 | #include "3270ds.h" |
61 | -#include "resources.h" | |
61 | +//#include "resources.h" | |
62 | 62 | |
63 | 63 | #include "ansic.h" |
64 | 64 | #include "ctlrc.h" |
... | ... | @@ -72,7 +72,7 @@ struct ta; |
72 | 72 | #include "telnetc.h" |
73 | 73 | #include "togglesc.h" |
74 | 74 | #include "trace_dsc.h" |
75 | -#include "utf8c.h" | |
75 | +//#include "utf8c.h" | |
76 | 76 | #include "utilc.h" |
77 | 77 | #if defined(X3270_DBCS) /*[*/ |
78 | 78 | #include "widec.h" |
... | ... | @@ -110,11 +110,13 @@ static void kybdlock_set(H3270 *session, unsigned int bits); |
110 | 110 | |
111 | 111 | /* Composite key mappings. */ |
112 | 112 | |
113 | +/* | |
113 | 114 | struct akeysym |
114 | 115 | { |
115 | 116 | KeySym keysym; |
116 | 117 | enum keytype keytype; |
117 | 118 | }; |
119 | +*/ | |
118 | 120 | |
119 | 121 | #define ak_eq(k1, k2) (((k1).keysym == (k2).keysym) && \ |
120 | 122 | ((k1).keytype == (k2).keytype)) | ... | ... |
src/core/linux/connect.c
... | ... | @@ -89,7 +89,7 @@ |
89 | 89 | |
90 | 90 | case 1: |
91 | 91 | // Got response. |
92 | - if(pfd.revents && POLLOUT) { | |
92 | + if(pfd.revents & POLLOUT) { | |
93 | 93 | debug("%s: Connection complete",__FUNCTION__); |
94 | 94 | return 0; |
95 | 95 | } |
... | ... | @@ -194,15 +194,23 @@ |
194 | 194 | |
195 | 195 | if(hSession->network.module->getsockopt(hSession, SOL_SOCKET, SO_ERROR, (char *) &err, &len) < 0) |
196 | 196 | { |
197 | - int err = errno; | |
197 | + lib3270_autoptr(char) body = lib3270_strdup_printf( | |
198 | + _("The System error was '%s' (rc=%d)"), | |
199 | + strerror(errno), | |
200 | + errno | |
201 | + ); | |
202 | + | |
198 | 203 | lib3270_disconnect(hSession); |
199 | - lib3270_popup_dialog( | |
200 | - hSession, | |
201 | - LIB3270_NOTIFY_ERROR, | |
202 | - _( "Network error" ), | |
203 | - _( "Unable to get connection state." ), | |
204 | - _( "The system error was %s" ), strerror(err) | |
205 | - ); | |
204 | + | |
205 | + LIB3270_POPUP popup = { | |
206 | + .type = LIB3270_NOTIFY_ERROR, | |
207 | + .title = _( "Network error" ), | |
208 | + .summary = _( "Unable to get connection state." ), | |
209 | + .body = body | |
210 | + }; | |
211 | + | |
212 | + lib3270_popup(hSession,&popup,0); | |
213 | + | |
206 | 214 | return; |
207 | 215 | } |
208 | 216 | else if(err) | ... | ... |
src/core/paste.c
... | ... | @@ -44,7 +44,7 @@ |
44 | 44 | #include <fcntl.h> |
45 | 45 | |
46 | 46 | #include "3270ds.h" |
47 | -#include "resources.h" | |
47 | +//#include "resources.h" | |
48 | 48 | |
49 | 49 | //#include "actionsc.h" |
50 | 50 | #include "ansic.h" |
... | ... | @@ -69,7 +69,7 @@ |
69 | 69 | #include "telnetc.h" |
70 | 70 | #include "togglesc.h" |
71 | 71 | #include "trace_dsc.h" |
72 | -#include "utf8c.h" | |
72 | +//#include "utf8c.h" | |
73 | 73 | #include "utilc.h" |
74 | 74 | #if defined(X3270_DBCS) /*[*/ |
75 | 75 | #include "widec.h" | ... | ... |
src/core/printer.c
src/core/properties/unsigned.c
src/core/screen.c
src/core/see.c
src/core/session.c
... | ... | @@ -67,10 +67,25 @@ void lib3270_session_free(H3270 *h) |
67 | 67 | if(!h) |
68 | 68 | return; |
69 | 69 | |
70 | - // Terminate session | |
71 | 70 | if(lib3270_is_connected(h)) |
71 | + { | |
72 | + // Connected, disconnect | |
73 | + lib3270_disconnect(h); | |
74 | + } | |
75 | + else if(lib3270_get_connection_state(h) == LIB3270_CONNECTING) | |
76 | + { | |
77 | + // Connecting, disconnect | |
78 | + debug("%s: Stopping while connecting",__FUNCTION__); | |
72 | 79 | lib3270_disconnect(h); |
73 | 80 | |
81 | + } | |
82 | + | |
83 | + // Do we have pending tasks? | |
84 | + if(h->tasks) | |
85 | + { | |
86 | + lib3270_write_log(h,LIB3270_STRINGIZE_VALUE_OF(PRODUCT_NAME),"Destroying session with %u active task(s)",h->tasks); | |
87 | + } | |
88 | + | |
74 | 89 | shutdown_toggles(h); |
75 | 90 | |
76 | 91 | // Release network module |
... | ... | @@ -290,6 +305,7 @@ void lib3270_reset_callbacks(H3270 *hSession) |
290 | 305 | hSession->cbk.update_luname = default_update_luname; |
291 | 306 | hSession->cbk.update_url = default_update_url; |
292 | 307 | hSession->cbk.action = default_action; |
308 | + hSession->cbk.reconnect = lib3270_reconnect; | |
293 | 309 | |
294 | 310 | lib3270_set_popup_handler(hSession, NULL); |
295 | 311 | |
... | ... | @@ -536,15 +552,19 @@ LIB3270_EXPORT char lib3270_get_session_id(H3270 *hSession) |
536 | 552 | |
537 | 553 | struct lib3270_session_callbacks * lib3270_get_session_callbacks(H3270 *hSession, const char *revision, unsigned short sz) |
538 | 554 | { |
539 | - if(revision && strcasecmp(revision,"20200803") < 0) | |
555 | + #define REQUIRED_REVISION "20201117" | |
556 | + | |
557 | + if(revision && strcasecmp(revision,REQUIRED_REVISION) < 0) | |
540 | 558 | { |
541 | - debug("%s: Revision test was %d",__FUNCTION__,strcasecmp(revision,"20200803")); | |
542 | 559 | errno = EINVAL; |
560 | + lib3270_write_log(hSession,PACKAGE_NAME,"Invalid revision %s when setting callback table",revision); | |
543 | 561 | return NULL; |
544 | 562 | } |
545 | 563 | |
546 | 564 | if(sz != sizeof(struct lib3270_session_callbacks)) |
547 | 565 | { |
566 | + | |
567 | + lib3270_write_log(hSession,PACKAGE_NAME,"Invalid callback table (sz=%u expected=%u)",sz,(unsigned int) sizeof(struct lib3270_session_callbacks)); | |
548 | 568 | errno = EINVAL; |
549 | 569 | return NULL; |
550 | 570 | } | ... | ... |
src/core/telnet.c
... | ... | @@ -92,8 +92,8 @@ |
92 | 92 | #include "kybdc.h" |
93 | 93 | // #include "macrosc.h" |
94 | 94 | #include "popupsc.h" |
95 | -#include "proxyc.h" | |
96 | -#include "resolverc.h" | |
95 | +// #include "proxyc.h" | |
96 | +//#include "resolverc.h" | |
97 | 97 | #include "statusc.h" |
98 | 98 | // #include "tablesc.h" |
99 | 99 | #include "telnetc.h" | ... | ... |
src/core/toggles/init.c
... | ... | @@ -100,7 +100,7 @@ static void toggle_connect(H3270 *hSession, const struct lib3270_toggle *toggle, |
100 | 100 | { |
101 | 101 | if(tt != LIB3270_TOGGLE_TYPE_INITIAL && lib3270_is_disconnected(hSession) && toggle->value) |
102 | 102 | { |
103 | - if(lib3270_reconnect(hSession,0)) | |
103 | + if(hSession->cbk.reconnect(hSession,0)) | |
104 | 104 | lib3270_write_log(hSession,"3270","Auto-connect fails: %s",strerror(errno)); |
105 | 105 | } |
106 | 106 | ... | ... |
src/core/trace_ds.c
src/include/action_table.h
... | ... | @@ -1,95 +0,0 @@ |
1 | -/* | |
2 | - * "Software PW3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
3 | - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
4 | - * aplicativos mainframe. Registro no INPI sob o nome G3270. | |
5 | - * | |
6 | - * Copyright (C) <2008> <Banco do Brasil S.A.> | |
7 | - * | |
8 | - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
9 | - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
10 | - * Free Software Foundation. | |
11 | - * | |
12 | - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
13 | - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
14 | - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
15 | - * obter mais detalhes. | |
16 | - * | |
17 | - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
18 | - * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
19 | - * St, Fifth Floor, Boston, MA 02110-1301 USA | |
20 | - * | |
21 | - * Este programa está nomeado como actions.h e possui - linhas de código. | |
22 | - * | |
23 | - * Contatos: | |
24 | - * | |
25 | - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
26 | - * erico.mendonca@gmail.com (Erico Mascarenhas de Mendonça) | |
27 | - * licinio@bb.com.br (Licínio Luis Branco) | |
28 | - * kraucer@bb.com.br (Kraucer Fernandes Mazuco) | |
29 | - * | |
30 | - */ | |
31 | - | |
32 | - #error Deprecated | |
33 | - | |
34 | - /* | |
35 | - * Action call table. | |
36 | - * | |
37 | - * Usually this definitions are used to declare lib3270's action table but, | |
38 | - * if you redefine the creation macros it can be used to build a callback | |
39 | - * table for g_object_connect calls. | |
40 | - * | |
41 | - */ | |
42 | - | |
43 | - /* Keyboard actions */ | |
44 | - DECLARE_LIB3270_KEY_ACTION( enter, "Send an \"Enter\" action." ) | |
45 | - | |
46 | - DECLARE_LIB3270_FKEY_ACTION( pfkey, "" ) | |
47 | - DECLARE_LIB3270_FKEY_ACTION( pakey, "" ) | |
48 | - | |
49 | - /* Cursor movement */ | |
50 | - DECLARE_LIB3270_CURSOR_ACTION( up, "Cursor up 1 position." ) | |
51 | - DECLARE_LIB3270_CURSOR_ACTION( down, "Cursor down 1 position." ) | |
52 | - DECLARE_LIB3270_CURSOR_ACTION( left, "Cursor left 1 position." ) | |
53 | - DECLARE_LIB3270_CURSOR_ACTION( right, "Cursor right 1 position." ) | |
54 | - | |
55 | - DECLARE_LIB3270_ACTION( newline, "Cursor to first field on next line or any lines after that." ) | |
56 | - | |
57 | - /* Misc actions */ | |
58 | - DECLARE_LIB3270_ACTION( kybdreset, "" ) | |
59 | - DECLARE_LIB3270_ACTION( clear, "Clear AID key" ) | |
60 | - DECLARE_LIB3270_ACTION( eraseinput, "" ) | |
61 | - | |
62 | - DECLARE_LIB3270_ACTION( select_field, "" ) | |
63 | - DECLARE_LIB3270_ACTION( select_all, "" ) | |
64 | - DECLARE_LIB3270_ACTION( unselect, "" ) | |
65 | - DECLARE_LIB3270_ACTION( reselect, "" ) | |
66 | - | |
67 | - DECLARE_LIB3270_ACTION( eraseeof, "Erase End Of Field Key." ) | |
68 | - DECLARE_LIB3270_ACTION( eraseeol, "Erase End Of Line Key." ) | |
69 | - DECLARE_LIB3270_ACTION( erase, "" ) | |
70 | - DECLARE_LIB3270_ACTION( delete, "" ) | |
71 | - DECLARE_LIB3270_ACTION( dup, "DUP key" ) | |
72 | - DECLARE_LIB3270_ACTION( fieldmark, "FM key" ) | |
73 | - | |
74 | - DECLARE_LIB3270_ACTION( backspace, "3270-style backspace." ) | |
75 | - | |
76 | - DECLARE_LIB3270_ACTION( previousword, "Cursor to previous word." ) | |
77 | - DECLARE_LIB3270_ACTION( nextword, "Cursor to next unprotected word." ) | |
78 | - DECLARE_LIB3270_ACTION( fieldend, "Move the cursor to the first blank after the last nonblank in the field." ) | |
79 | - | |
80 | - DECLARE_LIB3270_ACTION( firstfield, "Move to first unprotected field on screen." ) | |
81 | - DECLARE_LIB3270_ACTION( nextfield, "" ) | |
82 | - DECLARE_LIB3270_ACTION( previousfield, "Tab backward to previous field." ) | |
83 | - | |
84 | - DECLARE_LIB3270_ACTION( attn, "ATTN key, per RFC 2355. Sends IP, regardless." ) | |
85 | - DECLARE_LIB3270_ACTION( break, "" ) | |
86 | - DECLARE_LIB3270_ACTION( pastenext, "" ) | |
87 | - | |
88 | - DECLARE_LIB3270_ACTION( deleteword, "Backspaces the cursor until it hits the front of a word (does a ^W)." ) | |
89 | - DECLARE_LIB3270_ACTION( deletefield, "Delete field key (does a ^U)." ) | |
90 | - DECLARE_LIB3270_ACTION( sysreq, "" ) | |
91 | - | |
92 | - DECLARE_LIB3270_ACTION( testpattern, "" ) | |
93 | - DECLARE_LIB3270_ACTION( charsettable, "" ) | |
94 | - | |
95 | - |
src/include/hostc.h
... | ... | @@ -35,12 +35,7 @@ |
35 | 35 | * @brief Global declarations for host.c. |
36 | 36 | */ |
37 | 37 | |
38 | -// #include "api.h" | |
39 | - | |
40 | - | |
41 | -/** | |
42 | - * @brief Signal a state change. | |
43 | - */ | |
38 | + /// @brief Signal a state change. | |
44 | 39 | LIB3270_INTERNAL void lib3270_st_changed(H3270 *h, LIB3270_STATE tx, int mode); |
45 | 40 | |
46 | 41 | LIB3270_INTERNAL void host_in3270(H3270 *session, LIB3270_CSTATE); | ... | ... |
src/include/internals.h
... | ... | @@ -128,16 +128,6 @@ enum iaction { |
128 | 128 | IA_IDLE |
129 | 129 | }; |
130 | 130 | |
131 | -// Version strings | |
132 | -/* | |
133 | -LIB3270_INTERNAL const char * build; | |
134 | -LIB3270_INTERNAL const char * app_defaults_version; | |
135 | -LIB3270_INTERNAL const char * sccsid; | |
136 | -LIB3270_INTERNAL const char * build_rpq_timestamp; | |
137 | -LIB3270_INTERNAL const char * build_rpq_version; | |
138 | -LIB3270_INTERNAL const char * build_rpq_revision; | |
139 | -*/ | |
140 | - | |
141 | 131 | #if defined(X3270_DBCS) /*[*/ |
142 | 132 | LIB3270_INTERNAL Boolean dbcs; |
143 | 133 | #endif /*]*/ |
... | ... | @@ -334,41 +324,40 @@ struct _h3270 |
334 | 324 | // flags |
335 | 325 | LIB3270_HOST_TYPE host_type; ///< @brief Host type. |
336 | 326 | |
337 | - int selected : 1; ///< @brief Has selected region? | |
338 | - int has_copy : 1; ///< @brief Has copy? | |
339 | - int rectsel : 1; ///< @brief Selected region is a rectangle ? | |
340 | - int vcontrol : 1; ///< @brief Visible control ? | |
341 | - int modified_sel : 1; | |
342 | - int mono : 1; ///< @brief Forces monochrome display | |
343 | - int m3279 : 1; | |
344 | - int extended : 1; ///< @brief Extended data stream. | |
345 | - int typeahead : 1; | |
346 | - int numeric_lock : 1; | |
347 | - int oerr_lock : 1; ///< @brief If true, operator errors will lock the keyboard. | |
348 | - int unlock_delay : 1; ///< @brief If true the unlock delay feature is enabled. @see lib3270_set_unlock_delay | |
349 | - int auto_reconnect_inprogress : 1; | |
327 | + unsigned int selected : 1; ///< @brief Has selected region? | |
328 | + unsigned int has_copy : 1; ///< @brief Has copy? | |
329 | + unsigned int rectsel : 1; ///< @brief Selected region is a rectangle ? | |
330 | + unsigned int vcontrol : 1; ///< @brief Visible control ? | |
331 | + unsigned int modified_sel : 1; | |
332 | + unsigned int mono : 1; ///< @brief Forces monochrome display | |
333 | + unsigned int m3279 : 1; | |
334 | + unsigned int extended : 1; ///< @brief Extended data stream. | |
335 | + unsigned int typeahead : 1; | |
336 | + unsigned int numeric_lock : 1; | |
337 | + unsigned int oerr_lock : 1; ///< @brief If true, operator errors will lock the keyboard. | |
338 | + unsigned int unlock_delay : 1; ///< @brief If true the unlock delay feature is enabled. @see lib3270_set_unlock_delay | |
339 | + unsigned int auto_reconnect_inprogress : 1; | |
350 | 340 | unsigned int colors : 5; |
351 | - int apl_mode : 1; ///< @brief If true enables APL mode. | |
352 | - int icrnl : 1; | |
353 | - int inlcr : 1; | |
354 | - int onlcr : 1; | |
355 | - int bsd_tm : 1; | |
356 | - int syncing : 1; | |
357 | - int reverse : 1; /**< @brief reverse-input mode */ | |
358 | - int dbcs : 1; | |
359 | - int linemode : 1; | |
360 | - int trace_skipping : 1; | |
361 | - int need_tls_follows : 1; | |
362 | - int cut_xfer_in_progress : 1; | |
363 | -// int auto_keymap : 1; | |
364 | - int formatted : 1; /**< @brief Formatted screen flag */ | |
365 | - int starting : 1; /**< @brief Is starting (no first screen)? */ | |
341 | + unsigned int apl_mode : 1; ///< @brief If true enables APL mode. | |
342 | + unsigned int icrnl : 1; | |
343 | + unsigned int inlcr : 1; | |
344 | + unsigned int onlcr : 1; | |
345 | + unsigned int bsd_tm : 1; | |
346 | + unsigned int syncing : 1; | |
347 | + unsigned int reverse : 1; ///< @brief reverse-input mode | |
348 | + unsigned int dbcs : 1; | |
349 | + unsigned int linemode : 1; | |
350 | + unsigned int trace_skipping : 1; | |
351 | + unsigned int need_tls_follows : 1; | |
352 | + unsigned int cut_xfer_in_progress : 1; | |
353 | + unsigned int formatted : 1; ///< @brief Formatted screen flag | |
354 | + unsigned int starting : 1; ///< @brief Is starting (no first screen)? | |
366 | 355 | |
367 | 356 | struct lib3270_toggle |
368 | 357 | { |
369 | - char value; /**< toggle value */ | |
370 | - void (*upcall)(H3270 *, const struct lib3270_toggle *, LIB3270_TOGGLE_TYPE); /**< change value */ | |
371 | - } toggle[LIB3270_TOGGLE_COUNT]; | |
358 | + char value; ///< toggle value | |
359 | + void (*upcall)(H3270 *, const struct lib3270_toggle *, LIB3270_TOGGLE_TYPE); ///< change value | |
360 | + } toggle[LIB3270_TOGGLE_COUNT]; | |
372 | 361 | |
373 | 362 | // Network & Termtype |
374 | 363 | char * connected_type; |
... | ... | @@ -451,9 +440,9 @@ struct _h3270 |
451 | 440 | unsigned char default_cs; |
452 | 441 | unsigned char default_ic; |
453 | 442 | char reply_mode; |
454 | - int trace_primed : 1; | |
455 | - int ticking : 1; | |
456 | - int mticking : 1; | |
443 | + unsigned int trace_primed : 1; | |
444 | + unsigned int ticking : 1; | |
445 | + unsigned int mticking : 1; | |
457 | 446 | int crm_nattr; |
458 | 447 | unsigned char crm_attr[16]; |
459 | 448 | unsigned char * zero_buf; /**< @brief Empty buffer, for area clears */ |
... | ... | @@ -543,9 +532,9 @@ struct _h3270 |
543 | 532 | int dft_buffersize; ///< @brief Buffer size (LIMIN, LIMOUT) |
544 | 533 | |
545 | 534 | // rpq.c |
546 | - int rpq_complained : 1; | |
535 | + unsigned int rpq_complained : 1; | |
547 | 536 | #if !defined(_WIN32) |
548 | - int omit_due_space_limit : 1; | |
537 | + unsigned int omit_due_space_limit : 1; | |
549 | 538 | #endif |
550 | 539 | |
551 | 540 | char * rpq_warnbuf; |
... | ... | @@ -568,28 +557,28 @@ struct _h3270 |
568 | 557 | int once_cset; |
569 | 558 | int saved_cursor; |
570 | 559 | |
571 | - int held_wrap : 1; | |
560 | + unsigned int held_wrap : 1; | |
572 | 561 | |
573 | - int insert_mode : 1; | |
574 | - int auto_newline_mode : 1; | |
562 | + unsigned int insert_mode : 1; | |
563 | + unsigned int auto_newline_mode : 1; | |
575 | 564 | |
576 | - int appl_cursor : 1; | |
577 | - int saved_appl_cursor : 1; | |
565 | + unsigned int appl_cursor : 1; | |
566 | + unsigned int saved_appl_cursor : 1; | |
578 | 567 | |
579 | - int wraparound_mode : 1; | |
580 | - int saved_wraparound_mode : 1; | |
568 | + unsigned int wraparound_mode : 1; | |
569 | + unsigned int saved_wraparound_mode : 1; | |
581 | 570 | |
582 | - int rev_wraparound_mode : 1; | |
583 | - int saved_rev_wraparound_mode : 1; | |
571 | + unsigned int rev_wraparound_mode : 1; | |
572 | + unsigned int saved_rev_wraparound_mode : 1; | |
584 | 573 | |
585 | - int allow_wide_mode : 1; | |
586 | - int saved_allow_wide_mode : 1; | |
574 | + unsigned int allow_wide_mode : 1; | |
575 | + unsigned int saved_allow_wide_mode : 1; | |
587 | 576 | |
588 | - int wide_mode : 1; | |
589 | - int saved_wide_mode : 1; | |
577 | + unsigned int wide_mode : 1; | |
578 | + unsigned int saved_wide_mode : 1; | |
590 | 579 | |
591 | - int saved_altbuffer : 1; | |
592 | - int ansi_reset : 1; /**< @brief Non zero if the ansi_reset() was called in this session */ | |
580 | + unsigned int saved_altbuffer : 1; | |
581 | + unsigned int ansi_reset : 1; /**< @brief Non zero if the ansi_reset() was called in this session */ | |
593 | 582 | |
594 | 583 | int ansi_ch; |
595 | 584 | int cs_to_change; |
... | ... | @@ -663,8 +652,8 @@ struct _h3270 |
663 | 652 | |
664 | 653 | struct |
665 | 654 | { |
666 | - int host : 1; ///< @brief Non zero if host requires SSL. | |
667 | - int download_crl : 1; ///< @brief Non zero to download CRL. | |
655 | + unsigned int host : 1; ///< @brief Non zero if host requires SSL. | |
656 | + unsigned int download_crl : 1; ///< @brief Non zero to download CRL. | |
668 | 657 | LIB3270_SSL_STATE state; |
669 | 658 | int error; |
670 | 659 | const LIB3270_SSL_MESSAGE * message; ///< @brief Pointer to SSL messages for current state. |
... | ... | @@ -685,6 +674,7 @@ struct _h3270 |
685 | 674 | |
686 | 675 | } listeners; |
687 | 676 | |
677 | + unsigned int tasks; | |
688 | 678 | |
689 | 679 | }; |
690 | 680 | ... | ... |
src/include/kybdc.h
... | ... | @@ -74,7 +74,7 @@ |
74 | 74 | #define KYBDLOCK_IS_OERR(hSession) (hSession->kybdlock && !(hSession->kybdlock & ~KL_OERR_MASK)) |
75 | 75 | |
76 | 76 | /* other functions */ |
77 | - LIB3270_INTERNAL void add_xk(KeySym key, KeySym assoc); | |
77 | + //LIB3270_INTERNAL void add_xk(KeySym key, KeySym assoc); | |
78 | 78 | LIB3270_INTERNAL void clear_xks(void); |
79 | 79 | LIB3270_INTERNAL void do_reset(H3270 *session, Boolean explicit); |
80 | 80 | ... | ... |
src/include/lib3270++.h
... | ... | @@ -1,437 +0,0 @@ |
1 | -/* | |
2 | - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
3 | - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
4 | - * aplicativos mainframe. Registro no INPI sob o nome G3270. | |
5 | - * | |
6 | - * Copyright (C) <2008> <Banco do Brasil S.A.> | |
7 | - * | |
8 | - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
9 | - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
10 | - * Free Software Foundation. | |
11 | - * | |
12 | - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
13 | - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
14 | - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
15 | - * obter mais detalhes. | |
16 | - * | |
17 | - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
18 | - * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
19 | - * St, Fifth Floor, Boston, MA 02110-1301 USA | |
20 | - * | |
21 | - * Este programa está nomeado como lib3270++.h e possui - linhas de código. | |
22 | - * | |
23 | - * Contatos: | |
24 | - * | |
25 | - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
26 | - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
27 | - * | |
28 | - */ | |
29 | - | |
30 | -#ifndef LIB3270_HPP_INCLUDED | |
31 | - | |
32 | - #define LIB3270_HPP_INCLUDED 1 | |
33 | - | |
34 | - #include <iostream> | |
35 | - #include <cstdarg> | |
36 | - #include <vector> | |
37 | - #include <functional> | |
38 | - #include <lib3270.h> | |
39 | - | |
40 | - #if defined(_WIN32) | |
41 | - | |
42 | - #define TN3270_PUBLIC __declspec (dllexport) | |
43 | - #define TN3270_PRIVATE | |
44 | - | |
45 | - #elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550) | |
46 | - | |
47 | - #define TN3270_PUBLIC | |
48 | - #define TN3270_PRIVATE | |
49 | - | |
50 | - #elif defined(__GNUC__) | |
51 | - | |
52 | - #define TN3270_PUBLIC __attribute__((visibility("default"))) | |
53 | - #define TN3270_PRIVATE __attribute__((visibility("hidden"))) | |
54 | - | |
55 | - #else | |
56 | - | |
57 | - #error Unable to set visibility attribute | |
58 | - | |
59 | - #endif | |
60 | - | |
61 | -#ifdef __cplusplus | |
62 | - | |
63 | - #include <string> | |
64 | - | |
65 | - namespace TN3270 { | |
66 | - | |
67 | - class Host; | |
68 | - class Controller; | |
69 | - | |
70 | - #define DEFAULT_TIMEOUT 5 | |
71 | - | |
72 | - class TN3270_PUBLIC Event { | |
73 | - public: | |
74 | - enum Type : uint8_t { | |
75 | - All, ///< @brief All events (undefined). | |
76 | - Popup, ///< @brief Popup message. | |
77 | - Trace, ///< @brief Trace message. | |
78 | - Message, ///< @brief Generic message. | |
79 | - Connection ///< @brief Connect/Disconnect event. | |
80 | - }; | |
81 | - | |
82 | - private: | |
83 | - Type type; | |
84 | - | |
85 | - protected: | |
86 | - Event(enum Type type); | |
87 | - | |
88 | - public: | |
89 | - virtual ~Event(); | |
90 | - | |
91 | - /// @brief Check event type | |
92 | - inline bool is(Event::Type type) const noexcept { | |
93 | - return this->type == type; | |
94 | - } | |
95 | - | |
96 | - /// @brief Check event type | |
97 | - inline bool operator==(Event::Type type) const noexcept { | |
98 | - return this->type == type; | |
99 | - } | |
100 | - | |
101 | - inline operator Event::Type() const noexcept { | |
102 | - return this->type; | |
103 | - } | |
104 | - | |
105 | - /// @brief Get event description. | |
106 | - virtual std::string toString() const = 0; | |
107 | - | |
108 | - }; | |
109 | - | |
110 | - enum ProgramMessage : uint8_t { | |
111 | - MESSAGE_NONE = LIB3270_MESSAGE_NONE, ///< @brief No message | |
112 | - MESSAGE_SYSWAIT = LIB3270_MESSAGE_SYSWAIT, ///< @brief -- | |
113 | - MESSAGE_TWAIT = LIB3270_MESSAGE_TWAIT, ///< @brief -- | |
114 | - MESSAGE_CONNECTED = LIB3270_MESSAGE_CONNECTED, ///< @brief Connected | |
115 | - MESSAGE_DISCONNECTED = LIB3270_MESSAGE_DISCONNECTED, ///< @brief Disconnected from host | |
116 | - MESSAGE_AWAITING_FIRST = LIB3270_MESSAGE_AWAITING_FIRST, ///< @brief -- | |
117 | - MESSAGE_MINUS = LIB3270_MESSAGE_MINUS, ///< @brief -- | |
118 | - MESSAGE_PROTECTED = LIB3270_MESSAGE_PROTECTED, ///< @brief -- | |
119 | - MESSAGE_NUMERIC = LIB3270_MESSAGE_NUMERIC, ///< @brief -- | |
120 | - MESSAGE_OVERFLOW = LIB3270_MESSAGE_OVERFLOW, ///< @brief -- | |
121 | - MESSAGE_INHIBIT = LIB3270_MESSAGE_INHIBIT, ///< @brief -- | |
122 | - MESSAGE_KYBDLOCK = LIB3270_MESSAGE_KYBDLOCK, ///< @brief Keyboard is locked | |
123 | - | |
124 | - MESSAGE_X = LIB3270_MESSAGE_X, ///< @brief -- | |
125 | - MESSAGE_RESOLVING = LIB3270_MESSAGE_RESOLVING, ///< @brief Resolving hostname (running DNS query) | |
126 | - MESSAGE_CONNECTING = LIB3270_MESSAGE_CONNECTING ///< @brief Connecting to host | |
127 | - | |
128 | - }; | |
129 | - | |
130 | - /// @brief connection state. | |
131 | - enum ConnectionState : uint8_t { | |
132 | - DISCONNECTED = LIB3270_NOT_CONNECTED, ///< @brief disconnected | |
133 | - RESOLVING = LIB3270_RESOLVING, ///< @brief resolving hostname | |
134 | - PENDING = LIB3270_PENDING, ///< @brief connection pending | |
135 | - CONNECTED_INITIAL = LIB3270_CONNECTED_INITIAL, ///< @brief connected, no mode yet | |
136 | - CONNECTED_ANSI = LIB3270_CONNECTED_ANSI, ///< @brief connected in NVT ANSI mode | |
137 | - CONNECTED_3270 = LIB3270_CONNECTED_3270, ///< @brief connected in old-style 3270 mode | |
138 | - CONNECTED_INITIAL_E = LIB3270_CONNECTED_INITIAL_E, ///< @brief connected in TN3270E mode, unnegotiated | |
139 | - CONNECTED_NVT = LIB3270_CONNECTED_NVT, ///< @brief connected in TN3270E mode, NVT mode | |
140 | - CONNECTED_SSCP = LIB3270_CONNECTED_SSCP, ///< @brief connected in TN3270E mode, SSCP-LU mode | |
141 | - CONNECTED_TN3270E = LIB3270_CONNECTED_TN3270E, ///< @brief connected in TN3270E mode, 3270 mode | |
142 | - }; | |
143 | - | |
144 | - /// @brief PF Keys | |
145 | - enum PFKey : uint8_t { | |
146 | - PF_1, | |
147 | - PF_2, | |
148 | - PF_3, | |
149 | - PF_4, | |
150 | - PF_5, | |
151 | - PF_6, | |
152 | - PF_7, | |
153 | - PF_8, | |
154 | - PF_9, | |
155 | - PF_10, | |
156 | - PF_11, | |
157 | - PF_12 | |
158 | - }; | |
159 | - | |
160 | - /// @brief PF Keys | |
161 | - enum PAKey : uint8_t { | |
162 | - PA_1, | |
163 | - PA_2, | |
164 | - PA_3 | |
165 | - }; | |
166 | - | |
167 | - /// @brief Actions keys | |
168 | - enum Action : uint8_t { | |
169 | - ENTER, ///< Enter key | |
170 | - ERASE, | |
171 | - ERASE_EOF, | |
172 | - ERASE_EOL, | |
173 | - ERASE_INPUT | |
174 | - }; | |
175 | - | |
176 | - /// @brief TN3270 Session. | |
177 | - class TN3270_PUBLIC Session { | |
178 | - protected: | |
179 | - Session(); | |
180 | - | |
181 | - /// @brief Write information to log file. | |
182 | - void info(const char *fmt, ...) const; | |
183 | - | |
184 | - /// @brief Write warning to log file. | |
185 | - void warning(const char *fmt, ...) const; | |
186 | - | |
187 | - /// @brief Write error to log file. | |
188 | - void error(const char *fmt, ...) const; | |
189 | - | |
190 | - /// @brief Fire event. | |
191 | - void fire(const Event &event); | |
192 | - | |
193 | - public: | |
194 | - | |
195 | - /// @brief Create a tn3270 session. | |
196 | - static Session * create(const char *id = nullptr); | |
197 | - | |
198 | - virtual ~Session(); | |
199 | - | |
200 | - // Connect/disconnect | |
201 | - virtual void connect(const char *url) = 0; | |
202 | - virtual void disconnect() = 0; | |
203 | - | |
204 | - // Wait for session state. | |
205 | - virtual void waitForReady(time_t timeout = DEFAULT_TIMEOUT) = 0; | |
206 | - | |
207 | - // Gets | |
208 | - virtual std::string toString(int baddr = 0, size_t len = -1, char lf = '\n') const = 0; | |
209 | - virtual std::string toString(int row, int col, size_t sz, char lf = '\n') const = 0; | |
210 | - | |
211 | - inline operator std::string() const { | |
212 | - return toString(); | |
213 | - } | |
214 | - | |
215 | - // Get properties. | |
216 | - virtual void getProperty(const char *name, int &value) const = 0; | |
217 | - virtual void getProperty(const char *name, std::string &value) const = 0; | |
218 | - virtual void getProperty(const char *name, bool &value) const = 0; | |
219 | - | |
220 | - virtual std::string getVersion() const = 0; | |
221 | - virtual std::string getRevision() const = 0; | |
222 | - | |
223 | - virtual ProgramMessage getProgramMessage() const = 0; | |
224 | - inline operator ProgramMessage() const { | |
225 | - return getProgramMessage(); | |
226 | - } | |
227 | - | |
228 | - virtual ConnectionState getConnectionState() const = 0; | |
229 | - inline operator ConnectionState() const { | |
230 | - return getConnectionState(); | |
231 | - } | |
232 | - | |
233 | - inline bool operator==(ConnectionState state) const noexcept { | |
234 | - return this->getConnectionState() == state; | |
235 | - } | |
236 | - | |
237 | - // Set contents. | |
238 | - | |
239 | - /// @brief Set field at current posicion, jumps to next writable field. | |
240 | - virtual Session & push(const char *text) = 0; | |
241 | - inline Session & push(const std::string &text) { | |
242 | - return push(text.c_str()); | |
243 | - } | |
244 | - | |
245 | - /// @brief Set cursor address. | |
246 | - virtual TN3270::Session & setCursorPosition(unsigned short addr) = 0; | |
247 | - | |
248 | - /// @brief Set cursor position. | |
249 | - virtual TN3270::Session & setCursorPosition(unsigned short row, unsigned short col) = 0; | |
250 | - | |
251 | - virtual Session & push(int baddr, const std::string &text) = 0; | |
252 | - virtual Session & push(int row, int col, const std::string &text) = 0; | |
253 | - virtual Session & push(const PFKey key) = 0; | |
254 | - virtual Session & push(const PAKey key) = 0; | |
255 | - virtual Session & push(const Action action) = 0; | |
256 | - | |
257 | - // Get contents. | |
258 | - virtual Session & pop(int baddr, std::string &text) = 0; | |
259 | - virtual Session & pop(int row, int col, std::string &text) = 0; | |
260 | - virtual Session & pop(std::string &text) = 0; | |
261 | - | |
262 | - /// @brief Insert event listener. | |
263 | - void insert(Event::Type type, std::function <void(const Event &event)> listener); | |
264 | - | |
265 | - // Misc | |
266 | - | |
267 | - /// @brief Execute action by name. | |
268 | - virtual Session & action(const char *action_name) = 0; | |
269 | - | |
270 | - }; | |
271 | - | |
272 | - /// @brief TN3270 Host | |
273 | - class TN3270_PUBLIC Host : public std::basic_streambuf<char, std::char_traits<char> > { | |
274 | - private: | |
275 | - | |
276 | - /// @brief Connection with the host | |
277 | - Session *session; | |
278 | - | |
279 | - /// @brief How much seconds we wait for the terminal to be ready? | |
280 | - time_t timeout; | |
281 | - | |
282 | - protected: | |
283 | - | |
284 | - /// @brief Writes characters to the associated file from the put area | |
285 | - int sync() override; | |
286 | - | |
287 | - /// @brief Writes characters to the associated output sequence from the put area. | |
288 | - int overflow(int c) override; | |
289 | - | |
290 | - /// @brief Write information to log file. | |
291 | - void info(const char *fmt, ...) const; | |
292 | - | |
293 | - /// @brief Write warning to log file. | |
294 | - void warning(const char *fmt, ...) const; | |
295 | - | |
296 | - /// @brief Write error to log file. | |
297 | - void error(const char *fmt, ...) const; | |
298 | - | |
299 | - public: | |
300 | - Host(const char *id = nullptr, const char *url = nullptr, time_t timeout = DEFAULT_TIMEOUT); | |
301 | - ~Host(); | |
302 | - | |
303 | - inline bool operator==(ConnectionState state) const noexcept { | |
304 | - return session->getConnectionState() == state; | |
305 | - } | |
306 | - | |
307 | - void connect(const char *url, bool sync = true); | |
308 | - | |
309 | - inline ProgramMessage getProgramMessage() const { | |
310 | - return session->getProgramMessage(); | |
311 | - } | |
312 | - | |
313 | - inline operator bool() const { | |
314 | - return isReady(); | |
315 | - } | |
316 | - | |
317 | - inline operator ProgramMessage() const { | |
318 | - return getProgramMessage(); | |
319 | - } | |
320 | - | |
321 | - inline ConnectionState getConnectionState() const { | |
322 | - return session->getConnectionState(); | |
323 | - } | |
324 | - | |
325 | - bool isReady() const; | |
326 | - bool isConnected() const; | |
327 | - | |
328 | - inline operator ConnectionState() const { | |
329 | - return getConnectionState(); | |
330 | - } | |
331 | - | |
332 | - /// @brief Set cursor address. | |
333 | - inline void setCursorPosition(unsigned short addr) { | |
334 | - session->setCursorPosition(addr); | |
335 | - } | |
336 | - | |
337 | - /// @brief Set cursor position. | |
338 | - inline void setCursorPosition(unsigned short row, unsigned short col) { | |
339 | - session->setCursorPosition(row,col); | |
340 | - } | |
341 | - | |
342 | - // Get properties | |
343 | - | |
344 | - /// @brief Get lib3270 version. | |
345 | - inline std::string getVersion() const { | |
346 | - return session->getVersion(); | |
347 | - } | |
348 | - | |
349 | - /// @brief Get lib3270 revision. | |
350 | - std::string getRevision() const { | |
351 | - return session->getRevision(); | |
352 | - } | |
353 | - | |
354 | - // Set contents. | |
355 | - | |
356 | - /// @brief Set field at current posicion, jumps to next writable field. | |
357 | - inline Host & push(const char *text) { | |
358 | - session->push(text); | |
359 | - return *this; | |
360 | - }; | |
361 | - | |
362 | - inline Host & push(const std::string &text) { | |
363 | - session->push(text); | |
364 | - return *this; | |
365 | - | |
366 | - } | |
367 | - | |
368 | - inline Host & push(int baddr, const std::string &text) { | |
369 | - session->push(baddr,text); | |
370 | - return *this; | |
371 | - } | |
372 | - | |
373 | - inline Host & push(int row, int col, const std::string &text) { | |
374 | - session->push(row,col,text); | |
375 | - return *this; | |
376 | - } | |
377 | - | |
378 | - inline Host & push(const PFKey key) { | |
379 | - session->push(key); | |
380 | - return *this; | |
381 | - } | |
382 | - | |
383 | - inline Host & push(const PAKey key) { | |
384 | - session->push(key); | |
385 | - return *this; | |
386 | - } | |
387 | - | |
388 | - Host & push(const Action action); | |
389 | - | |
390 | - // Get contents. | |
391 | - | |
392 | - Host & pop(int baddr, std::string &text); | |
393 | - Host & pop(int row, int col, std::string &text); | |
394 | - Host & pop(std::string &text); | |
395 | - | |
396 | - std::string toString() const; | |
397 | - std::string toString(int baddr, size_t len = -1, char lf = '\n') const; | |
398 | - std::string toString(int row, int col, size_t sz, char lf = '\n') const; | |
399 | - | |
400 | - // Event listeners | |
401 | - inline Host & insert(Event::Type type, std::function <void(const Event &event)> listener) noexcept { | |
402 | - session->insert(type, listener); | |
403 | - return *this; | |
404 | - } | |
405 | - | |
406 | - | |
407 | - }; | |
408 | - | |
409 | - } | |
410 | - | |
411 | - TN3270_PUBLIC const char * toCharString(const TN3270::ProgramMessage programMessage) noexcept; | |
412 | - TN3270_PUBLIC const char * toCharString(const TN3270::ConnectionState connectionState) noexcept; | |
413 | - | |
414 | - template <typename T> | |
415 | - inline TN3270_PUBLIC TN3270::Session & operator<<(TN3270::Session& session, const T value) { | |
416 | - return session.push(value); | |
417 | - } | |
418 | - | |
419 | - template <typename T> | |
420 | - inline TN3270_PUBLIC TN3270::Session & operator>>(TN3270::Session& session, const T value) { | |
421 | - return session.pop(value); | |
422 | - } | |
423 | - | |
424 | - template <typename T> | |
425 | - inline TN3270_PUBLIC TN3270::Host & operator<<(TN3270::Host& host, const T value) { | |
426 | - return host.push(value); | |
427 | - } | |
428 | - | |
429 | - inline std::ostream & operator<<(std::ostream &stream, const TN3270::Host& host) { | |
430 | - stream << host.toString(); | |
431 | - return stream; | |
432 | - } | |
433 | - | |
434 | - | |
435 | -#endif | |
436 | - | |
437 | -#endif // LIB3270_H_INCLUDED |
src/include/lib3270.h
... | ... | @@ -546,6 +546,10 @@ |
546 | 546 | * |
547 | 547 | * @return zero if reconnect is unavailable (sets errno), non zero if available. |
548 | 548 | * |
549 | + * @retval ENODATA Invalid or empty hostname. | |
550 | + * @retval EBUSY Auto reconnect in progress. | |
551 | + * @retval EISCONN Session is connected. | |
552 | + * | |
549 | 553 | */ |
550 | 554 | LIB3270_EXPORT int lib3270_allow_reconnect(const H3270 *hSession); |
551 | 555 | |
... | ... | @@ -557,6 +561,11 @@ |
557 | 561 | * |
558 | 562 | * @return 0 for success, non zero if fails (sets errno). |
559 | 563 | * |
564 | + * @retval ENODATA Invalid or empty hostname. | |
565 | + * @retval EBUSY Auto reconnect in progress. | |
566 | + * @retval EISCONN Session is connected. | |
567 | + * @retval -1 Unexpected error. | |
568 | + * | |
560 | 569 | */ |
561 | 570 | LIB3270_EXPORT int lib3270_reconnect(H3270 *hSession,int seconds); |
562 | 571 | ... | ... |
src/include/lib3270/properties.h
... | ... | @@ -275,6 +275,16 @@ |
275 | 275 | */ |
276 | 276 | LIB3270_EXPORT const char * lib3270_service_get_name(const H3270 *h); |
277 | 277 | |
278 | + /** | |
279 | + * @brief Check if there's an active task. | |
280 | + * | |
281 | + * @param h Session handle. | |
282 | + * | |
283 | + * @return Number of background tasks. | |
284 | + * | |
285 | + */ | |
286 | + LIB3270_EXPORT unsigned int lib3270_get_task_count(const H3270 *h); | |
287 | + | |
278 | 288 | #ifdef __cplusplus |
279 | 289 | } |
280 | 290 | #endif | ... | ... |
src/include/lib3270/session.h
src/include/localdefs.h
... | ... | @@ -33,50 +33,23 @@ |
33 | 33 | /* These first definitions were cribbed from X11 -- but no X code is used. */ |
34 | 34 | #define False 0 |
35 | 35 | #define True 1 |
36 | -//typedef void *XtPointer; | |
37 | -// typedef void *Widget; | |
38 | -// typedef void *XEvent; | |
36 | + | |
39 | 37 | #ifdef __APPLE__ |
40 | 38 | typedef unsigned char Boolean; |
41 | 39 | #else |
42 | 40 | typedef char Boolean; |
43 | 41 | #endif |
42 | + | |
44 | 43 | typedef char *String; |
45 | -// typedef unsigned int Cardinal; | |
46 | -typedef unsigned long KeySym; | |
44 | +//typedef unsigned long KeySym; | |
47 | 45 | #define Bool int |
48 | 46 | |
49 | -/* | |
50 | -typedef void (*XtActionProc)( | |
51 | - Widget // widget, | |
52 | - XEvent* // event, | |
53 | - String* // params, | |
54 | - Cardinal* // num_param | |
55 | -); | |
56 | -*/ | |
57 | - | |
58 | -/* | |
59 | -typedef struct _XtActionsRec{ | |
60 | - String string; | |
61 | - XtActionProc proc; | |
62 | -} XtActionsRec; | |
63 | -*/ | |
64 | - | |
65 | -#define XtNumber(n) (sizeof(n)/sizeof((n)[0])) | |
66 | -#define NoSymbol 0L | |
47 | +//#define XtNumber(n) (sizeof(n)/sizeof((n)[0])) | |
48 | +//#define NoSymbol 0L | |
67 | 49 | |
68 | 50 | /* These are local functions with similar semantics to X functions. */ |
69 | - | |
70 | -// void * Malloc(size_t); | |
71 | -// void Free(void *); | |
72 | -// void * Calloc(size_t, size_t); | |
73 | -// void * Realloc(void *, size_t); | |
74 | - | |
75 | -// #define Malloc(x) lib3270_malloc(x) | |
76 | -// #define Free(x) lib3270_free(x) | |
77 | 51 | #define Calloc(e,n) lib3270_calloc(e,n,NULL) |
78 | 52 | #define Realloc(x,n) lib3270_realloc(x,n) |
79 | 53 | |
80 | 54 | #define NewString(x) strdup(x) |
81 | -//extern char *NewString(const char *); | |
82 | 55 | ... | ... |
src/include/networking.h
... | ... | @@ -142,7 +142,7 @@ |
142 | 142 | /// @retval 0 The session is offline. |
143 | 143 | int (*is_connected)(const H3270 *hSession); |
144 | 144 | |
145 | - /// @brief get socket name. | |
145 | + /// @brief Get socket name. | |
146 | 146 | /// |
147 | 147 | /// @return On success, zero is returned. On error, -1 is returned, and errno is set appropriately. |
148 | 148 | /// |
... | ... | @@ -150,6 +150,14 @@ |
150 | 150 | /// @retval -1 Error (errno is set). |
151 | 151 | int (*getsockname)(const H3270 *hSession, struct sockaddr *addr, socklen_t *addrlen); |
152 | 152 | |
153 | + /// @brief Get name of connected peer socket. | |
154 | + /// | |
155 | + /// @return On success, zero is returned. On error, -1 is returned, and errno is set appropriately. | |
156 | + /// | |
157 | + /// @retval 0 Success. | |
158 | + /// @retval -1 Error (errno is set). | |
159 | + int (*getpeername)(const H3270 *hSession, struct sockaddr *addr, socklen_t *addrlen); | |
160 | + | |
153 | 161 | /// @brief Set socket options. |
154 | 162 | int (*setsockopt)(H3270 *hSession, int level, int optname, const void *optval, size_t optlen); |
155 | 163 | ... | ... |
src/include/proxyc.h
... | ... | @@ -1,22 +0,0 @@ |
1 | -/* | |
2 | - * Copyright 2007 by Paul Mattes. | |
3 | - * Permission to use, copy, modify, and distribute this software and its | |
4 | - * documentation for any purpose and without fee is hereby granted, | |
5 | - * provided that the above copyright notice appear in all copies and that | |
6 | - * both that copyright notice and this permission notice appear in | |
7 | - * supporting documentation. | |
8 | - * | |
9 | - * x3270, c3270, wc3270, s3270 and tcl3270 are distributed in the hope that | |
10 | - * they will be useful, but WITHOUT ANY WARRANTY; without even the implied | |
11 | - * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 | - * file LICENSE for more details. | |
13 | - */ | |
14 | - | |
15 | -/* | |
16 | - * proxyc.h | |
17 | - * Declarations for proxy.c. | |
18 | - */ | |
19 | - | |
20 | -LIB3270_INTERNAL int proxy_setup(H3270 *session, char **phost, char **pport); | |
21 | -LIB3270_INTERNAL int proxy_negotiate(H3270 *session, int type, int fd, char *host, unsigned short port); | |
22 | -LIB3270_INTERNAL const char * proxy_type_name(int type); |
src/include/resolverc.h
... | ... | @@ -1,22 +0,0 @@ |
1 | -/* | |
2 | - * Copyright 2007 by Paul Mattes. | |
3 | - * Permission to use, copy, modify, and distribute this software and its | |
4 | - * documentation for any purpose and without fee is hereby granted, | |
5 | - * provided that the above copyright notice appear in all copies and that | |
6 | - * both that copyright notice and this permission notice appear in | |
7 | - * supporting documentation. | |
8 | - * | |
9 | - * x3270, c3270, wc3270, s3270, tcl3270, pr3287 and wpr3287 are distributed in | |
10 | - * the hope that they will be useful, but WITHOUT ANY WARRANTY; without even | |
11 | - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | |
12 | - * See the file LICENSE for more details. | |
13 | - */ | |
14 | - | |
15 | -/* | |
16 | - * resolverc.h | |
17 | - * Hostname resolution. | |
18 | - */ | |
19 | - | |
20 | -// LIB3270_INTERNAL int resolve_host_and_port(H3270 *session, const char *host, char *portname, unsigned short *pport,struct sockaddr *sa, socklen_t *sa_len, char *errmsg, int em_size); | |
21 | - | |
22 | - |
src/include/resources.h
src/include/shlobj_missing.h
src/include/statusc.h
... | ... | @@ -30,9 +30,6 @@ |
30 | 30 | LIB3270_INTERNAL void status_compose(int on, unsigned char c, enum keytype keytype); |
31 | 31 | LIB3270_INTERNAL void status_ctlr_done(H3270 *session); |
32 | 32 | |
33 | -// LIB3270_INTERNAL void status_timing(H3270 *session, struct timeval *t0, struct timeval *t1); | |
34 | -// LIB3270_INTERNAL void status_untiming(H3270 *session); | |
35 | - | |
36 | 33 | LIB3270_INTERNAL void status_lu(H3270 *session, const char *); |
37 | 34 | LIB3270_INTERNAL void status_oerr(H3270 *session, int error_type); |
38 | 35 | LIB3270_INTERNAL void status_reset(H3270 *session); | ... | ... |
src/include/telnetc.h
src/include/utf8c.h
... | ... | @@ -18,15 +18,17 @@ |
18 | 18 | * UTF-8 conversions |
19 | 19 | */ |
20 | 20 | |
21 | + /* | |
21 | 22 | enum ulfail { |
22 | - ULFAIL_NOUTF8, /* not using UTF-8 */ | |
23 | - ULFAIL_INCOMPLETE, /* incomplete sequence */ | |
24 | - ULFAIL_INVALID /* invalid sequence */ | |
23 | + ULFAIL_NOUTF8, // not using UTF-8 | |
24 | + ULFAIL_INCOMPLETE, // incomplete sequence | |
25 | + ULFAIL_INVALID // invalid sequence | |
25 | 26 | }; |
27 | +*/ | |
26 | 28 | |
27 | 29 | // LIB3270_INTERNAL char *locale_codeset; |
28 | 30 | |
29 | 31 | // LIB3270_INTERNAL void set_codeset(char *codeset_name); |
30 | 32 | // LIB3270_INTERNAL Boolean utf8_set_display_charsets(char *cslist, char *csname); |
31 | - LIB3270_INTERNAL char *utf8_expand(unsigned char c); | |
32 | - LIB3270_INTERNAL unsigned char utf8_lookup(char *mbs, enum ulfail *fail, int *consumed); | |
33 | +// LIB3270_INTERNAL char *utf8_expand(unsigned char c); | |
34 | +// LIB3270_INTERNAL unsigned char utf8_lookup(char *mbs, enum ulfail *fail, int *consumed); | ... | ... |
src/include/xl.h
src/mkactions/mkactions.c
... | ... | @@ -1,215 +0,0 @@ |
1 | -/* | |
2 | - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
3 | - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
4 | - * aplicativos mainframe. Registro no INPI sob o nome G3270. Registro no INPI sob o nome G3270. | |
5 | - * | |
6 | - * Copyright (C) <2008> <Banco do Brasil S.A.> | |
7 | - * | |
8 | - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
9 | - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
10 | - * Free Software Foundation. | |
11 | - * | |
12 | - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
13 | - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
14 | - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
15 | - * obter mais detalhes. | |
16 | - * | |
17 | - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
18 | - * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
19 | - * St, Fifth Floor, Boston, MA 02110-1301 USA | |
20 | - * | |
21 | - * Este programa está nomeado como mkfb.c e possui - linhas de código. | |
22 | - * | |
23 | - * Contatos: | |
24 | - * | |
25 | - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
26 | - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
27 | - * | |
28 | - */ | |
29 | - | |
30 | -/** | |
31 | - * @brief Utility to create the actions definition files. | |
32 | - * | |
33 | - */ | |
34 | - | |
35 | -#include <getopt.h> | |
36 | -#include <stdio.h> | |
37 | - | |
38 | -#define DECLARE_LIB3270_ACTION( name, description ) \ | |
39 | - { \ | |
40 | - description, \ | |
41 | - NULL, \ | |
42 | - "LIB3270_EXPORT int lib3270_" # name "(H3270 *hSession);" \ | |
43 | - }, | |
44 | - | |
45 | -#define DECLARE_LIB3270_CLEAR_SELECTION_ACTION( name, description ) \ | |
46 | - { \ | |
47 | - description, \ | |
48 | - NULL, \ | |
49 | - "LIB3270_EXPORT int lib3270_" # name "(H3270 *hSession);" \ | |
50 | - }, | |
51 | - | |
52 | -#define DECLARE_LIB3270_KEY_ACTION( name, description ) \ | |
53 | - { \ | |
54 | - description, \ | |
55 | - NULL, \ | |
56 | - "LIB3270_EXPORT int lib3270_" # name "(H3270 *hSession);" \ | |
57 | - }, | |
58 | - | |
59 | -#define DECLARE_LIB3270_CURSOR_ACTION( name, description ) \ | |
60 | - { \ | |
61 | - description, \ | |
62 | - NULL, \ | |
63 | - "LIB3270_EXPORT int lib3270_cursor_" # name "(H3270 *hSession);" \ | |
64 | - }, | |
65 | - | |
66 | -#define DECLARE_LIB3270_FKEY_ACTION( name, description ) \ | |
67 | - { \ | |
68 | - description, \ | |
69 | - "keycode\tNumber of the " #name " to activate.", \ | |
70 | - "LIB3270_EXPORT int lib3270_" # name "(H3270 *hSession, int keycode);" \ | |
71 | - }, | |
72 | - | |
73 | - | |
74 | -static struct { | |
75 | - const char *description; | |
76 | - const char *args; | |
77 | - const char *prototype; | |
78 | -} actions[] = { | |
79 | - #include <lib3270/action_table.h> | |
80 | -}; | |
81 | - | |
82 | - | |
83 | -int main(int argc, char *argv[]) { | |
84 | - | |
85 | - enum _format { | |
86 | - FORMAT_HEADER | |
87 | - } format = FORMAT_HEADER; | |
88 | - | |
89 | - size_t ix; | |
90 | - | |
91 | - char * outfile = "actions.h"; | |
92 | - | |
93 | - //#pragma GCC diagnostic push | |
94 | - //#pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant" | |
95 | - static struct option options[] = { | |
96 | - { "outfile", required_argument, 0, 'o' }, | |
97 | - { 0, 0, 0, 0} | |
98 | - | |
99 | - }; | |
100 | - //#pragma GCC diagnostic pop | |
101 | - | |
102 | - int long_index =0; | |
103 | - int opt; | |
104 | - while((opt = getopt_long(argc, argv, "o:", options, &long_index )) != -1) { | |
105 | - | |
106 | - switch(opt) { | |
107 | - case 'o': // Pidfile | |
108 | - outfile = optarg; | |
109 | - break; | |
110 | - } | |
111 | - | |
112 | - } | |
113 | - | |
114 | - FILE *out = fopen(outfile,"w"); | |
115 | - | |
116 | - fprintf(out,"%s\n", | |
117 | - "/*\n" | |
118 | - " * Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270\n" | |
119 | - " * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a\n" | |
120 | - " * aplicativos mainframe. Registro no INPI sob o nome G3270. Registro no INPI sob o nome G3270.\n" | |
121 | - " *\n" | |
122 | - " * Copyright (C) <2008> <Banco do Brasil S.A.>\n" | |
123 | - " *\n" | |
124 | - " * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob\n" | |
125 | - " * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela\n" | |
126 | - " * Free Software Foundation.\n" | |
127 | - " *\n" | |
128 | - " * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER\n" | |
129 | - " * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO\n" | |
130 | - " * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para\n" | |
131 | - " * obter mais detalhes.\n" | |
132 | - " *\n" | |
133 | - " * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este\n" | |
134 | - " * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin\n" | |
135 | - " * St, Fifth Floor, Boston, MA 02110-1301 USA\n" | |
136 | - " *\n" | |
137 | - " * Contatos:\n" | |
138 | - " *\n" | |
139 | - " * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)\n" | |
140 | - " * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)\n" | |
141 | - " *\n" | |
142 | - " */\n\n" | |
143 | - "#ifndef LIB3270_ACTIONS_H_INCLUDED\n" | |
144 | - "\n" | |
145 | - "\n #define LIB3270_ACTIONS_H_INCLUDED 1\n\n" | |
146 | - "#ifdef __cplusplus\n" | |
147 | - " extern \"C\" {\n" | |
148 | - "#endif\n\n" | |
149 | - ); | |
150 | - | |
151 | - if(format == FORMAT_HEADER) | |
152 | - { | |
153 | - | |
154 | - for(ix = 0; ix < (sizeof(actions)/sizeof(actions[0])); ix++) | |
155 | - { | |
156 | - fprintf(out, | |
157 | - "/**\n" | |
158 | - " *\n" | |
159 | - " * @brief %s\n" | |
160 | - " *\n" | |
161 | - " * @param hSession\tTN3270 Session handle.\n", | |
162 | - actions[ix].description | |
163 | - ); | |
164 | - | |
165 | - if(actions[ix].args) { | |
166 | - fprintf(out," * @param %s\n", actions[ix].args); | |
167 | - } | |
168 | - | |
169 | - fprintf(out, | |
170 | - " *\n" | |
171 | - " * @return 0 if Ok, non zero if not (sets errno)\n" | |
172 | - ); | |
173 | - | |
174 | - fprintf(out," *\n */\n %s\n\n",actions[ix].prototype); | |
175 | - } | |
176 | - | |
177 | - fprintf(out, | |
178 | - "\n" | |
179 | - "\n typedef struct _lib3270_action_entry" | |
180 | - "\n {" | |
181 | - "\n const char *name;" | |
182 | - "\n const char *description;" | |
183 | - "\n int (*call)(H3270 *hSession);" | |
184 | - "\n } LIB3270_ACTION_ENTRY;" | |
185 | - "\n\n" | |
186 | - "/**\n" | |
187 | - " *\n" | |
188 | - " * @brief Get lib3270 action table.\n" | |
189 | - " *\n" | |
190 | - " * @return Array with all the supported actions.\n" | |
191 | - " */\n" | |
192 | - " LIB3270_EXPORT const LIB3270_ACTION_ENTRY * lib3270_get_actions();\n" | |
193 | - "\n" | |
194 | - "/**\n" | |
195 | - " *\n" | |
196 | - " * @brief Call lib3270 action by name.\n" | |
197 | - " *\n" | |
198 | - " * @param hSession\tTN3270 Session handle.\n" | |
199 | - " * @param name\tName of the action to call.\n" | |
200 | - " *\n" | |
201 | - " */\n" | |
202 | - " LIB3270_EXPORT int lib3270_action(H3270 *hSession, const char *name);\n\n" | |
203 | - "#ifdef __cplusplus\n" | |
204 | - " }\n" | |
205 | - "#endif\n" | |
206 | - "\n#endif // LIB3270_ACTIONS_H_INCLUDED" | |
207 | - ); | |
208 | - } | |
209 | - | |
210 | - fclose(out); | |
211 | - | |
212 | - return 0; | |
213 | -} | |
214 | - | |
215 | - |
src/mkactions/mkactions.cbp
... | ... | @@ -1,45 +0,0 @@ |
1 | -<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> | |
2 | -<CodeBlocks_project_file> | |
3 | - <FileVersion major="1" minor="6" /> | |
4 | - <Project> | |
5 | - <Option title="LIB3270 Action Table Generator" /> | |
6 | - <Option pch_mode="2" /> | |
7 | - <Option compiler="gcc" /> | |
8 | - <Build> | |
9 | - <Target title="Debug"> | |
10 | - <Option output=".bin/Debug/mkactions" prefix_auto="1" extension_auto="1" /> | |
11 | - <Option object_output=".obj/Debug/" /> | |
12 | - <Option type="1" /> | |
13 | - <Option compiler="gcc" /> | |
14 | - <Compiler> | |
15 | - <Add option="-g" /> | |
16 | - </Compiler> | |
17 | - </Target> | |
18 | - <Target title="Release"> | |
19 | - <Option output=".bin/Release/mkactions" prefix_auto="1" extension_auto="1" /> | |
20 | - <Option object_output=".obj/Release/" /> | |
21 | - <Option type="1" /> | |
22 | - <Option compiler="gcc" /> | |
23 | - <Compiler> | |
24 | - <Add option="-O2" /> | |
25 | - </Compiler> | |
26 | - <Linker> | |
27 | - <Add option="-s" /> | |
28 | - </Linker> | |
29 | - </Target> | |
30 | - </Build> | |
31 | - <Compiler> | |
32 | - <Add option="-Wall" /> | |
33 | - <Add directory="../../include" /> | |
34 | - </Compiler> | |
35 | - <Unit filename="mkactions.c"> | |
36 | - <Option compilerVar="CC" /> | |
37 | - </Unit> | |
38 | - <Extensions> | |
39 | - <code_completion /> | |
40 | - <envvars /> | |
41 | - <debugger /> | |
42 | - <lib_finder disable_auto="1" /> | |
43 | - </Extensions> | |
44 | - </Project> | |
45 | -</CodeBlocks_project_file> |
src/network_modules/default/main.c
... | ... | @@ -92,6 +92,10 @@ static int unsecure_network_getsockname(const H3270 *hSession, struct sockaddr * |
92 | 92 | return getsockname(hSession->network.context->sock, addr, addrlen); |
93 | 93 | } |
94 | 94 | |
95 | +static int unsecure_network_getpeername(const H3270 *hSession, struct sockaddr *addr, socklen_t *addrlen) { | |
96 | + return getpeername(hSession->network.context->sock, addr, addrlen); | |
97 | +} | |
98 | + | |
95 | 99 | static void * unsecure_network_add_poll(H3270 *hSession, LIB3270_IO_FLAG flag, void(*call)(H3270 *, int, LIB3270_IO_FLAG, void *), void *userdata) { |
96 | 100 | return lib3270_add_poll_fd(hSession,hSession->network.context->sock,flag,call,userdata); |
97 | 101 | } |
... | ... | @@ -166,6 +170,7 @@ void lib3270_set_default_network_module(H3270 *hSession) { |
166 | 170 | .non_blocking = unsecure_network_non_blocking, |
167 | 171 | .is_connected = unsecure_network_is_connected, |
168 | 172 | .getsockname = unsecure_network_getsockname, |
173 | + .getpeername = unsecure_network_getpeername, | |
169 | 174 | .setsockopt = unsecure_network_setsockopt, |
170 | 175 | .getsockopt = unsecure_network_getsockopt, |
171 | 176 | .reset = unsecure_network_reset | ... | ... |
src/network_modules/openssl/crl.c
... | ... | @@ -27,7 +27,7 @@ |
27 | 27 | * |
28 | 28 | */ |
29 | 29 | |
30 | -/// @brief Get CRL infro from X509 cert. | |
30 | +/// @brief Get CRL info from X509 cert. | |
31 | 31 | /// |
32 | 32 | /// References: |
33 | 33 | /// |
... | ... | @@ -35,6 +35,7 @@ |
35 | 35 | |
36 | 36 | |
37 | 37 | #include "private.h" |
38 | +#include <utilc.h> | |
38 | 39 | |
39 | 40 | /*--[ Implement ]------------------------------------------------------------------------------------*/ |
40 | 41 | |
... | ... | @@ -79,7 +80,13 @@ LIB3270_STRING_ARRAY * lib3270_openssl_get_crls_from_peer(H3270 *hSession, X509 |
79 | 80 | #endif // OpenSSL 1.1.0+ |
80 | 81 | |
81 | 82 | if(data && length > 0) |
82 | - lib3270_string_array_append_with_length(uris,(char *) data, (size_t) length); | |
83 | + { | |
84 | + lib3270_autoptr(char) uri = lib3270_malloc( ((size_t) length) + 1); | |
85 | + strncpy(uri,(char *) data, (size_t) length); | |
86 | + | |
87 | + lib3270_autoptr(char) unescaped = lib3270_unescape(uri); | |
88 | + lib3270_string_array_append(uris,unescaped); | |
89 | + } | |
83 | 90 | |
84 | 91 | } |
85 | 92 | ... | ... |
src/network_modules/openssl/main.c
... | ... | @@ -186,6 +186,10 @@ static int openssl_network_getsockname(const H3270 *hSession, struct sockaddr *a |
186 | 186 | return getsockname(hSession->network.context->sock, addr, addrlen); |
187 | 187 | } |
188 | 188 | |
189 | +static int openssl_network_getpeername(const H3270 *hSession, struct sockaddr *addr, socklen_t *addrlen) { | |
190 | + return getpeername(hSession->network.context->sock, addr, addrlen); | |
191 | +} | |
192 | + | |
189 | 193 | static void * openssl_network_add_poll(H3270 *hSession, LIB3270_IO_FLAG flag, void(*call)(H3270 *, int, LIB3270_IO_FLAG, void *), void *userdata) { |
190 | 194 | return lib3270_add_poll_fd(hSession,hSession->network.context->sock,flag,call,userdata); |
191 | 195 | } |
... | ... | @@ -346,6 +350,7 @@ void lib3270_set_libssl_network_module(H3270 *hSession) { |
346 | 350 | .non_blocking = openssl_network_non_blocking, |
347 | 351 | .is_connected = openssl_network_is_connected, |
348 | 352 | .getsockname = openssl_network_getsockname, |
353 | + .getpeername = openssl_network_getpeername, | |
349 | 354 | .setsockopt = openssl_network_setsockopt, |
350 | 355 | .getsockopt = openssl_network_getsockopt, |
351 | 356 | .getcert = openssl_network_getcert, | ... | ... |
src/network_modules/openssl/start.c
... | ... | @@ -34,6 +34,7 @@ |
34 | 34 | |
35 | 35 | #include "private.h" |
36 | 36 | #include <lib3270/properties.h> |
37 | + #include <utilc.h> | |
37 | 38 | |
38 | 39 | static int import_crl(H3270 *hSession, SSL_CTX * ssl_ctx, LIB3270_NET_CONTEXT * context, const char *url) { |
39 | 40 | |
... | ... | @@ -103,25 +104,26 @@ |
103 | 104 | |
104 | 105 | if(X509_STORE_add_crl(store, x509_crl)) { |
105 | 106 | trace_ssl(hSession,"CRL was added to context cert store\n"); |
106 | - } else { | |
107 | - trace_ssl(hSession,"CRL was not added to context cert store\n"); | |
107 | + return 0; | |
108 | 108 | } |
109 | 109 | |
110 | - return 0; | |
110 | + trace_ssl(hSession,"CRL was not added to context cert store\n"); | |
111 | + | |
112 | + return -1; | |
111 | 113 | |
112 | 114 | } |
113 | 115 | |
114 | - static void download_crl_from_peer(H3270 *hSession, SSL_CTX * ctx_context, LIB3270_NET_CONTEXT * context, X509 *peer) { | |
116 | + static int download_crl_from_peer(H3270 *hSession, SSL_CTX * ctx_context, LIB3270_NET_CONTEXT * context, X509 *peer) { | |
115 | 117 | |
116 | 118 | debug("%s peer=%p",__FUNCTION__,(void *) peer); |
117 | 119 | |
118 | 120 | if(!peer) |
119 | - return; | |
121 | + return -1; | |
120 | 122 | |
121 | 123 | lib3270_autoptr(LIB3270_STRING_ARRAY) uris = lib3270_openssl_get_crls_from_peer(hSession, peer); |
122 | 124 | if(!uris) { |
123 | 125 | trace_ssl(hSession,"Can't get distpoints from peer certificate\n"); |
124 | - return; | |
126 | + return -1; | |
125 | 127 | } |
126 | 128 | |
127 | 129 | size_t ix; |
... | ... | @@ -134,11 +136,11 @@ |
134 | 136 | |
135 | 137 | if(!import_crl(hSession,ctx_context,context,uris->str[ix])) { |
136 | 138 | trace_ssl(hSession,"Got CRL from %s\n",uris->str[ix]); |
137 | - return; | |
139 | + return 0; | |
138 | 140 | } |
139 | 141 | |
140 | 142 | } |
141 | - return; | |
143 | + return -1; | |
142 | 144 | |
143 | 145 | } |
144 | 146 | |
... | ... | @@ -152,10 +154,9 @@ |
152 | 154 | if(strncasecmp(prefer,uris->str[ix],length)) |
153 | 155 | continue; |
154 | 156 | |
155 | - debug("Trying %s",uris->str[ix]); | |
156 | 157 | if(!import_crl(hSession,ctx_context,context,uris->str[ix])) { |
157 | 158 | trace_ssl(hSession,"Got CRL from %s\n",uris->str[ix]); |
158 | - return; | |
159 | + return 0; | |
159 | 160 | } |
160 | 161 | |
161 | 162 | } |
... | ... | @@ -168,13 +169,34 @@ |
168 | 169 | |
169 | 170 | if(!import_crl(hSession,ctx_context,context,uris->str[ix])) { |
170 | 171 | trace_ssl(hSession,"Got CRL from %s\n",uris->str[ix]); |
171 | - return; | |
172 | + return 0; | |
172 | 173 | } |
173 | 174 | |
174 | 175 | } |
175 | 176 | |
177 | + return -1; | |
178 | + | |
176 | 179 | } |
177 | 180 | |
181 | +int x509_store_ctx_error_callback(int ok, X509_STORE_CTX GNUC_UNUSED(*ctx)) | |
182 | +{ | |
183 | + debug("%s(%d)",__FUNCTION__,ok); | |
184 | + | |
185 | +/* | |
186 | + 55 { | |
187 | + 56 if (!ok) { | |
188 | + 57 Category::getInstance("OpenSSL").error( | |
189 | + 58 "path validation failure at depth(%d): %s", | |
190 | + 59 X509_STORE_CTX_get_error_depth(ctx), | |
191 | + 60 X509_verify_cert_error_string(X509_STORE_CTX_get_error(ctx)) | |
192 | + 61 ); | |
193 | + 62 } | |
194 | + 63 return ok; | |
195 | + 64 } | |
196 | +*/ | |
197 | + return ok; | |
198 | +} | |
199 | + | |
178 | 200 | int openssl_network_start_tls(H3270 *hSession) { |
179 | 201 | |
180 | 202 | SSL_CTX * ctx_context = (SSL_CTX *) lib3270_openssl_get_context(hSession); |
... | ... | @@ -199,7 +221,8 @@ |
199 | 221 | |
200 | 222 | SSL_set_ex_data(context->con,lib3270_openssl_get_ex_index(hSession),(char *) hSession); |
201 | 223 | // SSL_set_verify(context->con, SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL); |
202 | - SSL_set_verify(context->con, 0, NULL); | |
224 | +// SSL_set_verify(context->con, SSL_VERIFY_PEER, NULL); | |
225 | + SSL_set_verify(context->con, SSL_VERIFY_NONE, NULL); | |
203 | 226 | |
204 | 227 | if(SSL_set_fd(context->con, context->sock) != 1) |
205 | 228 | { |
... | ... | @@ -295,13 +318,40 @@ |
295 | 318 | |
296 | 319 | // CRL download is enabled and verification has failed; look for CRL file. |
297 | 320 | |
321 | + | |
298 | 322 | trace_ssl(hSession,"CRL Validation has failed, requesting CRL download\n"); |
299 | 323 | set_ssl_state(hSession,LIB3270_SSL_VERIFYING); |
300 | 324 | |
325 | + int rc_download = -1; | |
326 | + | |
301 | 327 | if(context->crl.url) { |
302 | - import_crl(hSession, ctx_context,context,context->crl.url); | |
328 | + rc_download = import_crl(hSession, ctx_context,context,context->crl.url); | |
303 | 329 | } else { |
304 | - download_crl_from_peer(hSession, ctx_context, context, peer); | |
330 | + rc_download = download_crl_from_peer(hSession, ctx_context, context, peer); | |
331 | + } | |
332 | + | |
333 | + debug("Download rc=%d",rc_download); | |
334 | + | |
335 | + if(!rc_download) | |
336 | + { | |
337 | + // Got CRL, verify it! | |
338 | + // Reference: https://stackoverflow.com/questions/10510850/how-to-verify-the-certificate-for-the-ongoing-ssl-session | |
339 | + | |
340 | + X509_STORE_CTX *csc = X509_STORE_CTX_new(); | |
341 | + X509_STORE_CTX_set_verify_cb(csc, x509_store_ctx_error_callback); | |
342 | + X509_STORE_CTX_init(csc, SSL_CTX_get_cert_store(ctx_context), peer, NULL); | |
343 | + | |
344 | + if(X509_verify_cert(csc) != 1) | |
345 | + rv = X509_STORE_CTX_get_error(csc); | |
346 | + else | |
347 | + rv = X509_V_OK; | |
348 | + | |
349 | + trace_ssl(hSession, "X509_verify_cert error code was %d\n", rv); | |
350 | + | |
351 | + SSL_set_verify_result(context->con, rv); | |
352 | + | |
353 | + X509_STORE_CTX_free(csc); | |
354 | + | |
305 | 355 | } |
306 | 356 | |
307 | 357 | } |
... | ... | @@ -313,6 +363,7 @@ |
313 | 363 | |
314 | 364 | // Get validation message. |
315 | 365 | hSession->ssl.message = lib3270_openssl_message_from_id(verify_result); |
366 | + debug("Verify message: %s",hSession->ssl.message->summary); | |
316 | 367 | |
317 | 368 | // Trace cypher |
318 | 369 | if(lib3270_get_toggle(hSession,LIB3270_TOGGLE_SSL_TRACE)) |
... | ... | @@ -331,7 +382,7 @@ |
331 | 382 | |
332 | 383 | // Check results. |
333 | 384 | if(hSession->ssl.message) |
334 | - trace_ssl(hSession,"%s",hSession->ssl.message->summary); | |
385 | + trace_ssl(hSession,"%s\n",hSession->ssl.message->summary); | |
335 | 386 | else |
336 | 387 | trace_ssl(hSession,"TLS/SSL verify result was %ld\n", verify_result); |
337 | 388 | ... | ... |
src/network_modules/tools.c
... | ... | @@ -263,3 +263,16 @@ int lib3270_socket_set_non_blocking(H3270 *hSession, int sock, const unsigned ch |
263 | 263 | |
264 | 264 | return EINVAL; |
265 | 265 | } |
266 | + | |
267 | + LIB3270_EXPORT int lib3270_getpeername(H3270 *hSession, struct sockaddr *addr, socklen_t *addrlen) | |
268 | + { | |
269 | + FAIL_IF_NOT_ONLINE(hSession); | |
270 | + return hSession->network.module->getpeername(hSession, addr, addrlen); | |
271 | + } | |
272 | + | |
273 | + LIB3270_EXPORT int lib3270_getsockname(H3270 *hSession, struct sockaddr *addr, socklen_t *addrlen) | |
274 | + { | |
275 | + FAIL_IF_NOT_ONLINE(hSession); | |
276 | + return hSession->network.module->getsockname(hSession, addr, addrlen); | |
277 | + } | |
278 | + | ... | ... |