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
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);
... ...