Commit 320371b5b136a117536f682094239dedfac91a8f
1 parent
819d90fa
Exists in
master
and in
3 other branches
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
telnet.c
@@ -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); |