Commit 320371b5b136a117536f682094239dedfac91a8f

Authored by perry.werneck@gmail.com
1 parent 819d90fa

Estado do emulador não estava sendo corretamente inicializado ao conectar pelo a…

…ndroid fazendo com que a segunda conexão ficasse bloqueada
Showing 1 changed file with 106 additions and 73 deletions   Show diff stats
@@ -269,17 +269,13 @@ static const char *nnn(int c); @@ -269,17 +269,13 @@ static const char *nnn(int c);
269 #define TNS_SB_IAC 7 /* got an IAC after an IAC SB */ 269 #define TNS_SB_IAC 7 /* got an IAC after an IAC SB */
270 270
271 /* telnet predefined messages */ 271 /* telnet predefined messages */
272 -static unsigned char do_opt[] = {  
273 - IAC, DO, '_' };  
274 -static unsigned char dont_opt[] = {  
275 - IAC, DONT, '_' };  
276 -static unsigned char will_opt[] = {  
277 - IAC, WILL, '_' };  
278 -static unsigned char wont_opt[] = {  
279 - IAC, WONT, '_' }; 272 +static unsigned char do_opt[] = { IAC, DO, '_' };
  273 +static unsigned char dont_opt[] = { IAC, DONT, '_' };
  274 +static unsigned char will_opt[] = { IAC, WILL, '_' };
  275 +static unsigned char wont_opt[] = { IAC, WONT, '_' };
  276 +
