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 | 269 | #define TNS_SB_IAC 7 /* got an IAC after an IAC SB */ |
270 | 270 | |
271 | 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 | 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 | 279 | #endif /*]*/ |
284 | 280 | |
285 | 281 | #if defined(X3270_TRACE) /*[*/ |
... | ... | @@ -620,30 +616,32 @@ int net_connect(H3270 *session, const char *host, char *portname, Boolean ls, Bo |
620 | 616 | |
621 | 617 | /* fill in the socket address of the given host */ |
622 | 618 | (void) memset((char *) &haddr, 0, sizeof(haddr)); |
623 | - if (session->passthru_host) { | |
619 | + if (session->passthru_host) | |
620 | + { | |
624 | 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 | 623 | haddr.sin.sin_port = passthru_port; |
628 | 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 | 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 | 646 | popup_a_sockerr(session, N_( "socket" ) ); |
649 | 647 | return -1; |
... | ... | @@ -863,28 +861,41 @@ static void net_connected(H3270 *session) |
863 | 861 | } |
864 | 862 | |
865 | 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 | 866 | /* Tell everyone else again. */ |
869 | 867 | lib3270_set_connected(session); |
870 | 868 | } |
871 | 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 | 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 | 892 | #endif /*]*/ |
882 | 893 | |
883 | 894 | #if defined(HAVE_LIBSSL) /*[*/ |
884 | 895 | need_tls_follows = False; |
885 | 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 | 900 | /* clear statistics and flags */ |
890 | 901 | time(&session->ns_time); |
... | ... | @@ -904,12 +915,10 @@ static void net_connected(H3270 *session) |
904 | 915 | /* write out the passthru hostname and port nubmer */ |
905 | 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 | 1213 | int sl; |
1205 | 1214 | #endif /*]*/ |
1206 | 1215 | |
1207 | - switch (session->telnet_state) { | |
1216 | + switch (session->telnet_state) | |
1217 | + { | |
1208 | 1218 | case TNS_DATA: /* normal data processing */ |
1209 | 1219 | if (c == IAC) { /* got a telnet command */ |
1210 | 1220 | session->telnet_state = TNS_IAC; |
... | ... | @@ -1252,14 +1262,19 @@ static int telnet_fsm(H3270 *session, unsigned char c) |
1252 | 1262 | } |
1253 | 1263 | break; |
1254 | 1264 | case TNS_IAC: /* process a telnet command */ |
1255 | - if (c != EOR && c != IAC) { | |
1265 | + if (c != EOR && c != IAC) | |
1266 | + { | |
1256 | 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 | 1275 | #if defined(X3270_ANSI) /*[*/ |
1262 | - if (!session->ansi_data) { | |
1276 | + if (!session->ansi_data) | |
1277 | + { | |
1263 | 1278 | trace_dsn("<.. "); |
1264 | 1279 | session->ansi_data = 4; |
1265 | 1280 | } |
... | ... | @@ -1272,40 +1287,53 @@ static int telnet_fsm(H3270 *session, unsigned char c) |
1272 | 1287 | trace_dsn("%s",see_chr); |
1273 | 1288 | ansi_process((unsigned int) c); |
1274 | 1289 | #endif /*]*/ |
1275 | - } else | |
1290 | + } | |
1291 | + else | |
1292 | + { | |
1276 | 1293 | store3270in(session,c); |
1294 | + } | |
1277 | 1295 | session->telnet_state = TNS_DATA; |
1278 | 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 | 1302 | session->ns_rrcvd++; |
1282 | 1303 | if (process_eor(session)) |
1283 | 1304 | return -1; |
1284 | 1305 | } else |
1285 | 1306 | Warning(session, _( "EOR received when not in 3270 mode, ignored." )); |
1307 | + | |
1286 | 1308 | trace_dsn("RCVD EOR\n"); |
1287 | 1309 | session->ibptr = session->ibuf; |
1288 | 1310 | session->telnet_state = TNS_DATA; |
1289 | 1311 | break; |
1290 | - case WILL: | |
1312 | + | |
1313 | + case WILL: | |
1291 | 1314 | session->telnet_state = TNS_WILL; |
1292 | 1315 | break; |
1293 | - case WONT: | |
1316 | + | |
1317 | + case WONT: | |
1294 | 1318 | session->telnet_state = TNS_WONT; |
1295 | 1319 | break; |
1296 | - case DO: | |
1320 | + | |
1321 | + case DO: | |
1297 | 1322 | session->telnet_state = TNS_DO; |
1298 | 1323 | break; |
1299 | - case DONT: | |
1324 | + | |
1325 | + case DONT: | |
1300 | 1326 | session->telnet_state = TNS_DONT; |
1301 | 1327 | break; |
1302 | - case SB: | |
1328 | + | |
1329 | + case SB: | |
1303 | 1330 | session->telnet_state = TNS_SB; |
1304 | 1331 | if (session->sbbuf == (unsigned char *)NULL) |
1305 | 1332 | session->sbbuf = (unsigned char *)lib3270_malloc(1024); |
1306 | 1333 | session->sbptr = session->sbbuf; |
1307 | 1334 | break; |
1308 | - case DM: | |
1335 | + | |
1336 | + case DM: | |
1309 | 1337 | trace_dsn("\n"); |
1310 | 1338 | if (session->syncing) |
1311 | 1339 | { |
... | ... | @@ -1314,12 +1342,14 @@ static int telnet_fsm(H3270 *session, unsigned char c) |
1314 | 1342 | } |
1315 | 1343 | session->telnet_state = TNS_DATA; |
1316 | 1344 | break; |
1317 | - case GA: | |
1318 | - case NOP: | |
1345 | + | |
1346 | + case GA: | |
1347 | + case NOP: | |
1319 | 1348 | trace_dsn("\n"); |
1320 | 1349 | session->telnet_state = TNS_DATA; |
1321 | 1350 | break; |
1322 | - default: | |
1351 | + | |
1352 | + default: | |
1323 | 1353 | trace_dsn("???\n"); |
1324 | 1354 | session->telnet_state = TNS_DATA; |
1325 | 1355 | break; |
... | ... | @@ -1370,15 +1400,17 @@ static int telnet_fsm(H3270 *session, unsigned char c) |
1370 | 1400 | break; |
1371 | 1401 | case TNS_WONT: /* telnet WONT DO OPTION command */ |
1372 | 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 | 1406 | dont_opt[2] = c; |
1376 | - net_rawout(&h3270, dont_opt, sizeof(dont_opt)); | |
1407 | + net_rawout(session, dont_opt, sizeof(dont_opt)); | |
1377 | 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 | 1414 | break; |
1383 | 1415 | case TNS_DO: /* telnet PLEASE DO OPTION command */ |
1384 | 1416 | trace_dsn("%s\n", opt(c)); |
... | ... | @@ -1400,14 +1432,16 @@ static int telnet_fsm(H3270 *session, unsigned char c) |
1400 | 1432 | if (c == TELOPT_TM && !session->bsd_tm) |
1401 | 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 | 1438 | if (c != TELOPT_TM) |
1405 | - h3270.myopts[c] = 1; | |
1439 | + session->myopts[c] = 1; | |
1406 | 1440 | will_opt[2] = c; |
1407 | - net_rawout(&h3270, will_opt, sizeof(will_opt)); | |
1441 | + net_rawout(session, will_opt, sizeof(will_opt)); | |
1408 | 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 | 1446 | if (c == TELOPT_NAWS) |
1413 | 1447 | send_naws(&h3270); |
... | ... | @@ -2571,8 +2605,7 @@ nnn(int c) |
2571 | 2605 | * cmd |
2572 | 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 | 2610 | if (TELCMD_OK(c)) |
2578 | 2611 | return TELCMD(c); | ... | ... |