| 2848 |
unsigned char FAR *outmsg = |
unsigned char FAR *outmsg = |
| 2849 |
begin_send_packet(pvar, SSH_CMSG_WINDOW_SIZE, 16); |
begin_send_packet(pvar, SSH_CMSG_WINDOW_SIZE, 16); |
| 2850 |
|
|
| 2851 |
set_uint32(outmsg, rows); |
set_uint32(outmsg, rows); // window height (characters) |
| 2852 |
set_uint32(outmsg + 4, cols); |
set_uint32(outmsg + 4, cols); // window width (characters) |
| 2853 |
set_uint32(outmsg + 8, x); |
set_uint32(outmsg + 8, x); // window width (pixels) |
| 2854 |
set_uint32(outmsg + 12, y); |
set_uint32(outmsg + 12, y); // window height (pixels) |
| 2855 |
finish_send_packet(pvar); |
finish_send_packet(pvar); |
| 2856 |
|
logprintf(pvar, LOG_LEVEL_VERBOSE, __FUNCTION__ ": sending SSH_CMSG_WINDOW_SIZE. " |
| 2857 |
|
"cols: %d, rows: %d, x: %d, y: %d", cols, rows, x, y); |
| 2858 |
} |
} |
| 2859 |
|
|
| 2860 |
} else if (SSHv2(pvar)) { // ターミナルサイズ変更通知の追加 (2005.1.4 yutaka) |
} else if (SSHv2(pvar)) { |
| 2861 |
// SSH2かどうかのチェックも行う。(2005.1.5 yutaka) |
// ターミナルサイズ変更通知の追加 (2005.1.4 yutaka) |
| 2862 |
|
// SSH2かどうかのチェックも行う。(2005.1.5 yutaka) |
| 2863 |
buffer_t *msg; |
buffer_t *msg; |
| 2864 |
char *s; |
char *req_type = "window-change"; |
| 2865 |
unsigned char *outmsg; |
unsigned char *outmsg; |
| 2866 |
int len; |
int len; |
| 2867 |
Channel_t *c; |
Channel_t *c; |
| 2876 |
return; |
return; |
| 2877 |
} |
} |
| 2878 |
buffer_put_int(msg, c->remote_id); |
buffer_put_int(msg, c->remote_id); |
| 2879 |
s = "window-change"; |
buffer_put_string(msg, req_type, strlen(req_type)); |
| 2880 |
buffer_put_string(msg, s, strlen(s)); |
buffer_put_char(msg, 0); // want_reply |
| 2881 |
buffer_put_char(msg, 0); // wantconfirm |
buffer_put_int(msg, cols); // columns |
| 2882 |
buffer_put_int(msg, pvar->ssh_state.win_cols); // columns |
buffer_put_int(msg, rows); // lines |
| 2883 |
buffer_put_int(msg, pvar->ssh_state.win_rows); // lines |
buffer_put_int(msg, x); // window width (pixel): |
| 2884 |
buffer_put_int(msg, x); // window width (pixel): |
buffer_put_int(msg, y); // window height (pixel): |
|
buffer_put_int(msg, y); // window height (pixel): |
|
| 2885 |
len = buffer_len(msg); |
len = buffer_len(msg); |
| 2886 |
outmsg = begin_send_packet(pvar, SSH2_MSG_CHANNEL_REQUEST, len); |
outmsg = begin_send_packet(pvar, SSH2_MSG_CHANNEL_REQUEST, len); |
| 2887 |
memcpy(outmsg, buffer_ptr(msg), len); |
memcpy(outmsg, buffer_ptr(msg), len); |
| 2888 |
finish_send_packet(pvar); |
finish_send_packet(pvar); |
| 2889 |
buffer_free(msg); |
buffer_free(msg); |
| 2890 |
|
|
| 2891 |
notify_verbose_message(pvar, "SSH2_MSG_CHANNEL_REQUEST was sent at SSH_notify_win_size().", LOG_LEVEL_VERBOSE); |
logprintf(pvar, LOG_LEVEL_VERBOSE, __FUNCTION__ ": sending SSH2_MSG_CHANNEL_REQUEST. " |
| 2892 |
|
"local: %d, remote: %d, request-type: %s, cols: %d, rows: %d, x: %d, y: %d", |
| 2893 |
|
c->self_id, c->remote_id, req_type, cols, rows, x, y); |
| 2894 |
|
|
| 2895 |
} else { |
} else { |
| 2896 |
// SSHでない場合は何もしない。 |
// SSHでない場合は何もしない。 |
|
|
|
| 2897 |
} |
} |
|
|
|
| 2898 |
} |
} |
| 2899 |
|
|
| 2900 |
// ブレーク信号を送る。 |
// ブレーク信号を送る -- RFC 4335 |
| 2901 |
// OpenSSH の"~B"に相当する。ただし、SSH2のみ。 |
// OpenSSH の"~B"に相当する。 |
| 2902 |
// (2010.9.27 yutaka) |
// (2010.9.27 yutaka) |
| 2903 |
int SSH_notify_break_signal(PTInstVar pvar) |
int SSH_notify_break_signal(PTInstVar pvar) |
| 2904 |
{ |
{ |
| 2905 |
int ret = 0; |
int ret = 0; |
| 2906 |
|
|
| 2907 |
if (SSHv1(pvar)) { |
if (SSHv2(pvar)) { // SSH2 のみ対応 |
|
// 何もしない。 |
|
|
|
|
|
} else if (SSHv2(pvar)) { |
|
| 2908 |
buffer_t *msg; |
buffer_t *msg; |
| 2909 |
char *s; |
char *req_type = "break"; |
| 2910 |
unsigned char *outmsg; |
unsigned char *outmsg; |
| 2911 |
int len; |
int len; |
| 2912 |
Channel_t *c; |
Channel_t *c; |
| 2920 |
goto error; |
goto error; |
| 2921 |
} |
} |
| 2922 |
buffer_put_int(msg, c->remote_id); |
buffer_put_int(msg, c->remote_id); |
| 2923 |
s = "break"; |
buffer_put_string(msg, req_type, strlen(req_type)); |
| 2924 |
buffer_put_string(msg, s, strlen(s)); |
buffer_put_char(msg, 0); // want_reply |
| 2925 |
buffer_put_char(msg, 0); // wantconfirm |
buffer_put_int(msg, 1000); // break-length (msec) |
|
buffer_put_int(msg, 1000); |
|
| 2926 |
len = buffer_len(msg); |
len = buffer_len(msg); |
| 2927 |
outmsg = begin_send_packet(pvar, SSH2_MSG_CHANNEL_REQUEST, len); |
outmsg = begin_send_packet(pvar, SSH2_MSG_CHANNEL_REQUEST, len); |
| 2928 |
memcpy(outmsg, buffer_ptr(msg), len); |
memcpy(outmsg, buffer_ptr(msg), len); |
| 2929 |
finish_send_packet(pvar); |
finish_send_packet(pvar); |
| 2930 |
buffer_free(msg); |
buffer_free(msg); |
| 2931 |
|
|
| 2932 |
notify_verbose_message(pvar, "SSH2_MSG_CHANNEL_REQUEST was sent at SSH_notify_break_signal().", LOG_LEVEL_VERBOSE); |
logprintf(pvar, LOG_LEVEL_VERBOSE, __FUNCTION__ ": sending SSH2_MSG_CHANNEL_REQUEST. " |
| 2933 |
|
"local: %d, remote: %d, request-type: %s, break-length: %d", |
| 2934 |
|
c->self_id, c->remote_id, req_type, 1000); |
| 2935 |
|
|
| 2936 |
ret = 1; |
ret = 1; |
|
|
|
|
} else { |
|
|
// SSHでない場合は何もしない。 |
|
|
|
|
| 2937 |
} |
} |
| 2938 |
|
|
| 2939 |
error: |
error: |
| 3676 |
} else { |
} else { |
| 3677 |
// SSH2: X11 port-forwarding (2005.7.2 yutaka) |
// SSH2: X11 port-forwarding (2005.7.2 yutaka) |
| 3678 |
buffer_t *msg; |
buffer_t *msg; |
| 3679 |
char *s; |
char *req_type = "x11-req"; |
| 3680 |
unsigned char *outmsg; |
unsigned char *outmsg; |
| 3681 |
int len; |
int len; |
| 3682 |
Channel_t *c; |
Channel_t *c; |
| 3705 |
newdata[newlen - 1] = '\0'; |
newdata[newlen - 1] = '\0'; |
| 3706 |
|
|
| 3707 |
buffer_put_int(msg, c->remote_id); |
buffer_put_int(msg, c->remote_id); |
| 3708 |
s = "x11-req"; |
buffer_put_string(msg, req_type, strlen(req_type)); // service name |
| 3709 |
buffer_put_string(msg, s, strlen(s)); // service name |
buffer_put_char(msg, 0); // want_reply (false) |
| 3710 |
buffer_put_char(msg, 0); // want confirm (false) |
buffer_put_char(msg, 0); // single connection |
|
buffer_put_char(msg, 0); // XXX bool single connection |
|
| 3711 |
|
|
| 3712 |
s = auth_protocol; // MIT-MAGIC-COOKIE-1 |
buffer_put_string(msg, auth_protocol, strlen(auth_protocol)); // protocol ("MIT-MAGIC-COOKIE-1") |
| 3713 |
buffer_put_string(msg, s, strlen(s)); |
buffer_put_string(msg, newdata, strlen(newdata)); // cookie |
|
s = newdata; |
|
|
buffer_put_string(msg, s, strlen(s)); |
|
| 3714 |
|
|
| 3715 |
buffer_put_int(msg, screen_num); |
buffer_put_int(msg, screen_num); |
| 3716 |
|
|
| 3720 |
finish_send_packet(pvar); |
finish_send_packet(pvar); |
| 3721 |
buffer_free(msg); |
buffer_free(msg); |
| 3722 |
|
|
| 3723 |
notify_verbose_message(pvar, "SSH2_MSG_CHANNEL_REQUEST was sent at SSH_request_X11_forwarding().", LOG_LEVEL_VERBOSE); |
logprintf(pvar, LOG_LEVEL_VERBOSE, __FUNCTION__ ": sending SSH2_MSG_CHANNEL_REQUEST. " |
| 3724 |
|
"local: %d, remote: %d, request-type: %s, proto: %s, cookie: %s, screen: %d", |
| 3725 |
|
c->self_id, c->remote_id, req_type, auth_protocol, newdata, screen_num); |
| 3726 |
|
|
| 3727 |
free(newdata); |
free(newdata); |
| 3728 |
} |
} |
| 7415 |
BOOL send_pty_request(PTInstVar pvar, Channel_t *c) |
BOOL send_pty_request(PTInstVar pvar, Channel_t *c) |
| 7416 |
{ |
{ |
| 7417 |
buffer_t *msg, *ttymsg; |
buffer_t *msg, *ttymsg; |
| 7418 |
char *s = "pty-req"; // pseudo terminalのリクエスト |
char *req_type = "pty-req"; // pseudo terminalのリクエスト |
| 7419 |
unsigned char *outmsg; |
unsigned char *outmsg; |
| 7420 |
int len, x, y; |
int len, x, y; |
| 7421 |
#ifdef DONT_WANTCONFIRM |
#ifdef DONT_WANTCONFIRM |
| 7422 |
int wantconfirm = 0; // false |
int want_reply = 0; // false |
| 7423 |
#else |
#else |
| 7424 |
int wantconfirm = 1; // true |
int want_reply = 1; // true |
| 7425 |
#endif |
#endif |
| 7426 |
|
|
| 7427 |
// pty open |
// pty open |
| 7438 |
} |
} |
| 7439 |
|
|
| 7440 |
buffer_put_int(msg, c->remote_id); |
buffer_put_int(msg, c->remote_id); |
| 7441 |
buffer_put_string(msg, s, strlen(s)); |
buffer_put_string(msg, req_type, strlen(req_type)); |
| 7442 |
buffer_put_char(msg, wantconfirm); // wantconfirm (disableに変更 2005/3/28 yutaka) |
buffer_put_char(msg, want_reply); // want_reply (disableに変更 2005/3/28 yutaka) |
| 7443 |
|
|
| 7444 |
s = pvar->ts->TermType; // TERM |
buffer_put_string(msg, pvar->ts->TermType, strlen(pvar->ts->TermType)); |
|
buffer_put_string(msg, s, strlen(s)); |
|
| 7445 |
buffer_put_int(msg, pvar->ssh_state.win_cols); // columns |
buffer_put_int(msg, pvar->ssh_state.win_cols); // columns |
| 7446 |
buffer_put_int(msg, pvar->ssh_state.win_rows); // lines |
buffer_put_int(msg, pvar->ssh_state.win_rows); // lines |
| 7447 |
get_window_pixel_size(pvar, &x, &y); |
get_window_pixel_size(pvar, &x, &y); |
| 7488 |
buffer_free(ttymsg); |
buffer_free(ttymsg); |
| 7489 |
|
|
| 7490 |
notify_verbose_message(pvar, "SSH2_MSG_CHANNEL_REQUEST was sent at send_pty_request().", LOG_LEVEL_VERBOSE); |
notify_verbose_message(pvar, "SSH2_MSG_CHANNEL_REQUEST was sent at send_pty_request().", LOG_LEVEL_VERBOSE); |
| 7491 |
|
logprintf(pvar, LOG_LEVEL_VERBOSE, __FUNCTION__ ": sending SSH2_MSG_CHANNEL_REQUEST. " |
| 7492 |
|
"local: %d, remote: %d, request-type: %s, " |
| 7493 |
|
"term: %s, cols: %d, rows: %d, x: %d, y: %d, " |
| 7494 |
|
"out-speed: %d, in-speed: %d, verase: %s, onlcr: %s", |
| 7495 |
|
c->self_id, c->remote_id, req_type, pvar->ts->TermType, |
| 7496 |
|
pvar->ssh_state.win_cols, pvar->ssh_state.win_rows, x, y, |
| 7497 |
|
9600, 9600, (pvar->ts->BSKey==IdBS)?"^h":"^?", (pvar->ts->CRReceive==IdBS)?"on":"off"); |
| 7498 |
|
|
| 7499 |
pvar->session_nego_status = 2; |
pvar->session_nego_status = 2; |
| 7500 |
|
|
| 7501 |
if (wantconfirm == 0) { |
if (want_reply == 0) { |
| 7502 |
handle_SSH2_channel_success(pvar); |
handle_SSH2_channel_success(pvar); |
| 7503 |
} |
} |
| 7504 |
|
|