Commit ed2e112bbc428ce751cd12fc9e1b4cb4e9247f3e
1 parent
b04b9f4b
Exists in
master
and in
5 other branches
Mais funções passam a suportar multi-sessão
Showing
7 changed files
with
84 additions
and
74 deletions
Show diff stats
src/lib3270/ansi.c
... | ... | @@ -1021,15 +1021,15 @@ ansi_nop(H3270 *hSession, int ig1 unused, int ig2 unused) |
1021 | 1021 | } |
1022 | 1022 | |
1023 | 1023 | #define PWRAP { \ |
1024 | - nc = h3270.cursor_addr + 1; \ | |
1025 | - if (nc < h3270.scroll_bottom * h3270.cols) \ | |
1026 | - cursor_move(&h3270,nc); \ | |
1024 | + nc = hSession->cursor_addr + 1; \ | |
1025 | + if (nc < hSession->scroll_bottom * hSession->cols) \ | |
1026 | + cursor_move(hSession,nc); \ | |
1027 | 1027 | else { \ |
1028 | - if (h3270.cursor_addr / h3270.cols >= h3270.scroll_bottom) \ | |
1029 | - cursor_move(&h3270,h3270.cursor_addr / h3270.cols * h3270.cols); \ | |
1028 | + if (hSession->cursor_addr / hSession->cols >= hSession->scroll_bottom) \ | |
1029 | + cursor_move(hSession,hSession->cursor_addr / hSession->cols * hSession->cols); \ | |
1030 | 1030 | else { \ |
1031 | - ansi_scroll(&h3270); \ | |
1032 | - cursor_move(&h3270,nc - h3270.cols); \ | |
1031 | + ansi_scroll(hSession); \ | |
1032 | + cursor_move(hSession,nc - hSession->cols); \ | |
1033 | 1033 | } \ |
1034 | 1034 | } \ |
1035 | 1035 | } | ... | ... |
src/lib3270/ctlr.c
... | ... | @@ -463,78 +463,85 @@ void ctlr_erase(H3270 *session, int alt) |
463 | 463 | /* |
464 | 464 | * Interpret an incoming 3270 command. |
465 | 465 | */ |
466 | -enum pds | |
467 | -process_ds(unsigned char *buf, int buflen) | |
466 | +enum pds process_ds(H3270 *hSession, unsigned char *buf, int buflen) | |
468 | 467 | { |
469 | 468 | enum pds rv; |
470 | 469 | |
471 | 470 | if (!buflen) |
472 | 471 | return PDS_OKAY_NO_OUTPUT; |
473 | 472 | |
474 | -// scroll_to_bottom(); | |
475 | - | |
476 | - trace_ds(&h3270,"< "); | |
473 | + trace_ds(hSession,"< "); | |
477 | 474 | |
478 | - switch (buf[0]) { /* 3270 command */ | |
475 | + switch (buf[0]) /* 3270 command */ | |
476 | + { | |
479 | 477 | case CMD_EAU: /* erase all unprotected */ |
480 | 478 | case SNA_CMD_EAU: |
481 | - trace_ds(&h3270,"EraseAllUnprotected\n"); | |
482 | - ctlr_erase_all_unprotected(&h3270); | |
479 | + trace_ds(hSession, "EraseAllUnprotected\n"); | |
480 | + ctlr_erase_all_unprotected(hSession); | |
483 | 481 | return PDS_OKAY_NO_OUTPUT; |
484 | 482 | break; |
483 | + | |
485 | 484 | case CMD_EWA: /* erase/write alternate */ |
486 | 485 | case SNA_CMD_EWA: |
487 | - trace_ds(&h3270,"EraseWriteAlternate"); | |
486 | + trace_ds(hSession,"EraseWriteAlternate"); | |
488 | 487 | ctlr_erase(NULL,True); |
489 | 488 | if ((rv = ctlr_write(buf, buflen, True)) < 0) |
490 | 489 | return rv; |
491 | 490 | return PDS_OKAY_NO_OUTPUT; |
492 | 491 | break; |
492 | + | |
493 | 493 | case CMD_EW: /* erase/write */ |
494 | 494 | case SNA_CMD_EW: |
495 | - trace_ds(&h3270,"EraseWrite"); | |
495 | + trace_ds(hSession,"EraseWrite"); | |
496 | 496 | ctlr_erase(NULL,False); |
497 | 497 | if ((rv = ctlr_write(buf, buflen, True)) < 0) |
498 | 498 | return rv; |
499 | 499 | return PDS_OKAY_NO_OUTPUT; |
500 | 500 | break; |
501 | + | |
501 | 502 | case CMD_W: /* write */ |
502 | 503 | case SNA_CMD_W: |
503 | - trace_ds(&h3270,"Write"); | |
504 | + trace_ds(hSession,"Write"); | |
504 | 505 | if ((rv = ctlr_write(buf, buflen, False)) < 0) |
505 | 506 | return rv; |
506 | 507 | return PDS_OKAY_NO_OUTPUT; |
507 | 508 | break; |
509 | + | |
508 | 510 | case CMD_RB: /* read buffer */ |
509 | 511 | case SNA_CMD_RB: |
510 | - trace_ds(&h3270,"ReadBuffer\n"); | |
511 | - ctlr_read_buffer(&h3270,h3270.aid); | |
512 | + trace_ds(hSession,"ReadBuffer\n"); | |
513 | + ctlr_read_buffer(hSession,hSession->aid); | |
512 | 514 | return PDS_OKAY_OUTPUT; |
513 | 515 | break; |
516 | + | |
514 | 517 | case CMD_RM: /* read modifed */ |
515 | 518 | case SNA_CMD_RM: |
516 | - trace_ds(&h3270,"ReadModified\n"); | |
517 | - ctlr_read_modified(h3270.aid, False); | |
519 | + trace_ds(hSession,"ReadModified\n"); | |
520 | + ctlr_read_modified(hSession->aid, False); | |
518 | 521 | return PDS_OKAY_OUTPUT; |
519 | 522 | break; |
523 | + | |
520 | 524 | case CMD_RMA: /* read modifed all */ |
521 | 525 | case SNA_CMD_RMA: |
522 | - trace_ds(&h3270,"ReadModifiedAll\n"); | |
523 | - ctlr_read_modified(h3270.aid, True); | |
526 | + trace_ds(hSession,"ReadModifiedAll\n"); | |
527 | + ctlr_read_modified(hSession->aid, True); | |
524 | 528 | return PDS_OKAY_OUTPUT; |
525 | 529 | break; |
530 | + | |
526 | 531 | case CMD_WSF: /* write structured field */ |
527 | 532 | case SNA_CMD_WSF: |
528 | - trace_ds(&h3270,"WriteStructuredField"); | |
533 | + trace_ds(hSession,"WriteStructuredField"); | |
529 | 534 | return write_structured_field(buf, buflen); |
530 | 535 | break; |
536 | + | |
531 | 537 | case CMD_NOP: /* no-op */ |
532 | - trace_ds(&h3270,"NoOp\n"); | |
538 | + trace_ds(hSession,"NoOp\n"); | |
533 | 539 | return PDS_OKAY_NO_OUTPUT; |
534 | 540 | break; |
541 | + | |
535 | 542 | default: |
536 | 543 | /* unknown 3270 command */ |
537 | - popup_an_error(&h3270,_( "Unknown 3270 Data Stream command: 0x%X" ),buf[0]); | |
544 | + popup_an_error(hSession,_( "Unknown 3270 Data Stream command: 0x%X" ),buf[0]); | |
538 | 545 | return PDS_BAD_CMD; |
539 | 546 | } |
540 | 547 | } | ... | ... |
src/lib3270/ctlrc.h
... | ... | @@ -69,7 +69,7 @@ LIB3270_INTERNAL void ctlr_write_sscp_lu(H3270 *session, unsigned char buf[], in |
69 | 69 | LIB3270_INTERNAL void mdt_clear(int baddr); |
70 | 70 | LIB3270_INTERNAL void mdt_set(int baddr); |
71 | 71 | LIB3270_INTERNAL int next_unprotected(H3270 *session, int baddr0); |
72 | -LIB3270_INTERNAL enum pds process_ds(unsigned char *buf, int buflen); | |
72 | +LIB3270_INTERNAL enum pds process_ds(H3270 *hSession, unsigned char *buf, int buflen); | |
73 | 73 | LIB3270_INTERNAL void ps_process(void); |
74 | 74 | |
75 | 75 | LIB3270_INTERNAL void update_model_info(H3270 *session, int model, int cols, int rows); | ... | ... |
src/lib3270/kybd.c
... | ... | @@ -594,7 +594,7 @@ LIB3270_ACTION(break) |
594 | 594 | if (!IN_3270) |
595 | 595 | return 0; |
596 | 596 | |
597 | - net_break(); | |
597 | + net_break(hSession); | |
598 | 598 | |
599 | 599 | return 0; |
600 | 600 | } |
... | ... | @@ -607,7 +607,7 @@ LIB3270_ACTION(attn) |
607 | 607 | if (!IN_3270) |
608 | 608 | return 0; |
609 | 609 | |
610 | - net_interrupt(); | |
610 | + net_interrupt(hSession); | |
611 | 611 | |
612 | 612 | return 0; |
613 | 613 | } |
... | ... | @@ -1886,7 +1886,7 @@ LIB3270_ACTION( sysreq ) |
1886 | 1886 | return 0; |
1887 | 1887 | #if defined(X3270_TN3270E) /*[*/ |
1888 | 1888 | if (IN_E) { |
1889 | - net_abort(); | |
1889 | + net_abort(hSession); | |
1890 | 1890 | } else |
1891 | 1891 | #endif /*]*/ |
1892 | 1892 | { | ... | ... |
src/lib3270/screen.c
... | ... | @@ -166,7 +166,7 @@ static unsigned short calc_attrs(H3270 *session, int baddr, int fa_addr, int fa) |
166 | 166 | /* Compute the color. */ |
167 | 167 | |
168 | 168 | /* Monochrome is easy, and so is color if nothing is specified. */ |
169 | - if (!h3270.m3279 || | |
169 | + if (!session->m3279 || | |
170 | 170 | (!session->ea_buf[baddr].fg && |
171 | 171 | !session->ea_buf[fa_addr].fg && |
172 | 172 | !session->ea_buf[baddr].bg && | ... | ... |
src/lib3270/telnet.c
... | ... | @@ -1952,8 +1952,7 @@ process_eor(H3270 *hSession) |
1952 | 1952 | hSession->tn3270e_submode = E_3270; |
1953 | 1953 | check_in3270(hSession); |
1954 | 1954 | hSession->response_required = h->response_flag; |
1955 | - rv = process_ds(hSession->ibuf + EH_SIZE, | |
1956 | - (hSession->ibptr - hSession->ibuf) - EH_SIZE); | |
1955 | + rv = process_ds(hSession, hSession->ibuf + EH_SIZE,(hSession->ibptr - hSession->ibuf) - EH_SIZE); | |
1957 | 1956 | if (rv < 0 && |
1958 | 1957 | hSession->response_required != TN3270E_RSF_NO_RESPONSE) |
1959 | 1958 | tn3270e_nak(hSession,rv); |
... | ... | @@ -2000,7 +1999,7 @@ process_eor(H3270 *hSession) |
2000 | 1999 | } else |
2001 | 2000 | #endif /*]*/ |
2002 | 2001 | { |
2003 | - (void) process_ds(hSession->ibuf, hSession->ibptr - hSession->ibuf); | |
2002 | + (void) process_ds(hSession, hSession->ibuf, hSession->ibptr - hSession->ibuf); | |
2004 | 2003 | } |
2005 | 2004 | return 0; |
2006 | 2005 | } |
... | ... | @@ -2270,7 +2269,7 @@ static void do_intr(H3270 *hSession, char c) |
2270 | 2269 | } |
2271 | 2270 | ansi_process_s(ctl_see((int) c)); |
2272 | 2271 | cooked_init(hSession); |
2273 | - net_interrupt(); | |
2272 | + net_interrupt(hSession); | |
2274 | 2273 | } |
2275 | 2274 | |
2276 | 2275 | static void do_quit(H3270 *hSession, char c) |
... | ... | @@ -2282,7 +2281,7 @@ static void do_quit(H3270 *hSession, char c) |
2282 | 2281 | } |
2283 | 2282 | ansi_process_s(ctl_see((int) c)); |
2284 | 2283 | cooked_init(hSession); |
2285 | - net_break(); | |
2284 | + net_break(hSession); | |
2286 | 2285 | } |
2287 | 2286 | |
2288 | 2287 | static void do_cerase(H3270 *hSession, char c) |
... | ... | @@ -2688,8 +2687,8 @@ void trace_netdata(H3270 *hSession, char direction, unsigned const char *buf, in |
2688 | 2687 | (void) gettimeofday(&ts, (struct timezone *)NULL); |
2689 | 2688 | if (IN_3270) |
2690 | 2689 | { |
2691 | - tdiff = ((1.0e6 * (double)(ts.tv_sec - h3270.ds_ts.tv_sec)) + | |
2692 | - (double)(ts.tv_usec - h3270.ds_ts.tv_usec)) / 1.0e6; | |
2690 | + tdiff = ((1.0e6 * (double)(ts.tv_sec - hSession->ds_ts.tv_sec)) + | |
2691 | + (double)(ts.tv_usec - hSession->ds_ts.tv_usec)) / 1.0e6; | |
2693 | 2692 | trace_dsn(hSession,"%c +%gs\n", direction, tdiff); |
2694 | 2693 | } |
2695 | 2694 | |
... | ... | @@ -2990,20 +2989,23 @@ net_linemode(void) |
2990 | 2989 | } |
2991 | 2990 | */ |
2992 | 2991 | |
2993 | -void | |
2994 | -net_charmode(void) | |
2992 | +void net_charmode(H3270 *hSession) | |
2995 | 2993 | { |
2996 | 2994 | if (!CONNECTED) |
2997 | 2995 | return; |
2998 | - if (!hisopts[TELOPT_ECHO]) { | |
2996 | + | |
2997 | + if (!hisopts[TELOPT_ECHO]) | |
2998 | + { | |
2999 | 2999 | do_opt[2] = TELOPT_ECHO; |
3000 | 3000 | net_rawout(do_opt, sizeof(do_opt)); |
3001 | - trace_dsn(&h3270,"SENT %s %s\n", cmd(DO), opt(TELOPT_ECHO)); | |
3001 | + trace_dsn(hSession,"SENT %s %s\n", cmd(DO), opt(TELOPT_ECHO)); | |
3002 | 3002 | } |
3003 | - if (!hisopts[TELOPT_SGA]) { | |
3003 | + | |
3004 | + if (!hisopts[TELOPT_SGA]) | |
3005 | + { | |
3004 | 3006 | do_opt[2] = TELOPT_SGA; |
3005 | 3007 | net_rawout(do_opt, sizeof(do_opt)); |
3006 | - trace_dsn(&h3270,"SENT %s %s\n", cmd(DO), opt(TELOPT_SGA)); | |
3008 | + trace_dsn(hSession,"SENT %s %s\n", cmd(DO), opt(TELOPT_SGA)); | |
3007 | 3009 | } |
3008 | 3010 | } |
3009 | 3011 | #endif /*]*/ |
... | ... | @@ -3014,14 +3016,13 @@ net_charmode(void) |
3014 | 3016 | * Send telnet break, which is used to implement 3270 ATTN. |
3015 | 3017 | * |
3016 | 3018 | */ |
3017 | -void | |
3018 | -net_break(void) | |
3019 | +void net_break(H3270 *hSession) | |
3019 | 3020 | { |
3020 | - static unsigned char buf[] = { IAC, BREAK }; | |
3021 | + static const unsigned char buf[] = { IAC, BREAK }; | |
3021 | 3022 | |
3022 | 3023 | /* I don't know if we should first send TELNET synch ? */ |
3023 | - net_rawout(&h3270, buf, sizeof(buf)); | |
3024 | - trace_dsn(&h3270,"SENT BREAK\n"); | |
3024 | + net_rawout(hSession, buf, sizeof(buf)); | |
3025 | + trace_dsn(hSession,"SENT BREAK\n"); | |
3025 | 3026 | } |
3026 | 3027 | |
3027 | 3028 | /* |
... | ... | @@ -3029,14 +3030,13 @@ net_break(void) |
3029 | 3030 | * Send telnet IP. |
3030 | 3031 | * |
3031 | 3032 | */ |
3032 | -void | |
3033 | -net_interrupt(void) | |
3033 | +void net_interrupt(H3270 *hSession) | |
3034 | 3034 | { |
3035 | - static unsigned char buf[] = { IAC, IP }; | |
3035 | + static const unsigned char buf[] = { IAC, IP }; | |
3036 | 3036 | |
3037 | 3037 | /* I don't know if we should first send TELNET synch ? */ |
3038 | - net_rawout(&h3270, buf, sizeof(buf)); | |
3039 | - trace_dsn(&h3270,"SENT IP\n"); | |
3038 | + net_rawout(hSession, buf, sizeof(buf)); | |
3039 | + trace_dsn(hSession,"SENT IP\n"); | |
3040 | 3040 | } |
3041 | 3041 | |
3042 | 3042 | /* |
... | ... | @@ -3045,36 +3045,39 @@ net_interrupt(void) |
3045 | 3045 | * |
3046 | 3046 | */ |
3047 | 3047 | #if defined(X3270_TN3270E) /*[*/ |
3048 | -void | |
3049 | -net_abort(void) | |
3048 | +void net_abort(H3270 *hSession) | |
3050 | 3049 | { |
3051 | - static unsigned char buf[] = { IAC, AO }; | |
3050 | + static const unsigned char buf[] = { IAC, AO }; | |
3052 | 3051 | |
3053 | - if (h3270.e_funcs & E_OPT(TN3270E_FUNC_SYSREQ)) { | |
3052 | + if (hSession->e_funcs & E_OPT(TN3270E_FUNC_SYSREQ)) | |
3053 | + { | |
3054 | 3054 | /* |
3055 | 3055 | * I'm not sure yet what to do here. Should the host respond |
3056 | 3056 | * to the AO by sending us SSCP-LU data (and putting us into |
3057 | 3057 | * SSCP-LU mode), or should we put ourselves in it? |
3058 | 3058 | * Time, and testers, will tell. |
3059 | 3059 | */ |
3060 | - switch (h3270.tn3270e_submode) { | |
3060 | + switch (hSession->tn3270e_submode) | |
3061 | + { | |
3061 | 3062 | case E_NONE: |
3062 | 3063 | case E_NVT: |
3063 | 3064 | break; |
3065 | + | |
3064 | 3066 | case E_SSCP: |
3065 | - net_rawout(&h3270, buf, sizeof(buf)); | |
3066 | - trace_dsn(&h3270,"SENT AO\n"); | |
3067 | - if (h3270.tn3270e_bound || | |
3068 | - !(h3270.e_funcs & E_OPT(TN3270E_FUNC_BIND_IMAGE))) { | |
3069 | - h3270.tn3270e_submode = E_3270; | |
3070 | - check_in3270(&h3270); | |
3067 | + net_rawout(hSession, buf, sizeof(buf)); | |
3068 | + trace_dsn(hSession,"SENT AO\n"); | |
3069 | + if (hSession->tn3270e_bound || !(hSession->e_funcs & E_OPT(TN3270E_FUNC_BIND_IMAGE))) | |
3070 | + { | |
3071 | + hSession->tn3270e_submode = E_3270; | |
3072 | + check_in3270(hSession); | |
3071 | 3073 | } |
3072 | 3074 | break; |
3075 | + | |
3073 | 3076 | case E_3270: |
3074 | - net_rawout(&h3270, buf, sizeof(buf)); | |
3075 | - trace_dsn(&h3270,"SENT AO\n"); | |
3076 | - h3270.tn3270e_submode = E_SSCP; | |
3077 | - check_in3270(&h3270); | |
3077 | + net_rawout(hSession, buf, sizeof(buf)); | |
3078 | + trace_dsn(hSession,"SENT AO\n"); | |
3079 | + hSession->tn3270e_submode = E_SSCP; | |
3080 | + check_in3270(hSession); | |
3078 | 3081 | break; |
3079 | 3082 | } |
3080 | 3083 | } | ... | ... |
src/lib3270/telnetc.h
... | ... | @@ -29,17 +29,17 @@ struct ctl_char { |
29 | 29 | char value[3]; |
30 | 30 | }; |
31 | 31 | |
32 | -LIB3270_INTERNAL void net_abort(void); | |
32 | +LIB3270_INTERNAL void net_abort(H3270 *hSession); | |
33 | 33 | LIB3270_INTERNAL Boolean net_add_dummy_tn3270e(void); |
34 | 34 | LIB3270_INTERNAL void net_add_eor(unsigned char *buf, int len); |
35 | -LIB3270_INTERNAL void net_break(void); | |
36 | -LIB3270_INTERNAL void net_charmode(void); | |
35 | +LIB3270_INTERNAL void net_break(H3270 *hSession); | |
36 | +LIB3270_INTERNAL void net_charmode(H3270 *hSession); | |
37 | 37 | LIB3270_INTERNAL int net_connect(H3270 *session, const char *, char *, Boolean, Boolean *, Boolean *); |
38 | 38 | LIB3270_INTERNAL void net_disconnect(H3270 *session); |
39 | 39 | LIB3270_INTERNAL void net_exception(H3270 *session); |
40 | 40 | // LIB3270_INTERNAL void net_hexansi_out(unsigned char *buf, int len); |
41 | 41 | LIB3270_INTERNAL void net_input(H3270 *session); |
42 | -LIB3270_INTERNAL void net_interrupt(void); | |
42 | +LIB3270_INTERNAL void net_interrupt(H3270 *hSession); | |
43 | 43 | // LIB3270_INTERNAL void net_linemode(void); |
44 | 44 | // LIB3270_INTERNAL struct ctl_char *net_linemode_chars(void); |
45 | 45 | LIB3270_INTERNAL void net_output(H3270 *hSession); | ... | ... |