Commit 97080b25c1df344997d12458bfea6d5706338ccc

Authored by Perry Werneck
1 parent db04ac3f

Splitting ssl & host_type properties.

src/include/lib3270.h
... ... @@ -278,33 +278,27 @@
278 278  
279 279  
280 280 /**
281   - * Connect options
  281 + * @brief Host options
282 282 *
283 283 */
284   - typedef enum lib3270_option
  284 + typedef enum lib3270_host_type
285 285 {
286   - /* Host types */
287   - LIB3270_OPTION_AS400 = 0x0001, /**< AS400 host - Prefix every PF with PA1 */
288   - LIB3270_OPTION_TSO = 0x0002, /**< Host is TSO? */
289   - LIB3270_OPTION_S390 = 0x0006, /**< Host is S390? (TSO included) */
  286 + // Host types
  287 + LIB3270_HOST_AS400 = 0x0001, ///< AS400 host - Prefix every PF with PA1
  288 + LIB3270_HOST_TSO = 0x0002, ///< Host is TSO?
  289 + LIB3270_HOST_S390 = 0x0006, ///< Host is S390? (TSO included)
290 290  
291   - /* Other options */
292   - LIB3270_OPTION_SSL = 0x0010, /**< Secure connection ? */
  291 + } LIB3270_HOST_TYPE;
293 292  
  293 + #define LIB3270_HOSTTYPE_DEFAULT LIB3270_HOST_S390
294 294  
295   - LIB3270_OPTION_WAIT = 0x8000 /**< Wait for session ready on connect ? */
296   - } LIB3270_OPTION;
297   -
298   - #define LIB3270_OPTION_HOST_TYPE 0x0007
299   - #define LIB3270_OPTION_DEFAULTS LIB3270_OPTION_S390
300   -
301   - typedef struct _lib3270_option_entry
  295 + typedef struct _LIB3270_HOST_TYPE_entry
302 296 {
303   - LIB3270_OPTION option;
304   - const char * name;
305   - const char * description;
306   - const char * tooltip;
307   - } LIB3270_OPTION_ENTRY;
  297 + LIB3270_HOST_TYPE type;
  298 + const char * name;
  299 + const char * description;
  300 + const char * tooltip;
  301 + } LIB3270_HOST_TYPE_ENTRY;
308 302  
309 303 /**
310 304 * SSL state
... ... @@ -517,7 +511,9 @@
517 511 * @param h Session handle.
518 512 *
519 513 */
520   - LIB3270_EXPORT LIB3270_OPTION lib3270_get_options(H3270 *hSession);
  514 + LIB3270_EXPORT LIB3270_HOST_TYPE lib3270_get_host_type(H3270 *hSession);
  515 +
  516 + LIB3270_EXPORT const char * lib3270_get_host_type_name(H3270 *hSession);
521 517  
522 518 /**
523 519 * @brief Get URL of the hostname for the connect/reconnect operations.
... ... @@ -531,17 +527,17 @@
531 527  
532 528  
533 529 /**
534   - * @brief Network connect operation, keep main loop running
  530 + * @brief Reconnect to host.
535 531 *
536 532 * @param h Session handle.
537   - * @param seconds Seconds to wait for connection .
  533 + * @param seconds Seconds to wait for connection.
538 534 *
539 535 * @return 0 for success, EAGAIN if auto-reconnect is in progress, EBUSY if connected, ENOTCONN if connection has failed, -1 on unexpected failure.
540 536 *
541 537 */
542   - LIB3270_EXPORT int lib3270_connect(H3270 *h,int seconds);
  538 + LIB3270_EXPORT int lib3270_reconnect(H3270 *h,int seconds);
543 539  
544   - LIB3270_EXPORT int lib3270_set_connected(H3270 *h,int state);
  540 +// LIB3270_EXPORT int lib3270_set_connected(H3270 *h,int state);
545 541  
546 542 /**
547 543 * @brief Connect to defined host, keep main loop running.
... ... @@ -554,7 +550,7 @@
554 550 * @return 0 for success, EAGAIN if auto-reconnect is in progress, EBUSY if connected, ENOTCONN if connection has failed, -1 on unexpected failure.
555 551 *
556 552 */
557   - LIB3270_EXPORT int lib3270_connect_host(H3270 *hSession, const char *hostname, const char *srvc, LIB3270_OPTION opt);
  553 +// LIB3270_EXPORT int lib3270_connect_host(H3270 *hSession, const char *hostname, const char *srvc, LIB3270_HOST_TYPE opt);
