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,7 +255,6 @@ | ||
255 | </Unit> | 255 | </Unit> |
256 | <Unit filename="src/include/3270ds.h" /> | 256 | <Unit filename="src/include/3270ds.h" /> |
257 | <Unit filename="src/include/X11keysym.h" /> | 257 | <Unit filename="src/include/X11keysym.h" /> |
258 | - <Unit filename="src/include/action_table.h" /> | ||
259 | <Unit filename="src/include/ansic.h" /> | 258 | <Unit filename="src/include/ansic.h" /> |
260 | <Unit filename="src/include/arpa_telnet.h" /> | 259 | <Unit filename="src/include/arpa_telnet.h" /> |
261 | <Unit filename="src/include/array.h" /> | 260 | <Unit filename="src/include/array.h" /> |
@@ -271,7 +270,6 @@ | @@ -271,7 +270,6 @@ | ||
271 | <Unit filename="src/include/hostc.h" /> | 270 | <Unit filename="src/include/hostc.h" /> |
272 | <Unit filename="src/include/internals.h" /> | 271 | <Unit filename="src/include/internals.h" /> |
273 | <Unit filename="src/include/kybdc.h" /> | 272 | <Unit filename="src/include/kybdc.h" /> |
274 | - <Unit filename="src/include/lib3270++.h" /> | ||
275 | <Unit filename="src/include/lib3270.h" /> | 273 | <Unit filename="src/include/lib3270.h" /> |
276 | <Unit filename="src/include/lib3270/actions.h" /> | 274 | <Unit filename="src/include/lib3270/actions.h" /> |
277 | <Unit filename="src/include/lib3270/charset.h" /> | 275 | <Unit filename="src/include/lib3270/charset.h" /> |
locale/pt_BR.po
@@ -6,7 +6,7 @@ msgstr "" | @@ -6,7 +6,7 @@ msgstr "" | ||
6 | "Project-Id-Version: pw3270 5.0\n" | 6 | "Project-Id-Version: pw3270 5.0\n" |
7 | "Report-Msgid-Bugs-To: \n" | 7 | "Report-Msgid-Bugs-To: \n" |
8 | "POT-Creation-Date: 2020-10-17 11:58-0300\n" | 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 | "Last-Translator: Perry Werneck <perry.werneck@gmail.com>\n" | 10 | "Last-Translator: Perry Werneck <perry.werneck@gmail.com>\n" |
11 | "Language-Team: Português <>\n" | 11 | "Language-Team: Português <>\n" |
12 | "Language: pt_BR\n" | 12 | "Language: pt_BR\n" |
@@ -16,8 +16,7 @@ msgstr "" | @@ -16,8 +16,7 @@ msgstr "" | ||
16 | "X-Poedit-Language: Portuguese\n" | 16 | "X-Poedit-Language: Portuguese\n" |
17 | "X-Poedit-Country: BRAZIL\n" | 17 | "X-Poedit-Country: BRAZIL\n" |
18 | "X-Poedit-SourceCharset: utf-8\n" | 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 | "X-Generator: Gtranslator 2.91.7\n" | 20 | "X-Generator: Gtranslator 2.91.7\n" |
22 | 21 | ||
23 | #: src/core/ctlr.c:187 | 22 | #: src/core/ctlr.c:187 |
@@ -898,12 +897,10 @@ msgid "Keyboard lock status" | @@ -898,12 +897,10 @@ msgid "Keyboard lock status" | ||
898 | msgstr "Estado de bloqueio do teclado" | 897 | msgstr "Estado de bloqueio do teclado" |
899 | 898 | ||
900 | #: src/core/windows/ldap.c:193 | 899 | #: src/core/windows/ldap.c:193 |
901 | -#, fuzzy | ||
902 | msgid "LDAP Search did not produce any attributes." | 900 | msgid "LDAP Search did not produce any attributes." |
903 | msgstr "Pesquisa LDAP não produziu nenhum atributo." | 901 | msgstr "Pesquisa LDAP não produziu nenhum atributo." |
904 | 902 | ||
905 | #: src/core/windows/ldap.c:201 | 903 | #: src/core/windows/ldap.c:201 |
906 | -#, fuzzy | ||
907 | msgid "LDAPSearch did not produce any values." | 904 | msgid "LDAPSearch did not produce any values." |
908 | msgstr "Pesquisa LDAP não produziu nenhum valor." | 905 | msgstr "Pesquisa LDAP não produziu nenhum valor." |
909 | 906 |
src/core/actions/table.c
@@ -48,7 +48,7 @@ | @@ -48,7 +48,7 @@ | ||
48 | 48 | ||
49 | static int connect_host(H3270 *hSession) | 49 | static int connect_host(H3270 *hSession) |
50 | { | 50 | { |
51 | - return lib3270_reconnect(hSession,0); | 51 | + return hSession->cbk.reconnect(hSession,0); |
52 | } | 52 | } |
53 | 53 | ||
54 | static int select_up(H3270 *hSession) | 54 | static int select_up(H3270 *hSession) |
src/core/ansi.c
@@ -59,7 +59,7 @@ | @@ -59,7 +59,7 @@ | ||
59 | #include "screenc.h" | 59 | #include "screenc.h" |
60 | #include "telnetc.h" | 60 | #include "telnetc.h" |
61 | #include "trace_dsc.h" | 61 | #include "trace_dsc.h" |
62 | -#include "utf8c.h" | 62 | +//#include "utf8c.h" |
63 | #if defined(X3270_DBCS) /*[*/ | 63 | #if defined(X3270_DBCS) /*[*/ |
64 | #include "widec.h" | 64 | #include "widec.h" |
65 | #endif /*]*/ | 65 | #endif /*]*/ |
src/core/charset/utf8.c
@@ -39,7 +39,7 @@ | @@ -39,7 +39,7 @@ | ||
39 | // #include "api.h" | 39 | // #include "api.h" |
40 | 40 | ||
41 | #include "popupsc.h" | 41 | #include "popupsc.h" |
42 | -#include "utf8c.h" | 42 | +//#include "utf8c.h" |
43 | 43 | ||
44 | // char *locale_codeset = CN; | 44 | // char *locale_codeset = CN; |
45 | 45 | ||
@@ -350,6 +350,7 @@ static char *utf8_tab[U_MAX][96] = { | @@ -350,6 +350,7 @@ static char *utf8_tab[U_MAX][96] = { | ||
350 | * character set. | 350 | * character set. |
351 | * Returns 0 if the lookup fails. | 351 | * Returns 0 if the lookup fails. |
352 | */ | 352 | */ |
353 | + /* | ||
353 | unsigned char utf8_lookup(char GNUC_UNUSED(*mbs), enum ulfail *fail, int GNUC_UNUSED(*consumed)) | 354 | unsigned char utf8_lookup(char GNUC_UNUSED(*mbs), enum ulfail *fail, int GNUC_UNUSED(*consumed)) |
354 | { | 355 | { |
355 | if (fail != NULL) | 356 | if (fail != NULL) |
@@ -357,3 +358,4 @@ unsigned char utf8_lookup(char GNUC_UNUSED(*mbs), enum ulfail *fail, int GNUC_UN | @@ -357,3 +358,4 @@ unsigned char utf8_lookup(char GNUC_UNUSED(*mbs), enum ulfail *fail, int GNUC_UN | ||
357 | 358 | ||
358 | return 0; | 359 | return 0; |
359 | } | 360 | } |
361 | +*/ |
src/core/connect.c
@@ -49,36 +49,10 @@ | @@ -49,36 +49,10 @@ | ||
49 | lib3270_set_url(hSession,url); | 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 | int lib3270_allow_reconnect(const H3270 *hSession) | 56 | int lib3270_allow_reconnect(const H3270 *hSession) |
83 | { | 57 | { |
84 | // | 58 | // |
@@ -103,7 +77,8 @@ | @@ -103,7 +77,8 @@ | ||
103 | // Do I have a defined host? | 77 | // Do I have a defined host? |
104 | if(!(hSession->host.current && hSession->host.srvc && *hSession->host.current && *hSession->host.srvc)) | 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 | return 0; | 82 | return 0; |
108 | } | 83 | } |
109 | 84 |
src/core/ctlr.c
@@ -46,7 +46,7 @@ | @@ -46,7 +46,7 @@ | ||
46 | #include <stdlib.h> | 46 | #include <stdlib.h> |
47 | #include "3270ds.h" | 47 | #include "3270ds.h" |
48 | #include "screen.h" | 48 | #include "screen.h" |
49 | -#include "resources.h" | 49 | +//#include "resources.h" |
50 | 50 | ||
51 | #include "ctlrc.h" | 51 | #include "ctlrc.h" |
52 | #include "ftc.h" | 52 | #include "ftc.h" |
@@ -205,7 +205,7 @@ void ctlr_set_rows_cols(H3270 *session, int mn, int ovc, int ovr) | @@ -205,7 +205,7 @@ void ctlr_set_rows_cols(H3270 *session, int mn, int ovc, int ovr) | ||
205 | // popup_an_error(session,"Invalid %s %dx%d:\nToo big",ResOversize, ovc, ovr); | 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 | lib3270_popup_dialog( | 211 | lib3270_popup_dialog( |
@@ -219,7 +219,7 @@ void ctlr_set_rows_cols(H3270 *session, int mn, int ovc, int ovr) | @@ -219,7 +219,7 @@ void ctlr_set_rows_cols(H3270 *session, int mn, int ovc, int ovr) | ||
219 | 219 | ||
220 | // popup_an_error(session,"Invalid %s cols (%d):\nLess than model %d cols (%d)",ResOversize, ovc, session->model_num, session->maxCOLS); | 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 | lib3270_popup_dialog( | 225 | lib3270_popup_dialog( |
src/core/host.c
@@ -43,7 +43,7 @@ | @@ -43,7 +43,7 @@ | ||
43 | 43 | ||
44 | #include <internals.h> | 44 | #include <internals.h> |
45 | #include <stdlib.h> | 45 | #include <stdlib.h> |
46 | -#include "resources.h" | 46 | +//#include "resources.h" |
47 | 47 | ||
48 | #include "hostc.h" | 48 | #include "hostc.h" |
49 | #include "statusc.h" | 49 | #include "statusc.h" |
@@ -74,7 +74,7 @@ static int check_for_auto_reconnect(H3270 *hSession, void GNUC_UNUSED(*userdata) | @@ -74,7 +74,7 @@ static int check_for_auto_reconnect(H3270 *hSession, void GNUC_UNUSED(*userdata) | ||
74 | { | 74 | { |
75 | lib3270_write_log(hSession,"3270","Starting auto-reconnect on %s",lib3270_get_url(hSession)); | 75 | lib3270_write_log(hSession,"3270","Starting auto-reconnect on %s",lib3270_get_url(hSession)); |
76 | hSession->auto_reconnect_inprogress = 0; // Reset "in-progress" to allow reconnection. | 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 | lib3270_write_log(hSession,"3270","Auto-reconnect fails: %s",strerror(errno)); | 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,9 +465,10 @@ LIB3270_EXPORT int lib3270_run_task(H3270 *hSession, int(*callback)(H3270 *h, vo | ||
465 | CHECK_SESSION_HANDLE(hSession); | 465 | CHECK_SESSION_HANDLE(hSession); |
466 | 466 | ||
467 | hSession->cbk.set_timer(hSession,1); | 467 | hSession->cbk.set_timer(hSession,1); |
468 | + hSession->tasks++; | ||
468 | rc = run_task(hSession,callback,parm); | 469 | rc = run_task(hSession,callback,parm); |
469 | hSession->cbk.set_timer(hSession,0); | 470 | hSession->cbk.set_timer(hSession,0); |
470 | - | 471 | + hSession->tasks--; |
471 | return rc; | 472 | return rc; |
472 | 473 | ||
473 | } | 474 | } |
src/core/keyboard/actions.c
@@ -57,7 +57,7 @@ struct ta; | @@ -57,7 +57,7 @@ struct ta; | ||
57 | 57 | ||
58 | #include <fcntl.h> | 58 | #include <fcntl.h> |
59 | #include "3270ds.h" | 59 | #include "3270ds.h" |
60 | -#include "resources.h" | 60 | +//#include "resources.h" |
61 | 61 | ||
62 | #include "ansic.h" | 62 | #include "ansic.h" |
63 | #include "ctlrc.h" | 63 | #include "ctlrc.h" |
@@ -71,7 +71,7 @@ struct ta; | @@ -71,7 +71,7 @@ struct ta; | ||
71 | #include "telnetc.h" | 71 | #include "telnetc.h" |
72 | #include "togglesc.h" | 72 | #include "togglesc.h" |
73 | #include "trace_dsc.h" | 73 | #include "trace_dsc.h" |
74 | -#include "utf8c.h" | 74 | +//#include "utf8c.h" |
75 | #include "utilc.h" | 75 | #include "utilc.h" |
76 | #if defined(X3270_DBCS) /*[*/ | 76 | #if defined(X3270_DBCS) /*[*/ |
77 | #include "widec.h" | 77 | #include "widec.h" |
src/core/keyboard/kybd.c
@@ -58,7 +58,7 @@ struct ta; | @@ -58,7 +58,7 @@ struct ta; | ||
58 | 58 | ||
59 | #include <fcntl.h> | 59 | #include <fcntl.h> |
60 | #include "3270ds.h" | 60 | #include "3270ds.h" |
61 | -#include "resources.h" | 61 | +//#include "resources.h" |
62 | 62 | ||
63 | #include "ansic.h" | 63 | #include "ansic.h" |
64 | #include "ctlrc.h" | 64 | #include "ctlrc.h" |
@@ -72,7 +72,7 @@ struct ta; | @@ -72,7 +72,7 @@ struct ta; | ||
72 | #include "telnetc.h" | 72 | #include "telnetc.h" |
73 | #include "togglesc.h" | 73 | #include "togglesc.h" |
74 | #include "trace_dsc.h" | 74 | #include "trace_dsc.h" |
75 | -#include "utf8c.h" | 75 | +//#include "utf8c.h" |
76 | #include "utilc.h" | 76 | #include "utilc.h" |
77 | #if defined(X3270_DBCS) /*[*/ | 77 | #if defined(X3270_DBCS) /*[*/ |
78 | #include "widec.h" | 78 | #include "widec.h" |
@@ -110,11 +110,13 @@ static void kybdlock_set(H3270 *session, unsigned int bits); | @@ -110,11 +110,13 @@ static void kybdlock_set(H3270 *session, unsigned int bits); | ||
110 | 110 | ||
111 | /* Composite key mappings. */ | 111 | /* Composite key mappings. */ |
112 | 112 | ||
113 | +/* | ||
113 | struct akeysym | 114 | struct akeysym |
114 | { | 115 | { |
115 | KeySym keysym; | 116 | KeySym keysym; |
116 | enum keytype keytype; | 117 | enum keytype keytype; |
117 | }; | 118 | }; |
119 | +*/ | ||
118 | 120 | ||
119 | #define ak_eq(k1, k2) (((k1).keysym == (k2).keysym) && \ | 121 | #define ak_eq(k1, k2) (((k1).keysym == (k2).keysym) && \ |
120 | ((k1).keytype == (k2).keytype)) | 122 | ((k1).keytype == (k2).keytype)) |
src/core/linux/connect.c
@@ -89,7 +89,7 @@ | @@ -89,7 +89,7 @@ | ||
89 | 89 | ||
90 | case 1: | 90 | case 1: |
91 | // Got response. | 91 | // Got response. |
92 | - if(pfd.revents && POLLOUT) { | 92 | + if(pfd.revents & POLLOUT) { |
93 | debug("%s: Connection complete",__FUNCTION__); | 93 | debug("%s: Connection complete",__FUNCTION__); |
94 | return 0; | 94 | return 0; |
95 | } | 95 | } |
@@ -194,15 +194,23 @@ | @@ -194,15 +194,23 @@ | ||
194 | 194 | ||
195 | if(hSession->network.module->getsockopt(hSession, SOL_SOCKET, SO_ERROR, (char *) &err, &len) < 0) | 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 | lib3270_disconnect(hSession); | 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 | return; | 214 | return; |
207 | } | 215 | } |
208 | else if(err) | 216 | else if(err) |
src/core/paste.c
@@ -44,7 +44,7 @@ | @@ -44,7 +44,7 @@ | ||
44 | #include <fcntl.h> | 44 | #include <fcntl.h> |
45 | 45 | ||
46 | #include "3270ds.h" | 46 | #include "3270ds.h" |
47 | -#include "resources.h" | 47 | +//#include "resources.h" |
48 | 48 | ||
49 | //#include "actionsc.h" | 49 | //#include "actionsc.h" |
50 | #include "ansic.h" | 50 | #include "ansic.h" |
@@ -69,7 +69,7 @@ | @@ -69,7 +69,7 @@ | ||
69 | #include "telnetc.h" | 69 | #include "telnetc.h" |
70 | #include "togglesc.h" | 70 | #include "togglesc.h" |
71 | #include "trace_dsc.h" | 71 | #include "trace_dsc.h" |
72 | -#include "utf8c.h" | 72 | +//#include "utf8c.h" |
73 | #include "utilc.h" | 73 | #include "utilc.h" |
74 | #if defined(X3270_DBCS) /*[*/ | 74 | #if defined(X3270_DBCS) /*[*/ |
75 | #include "widec.h" | 75 | #include "widec.h" |
src/core/printer.c
@@ -58,7 +58,7 @@ | @@ -58,7 +58,7 @@ | ||
58 | #include "3270ds.h" | 58 | #include "3270ds.h" |
59 | #include "appres.h" | 59 | #include "appres.h" |
60 | #include "objects.h" | 60 | #include "objects.h" |
61 | -#include "resources.h" | 61 | +//#include "resources.h" |
62 | 62 | ||
63 | #include "charsetc.h" | 63 | #include "charsetc.h" |
64 | #include "ctlrc.h" | 64 | #include "ctlrc.h" |
src/core/properties/unsigned.c
@@ -198,3 +198,8 @@ int lib3270_set_uint_property(H3270 *hSession, const char *name, unsigned int va | @@ -198,3 +198,8 @@ int lib3270_set_uint_property(H3270 *hSession, const char *name, unsigned int va | ||
198 | 198 | ||
199 | } | 199 | } |
200 | 200 | ||
201 | +LIB3270_EXPORT unsigned int lib3270_get_task_count(const H3270 *h) | ||
202 | +{ | ||
203 | + return h->tasks; | ||
204 | +} | ||
205 | + |
src/core/screen.c
@@ -37,7 +37,7 @@ | @@ -37,7 +37,7 @@ | ||
37 | #include <internals.h> | 37 | #include <internals.h> |
38 | #include <signal.h> | 38 | #include <signal.h> |
39 | #include "3270ds.h" | 39 | #include "3270ds.h" |
40 | -#include "resources.h" | 40 | +//#include "resources.h" |
41 | #include "ctlrc.h" | 41 | #include "ctlrc.h" |
42 | #include "hostc.h" | 42 | #include "hostc.h" |
43 | #include "kybdc.h" | 43 | #include "kybdc.h" |
src/core/see.c
@@ -47,9 +47,9 @@ | @@ -47,9 +47,9 @@ | ||
47 | #include "3270ds.h" | 47 | #include "3270ds.h" |
48 | 48 | ||
49 | // #include "tablesc.h" | 49 | // #include "tablesc.h" |
50 | -#if !defined(PR3287) /*[*/ | ||
51 | -#include "utf8c.h" | ||
52 | -#endif /*]*/ | 50 | +//#if !defined(PR3287) /*[*/ |
51 | +//#include "utf8c.h" | ||
52 | +//#endif /*]*/ | ||
53 | #include "seec.h" | 53 | #include "seec.h" |
54 | 54 | ||
55 | const char * | 55 | const char * |
src/core/session.c
@@ -67,10 +67,25 @@ void lib3270_session_free(H3270 *h) | @@ -67,10 +67,25 @@ void lib3270_session_free(H3270 *h) | ||
67 | if(!h) | 67 | if(!h) |
68 | return; | 68 | return; |
69 | 69 | ||
70 | - // Terminate session | ||
71 | if(lib3270_is_connected(h)) | 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 | lib3270_disconnect(h); | 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 | shutdown_toggles(h); | 89 | shutdown_toggles(h); |
75 | 90 | ||
76 | // Release network module | 91 | // Release network module |
@@ -290,6 +305,7 @@ void lib3270_reset_callbacks(H3270 *hSession) | @@ -290,6 +305,7 @@ void lib3270_reset_callbacks(H3270 *hSession) | ||
290 | hSession->cbk.update_luname = default_update_luname; | 305 | hSession->cbk.update_luname = default_update_luname; |
291 | hSession->cbk.update_url = default_update_url; | 306 | hSession->cbk.update_url = default_update_url; |
292 | hSession->cbk.action = default_action; | 307 | hSession->cbk.action = default_action; |
308 | + hSession->cbk.reconnect = lib3270_reconnect; | ||
293 | 309 | ||
294 | lib3270_set_popup_handler(hSession, NULL); | 310 | lib3270_set_popup_handler(hSession, NULL); |
295 | 311 | ||
@@ -536,15 +552,19 @@ LIB3270_EXPORT char lib3270_get_session_id(H3270 *hSession) | @@ -536,15 +552,19 @@ LIB3270_EXPORT char lib3270_get_session_id(H3270 *hSession) | ||
536 | 552 | ||
537 | struct lib3270_session_callbacks * lib3270_get_session_callbacks(H3270 *hSession, const char *revision, unsigned short sz) | 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 | errno = EINVAL; | 559 | errno = EINVAL; |
560 | + lib3270_write_log(hSession,PACKAGE_NAME,"Invalid revision %s when setting callback table",revision); | ||
543 | return NULL; | 561 | return NULL; |
544 | } | 562 | } |
545 | 563 | ||
546 | if(sz != sizeof(struct lib3270_session_callbacks)) | 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 | errno = EINVAL; | 568 | errno = EINVAL; |
549 | return NULL; | 569 | return NULL; |
550 | } | 570 | } |
src/core/telnet.c
@@ -92,8 +92,8 @@ | @@ -92,8 +92,8 @@ | ||
92 | #include "kybdc.h" | 92 | #include "kybdc.h" |
93 | // #include "macrosc.h" | 93 | // #include "macrosc.h" |
94 | #include "popupsc.h" | 94 | #include "popupsc.h" |
95 | -#include "proxyc.h" | ||
96 | -#include "resolverc.h" | 95 | +// #include "proxyc.h" |
96 | +//#include "resolverc.h" | ||
97 | #include "statusc.h" | 97 | #include "statusc.h" |
98 | // #include "tablesc.h" | 98 | // #include "tablesc.h" |
99 | #include "telnetc.h" | 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,7 +100,7 @@ static void toggle_connect(H3270 *hSession, const struct lib3270_toggle *toggle, | ||
100 | { | 100 | { |
101 | if(tt != LIB3270_TOGGLE_TYPE_INITIAL && lib3270_is_disconnected(hSession) && toggle->value) | 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 | lib3270_write_log(hSession,"3270","Auto-connect fails: %s",strerror(errno)); | 104 | lib3270_write_log(hSession,"3270","Auto-connect fails: %s",strerror(errno)); |
105 | } | 105 | } |
106 | 106 |
src/core/trace_ds.c
@@ -53,7 +53,7 @@ | @@ -53,7 +53,7 @@ | ||
53 | #include <stdarg.h> | 53 | #include <stdarg.h> |
54 | #include <fcntl.h> | 54 | #include <fcntl.h> |
55 | #include "3270ds.h" | 55 | #include "3270ds.h" |
56 | -#include "resources.h" | 56 | +//#include "resources.h" |
57 | 57 | ||
58 | // #include "charsetc.h" | 58 | // #include "charsetc.h" |
59 | #include "ctlrc.h" | 59 | #include "ctlrc.h" |
src/include/action_table.h
@@ -1,95 +0,0 @@ | @@ -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,12 +35,7 @@ | ||
35 | * @brief Global declarations for host.c. | 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 | LIB3270_INTERNAL void lib3270_st_changed(H3270 *h, LIB3270_STATE tx, int mode); | 39 | LIB3270_INTERNAL void lib3270_st_changed(H3270 *h, LIB3270_STATE tx, int mode); |
45 | 40 | ||
46 | LIB3270_INTERNAL void host_in3270(H3270 *session, LIB3270_CSTATE); | 41 | LIB3270_INTERNAL void host_in3270(H3270 *session, LIB3270_CSTATE); |
src/include/internals.h
@@ -128,16 +128,6 @@ enum iaction { | @@ -128,16 +128,6 @@ enum iaction { | ||
128 | IA_IDLE | 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 | #if defined(X3270_DBCS) /*[*/ | 131 | #if defined(X3270_DBCS) /*[*/ |
142 | LIB3270_INTERNAL Boolean dbcs; | 132 | LIB3270_INTERNAL Boolean dbcs; |
143 | #endif /*]*/ | 133 | #endif /*]*/ |
@@ -334,41 +324,40 @@ struct _h3270 | @@ -334,41 +324,40 @@ struct _h3270 | ||
334 | // flags | 324 | // flags |
335 | LIB3270_HOST_TYPE host_type; ///< @brief Host type. | 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 | unsigned int colors : 5; | 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 | struct lib3270_toggle | 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 | // Network & Termtype | 362 | // Network & Termtype |
374 | char * connected_type; | 363 | char * connected_type; |
@@ -451,9 +440,9 @@ struct _h3270 | @@ -451,9 +440,9 @@ struct _h3270 | ||
451 | unsigned char default_cs; | 440 | unsigned char default_cs; |
452 | unsigned char default_ic; | 441 | unsigned char default_ic; |
453 | char reply_mode; | 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 | int crm_nattr; | 446 | int crm_nattr; |
458 | unsigned char crm_attr[16]; | 447 | unsigned char crm_attr[16]; |
459 | unsigned char * zero_buf; /**< @brief Empty buffer, for area clears */ | 448 | unsigned char * zero_buf; /**< @brief Empty buffer, for area clears */ |
@@ -543,9 +532,9 @@ struct _h3270 | @@ -543,9 +532,9 @@ struct _h3270 | ||
543 | int dft_buffersize; ///< @brief Buffer size (LIMIN, LIMOUT) | 532 | int dft_buffersize; ///< @brief Buffer size (LIMIN, LIMOUT) |
544 | 533 | ||
545 | // rpq.c | 534 | // rpq.c |
546 | - int rpq_complained : 1; | 535 | + unsigned int rpq_complained : 1; |
547 | #if !defined(_WIN32) | 536 | #if !defined(_WIN32) |
548 | - int omit_due_space_limit : 1; | 537 | + unsigned int omit_due_space_limit : 1; |
549 | #endif | 538 | #endif |
550 | 539 | ||
551 | char * rpq_warnbuf; | 540 | char * rpq_warnbuf; |
@@ -568,28 +557,28 @@ struct _h3270 | @@ -568,28 +557,28 @@ struct _h3270 | ||
568 | int once_cset; | 557 | int once_cset; |
569 | int saved_cursor; | 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 | int ansi_ch; | 583 | int ansi_ch; |
595 | int cs_to_change; | 584 | int cs_to_change; |
@@ -663,8 +652,8 @@ struct _h3270 | @@ -663,8 +652,8 @@ struct _h3270 | ||
663 | 652 | ||
664 | struct | 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 | LIB3270_SSL_STATE state; | 657 | LIB3270_SSL_STATE state; |
669 | int error; | 658 | int error; |
670 | const LIB3270_SSL_MESSAGE * message; ///< @brief Pointer to SSL messages for current state. | 659 | const LIB3270_SSL_MESSAGE * message; ///< @brief Pointer to SSL messages for current state. |
@@ -685,6 +674,7 @@ struct _h3270 | @@ -685,6 +674,7 @@ struct _h3270 | ||
685 | 674 | ||
686 | } listeners; | 675 | } listeners; |
687 | 676 | ||
677 | + unsigned int tasks; | ||
688 | 678 | ||
689 | }; | 679 | }; |
690 | 680 |
src/include/kybdc.h
@@ -74,7 +74,7 @@ | @@ -74,7 +74,7 @@ | ||
74 | #define KYBDLOCK_IS_OERR(hSession) (hSession->kybdlock && !(hSession->kybdlock & ~KL_OERR_MASK)) | 74 | #define KYBDLOCK_IS_OERR(hSession) (hSession->kybdlock && !(hSession->kybdlock & ~KL_OERR_MASK)) |
75 | 75 | ||
76 | /* other functions */ | 76 | /* other functions */ |
77 | - LIB3270_INTERNAL void add_xk(KeySym key, KeySym assoc); | 77 | + //LIB3270_INTERNAL void add_xk(KeySym key, KeySym assoc); |
78 | LIB3270_INTERNAL void clear_xks(void); | 78 | LIB3270_INTERNAL void clear_xks(void); |
79 | LIB3270_INTERNAL void do_reset(H3270 *session, Boolean explicit); | 79 | LIB3270_INTERNAL void do_reset(H3270 *session, Boolean explicit); |
80 | 80 |
src/include/lib3270++.h
@@ -1,437 +0,0 @@ | @@ -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,6 +546,10 @@ | ||
546 | * | 546 | * |
547 | * @return zero if reconnect is unavailable (sets errno), non zero if available. | 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 | LIB3270_EXPORT int lib3270_allow_reconnect(const H3270 *hSession); | 554 | LIB3270_EXPORT int lib3270_allow_reconnect(const H3270 *hSession); |
551 | 555 | ||
@@ -557,6 +561,11 @@ | @@ -557,6 +561,11 @@ | ||
557 | * | 561 | * |
558 | * @return 0 for success, non zero if fails (sets errno). | 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 | LIB3270_EXPORT int lib3270_reconnect(H3270 *hSession,int seconds); | 570 | LIB3270_EXPORT int lib3270_reconnect(H3270 *hSession,int seconds); |
562 | 571 |
src/include/lib3270/properties.h
@@ -275,6 +275,16 @@ | @@ -275,6 +275,16 @@ | ||
275 | */ | 275 | */ |
276 | LIB3270_EXPORT const char * lib3270_service_get_name(const H3270 *h); | 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 | #ifdef __cplusplus | 288 | #ifdef __cplusplus |
279 | } | 289 | } |
280 | #endif | 290 | #endif |
src/include/lib3270/session.h
src/include/localdefs.h
@@ -33,50 +33,23 @@ | @@ -33,50 +33,23 @@ | ||
33 | /* These first definitions were cribbed from X11 -- but no X code is used. */ | 33 | /* These first definitions were cribbed from X11 -- but no X code is used. */ |
34 | #define False 0 | 34 | #define False 0 |
35 | #define True 1 | 35 | #define True 1 |
36 | -//typedef void *XtPointer; | ||
37 | -// typedef void *Widget; | ||
38 | -// typedef void *XEvent; | 36 | + |
39 | #ifdef __APPLE__ | 37 | #ifdef __APPLE__ |
40 | typedef unsigned char Boolean; | 38 | typedef unsigned char Boolean; |
41 | #else | 39 | #else |
42 | typedef char Boolean; | 40 | typedef char Boolean; |
43 | #endif | 41 | #endif |
42 | + | ||
44 | typedef char *String; | 43 | typedef char *String; |
45 | -// typedef unsigned int Cardinal; | ||
46 | -typedef unsigned long KeySym; | 44 | +//typedef unsigned long KeySym; |
47 | #define Bool int | 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 | /* These are local functions with similar semantics to X functions. */ | 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 | #define Calloc(e,n) lib3270_calloc(e,n,NULL) | 51 | #define Calloc(e,n) lib3270_calloc(e,n,NULL) |
78 | #define Realloc(x,n) lib3270_realloc(x,n) | 52 | #define Realloc(x,n) lib3270_realloc(x,n) |
79 | 53 | ||
80 | #define NewString(x) strdup(x) | 54 | #define NewString(x) strdup(x) |
81 | -//extern char *NewString(const char *); | ||
82 | 55 |
src/include/networking.h
@@ -142,7 +142,7 @@ | @@ -142,7 +142,7 @@ | ||
142 | /// @retval 0 The session is offline. | 142 | /// @retval 0 The session is offline. |
143 | int (*is_connected)(const H3270 *hSession); | 143 | int (*is_connected)(const H3270 *hSession); |
144 | 144 | ||
145 | - /// @brief get socket name. | 145 | + /// @brief Get socket name. |
146 | /// | 146 | /// |
147 | /// @return On success, zero is returned. On error, -1 is returned, and errno is set appropriately. | 147 | /// @return On success, zero is returned. On error, -1 is returned, and errno is set appropriately. |
148 | /// | 148 | /// |
@@ -150,6 +150,14 @@ | @@ -150,6 +150,14 @@ | ||
150 | /// @retval -1 Error (errno is set). | 150 | /// @retval -1 Error (errno is set). |
151 | int (*getsockname)(const H3270 *hSession, struct sockaddr *addr, socklen_t *addrlen); | 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 | /// @brief Set socket options. | 161 | /// @brief Set socket options. |
154 | int (*setsockopt)(H3270 *hSession, int level, int optname, const void *optval, size_t optlen); | 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,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,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
@@ -18,6 +18,8 @@ | @@ -18,6 +18,8 @@ | ||
18 | * x3270/c3270/s3270/tcl3270 resource and option names. | 18 | * x3270/c3270/s3270/tcl3270 resource and option names. |
19 | */ | 19 | */ |
20 | 20 | ||
21 | +#error Deprecated | ||
22 | + | ||
21 | /* Resources. */ | 23 | /* Resources. */ |
22 | #define ResActiveIcon "activeIcon" | 24 | #define ResActiveIcon "activeIcon" |
23 | #define ResAdVersion "adVersion" | 25 | #define ResAdVersion "adVersion" |
src/include/shlobj_missing.h
1 | /* IShellLinkDataList, missing from mingw's <shlobj.h>. */ | 1 | /* IShellLinkDataList, missing from mingw's <shlobj.h>. */ |
2 | 2 | ||
3 | +#error Deprecated | ||
4 | + | ||
3 | LIB3270_INTERNAL const GUID IID_IShellLinkDataList; | 5 | LIB3270_INTERNAL const GUID IID_IShellLinkDataList; |
4 | 6 | ||
5 | #define INTERFACE IShellLinkDataList | 7 | #define INTERFACE IShellLinkDataList |
src/include/statusc.h
@@ -30,9 +30,6 @@ | @@ -30,9 +30,6 @@ | ||
30 | LIB3270_INTERNAL void status_compose(int on, unsigned char c, enum keytype keytype); | 30 | LIB3270_INTERNAL void status_compose(int on, unsigned char c, enum keytype keytype); |
31 | LIB3270_INTERNAL void status_ctlr_done(H3270 *session); | 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 | LIB3270_INTERNAL void status_lu(H3270 *session, const char *); | 33 | LIB3270_INTERNAL void status_lu(H3270 *session, const char *); |
37 | LIB3270_INTERNAL void status_oerr(H3270 *session, int error_type); | 34 | LIB3270_INTERNAL void status_oerr(H3270 *session, int error_type); |
38 | LIB3270_INTERNAL void status_reset(H3270 *session); | 35 | LIB3270_INTERNAL void status_reset(H3270 *session); |
src/include/telnetc.h
@@ -62,4 +62,3 @@ LIB3270_INTERNAL void space3270out(H3270 *hSession, int n); | @@ -62,4 +62,3 @@ LIB3270_INTERNAL void space3270out(H3270 *hSession, int n); | ||
62 | #define trace_netdata(direction, buf, len) /* */ | 62 | #define trace_netdata(direction, buf, len) /* */ |
63 | #endif // X3270_TRACE | 63 | #endif // X3270_TRACE |
64 | 64 | ||
65 | -// LIB3270_INTERNAL int net_getsockname(const H3270 *h3270, void *buf, int *len); |
src/include/utf8c.h
@@ -18,15 +18,17 @@ | @@ -18,15 +18,17 @@ | ||
18 | * UTF-8 conversions | 18 | * UTF-8 conversions |
19 | */ | 19 | */ |
20 | 20 | ||
21 | + /* | ||
21 | enum ulfail { | 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 | // LIB3270_INTERNAL char *locale_codeset; | 29 | // LIB3270_INTERNAL char *locale_codeset; |
28 | 30 | ||
29 | // LIB3270_INTERNAL void set_codeset(char *codeset_name); | 31 | // LIB3270_INTERNAL void set_codeset(char *codeset_name); |
30 | // LIB3270_INTERNAL Boolean utf8_set_display_charsets(char *cslist, char *csname); | 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
@@ -17,9 +17,11 @@ | @@ -17,9 +17,11 @@ | ||
17 | * DBCS translation table structure. | 17 | * DBCS translation table structure. |
18 | */ | 18 | */ |
19 | 19 | ||
20 | + /* | ||
20 | typedef struct { | 21 | typedef struct { |
21 | unsigned n; | 22 | unsigned n; |
22 | unsigned short *data; | 23 | unsigned short *data; |
23 | } xl_t; | 24 | } xl_t; |
24 | 25 | ||
25 | #define XL_SIZE(e) ((sizeof(e)/sizeof(e[0]))/3) | 26 | #define XL_SIZE(e) ((sizeof(e)/sizeof(e[0]))/3) |
27 | +*/ |
src/mkactions/mkactions.c
@@ -1,215 +0,0 @@ | @@ -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,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,6 +92,10 @@ static int unsecure_network_getsockname(const H3270 *hSession, struct sockaddr * | ||
92 | return getsockname(hSession->network.context->sock, addr, addrlen); | 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 | static void * unsecure_network_add_poll(H3270 *hSession, LIB3270_IO_FLAG flag, void(*call)(H3270 *, int, LIB3270_IO_FLAG, void *), void *userdata) { | 99 | static void * unsecure_network_add_poll(H3270 *hSession, LIB3270_IO_FLAG flag, void(*call)(H3270 *, int, LIB3270_IO_FLAG, void *), void *userdata) { |
96 | return lib3270_add_poll_fd(hSession,hSession->network.context->sock,flag,call,userdata); | 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,6 +170,7 @@ void lib3270_set_default_network_module(H3270 *hSession) { | ||
166 | .non_blocking = unsecure_network_non_blocking, | 170 | .non_blocking = unsecure_network_non_blocking, |
167 | .is_connected = unsecure_network_is_connected, | 171 | .is_connected = unsecure_network_is_connected, |
168 | .getsockname = unsecure_network_getsockname, | 172 | .getsockname = unsecure_network_getsockname, |
173 | + .getpeername = unsecure_network_getpeername, | ||
169 | .setsockopt = unsecure_network_setsockopt, | 174 | .setsockopt = unsecure_network_setsockopt, |
170 | .getsockopt = unsecure_network_getsockopt, | 175 | .getsockopt = unsecure_network_getsockopt, |
171 | .reset = unsecure_network_reset | 176 | .reset = unsecure_network_reset |
src/network_modules/openssl/crl.c
@@ -27,7 +27,7 @@ | @@ -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 | /// References: | 32 | /// References: |
33 | /// | 33 | /// |
@@ -35,6 +35,7 @@ | @@ -35,6 +35,7 @@ | ||
35 | 35 | ||
36 | 36 | ||
37 | #include "private.h" | 37 | #include "private.h" |
38 | +#include <utilc.h> | ||
38 | 39 | ||
39 | /*--[ Implement ]------------------------------------------------------------------------------------*/ | 40 | /*--[ Implement ]------------------------------------------------------------------------------------*/ |
40 | 41 | ||
@@ -79,7 +80,13 @@ LIB3270_STRING_ARRAY * lib3270_openssl_get_crls_from_peer(H3270 *hSession, X509 | @@ -79,7 +80,13 @@ LIB3270_STRING_ARRAY * lib3270_openssl_get_crls_from_peer(H3270 *hSession, X509 | ||
79 | #endif // OpenSSL 1.1.0+ | 80 | #endif // OpenSSL 1.1.0+ |
80 | 81 | ||
81 | if(data && length > 0) | 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,6 +186,10 @@ static int openssl_network_getsockname(const H3270 *hSession, struct sockaddr *a | ||
186 | return getsockname(hSession->network.context->sock, addr, addrlen); | 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 | static void * openssl_network_add_poll(H3270 *hSession, LIB3270_IO_FLAG flag, void(*call)(H3270 *, int, LIB3270_IO_FLAG, void *), void *userdata) { | 193 | static void * openssl_network_add_poll(H3270 *hSession, LIB3270_IO_FLAG flag, void(*call)(H3270 *, int, LIB3270_IO_FLAG, void *), void *userdata) { |
190 | return lib3270_add_poll_fd(hSession,hSession->network.context->sock,flag,call,userdata); | 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,6 +350,7 @@ void lib3270_set_libssl_network_module(H3270 *hSession) { | ||
346 | .non_blocking = openssl_network_non_blocking, | 350 | .non_blocking = openssl_network_non_blocking, |
347 | .is_connected = openssl_network_is_connected, | 351 | .is_connected = openssl_network_is_connected, |
348 | .getsockname = openssl_network_getsockname, | 352 | .getsockname = openssl_network_getsockname, |
353 | + .getpeername = openssl_network_getpeername, | ||
349 | .setsockopt = openssl_network_setsockopt, | 354 | .setsockopt = openssl_network_setsockopt, |
350 | .getsockopt = openssl_network_getsockopt, | 355 | .getsockopt = openssl_network_getsockopt, |
351 | .getcert = openssl_network_getcert, | 356 | .getcert = openssl_network_getcert, |
src/network_modules/openssl/start.c
@@ -34,6 +34,7 @@ | @@ -34,6 +34,7 @@ | ||
34 | 34 | ||
35 | #include "private.h" | 35 | #include "private.h" |
36 | #include <lib3270/properties.h> | 36 | #include <lib3270/properties.h> |
37 | + #include <utilc.h> | ||
37 | 38 | ||
38 | static int import_crl(H3270 *hSession, SSL_CTX * ssl_ctx, LIB3270_NET_CONTEXT * context, const char *url) { | 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,25 +104,26 @@ | ||
103 | 104 | ||
104 | if(X509_STORE_add_crl(store, x509_crl)) { | 105 | if(X509_STORE_add_crl(store, x509_crl)) { |
105 | trace_ssl(hSession,"CRL was added to context cert store\n"); | 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 | debug("%s peer=%p",__FUNCTION__,(void *) peer); | 118 | debug("%s peer=%p",__FUNCTION__,(void *) peer); |
117 | 119 | ||
118 | if(!peer) | 120 | if(!peer) |
119 | - return; | 121 | + return -1; |
120 | 122 | ||
121 | lib3270_autoptr(LIB3270_STRING_ARRAY) uris = lib3270_openssl_get_crls_from_peer(hSession, peer); | 123 | lib3270_autoptr(LIB3270_STRING_ARRAY) uris = lib3270_openssl_get_crls_from_peer(hSession, peer); |
122 | if(!uris) { | 124 | if(!uris) { |
123 | trace_ssl(hSession,"Can't get distpoints from peer certificate\n"); | 125 | trace_ssl(hSession,"Can't get distpoints from peer certificate\n"); |
124 | - return; | 126 | + return -1; |
125 | } | 127 | } |
126 | 128 | ||
127 | size_t ix; | 129 | size_t ix; |
@@ -134,11 +136,11 @@ | @@ -134,11 +136,11 @@ | ||
134 | 136 | ||
135 | if(!import_crl(hSession,ctx_context,context,uris->str[ix])) { | 137 | if(!import_crl(hSession,ctx_context,context,uris->str[ix])) { |
136 | trace_ssl(hSession,"Got CRL from %s\n",uris->str[ix]); | 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,10 +154,9 @@ | ||
152 | if(strncasecmp(prefer,uris->str[ix],length)) | 154 | if(strncasecmp(prefer,uris->str[ix],length)) |
153 | continue; | 155 | continue; |
154 | 156 | ||
155 | - debug("Trying %s",uris->str[ix]); | ||
156 | if(!import_crl(hSession,ctx_context,context,uris->str[ix])) { | 157 | if(!import_crl(hSession,ctx_context,context,uris->str[ix])) { |
157 | trace_ssl(hSession,"Got CRL from %s\n",uris->str[ix]); | 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,13 +169,34 @@ | ||
168 | 169 | ||
169 | if(!import_crl(hSession,ctx_context,context,uris->str[ix])) { | 170 | if(!import_crl(hSession,ctx_context,context,uris->str[ix])) { |
170 | trace_ssl(hSession,"Got CRL from %s\n",uris->str[ix]); | 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 | int openssl_network_start_tls(H3270 *hSession) { | 200 | int openssl_network_start_tls(H3270 *hSession) { |
179 | 201 | ||
180 | SSL_CTX * ctx_context = (SSL_CTX *) lib3270_openssl_get_context(hSession); | 202 | SSL_CTX * ctx_context = (SSL_CTX *) lib3270_openssl_get_context(hSession); |
@@ -199,7 +221,8 @@ | @@ -199,7 +221,8 @@ | ||
199 | 221 | ||
200 | SSL_set_ex_data(context->con,lib3270_openssl_get_ex_index(hSession),(char *) hSession); | 222 | SSL_set_ex_data(context->con,lib3270_openssl_get_ex_index(hSession),(char *) hSession); |
201 | // SSL_set_verify(context->con, SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL); | 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 | if(SSL_set_fd(context->con, context->sock) != 1) | 227 | if(SSL_set_fd(context->con, context->sock) != 1) |
205 | { | 228 | { |
@@ -295,13 +318,40 @@ | @@ -295,13 +318,40 @@ | ||
295 | 318 | ||
296 | // CRL download is enabled and verification has failed; look for CRL file. | 319 | // CRL download is enabled and verification has failed; look for CRL file. |
297 | 320 | ||
321 | + | ||
298 | trace_ssl(hSession,"CRL Validation has failed, requesting CRL download\n"); | 322 | trace_ssl(hSession,"CRL Validation has failed, requesting CRL download\n"); |
299 | set_ssl_state(hSession,LIB3270_SSL_VERIFYING); | 323 | set_ssl_state(hSession,LIB3270_SSL_VERIFYING); |
300 | 324 | ||
325 | + int rc_download = -1; | ||
326 | + | ||
301 | if(context->crl.url) { | 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 | } else { | 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,6 +363,7 @@ | ||
313 | 363 | ||
314 | // Get validation message. | 364 | // Get validation message. |
315 | hSession->ssl.message = lib3270_openssl_message_from_id(verify_result); | 365 | hSession->ssl.message = lib3270_openssl_message_from_id(verify_result); |
366 | + debug("Verify message: %s",hSession->ssl.message->summary); | ||
316 | 367 | ||
317 | // Trace cypher | 368 | // Trace cypher |
318 | if(lib3270_get_toggle(hSession,LIB3270_TOGGLE_SSL_TRACE)) | 369 | if(lib3270_get_toggle(hSession,LIB3270_TOGGLE_SSL_TRACE)) |
@@ -331,7 +382,7 @@ | @@ -331,7 +382,7 @@ | ||
331 | 382 | ||
332 | // Check results. | 383 | // Check results. |
333 | if(hSession->ssl.message) | 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 | else | 386 | else |
336 | trace_ssl(hSession,"TLS/SSL verify result was %ld\n", verify_result); | 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,3 +263,16 @@ int lib3270_socket_set_non_blocking(H3270 *hSession, int sock, const unsigned ch | ||
263 | 263 | ||
264 | return EINVAL; | 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 | + |