280 #if defined(X3270_TN3270E) /*[*/ 277 #if defined(X3270_TN3270E) /*[*/
281 -static unsigned char functions_req[] = {  
282 - IAC, SB, TELOPT_TN3270E, TN3270E_OP_FUNCTIONS }; 278 +static unsigned char functions_req[] = { IAC, SB, TELOPT_TN3270E, TN3270E_OP_FUNCTIONS };
283 #endif /*]*/ 279 #endif /*]*/
284 280
285 #if defined(X3270_TRACE) /*[*/ 281 #if defined(X3270_TRACE) /*[*/
@@ -620,30 +616,32 @@ int net_connect(H3270 *session, const char *host, char *portname, Boolean ls, Bo @@ -620,30 +616,32 @@ int net_connect(H3270 *session, const char *host, char *portname, Boolean ls, Bo
620 616
621 /* fill in the socket address of the given host */ 617 /* fill in the socket address of the given host */
622 (void) memset((char *) &haddr, 0, sizeof(haddr)); 618 (void) memset((char *) &haddr, 0, sizeof(haddr));
623 - if (session->passthru_host) { 619 + if (session->passthru_host)
  620 + {
624 haddr.sin.sin_family = AF_INET; 621 haddr.sin.sin_family = AF_INET;
625 - (void) memmove(&haddr.sin.sin_addr, passthru_haddr,  
626 - passthru_len); 622 + (void) memmove(&haddr.sin.sin_addr, passthru_haddr,passthru_len);
627 haddr.sin.sin_port = passthru_port; 623 haddr.sin.sin_port = passthru_port;
628 ha_len = sizeof(struct sockaddr_in); 624 ha_len = sizeof(struct sockaddr_in);
629 - } else if (session->proxy_type > 0) {  
630 - if (resolve_host_and_port(session,session->proxy_host, session->proxy_portname,  
631 - &session->proxy_port, &haddr.sa, &ha_len, errmsg,  
632 - sizeof(errmsg)) < 0) {  
633 - popup_an_error(session,errmsg);  
634 - return -1; 625 + }
  626 + else if (session->proxy_type > 0)
  627 + {
  628 + if (resolve_host_and_port(session,session->proxy_host, session->proxy_portname,&session->proxy_port, &haddr.sa, &ha_len, errmsg,sizeof(errmsg)) < 0)
  629 + {
  630 + popup_an_error(session,errmsg);
  631 + return -1;
  632 + }
  633 + }
  634 + else
  635 + {
  636 + if (resolve_host_and_port(session,host, portname,&session->current_port, &haddr.sa, &ha_len,errmsg, sizeof(errmsg)) < 0)
  637 + {
  638 + popup_an_error(session,errmsg);
  639 + return -1;
635 } 640 }
636 - } else {  
637 - if (resolve_host_and_port(session,host, portname,  
638 - &session->current_port, &haddr.sa, &ha_len,  
639 - errmsg, sizeof(errmsg)) < 0) {  
640 - popup_an_error(session,errmsg);  
641 - return -1;  
642 - }  
643 } 641 }
644 642
645 /* create the socket */ 643 /* create the socket */
646 - if ((session->sock = socket(haddr.sa.sa_family, SOCK_STREAM, 0)) == -1) 644 + if((session->sock = socket(haddr.sa.sa_family, SOCK_STREAM, 0)) == -1)
647 { 645 {
648 popup_a_sockerr(session, N_( "socket" ) ); 646 popup_a_sockerr(session, N_( "socket" ) );
649 return -1; 647 return -1;
@@ -863,28 +861,41 @@ static void net_connected(H3270 *session) @@ -863,28 +861,41 @@ static void net_connected(H3270 *session)
863 } 861 }
864 862
865 // session->secure_connection = True; 863 // session->secure_connection = True;
866 -// trace_dsn("TLS/SSL tunneled connection complete. Connection is now secure.\n"); 864 + trace_dsn("TLS/SSL tunneled connection complete. Connection is now secure.\n");
867 865
868 /* Tell everyone else again. */ 866 /* Tell everyone else again. */
869 lib3270_set_connected(session); 867 lib3270_set_connected(session);
870 } 868 }
871 #endif /*]*/ 869 #endif /*]*/
872 870
873 - /* set up telnet options */  
874 - (void) memset((char *) h3270.myopts, 0, sizeof(h3270.myopts));  
875 - (void) memset((char *) h3270.hisopts, 0, sizeof(h3270.hisopts)); 871 + lib3270_setup_session(session);
  872 +
  873 +}
  874 +
  875 +/**
  876 + * Set up telnet options.
  877 + *
  878 + * Called just after a sucessfull connect to setup tn3270 state.
  879 + *
  880 + * @param session 3270 session to setup.
  881 + *
  882 + */
  883 +LIB3270_EXPORT void lib3270_setup_session(H3270 *session)
  884 +{
  885 + (void) memset((char *) session->myopts, 0, sizeof(session->myopts));
  886 + (void) memset((char *) session->hisopts, 0, sizeof(session->hisopts));
876 887
877 #if defined(X3270_TN3270E) /*[*/ 888 #if defined(X3270_TN3270E) /*[*/
878 - h3270.e_funcs = E_OPT(TN3270E_FUNC_BIND_IMAGE) | E_OPT(TN3270E_FUNC_RESPONSES) | E_OPT(TN3270E_FUNC_SYSREQ);  
879 - h3270.e_xmit_seq = 0;  
880 - h3270.response_required = TN3270E_RSF_NO_RESPONSE; 889 + session->e_funcs = E_OPT(TN3270E_FUNC_BIND_IMAGE) | E_OPT(TN3270E_FUNC_RESPONSES) | E_OPT(TN3270E_FUNC_SYSREQ);
  890 + session->e_xmit_seq = 0;
  891 + session->response_required = TN3270E_RSF_NO_RESPONSE;
881 #endif /*]*/ 892 #endif /*]*/
882 893
883 #if defined(HAVE_LIBSSL) /*[*/ 894 #if defined(HAVE_LIBSSL) /*[*/
884 need_tls_follows = False; 895 need_tls_follows = False;
885 #endif /*]*/ 896 #endif /*]*/
886 - h3270.telnet_state = TNS_DATA;  
887 - h3270.ibptr = h3270.ibuf; 897 + session->telnet_state = TNS_DATA;
  898 + session->ibptr = h3270.ibuf;
888 899
889 /* clear statistics and flags */ 900 /* clear statistics and flags */
890 time(&session->ns_time); 901 time(&session->ns_time);
@@ -904,12 +915,10 @@ static void net_connected(H3270 *session) @@ -904,12 +915,10 @@ static void net_connected(H3270 *session)
904 /* write out the passthru hostname and port nubmer */ 915 /* write out the passthru hostname and port nubmer */
905 if (session->passthru_host) 916 if (session->passthru_host)
906 { 917 {
907 - char *buf;  
908 -  
909 - buf = lib3270_malloc(strlen(session->hostname) + 32);  
910 - (void) sprintf(buf, "%s %d\r\n", session->hostname, session->current_port);  
911 - (void) send(session->sock, buf, strlen(buf), 0);  
912 - lib3270_free(buf); 918 + unsigned char *buffer = (unsigned char *) xs_buffer("%s %d\r\n", session->hostname, session->current_port);
  919 + session->write(session, buffer, strlen((char *) buffer));
  920 + lib3270_free(buffer);
  921 + trace_ds("SENT HOSTNAME %s:%d\n", session->hostname, session->current_port);
913 } 922 }
914 } 923 }
915 924
@@ -1204,7 +1213,8 @@ static int telnet_fsm(H3270 *session, unsigned char c) @@ -1204,7 +1213,8 @@ static int telnet_fsm(H3270 *session, unsigned char c)
1204 int sl; 1213 int sl;
1205 #endif /*]*/ 1214 #endif /*]*/
1206 1215
1207 - switch (session->telnet_state) { 1216 + switch (session->telnet_state)
  1217 + {
1208 case TNS_DATA: /* normal data processing */ 1218 case TNS_DATA: /* normal data processing */
1209 if (c == IAC) { /* got a telnet command */ 1219 if (c == IAC) { /* got a telnet command */
1210 session->telnet_state = TNS_IAC; 1220 session->telnet_state = TNS_IAC;
@@ -1252,14 +1262,19 @@ static int telnet_fsm(H3270 *session, unsigned char c) @@ -1252,14 +1262,19 @@ static int telnet_fsm(H3270 *session, unsigned char c)
1252 } 1262 }
1253 break; 1263 break;
1254 case TNS_IAC: /* process a telnet command */ 1264 case TNS_IAC: /* process a telnet command */
1255 - if (c != EOR && c != IAC) { 1265 + if (c != EOR && c != IAC)
  1266 + {
1256 trace_dsn("RCVD %s ", cmd(c)); 1267 trace_dsn("RCVD %s ", cmd(c));
1257 } 1268 }
1258 - switch (c) {  
1259 - case IAC: /* escaped IAC, insert it */  
1260 - if (IN_ANSI && !IN_E) { 1269 +
  1270 + switch (c)
  1271 + {
  1272 + case IAC: /* escaped IAC, insert it */
  1273 + if (IN_ANSI && !IN_E)
  1274 + {
1261 #if defined(X3270_ANSI) /*[*/ 1275 #if defined(X3270_ANSI) /*[*/
1262 - if (!session->ansi_data) { 1276 + if (!session->ansi_data)
  1277 + {
1263 trace_dsn("<.. "); 1278 trace_dsn("<.. ");
1264 session->ansi_data = 4; 1279 session->ansi_data = 4;
1265 } 1280 }
@@ -1272,40 +1287,53 @@ static int telnet_fsm(H3270 *session, unsigned char c) @@ -1272,40 +1287,53 @@ static int telnet_fsm(H3270 *session, unsigned char c)
1272 trace_dsn("%s",see_chr); 1287 trace_dsn("%s",see_chr);
1273 ansi_process((unsigned int) c); 1288 ansi_process((unsigned int) c);
1274 #endif /*]*/ 1289 #endif /*]*/
1275 - } else 1290 + }
  1291 + else
  1292 + {
1276 store3270in(session,c); 1293 store3270in(session,c);
  1294 + }
1277 session->telnet_state = TNS_DATA; 1295 session->telnet_state = TNS_DATA;
1278 break; 1296 break;
1279 - case EOR: /* eor, process accumulated input */  
1280 - if (IN_3270 || (IN_E && session->tn3270e_negotiated)) { 1297 +
  1298 + case EOR: /* eor, process accumulated input */
  1299 +
  1300 + if (IN_3270 || (IN_E && session->tn3270e_negotiated))
  1301 + {
1281 session->ns_rrcvd++; 1302 session->ns_rrcvd++;
1282 if (process_eor(session)) 1303 if (process_eor(session))
1283 return -1; 1304 return -1;
1284 } else 1305 } else
1285 Warning(session, _( "EOR received when not in 3270 mode, ignored." )); 1306 Warning(session, _( "EOR received when not in 3270 mode, ignored." ));
  1307 +
1286 trace_dsn("RCVD EOR\n"); 1308 trace_dsn("RCVD EOR\n");
1287 session->ibptr = session->ibuf; 1309 session->ibptr = session->ibuf;
1288 session->telnet_state = TNS_DATA; 1310 session->telnet_state = TNS_DATA;
1289 break; 1311 break;
1290 - case WILL: 1312 +
  1313 + case WILL:
1291 session->telnet_state = TNS_WILL; 1314 session->telnet_state = TNS_WILL;
1292 break; 1315 break;
1293 - case WONT: 1316 +
  1317 + case WONT:
1294 session->telnet_state = TNS_WONT; 1318 session->telnet_state = TNS_WONT;
1295 break; 1319 break;
1296 - case DO: 1320 +
  1321 + case DO:
1297 session->telnet_state = TNS_DO; 1322 session->telnet_state = TNS_DO;
1298 break; 1323 break;
1299 - case DONT: 1324 +
  1325 + case DONT:
1300 session->telnet_state = TNS_DONT; 1326 session->telnet_state = TNS_DONT;
1301 break; 1327 break;
1302 - case SB: 1328 +
  1329 + case SB:
1303 session->telnet_state = TNS_SB; 1330 session->telnet_state = TNS_SB;
1304 if (session->sbbuf == (unsigned char *)NULL) 1331 if (session->sbbuf == (unsigned char *)NULL)
1305 session->sbbuf = (unsigned char *)lib3270_malloc(1024); 1332 session->sbbuf = (unsigned char *)lib3270_malloc(1024);
1306 session->sbptr = session->sbbuf; 1333 session->sbptr = session->sbbuf;
1307 break; 1334 break;
1308 - case DM: 1335 +
  1336 + case DM:
1309 trace_dsn("\n"); 1337 trace_dsn("\n");
1310 if (session->syncing) 1338 if (session->syncing)
1311 { 1339 {
@@ -1314,12 +1342,14 @@ static int telnet_fsm(H3270 *session, unsigned char c) @@ -1314,12 +1342,14 @@ static int telnet_fsm(H3270 *session, unsigned char c)
1314 } 1342 }
1315 session->telnet_state = TNS_DATA; 1343 session->telnet_state = TNS_DATA;
1316 break; 1344 break;
1317 - case GA:  
1318 - case NOP: 1345 +
  1346 + case GA:
  1347 + case NOP:
1319 trace_dsn("\n"); 1348 trace_dsn("\n");
1320 session->telnet_state = TNS_DATA; 1349 session->telnet_state = TNS_DATA;
1321 break; 1350 break;
1322 - default: 1351 +
  1352 + default:
1323 trace_dsn("???\n"); 1353 trace_dsn("???\n");
1324 session->telnet_state = TNS_DATA; 1354 session->telnet_state = TNS_DATA;
1325 break; 1355 break;
@@ -1370,15 +1400,17 @@ static int telnet_fsm(H3270 *session, unsigned char c) @@ -1370,15 +1400,17 @@ static int telnet_fsm(H3270 *session, unsigned char c)
1370 break; 1400 break;
1371 case TNS_WONT: /* telnet WONT DO OPTION command */ 1401 case TNS_WONT: /* telnet WONT DO OPTION command */
1372 trace_dsn("%s\n", opt(c)); 1402 trace_dsn("%s\n", opt(c));
1373 - if (h3270.hisopts[c]) {  
1374 - h3270.hisopts[c] = 0; 1403 + if (session->hisopts[c])
  1404 + {
  1405 + session->hisopts[c] = 0;
1375 dont_opt[2] = c; 1406 dont_opt[2] = c;
1376 - net_rawout(&h3270, dont_opt, sizeof(dont_opt)); 1407 + net_rawout(session, dont_opt, sizeof(dont_opt));
1377 trace_dsn("SENT %s %s\n", cmd(DONT), opt(c)); 1408 trace_dsn("SENT %s %s\n", cmd(DONT), opt(c));
1378 - check_in3270(&h3270);  
1379 - check_linemode(&h3270,False); 1409 + check_in3270(session);
  1410 + check_linemode(session,False);
1380 } 1411 }
1381 - h3270.telnet_state = TNS_DATA; 1412 +
  1413 + session->telnet_state = TNS_DATA;
1382 break; 1414 break;
1383 case TNS_DO: /* telnet PLEASE DO OPTION command */ 1415 case TNS_DO: /* telnet PLEASE DO OPTION command */
1384 trace_dsn("%s\n", opt(c)); 1416 trace_dsn("%s\n", opt(c));
@@ -1400,14 +1432,16 @@ static int telnet_fsm(H3270 *session, unsigned char c) @@ -1400,14 +1432,16 @@ static int telnet_fsm(H3270 *session, unsigned char c)
1400 if (c == TELOPT_TM && !session->bsd_tm) 1432 if (c == TELOPT_TM && !session->bsd_tm)
1401 goto wont; 1433 goto wont;
1402 1434
1403 - if (!h3270.myopts[c]) { 1435 + trace("session->myopts[c]=%d",session->myopts[c]);
  1436 + if (!session->myopts[c])
  1437 + {
1404 if (c != TELOPT_TM) 1438 if (c != TELOPT_TM)
1405 - h3270.myopts[c] = 1; 1439 + session->myopts[c] = 1;
1406 will_opt[2] = c; 1440 will_opt[2] = c;
1407 - net_rawout(&h3270, will_opt, sizeof(will_opt)); 1441 + net_rawout(session, will_opt, sizeof(will_opt));
1408 trace_dsn("SENT %s %s\n", cmd(WILL), opt(c)); 1442 trace_dsn("SENT %s %s\n", cmd(WILL), opt(c));
1409 - check_in3270(&h3270);  
1410 - check_linemode(&h3270,False); 1443 + check_in3270(session);
  1444 + check_linemode(session,False);
1411 } 1445 }
1412 if (c == TELOPT_NAWS) 1446 if (c == TELOPT_NAWS)
1413 send_naws(&h3270); 1447 send_naws(&h3270);
@@ -2571,8 +2605,7 @@ nnn(int c) @@ -2571,8 +2605,7 @@ nnn(int c)
2571 * cmd 2605 * cmd
2572 * Expands a TELNET command into a character string. 2606 * Expands a TELNET command into a character string.
2573 */ 2607 */
2574 -static const char *  
2575 -cmd(int c) 2608 +static const char * cmd(int c)
2576 { 2609 {
2577 if (TELCMD_OK(c)) 2610 if (TELCMD_OK(c))
2578 return TELCMD(c); 2611 return TELCMD(c);