558 554  
559 555 /**
560 556 * @brief Connect by URL
... ... @@ -1249,17 +1245,16 @@
1249 1245  
1250 1246 LIB3270_EXPORT int lib3270_clear_operator_error(H3270 *hSession);
1251 1247  
1252   - LIB3270_EXPORT void lib3270_set_options(H3270 *hSession, LIB3270_OPTION opt);
1253 1248  
1254 1249 LIB3270_EXPORT int lib3270_set_color_type(H3270 *hSession, int colortype);
1255 1250 LIB3270_EXPORT int lib3270_get_color_type(H3270 *hSession);
1256 1251  
1257   - LIB3270_EXPORT int lib3270_set_host_type(H3270 *hSession, const char *name);
1258   - LIB3270_EXPORT const char * lib3270_get_host_type(H3270 *hSession);
  1252 + LIB3270_EXPORT int lib3270_set_host_type_by_name(H3270 *hSession, const char *name);
  1253 + LIB3270_EXPORT int lib3270_set_host_type(H3270 *hSession, LIB3270_HOST_TYPE opt);
1259 1254  
1260   - LIB3270_EXPORT LIB3270_OPTION lib3270_parse_host_type(const char *name);
  1255 + LIB3270_EXPORT LIB3270_HOST_TYPE lib3270_parse_host_type(const char *name);
1261 1256  
1262   - LIB3270_EXPORT const LIB3270_OPTION_ENTRY * lib3270_get_option_list(void);
  1257 + LIB3270_EXPORT const LIB3270_HOST_TYPE_ENTRY * lib3270_get_option_list(void);
1263 1258  
1264 1259 LIB3270_EXPORT LIB3270_POINTER lib3270_get_pointer(H3270 *hSession, int baddr);
1265 1260  
... ... @@ -1277,14 +1272,28 @@
1277 1272 LIB3270_EXPORT int lib3270_run_task(H3270 *hSession, int(*callback)(H3270 *h, void *), void *parm);
1278 1273  
1279 1274 /**
1280   - * The host is TSO?
  1275 + * @brief The host is TSO?
1281 1276 *
1282 1277 * @param hSession Session Handle
1283 1278 *
1284 1279 * @return Non zero if the host is TSO.
1285 1280 *
1286 1281 */
1287   - LIB3270_EXPORT int lib3270_is_tso(H3270 *hSession);
  1282 + LIB3270_EXPORT int lib3270_is_tso(H3270 *hSession);
  1283 +
  1284 + LIB3270_EXPORT int lib3270_set_tso(H3270 *hSession, int on);
  1285 +
  1286 + /**
  1287 + * @brief Host is AS400 (Prefix every PF with PA1).
  1288 + *
  1289 + * @param hSession Session Handle
  1290 + *
  1291 + * @return Non zero if the host is AS400.
  1292 + *
  1293 + */
  1294 + LIB3270_EXPORT int lib3270_is_as400(H3270 *hSession);
  1295 +
  1296 + LIB3270_EXPORT int lib3270_set_as400(H3270 *hSession, int on);
1288 1297  
1289 1298 #ifdef WIN32
1290 1299 LIB3270_EXPORT const char * lib3270_win32_strerror(int e);
... ...
src/include/lib3270/macros.h
... ... @@ -1,39 +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 macros.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   - * macmiranda@bb.com.br (Marco Aurélio Caldas Miranda)
30   - *
31   - */
32   -
33   - #error Deprecated
34   -
35   -
36   - // #define LIB3270_MACRO( name ) LIB3270_EXPORT char * lib3270_macro_ ## name (H3270 *hSession, int argc, const char **argv)
37   -
38   -// LIB3270_EXPORT char * lib3270_run_macro(H3270 *session, const char **argv);
39   -
src/lib3270/ft.c
... ... @@ -439,13 +439,13 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state);
439 439 (ft->flags & LIB3270_FT_OPTION_APPEND) ? " APPEND" : ""
440 440 );
441 441  
442   - trace("tso=%s",hSession->options & LIB3270_OPTION_TSO ? "yes" : "No");
  442 + trace("tso=%s",lib3270_is_tso(hSession) ? "yes" : "No");
443 443  
444 444 if(!(ft->flags & LIB3270_FT_OPTION_RECEIVE))
445 445 {
446 446 // Sending file
447 447  
448   - if(hSession->options & LIB3270_OPTION_TSO)
  448 + if(lib3270_is_tso(hSession))
449 449 {
450 450 // TSO Host
451 451 if(recfm > 0)
... ... @@ -492,7 +492,7 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state);
492 492  
493 493 if(*op)
494 494 {
495   - if(hSession->options & LIB3270_OPTION_TSO)
  495 + if(lib3270_is_tso(hSession))
496 496 snconcat(buffer,4095," %s",op+1);
497 497 else
498 498 snconcat(buffer,4095," (%s",op+1);
... ...
src/lib3270/host.c
... ... @@ -58,11 +58,21 @@
58 58 /**
59 59 * @brief Called from timer to attempt an automatic reconnection.
60 60 */
61   -int lib3270_reconnect(H3270 *hSession)
  61 +int lib3270_check_for_auto_reconnect(H3270 *hSession)
62 62 {
63   - lib3270_write_log(hSession,"3270","Starting auto-reconnect on %s",lib3270_get_url(hSession));
64   - hSession->auto_reconnect_inprogress = 0;
65   - lib3270_connect(hSession,0);
  63 + if(hSession->popups)
  64 + {
  65 + lib3270_write_log(hSession,"3270","Delaying auto-reconnect. There's %u pending popup(s)",(unsigned int) hSession->popups);
  66 + return 1;
  67 + }
  68 +
  69 + if(hSession->auto_reconnect_inprogress)
  70 + {
  71 + lib3270_write_log(hSession,"3270","Starting auto-reconnect on %s",lib3270_get_url(hSession));
  72 + lib3270_reconnect(hSession,0);
  73 + hSession->auto_reconnect_inprogress = 0;
  74 + }
  75 +
66 76 return 0;
67 77 }
68 78  
... ... @@ -86,7 +96,7 @@ int host_disconnect(H3270 *hSession, int failed)
86 96 {
87 97 /* Schedule an automatic reconnection. */
88 98 hSession->auto_reconnect_inprogress = 1;
89   - (void) AddTimer(failed ? RECONNECT_ERR_MS : RECONNECT_MS, hSession, lib3270_reconnect);
  99 + (void) AddTimer(failed ? RECONNECT_ERR_MS : RECONNECT_MS, hSession, lib3270_check_for_auto_reconnect);
90 100 }
91 101  
92 102 /*
... ... @@ -219,12 +229,16 @@ static void update_host(H3270 *h)
219 229 Replace(h->host.full,
220 230 lib3270_strdup_printf(
221 231 "%s%s:%s",
222   - h->options&LIB3270_OPTION_SSL ? "tn3270s://" : "tn3270://",
  232 +#ifdef HAVE_LIBSSL
  233 + (h->ssl.enabled ? "tn3270s://" : "tn3270://"),
  234 +#else
  235 + "tn3270://",
  236 +#endif // HAVE_LIBSSL
223 237 h->host.current,
224 238 h->host.srvc
225 239 ));
226 240  
227   - trace("hosturl=[%s] ssl=%s",h->host.full,(h->options&LIB3270_OPTION_SSL) ? "yes" : "no");
  241 + trace("hosturl=[%s] ssl=%s",h->host.full,h->ssl.enabled ? "yes" : "no");
228 242  
229 243 }
230 244  
... ... @@ -269,18 +283,21 @@ LIB3270_EXPORT int lib3270_set_url(H3270 *h, const char *n)
269 283 {
270 284 static const struct _sch
271 285 {
272   - LIB3270_OPTION opt;
  286 + char ssl;
273 287 const char * text;
274 288 const char * srvc;
275 289 } sch[] =
276 290 {
277   - { LIB3270_OPTION_DEFAULTS, "tn3270://", "telnet" },
278   - { LIB3270_OPTION_SSL, "tn3270s://", "telnets" },
279   - { LIB3270_OPTION_DEFAULTS, "telnet://", "telnet" },
280   - { LIB3270_OPTION_DEFAULTS, "telnets://", "telnets" },
281   - { LIB3270_OPTION_SSL, "L://", "telnets" },
  291 +#ifdef HAVE_LIBSSL
  292 + { 1, "tn3270s://", "telnets" },
  293 + { 1, "telnets://", "telnets" },
  294 + { 1, "L://", "telnets" },
  295 + { 1, "L:", "telnets" },
  296 +#endif // HAVE_LIBSSL
  297 +
  298 + { 0, "tn3270://", "telnet" },
  299 + { 0, "telnet://", "telnet" }
282 300  
283   - { LIB3270_OPTION_SSL, "L:", "telnets" } // The compatibility should be the last option
284 301 };
285 302  
286 303 char * str = strdup(n);
... ... @@ -291,16 +308,21 @@ LIB3270_EXPORT int lib3270_set_url(H3270 *h, const char *n)
291 308 int f;
292 309  
293 310 trace("%s(%s)",__FUNCTION__,str);
294   - h->options = LIB3270_OPTION_DEFAULTS;
  311 +
  312 +#ifdef HAVE_LIBSSL
  313 + h->ssl.enabled = 0;
  314 +#endif // HAVE_LIBSSL
295 315  
296 316 for(f=0;f < sizeof(sch)/sizeof(sch[0]);f++)
297 317 {
298 318 size_t sz = strlen(sch[f].text);
299 319 if(!strncasecmp(hostname,sch[f].text,sz))
300 320 {
301   - h->options = sch[f].opt;
302   - srvc = sch[f].srvc;
303   - hostname += sz;
  321 +#ifdef HAVE_LIBSSL
  322 + h->ssl.enabled = sch[f].ssl;
  323 +#endif // HAVE_LIBSSL
  324 + srvc = sch[f].srvc;
  325 + hostname += sz;
304 326 break;
305 327 }
306 328 }
... ... @@ -348,25 +370,18 @@ LIB3270_EXPORT int lib3270_set_url(H3270 *h, const char *n)
348 370 *(val++) = 0;
349 371  
350 372 if(lib3270_set_string_property(h, var, val, 0) == 0)
351   - {
352 373 continue;
353   - }
354   -
355   - /*
356   - if(!(strcasecmp(var,"lu") && strcasecmp(var,"luname")))
357   - {
358   - lib3270_set_luname(h, val);
359   - // strncpy(h->luname,val,LIB3270_LUNAME_LENGTH);
360   - }
361   - else
362   - {
363   - lib3270_write_log(h,"","Ignoring invalid URL attribute \"%s\"",var);
364   - }
365   - */
366 374  
367 375 lib3270_write_log(h,"","Can't set attribute \"%s\": %s",var,strerror(errno));
368 376  
369 377 }
  378 + else
  379 + {
  380 + if(lib3270_set_int_property(h,var,1,0))
  381 + continue;
  382 +
  383 + lib3270_write_log(h,"","Can't set attribute \"%s\": %s",var,strerror(errno));
  384 + }
370 385  
371 386 }
372 387  
... ...
src/lib3270/kybd.c
... ... @@ -534,14 +534,14 @@ LIB3270_EXPORT int lib3270_pfkey(H3270 *hSession, int key)
534 534  
535 535 if (hSession->kybdlock)
536 536 {
537   - if(hSession->options & LIB3270_OPTION_AS400)
  537 + if(hSession->host_type & LIB3270_HOST_AS400)
538 538 enq_key(hSession,pa_xlate[0]);
539 539  
540 540 enq_key(hSession,pf_xlate[key-1]);
541 541 }
542 542 else
543 543 {
544   - if(hSession->options & LIB3270_OPTION_AS400)
  544 + if(hSession->host_type & LIB3270_HOST_AS400)
545 545 key_AID(hSession,pa_xlate[0]);
546 546  
547 547 key_AID(hSession,pf_xlate[key-1]);
... ...
src/lib3270/linux/connect.c
... ... @@ -124,11 +124,12 @@ static void net_connected(H3270 *hSession, int fd unused, LIB3270_IO_FLAG flag u
124 124 lib3270_set_url(hSession,url);
125 125 }
126 126  
127   - return lib3270_connect(hSession, wait);
  127 + return lib3270_reconnect(hSession, wait);
128 128  
129 129 }
130 130  
131   - LIB3270_EXPORT int lib3270_connect_host(H3270 *hSession, const char *hostname, const char *srvc, LIB3270_OPTION opt)
  131 + /*
  132 + LIB3270_EXPORT int lib3270_connect_host(H3270 *hSession, const char *hostname, const char *srvc, LIB3270_HOST_TYPE opt)
132 133 {
133 134 CHECK_SESSION_HANDLE(hSession);
134 135  
... ... @@ -155,22 +156,23 @@ static void net_connected(H3270 *hSession, int fd unused, LIB3270_IO_FLAG flag u
155 156 hostname = name;
156 157 }
157 158  
158   - hSession->options = opt & ~LIB3270_OPTION_WAIT;
  159 + hSession->options = opt & ~LIB3270_HOST_TYPE_WAIT;
159 160 Replace(hSession->host.current,strdup(hostname));
160 161 Replace(hSession->host.srvc,strdup(srvc));
161 162  
162 163 Replace(hSession->host.full,
163 164 lib3270_strdup_printf(
164 165 "%s%s:%s",
165   - opt&LIB3270_OPTION_SSL ? "tn3270s://" : "tn3270://",
  166 + opt&LIB3270_HOST_TYPE_SSL ? "tn3270s://" : "tn3270://",
166 167 hostname,
167 168 srvc ));
168 169  
169 170 trace("current_host=\"%s\"",hSession->host.current);
170 171  
171   - return lib3270_connect(hSession,opt & LIB3270_OPTION_WAIT);
  172 + return lib3270_reconnect(hSession,opt & LIB3270_HOST_TYPE_WAIT);
172 173  
173 174 }
  175 + */
174 176  
175 177 struct resolver
176 178 {
... ... @@ -223,7 +225,7 @@ static void net_connected(H3270 *hSession, int fd unused, LIB3270_IO_FLAG flag u
223 225  
224 226 }
225 227  
226   - int lib3270_connect(H3270 *hSession, int seconds)
  228 + int lib3270_reconnect(H3270 *hSession, int seconds)
227 229 {
228 230 int optval;
229 231 struct resolver host;
... ... @@ -283,22 +285,13 @@ static void net_connected(H3270 *hSession, int fd unused, LIB3270_IO_FLAG flag u
283 285 hSession->ever_3270 = False;
284 286 hSession->ssl.host = 0;
285 287  
286   - if(hSession->options&LIB3270_OPTION_SSL)
287   - {
288 288 #if defined(HAVE_LIBSSL)
  289 + if(hSession->ssl.enabled)
  290 + {
289 291 hSession->ssl.host = 1;
290 292 ssl_init(hSession);
291   -#else
292   - lib3270_popup_dialog( hSession,
293   - LIB3270_NOTIFY_ERROR,
294   - _( "SSL error" ),
295   - _( "Unable to connect to secure hosts" ),
296   - _( "This version of %s was built without support for secure sockets layer (SSL)." ),
297   - PACKAGE_NAME);
298   -
299   - return errno = EINVAL;
300   -#endif // HAVE_LIBSSL
301 293 }
  294 +#endif // HAVE_LIBSSL
302 295  
303 296 // set options for inline out-of-band data and keepalives
304 297 optval = 1;
... ...
src/lib3270/macros.c
... ... @@ -1,362 +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 macros.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   - * licinio@bb.com.br (Licínio Luis Branco)
28   - * kraucer@bb.com.br (Kraucer Fernandes Mazuco)
29   - * macmiranda@bb.com.br (Marco Aurélio Caldas Miranda)
30   - *
31   - */
32   -
33   -/*
34   -#ifdef WIN32
35   - #include <winsock2.h>
36   - #include <windows.h>
37   -#endif // WIN32
38   -
39   - #include <errno.h>
40   - #include <string.h>
41   - #include <stdio.h>
42   - #include <lib3270.h>
43   - #include <lib3270/macros.h>
44   - #include <lib3270/selection.h>
45   - #include <stdlib.h>
46   - #include <strings.h>
47   - #include "private.h"
48   - #include "utilc.h"
49   - #include "api.h"
50   - */
51   -
52   -/*--[ Structs & Defines ]----------------------------------------------------------------------------*/
53   -
54   -/*
55   - struct macro_list
56   - {
57   - const char *name;
58   - char *(*exec)(H3270 *session, int argc, const char **argv);
59   - };
60   -*/
61   -
62   -/*--[ Implement ]------------------------------------------------------------------------------------*/
63   -
64   -/*
65   - static const char * get_state(H3270 *h)
66   - {
67   - #define DECLARE_XLAT_STATE(x) { x, #x }
68   - static const struct _xlat_state
69   - {
70   - LIB3270_CSTATE state;
71   - const char * ret;
72   - } xlat_state[] =
73   - {
74   - DECLARE_XLAT_STATE( LIB3270_NOT_CONNECTED ),
75   - DECLARE_XLAT_STATE( LIB3270_RESOLVING ),
76   - DECLARE_XLAT_STATE( LIB3270_PENDING ),
77   - DECLARE_XLAT_STATE( LIB3270_CONNECTED_INITIAL ),
78   - DECLARE_XLAT_STATE( LIB3270_CONNECTED_ANSI ),
79   - DECLARE_XLAT_STATE( LIB3270_CONNECTED_3270 ),
80   - DECLARE_XLAT_STATE( LIB3270_CONNECTED_INITIAL_E ),
81   - DECLARE_XLAT_STATE( LIB3270_CONNECTED_NVT ),
82   - DECLARE_XLAT_STATE( LIB3270_CONNECTED_SSCP ),
83   - DECLARE_XLAT_STATE( LIB3270_CONNECTED_TN3270E )
84   - };
85   -
86   - size_t f;
87   -
88   - LIB3270_CSTATE state = lib3270_get_connection_state(h);
89   -
90   - for(f=0;f < (sizeof(xlat_state)/sizeof(struct _xlat_state)); f++)
91   - {
92   - if(state == xlat_state[f].state)
93   - return xlat_state[f].ret;
94   - }
95   -
96   - return "Unexpected";
97   - }
98   -
99   - LIB3270_MACRO( encoding )
100   - {
101   - return strdup(lib3270_get_display_charset(hSession));
102   - }
103   -
104   - LIB3270_MACRO( get )
105   - {
106   - char *buffer = NULL;
107   -
108   - switch(argc)
109   - {
110   - case 1: // Get entire screen
111   - buffer = lib3270_get_string_at_address(hSession,0,-1,'\n');
112   - break;
113   -
114   - default:
115   - errno = EINVAL;
116   - }
117   -
118   - return buffer;
119   - }
120   -
121   - LIB3270_MACRO( set )
122   - {
123   - const char *str = NULL;
124   - int rows, cols;
125   -
126   - if(lib3270_get_program_message(hSession) != LIB3270_MESSAGE_NONE)
127   - {
128   - errno = EBUSY;
129   - return NULL;
130   - }
131   -
132   - lib3270_get_screen_size(hSession,&rows,&cols);
133   -
134   - switch(argc)
135   - {
136   - case 1:
137   - lib3270_enter(hSession);
138   - break;
139   -
140   - case 2:
141   - str = argv[1];
142   - break;
143   -
144   - case 3:
145   - lib3270_set_cursor_address(hSession,atoi(argv[1]));
146   - str = argv[2];
147   - break;
148   -
149   - case 4:
150   - lib3270_set_cursor_address(hSession,(atoi(argv[1])-1) * cols + (atoi(argv[2])-1));
151   - str = argv[3];
152   - break;
153   -
154   - default:
155   - errno = EINVAL;
156   - return NULL;
157   - }
158   -
159   - if(str)
160   - lib3270_set_string(NULL, (const unsigned char *) str);
161   -
162   - return strdup(get_state(hSession));
163   - }
164   -
165   - LIB3270_MACRO( status )
166   - {
167   - const char * luname = (const char *) lib3270_get_luname(hSession);
168   - const char * state = get_state(hSession);
169   - const char * host = (const char *) lib3270_get_hostname(hSession);
170   - char * rsp;
171   - size_t sz;
172   -
173   - if(!luname)
174   - luname = "none";
175   -
176   - if(!host)
177   - host = "-";
178   -
179   - sz = strlen(luname)+strlen(state)+strlen(host)+4;
180   - rsp = lib3270_malloc(sz+1);
181   - snprintf(rsp,sz,"%s %s %s",state,luname,host);
182   - return rsp;
183   - }
184   -
185   - LIB3270_MACRO( cstate )
186   - {
187   - return strdup(get_state(hSession));
188   - }
189   -
190   - LIB3270_MACRO( luname )
191   - {
192   - const char * luname = (const char *) lib3270_get_luname(hSession);
193   - return strdup(luname ? luname : "none" );
194   - }
195   -
196   - LIB3270_MACRO( pf )
197   - {
198   - char ret[10];
199   - if(argc != 2)
200   - {
201   - errno = EINVAL;
202   - return NULL;
203   - }
204   - snprintf(ret,9,"%d",lib3270_pfkey(hSession,atoi(argv[1])));
205   - return strdup(ret);
206   - }
207   -
208   - LIB3270_MACRO( pa )
209   - {
210   - char ret[10];
211   - if(argc != 2)
212   - {
213   - errno = EINVAL;
214   - return NULL;
215   - }
216   - snprintf(ret,9,"%d",lib3270_pakey(hSession,atoi(argv[1])));
217   - return strdup(ret);
218   - }
219   -
220   - LIB3270_MACRO( enter )
221   - {
222   - char ret[10];
223   - if(argc != 1)
224   - {
225   - errno = EINVAL;
226   - return NULL;
227   - }
228   - snprintf(ret,9,"%d",lib3270_enter(hSession));
229   - return strdup(ret);
230   - }
231   -
232   - LIB3270_MACRO( connect )
233   - {
234   - int rc = EBUSY;
235   - char ret[10];
236   -
237   - switch(argc)
238   - {
239   - case 1:
240   - rc = lib3270_connect(hSession,0);
241   - break;
242   -
243   - case 2:
244   - lib3270_set_url(hSession,argv[1]);
245   - rc = lib3270_connect(hSession,0);
246   - break;
247   -
248   - case 3:
249   - lib3270_set_url(hSession,argv[1]);
250   - rc = lib3270_connect(hSession,atoi(argv[2]));
251   - break;
252   -
253   - default:
254   - return NULL;
255   - }
256   -
257   - snprintf(ret,9,"%d",rc);
258   - return strdup(ret);
259   - }
260   -
261   - LIB3270_MACRO( disconnect )
262   - {
263   - lib3270_disconnect(hSession);
264   - return strdup("0");
265   - }
266   -
267   - LIB3270_MACRO( unselect )
268   - {
269   - lib3270_unselect(hSession);
270   - return strdup("0");
271   - }
272   -
273   - LIB3270_MACRO( select )
274   - {
275   - int rc = -1;
276   - char ret[10];
277   -
278   - switch(argc)
279   - {
280   - case 1: // 1 argument, select all
281   - rc = lib3270_select_all(hSession);
282   - break;
283   -
284   - case 3: // 2 arguments, first and last addr
285   - rc = lib3270_select_region(hSession,atoi(argv[1]),atoi(argv[2]));
286   - break;
287   -
288   -
289   - default:
290   - errno = EINVAL;
291   - return NULL;
292   - }
293   -
294   - snprintf(ret,9,"%d",rc);
295   - return strdup(ret);
296   -
297   - }
298   -*/
299   -
300   -/*--[ Macro entry point ]----------------------------------------------------------------------------*/
301   -
302   -/*
303   - LIB3270_EXPORT char * lib3270_run_macro(H3270 *session, const char **argv)
304   - {
305   - #define LIB3270_MACRO_ENTRY( name ) { #name, lib3270_macro_ ## name }
306   -
307   - static const struct macro_list cmd[] =
308   - {
309   - LIB3270_MACRO_ENTRY( connect ),
310   - LIB3270_MACRO_ENTRY( cstate ),
311   - LIB3270_MACRO_ENTRY( disconnect ),
312   - LIB3270_MACRO_ENTRY( encoding ),
313   - LIB3270_MACRO_ENTRY( enter ),
314   - LIB3270_MACRO_ENTRY( get ),
315   - LIB3270_MACRO_ENTRY( luname ),
316   - LIB3270_MACRO_ENTRY( pa ),
317   - LIB3270_MACRO_ENTRY( pf ),
318   - LIB3270_MACRO_ENTRY( set ),
319   - LIB3270_MACRO_ENTRY( status ),
320   - LIB3270_MACRO_ENTRY( select ),
321   - LIB3270_MACRO_ENTRY( unselect ),
322   -
323   - {NULL, NULL}
324   - };
325   -
326   - int argc;
327   - int f;
328   -
329   - CHECK_SESSION_HANDLE(session);
330   -
331   - trace("macro(%s)",argv[0]);
332   -
333   - // Get the number of arguments
334   - for(argc = 0; argv[argc]; argc++);
335   -
336   - // Search for macro function
337   - for(f=0;cmd[f].name;f++)
338   - {
339   - if(!strcasecmp(cmd[f].name,argv[0]))
340   - return cmd[f].exec(session,argc,argv);
341   - }
342   -
343   - if(argc == 1)
344   - {
345   - // Search for action
346   - const LIB3270_ACTION_ENTRY *actions = lib3270_get_action_table();
347   -
348   - for(f=0;actions[f].name;f++)
349   - {
350   - if(!strcasecmp(actions[f].name,argv[0]))
351   - {
352   - int rc = actions[f].call(session);
353   - return xs_buffer("%d",rc);
354   - }
355   - }
356   -
357   - }
358   -
359   - // Not found, return NULL
360   - return NULL;
361   - }
362   -*/
src/lib3270/options.c
... ... @@ -35,22 +35,22 @@
35 35  
36 36 /*---[ Statics ]--------------------------------------------------------------------------------------------------------------*/
37 37  
38   - static const LIB3270_OPTION_ENTRY host_type[] =
  38 + static const LIB3270_HOST_TYPE_ENTRY host_type[] =
39 39 {
40 40 {
41   - LIB3270_OPTION_S390,
  41 + LIB3270_HOST_S390,
42 42 "S390",
43 43 N_( "IBM S/390" ),
44 44 NULL
45 45 },
46 46 {
47   - LIB3270_OPTION_AS400,
  47 + LIB3270_HOST_AS400,
48 48 "AS400",
49 49 N_( "IBM AS/400" ),
50 50 NULL
51 51 },
52 52 {
53   - LIB3270_OPTION_TSO,
  53 + LIB3270_HOST_TSO,
54 54 "TSO",
55 55 N_( "Other (TSO)" ),
56 56 NULL
... ... @@ -73,25 +73,17 @@
73 73  
74 74 /*---[ Implement ]------------------------------------------------------------------------------------------------------------*/
75 75  
76   -LIB3270_EXPORT LIB3270_OPTION lib3270_get_options(H3270 *hSession)
  76 +LIB3270_EXPORT LIB3270_HOST_TYPE lib3270_get_host_type(H3270 *hSession)
77 77 {
78 78 CHECK_SESSION_HANDLE(hSession);
79   - return hSession->options;
  79 + return hSession->host_type;
80 80 }
81 81  
82   -LIB3270_EXPORT void lib3270_set_options(H3270 *hSession, LIB3270_OPTION opt)
  82 +LIB3270_EXPORT int lib3270_set_host_type(H3270 *hSession, LIB3270_HOST_TYPE opt)
83 83 {
84   - CHECK_SESSION_HANDLE(hSession);
85   - hSession->options = opt;
86   -
87   - Replace(hSession->host.full,
88   - lib3270_strdup_printf(
89   - "%s%s:%s",
90   - hSession->options&LIB3270_OPTION_SSL ? "tn3270s://" : "tn3270://",
91   - hSession->host.current,
92   - hSession->host.srvc
93   - ));
94   -
  84 + FAIL_IF_ONLINE(hSession);
  85 + hSession->host_type = opt;
  86 + return 0;
95 87 }
96 88  
97 89 LIB3270_EXPORT int lib3270_get_color_type(H3270 *hSession)
... ... @@ -137,7 +129,7 @@ LIB3270_EXPORT int lib3270_set_color_type(H3270 *hSession, int colortype)
137 129 }
138 130  
139 131  
140   -LIB3270_EXPORT const LIB3270_OPTION_ENTRY * lib3270_get_option_list(void)
  132 +LIB3270_EXPORT const LIB3270_HOST_TYPE_ENTRY * lib3270_get_option_list(void)
141 133 {
142 134 return host_type;
143 135 }
... ... @@ -145,10 +137,40 @@ LIB3270_EXPORT const LIB3270_OPTION_ENTRY * lib3270_get_option_list(void)
145 137 LIB3270_EXPORT int lib3270_is_tso(H3270 *hSession)
146 138 {
147 139 CHECK_SESSION_HANDLE(hSession);
148   - return (hSession->options & LIB3270_OPTION_TSO) != 0;
  140 + return (hSession->host_type & LIB3270_HOST_TSO) != 0;
  141 +}
  142 +
  143 +LIB3270_EXPORT int lib3270_set_tso(H3270 *hSession, int on)
  144 +{
  145 + FAIL_IF_ONLINE(hSession);
  146 +
  147 + if(on)
  148 + hSession->host_type = LIB3270_HOST_TSO;
  149 + else
  150 + hSession->host_type &= ~LIB3270_HOST_TSO;
  151 +
  152 + return 0;
  153 +}
  154 +
  155 +LIB3270_EXPORT int lib3270_is_as400(H3270 *hSession)
  156 +{
  157 + CHECK_SESSION_HANDLE(hSession);
  158 + return (hSession->host_type & LIB3270_HOST_AS400) != 0;
149 159 }
150 160  
151   -LIB3270_EXPORT LIB3270_OPTION lib3270_parse_host_type(const char *name)
  161 +LIB3270_EXPORT int lib3270_set_as400(H3270 *hSession, int on)
  162 +{
  163 + FAIL_IF_ONLINE(hSession);
  164 +
  165 + if(on)
  166 + hSession->host_type |= LIB3270_HOST_AS400;
  167 + else
  168 + hSession->host_type &= ~LIB3270_HOST_AS400;
  169 +
  170 + return 0;
  171 +}
  172 +
  173 +LIB3270_EXPORT LIB3270_HOST_TYPE lib3270_parse_host_type(const char *name)
152 174 {
153 175  
154 176 int f;
... ... @@ -156,22 +178,23 @@ LIB3270_EXPORT LIB3270_OPTION lib3270_parse_host_type(const char *name)
156 178 for(f=0;host_type[f].name;f++)
157 179 {
158 180 if(!strcasecmp(host_type[f].name,name))
159   - return host_type[f].option;
  181 + return host_type[f].type;
160 182 }
161 183  
  184 + errno = ENOENT;
162 185 return 0;
163 186 }
164 187  
165   -LIB3270_EXPORT int lib3270_set_host_type(H3270 *hSession, const char *name)
  188 +LIB3270_EXPORT int lib3270_set_host_type_by_name(H3270 *hSession, const char *name)
166 189 {
167   - size_t f;
  190 + FAIL_IF_ONLINE(hSession);
168 191  
  192 + size_t f;
169 193 for(f=0;f<(sizeof(host_type)/sizeof(host_type[0]));f++)
170 194 {
171 195 if(host_type[f].name && !strcasecmp(host_type[f].name,name))
172 196 {
173   - hSession->options &= ~LIB3270_OPTION_HOST_TYPE;
174   - hSession->options |= host_type[f].option;
  197 + hSession->host_type = host_type[f].type;
175 198 return 0;
176 199 }
177 200 }
... ... @@ -179,13 +202,13 @@ LIB3270_EXPORT int lib3270_set_host_type(H3270 *hSession, const char *name)
179 202 return errno = EINVAL;
180 203 }
181 204  
182   -LIB3270_EXPORT const char * lib3270_get_host_type(H3270 *hSession)
  205 +LIB3270_EXPORT const char * lib3270_get_host_type_name(H3270 *hSession)
183 206 {
184 207 size_t f;
185 208  
186 209 for(f=0;f<(sizeof(host_type)/sizeof(host_type[0]));f++)
187 210 {
188   - if(hSession->options & host_type[f].option)
  211 + if(hSession->host_type == host_type[f].type)
189 212 {
190 213 return host_type[f].name;
191 214 }
... ...
src/lib3270/private.h
... ... @@ -309,7 +309,7 @@ struct _h3270
309 309 LIB3270_CSTATE cstate; ///< @brief Connection state.
310 310  
311 311 // flags
312   - LIB3270_OPTION options; ///< @brief Session options.
  312 + LIB3270_HOST_TYPE host_type; ///< @brief Host type.
313 313  
314 314 int selected : 1; ///< @brief Has selected region?
315 315 int rectsel : 1; ///< @brief Selected region is a rectangle ?
... ... @@ -605,6 +605,7 @@ struct _h3270
605 605 /// @brief SSL Data.
606 606 struct
607 607 {
  608 + char enabled;
608 609 char host;
609 610 LIB3270_SSL_STATE state;
610 611 unsigned long error;
... ... @@ -647,7 +648,7 @@ LIB3270_INTERNAL int lib3270_default_event_dispatcher(H3270 *hSession, int block
647 648 /**
648 649 * @brief Called from timer to attempt an automatic reconnection.
649 650 */
650   -LIB3270_INTERNAL int lib3270_reconnect(H3270 *hSession);
  651 +LIB3270_INTERNAL int lib3270_check_for_auto_reconnect(H3270 *hSession);
651 652  
652 653 #if defined(DEBUG)
653 654 #define CHECK_SESSION_HANDLE(x) check_session_handle(&x,__FUNCTION__);
... ...
src/lib3270/properties.c
... ... @@ -72,7 +72,7 @@
72 72 "connected", // Property name.
73 73 N_( "" ), // Property description.
74 74 lib3270_is_connected, // Get value.
75   - lib3270_set_connected // Set value.
  75 + NULL // Set value.
76 76 },
77 77  
78 78 {
... ... @@ -86,7 +86,14 @@
86 86 "tso", // Property name.
87 87 N_( "Non zero if the host is TSO." ), // Property description.
88 88 lib3270_is_tso, // Get value.
89   - NULL // Set value.
  89 + lib3270_set_tso // Set value.
  90 + },
  91 +
  92 + {
  93 + "as400", // Property name.
  94 + N_( "Non zero if the host is AS400." ), // Property description.
  95 + lib3270_is_as400, // Get value.
  96 + lib3270_set_as400 // Set value.
90 97 },
91 98  
92 99 {
... ... @@ -360,8 +367,8 @@
360 367 {
361 368 "host_type", // Property name.
362 369 N_( "" ), // Property description.
363   - lib3270_get_host_type, // Get value.
364   - lib3270_set_host_type // Set value.
  370 + lib3270_get_host_type_name, // Get value.
  371 + lib3270_set_host_type_by_name // Set value.
365 372 },
366 373  
367 374 {
... ... @@ -422,11 +429,12 @@
422 429  
423 430 }
424 431  
  432 + /*
425 433 int lib3270_set_connected(H3270 *hSession, int state) {
426 434  
427 435 if(state) {
428 436  
429   - if(lib3270_connect(hSession,120))
  437 + if(lib3270_reconnect(hSession,120))
430 438 return -1;
431 439  
432 440 } else {
... ... @@ -436,6 +444,7 @@
436 444  
437 445 return 0;
438 446 }
  447 + */
439 448  
440 449 int lib3270_get_int_property(H3270 *hSession, const char *name, int seconds)
441 450 {
... ...
src/lib3270/session.c
... ... @@ -314,7 +314,7 @@ static void lib3270_session_init(H3270 *hSession, const char *model, const char
314 314 hSession->saved_wraparound_mode = 1;
315 315 hSession->once_cset = -1;
316 316 hSession->state = LIB3270_ANSI_STATE_DATA;
317   - hSession->options = LIB3270_OPTION_DEFAULTS;
  317 + hSession->host_type = LIB3270_HOSTTYPE_DEFAULT;
318 318 hSession->colors = 16;
319 319 hSession->m3279 = 1;
320 320 hSession->unlock_delay_ms = 350; // 0.35s after last unlock
... ...
src/lib3270/testprogram/testprogram.c
... ... @@ -50,7 +50,7 @@ int main(int argc, char *argv[])
50 50 //lib3270_set_toggle(h,LIB3270_TOGGLE_DS_TRACE,1);
51 51 lib3270_set_toggle(h,LIB3270_TOGGLE_SSL_TRACE,1);
52 52  
53   - rc = lib3270_connect(h,120);
  53 + rc = lib3270_reconnect(h,120);
54 54 printf("\nConnect %s exits with rc=%d\n",lib3270_get_url(h),rc);
55 55  
56 56 lib3270_wait_for_ready(h,10);
... ...
src/lib3270/toggles.c
... ... @@ -352,7 +352,7 @@ static void toggle_reconnect(H3270 *hSession, struct lib3270_toggle *t unused, L
352 352 /* Schedule an automatic reconnection. */
353 353 lib3270_write_log(hSession,"toggle","Auto-reconnect toggle was activated when offline, reconnecting");
354 354 hSession->auto_reconnect_inprogress = 1;
355   - (void) AddTimer(RECONNECT_MS, hSession, lib3270_reconnect);
  355 + (void) AddTimer(RECONNECT_MS, hSession, lib3270_check_for_auto_reconnect);
356 356 }
357 357  
358 358 }
... ...
src/lib3270/windows/connect.c
... ... @@ -159,11 +159,12 @@ LIB3270_EXPORT int lib3270_connect_url(H3270 *hSession, const char *url, int wai
159 159 lib3270_set_url(hSession,url);
160 160 }
161 161  
162   - return lib3270_connect(hSession, wait);
  162 + return lib3270_reconnect(hSession, wait);
163 163  
164 164 }
165 165  
166   -LIB3270_EXPORT int lib3270_connect_host(H3270 *hSession, const char *hostname, const char *srvc, LIB3270_OPTION opt)
  166 +/*
  167 +LIB3270_EXPORT int lib3270_connect_host(H3270 *hSession, const char *hostname, const char *srvc, LIB3270_HOST_TYPE opt)
167 168 {
168 169 CHECK_SESSION_HANDLE(hSession);
169 170  
... ... @@ -190,22 +191,23 @@ LIB3270_EXPORT int lib3270_connect_host(H3270 *hSession, const char *hostname, c
190 191 hostname = name;
191 192 }
192 193  
193   - hSession->options = opt & ~LIB3270_OPTION_WAIT;
  194 + hSession->options = opt & ~LIB3270_HOST_TYPE_WAIT;
194 195 Replace(hSession->host.current,strdup(hostname));
195 196 Replace(hSession->host.srvc,strdup(srvc));
196 197  
197 198 Replace(hSession->host.full,
198 199 lib3270_strdup_printf(
199 200 "%s%s:%s",
200   - opt&LIB3270_OPTION_SSL ? "tn3270s://" : "tn3270://",
  201 + opt&LIB3270_HOST_TYPE_SSL ? "tn3270s://" : "tn3270://",
201 202 hostname,
202 203 srvc ));
203 204  
204 205 trace("current_host=\"%s\"",hSession->host.current);
205 206  
206   - return lib3270_connect(hSession,opt & LIB3270_OPTION_WAIT);
  207 + return lib3270_reconnect(hSession,opt & LIB3270_HOST_TYPE_WAIT);
207 208  
208 209 }
  210 +*/
209 211  
210 212 struct resolver
211 213 {
... ... @@ -260,7 +262,7 @@ LIB3270_EXPORT int lib3270_connect_host(H3270 *hSession, const char *hostname, c
260 262  
261 263 }
262 264  
263   -int lib3270_connect(H3270 *hSession, int seconds)
  265 +int lib3270_reconnect(H3270 *hSession, int seconds)
264 266 {
265 267 int optval;
266 268 struct resolver host;
... ... @@ -330,7 +332,7 @@ int lib3270_connect(H3270 *hSession, int seconds)
330 332 hSession->ever_3270 = False;
331 333 hSession->ssl.host = 0;
332 334  
333   - if(hSession->options&LIB3270_OPTION_SSL)
  335 + if(hSession->options&LIB3270_HOST_TYPE_SSL)
334 336 {
335 337 #if defined(HAVE_LIBSSL)
336 338 hSession->ssl.host = 1;
... ...