Develop and Download Open Source Software

Browse Subversion Repository

Diff of /trunk/ttssh2/ttxssh/pkt.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2980 by maya, Wed Jun 6 14:10:12 2007 UTC revision 3215 by yutakapon, Wed Mar 4 11:40:44 2009 UTC
# Line 33  See LICENSE.TXT for the license. Line 33  See LICENSE.TXT for the license.
33    
34  #include "ttxssh.h"  #include "ttxssh.h"
35  #include "util.h"  #include "util.h"
36    #include "pkt.h"
37    
38  //#define READAMOUNT 60000  //#define READAMOUNT 60000
39  // 60000 -> 65536 へ拡張。SSH2ではwindow制御を行うため、SSH2のwindow sizeと  // 60000 -> 65536 へ拡張。SSH2ではwindow制御を行うため、SSH2のwindow sizeと
40  // 合わせておく必要がある。(2004.10.17 yutaka)  // 合わせておく必要がある。(2004.10.17 yutaka)
41  #define READAMOUNT 65536  //#define READAMOUNT 65536
42    // 65536 -> 131072 へ拡張。(2007.10.29 maya)
43    #define READAMOUNT CHAN_SES_WINDOW_DEFAULT
44    
45  void PKT_init(PTInstVar pvar)  void PKT_init(PTInstVar pvar)
46  {  {
# Line 58  static int recv_data(PTInstVar pvar, uns Line 61  static int recv_data(PTInstVar pvar, uns
61          /* Shuffle data to the start of the buffer */          /* Shuffle data to the start of the buffer */
62          if (pvar->pkt_state.datastart != 0) {          if (pvar->pkt_state.datastart != 0) {
63                  memmove(pvar->pkt_state.buf,                  memmove(pvar->pkt_state.buf,
64                                  pvar->pkt_state.buf + pvar->pkt_state.datastart,                          pvar->pkt_state.buf + pvar->pkt_state.datastart,
65                                  pvar->pkt_state.datalen);                          pvar->pkt_state.datalen);
66                  pvar->pkt_state.datastart = 0;                  pvar->pkt_state.datastart = 0;
67          }          }
68    
69          buf_ensure_size(&pvar->pkt_state.buf, &pvar->pkt_state.buflen,          buf_ensure_size(&pvar->pkt_state.buf, &pvar->pkt_state.buflen,
70                                          up_to_amount);                          up_to_amount);
71    
72          _ASSERT(pvar->pkt_state.buf != NULL);          _ASSERT(pvar->pkt_state.buf != NULL);
73    
74          amount_read = (pvar->Precv) (pvar->socket,          amount_read = (pvar->Precv) (pvar->socket,
75                                                                   pvar->pkt_state.buf +                                       pvar->pkt_state.buf +
76                                                                   pvar->pkt_state.datalen,                                       pvar->pkt_state.datalen,
77                                                                   up_to_amount - pvar->pkt_state.datalen,                                       up_to_amount - pvar->pkt_state.datalen,
78                                                                   0);                                       0);
79    
80          if (amount_read > 0) {          if (amount_read > 0) {
81                  /* Update seen_newline if necessary */                  /* Update seen_newline if necessary */
82                  if (!pvar->pkt_state.seen_server_ID                  if (!pvar->pkt_state.seen_server_ID
83                          && !pvar->pkt_state.seen_newline) {                   && !pvar->pkt_state.seen_newline) {
84                          int i;                          int i;
85    
86                          for (i = 0; i < amount_read; i++) {                          for (i = 0; i < amount_read; i++) {
87                                  if (pvar->pkt_state.buf[pvar->pkt_state.datalen + i] ==                                  if (pvar->pkt_state.buf[pvar->pkt_state.datalen + i] ==
88                                          '\n') {                                      '\n') {
89                                          pvar->pkt_state.seen_newline = 1;                                          pvar->pkt_state.seen_newline = 1;
90                                  }                                  }
91                          }                          }
# Line 106  static int recv_line_data(PTInstVar pvar Line 109  static int recv_line_data(PTInstVar pvar
109          /* Shuffle data to the start of the buffer */          /* Shuffle data to the start of the buffer */
110          if (pvar->pkt_state.datastart != 0) {          if (pvar->pkt_state.datastart != 0) {
111                  memmove(pvar->pkt_state.buf,                  memmove(pvar->pkt_state.buf,
112                                  pvar->pkt_state.buf + pvar->pkt_state.datastart,                          pvar->pkt_state.buf + pvar->pkt_state.datastart,
113                                  pvar->pkt_state.datalen);                          pvar->pkt_state.datalen);
114                  pvar->pkt_state.datastart = 0;                  pvar->pkt_state.datastart = 0;
115          }          }
116    
117          buf_ensure_size(&pvar->pkt_state.buf, &pvar->pkt_state.buflen,          buf_ensure_size(&pvar->pkt_state.buf, &pvar->pkt_state.buflen,
118                                          up_to_amount);                          up_to_amount);
119    
120          for (i = 0 ; i < (int)up_to_amount ; i++) {          for (i = 0 ; i < (int)up_to_amount ; i++) {
121                  amount_read = (pvar->Precv) (pvar->socket,                  amount_read = (pvar->Precv) (pvar->socket,
122                                                                          &buf[i],                                               &buf[i], 1, 0);
                                                                         1,  
                                                                         0);  
123                  if (amount_read != 1) {                  if (amount_read != 1) {
124                          return 0; // error                          return 0; // error
125                  }                  }
# Line 150  int PKT_recv(PTInstVar pvar, char FAR * Line 151  int PKT_recv(PTInstVar pvar, char FAR *
151    
152          while (SSH_is_any_payload(pvar) ? buflen > 0 : !connection_closed) {          while (SSH_is_any_payload(pvar) ? buflen > 0 : !connection_closed) {
153                  if (SSH_is_any_payload(pvar)) {                  if (SSH_is_any_payload(pvar)) {
154                          /* ssh.c has some session data for us to give to Teraterm. */                          /* ssh.c has some session data for us to give to Tera Term. */
155                          int grabbed = SSH_extract_payload(pvar, buf, buflen);                          int grabbed = SSH_extract_payload(pvar, buf, buflen);
156    
157                          amount_in_buf += grabbed;                          amount_in_buf += grabbed;
# Line 158  int PKT_recv(PTInstVar pvar, char FAR * Line 159  int PKT_recv(PTInstVar pvar, char FAR *
159                          buflen -= grabbed;                          buflen -= grabbed;
160    
161                  } else if (!pvar->pkt_state.seen_server_ID &&                  } else if (!pvar->pkt_state.seen_server_ID &&
162                                     (pvar->pkt_state.seen_newline                             (pvar->pkt_state.seen_newline
163                                          || pvar->pkt_state.datalen >= 255)) {                              || pvar->pkt_state.datalen >= 255)) {
164                          /* We're looking for the initial ID string and either we've seen the                          /* We're looking for the initial ID string and either we've seen the
165                             terminating newline, or we've exceeded the limit at which we should see                             terminating newline, or we've exceeded the limit at which we should see
166                             a newline. */                             a newline. */
167                          unsigned int i;                          unsigned int i;
168    
169                          for (i = 0;                          for (i = 0;
170                                   pvar->pkt_state.buf[i] != '\n'                               pvar->pkt_state.buf[i] != '\n'
171                                   && i < pvar->pkt_state.datalen; i++) {                               && i < pvar->pkt_state.datalen; i++) {
172                          }                          }
173                          if (pvar->pkt_state.buf[i] == '\n') {                          if (pvar->pkt_state.buf[i] == '\n') {
174                                  i++;                                  i++;
# Line 184  int PKT_recv(PTInstVar pvar, char FAR * Line 185  int PKT_recv(PTInstVar pvar, char FAR *
185                                          SSH2_send_kexinit(pvar);                                          SSH2_send_kexinit(pvar);
186                                  }                                  }
187    
188                            } else {
189                                    // reset flag to re-read server ID (2008.1.24 yutaka)
190                                    pvar->pkt_state.seen_newline = 0;
191    
192                          }                          }
193    
194                          pvar->pkt_state.datastart += i;                          pvar->pkt_state.datastart += i;
195                          pvar->pkt_state.datalen -= i;                          pvar->pkt_state.datalen -= i;
196    
197                  } else if (pvar->pkt_state.seen_server_ID                  } else if (pvar->pkt_state.seen_server_ID
198                                     && pvar->pkt_state.datalen >=                             && pvar->pkt_state.datalen >=
199                                     (unsigned int) SSH_get_min_packet_size(pvar)) {                             (unsigned int) SSH_get_min_packet_size(pvar)) {
200                          char FAR *data =                          char FAR *data =
201                                  pvar->pkt_state.buf + pvar->pkt_state.datastart;                                  pvar->pkt_state.buf + pvar->pkt_state.datastart;
202                          uint32 padding;                          uint32 padding;
# Line 236  int PKT_recv(PTInstVar pvar, char FAR * Line 241  int PKT_recv(PTInstVar pvar, char FAR *
241                                  pvar->pkt_state.datastart += total_packet_size;                                  pvar->pkt_state.datastart += total_packet_size;
242                                  pvar->pkt_state.datalen -= total_packet_size;                                  pvar->pkt_state.datalen -= total_packet_size;
243    
244                          } else if (total_packet_size > 4 * 1024 * 1024) {                          } else if (total_packet_size > PACKET_MAX_SIZE) {
245                                  // 4MBを超える巨大なパケットが届いたら、異常終了する。                                  // 4MBを超える巨大なパケットが届いたら、異常終了する。
246                                  // 実際にはデータ化けで復号失敗時に、誤認識することが多い。                                  // 実際にはデータ化けで復号失敗時に、誤認識することが多い。
247  #ifndef NO_I18N                                  UTIL_get_lang_msg("MSG_PKT_OVERSIZED_ERROR", pvar,
248                                  strcpy(pvar->ts->UIMsg, "Oversized packet received from server; connection will close.");                                                                    "Oversized packet received from server; connection will close.");
                                 UTIL_get_lang_msg("MSG_PKT_OVERSIZED_ERROR", pvar);  
249                                  notify_fatal_error(pvar, pvar->ts->UIMsg);                                  notify_fatal_error(pvar, pvar->ts->UIMsg);
 #else  
                                 notify_fatal_error(pvar,  
                                                                    "Oversized packet received from server; connection will close.");  
 #endif  
250                          } else {                          } else {
251                                  int amount_read =                                  int amount_read =
252                                          recv_data(pvar, max(total_packet_size, READAMOUNT));                                          recv_data(pvar, max(total_packet_size, READAMOUNT));
# Line 296  int PKT_recv(PTInstVar pvar, char FAR * Line 296  int PKT_recv(PTInstVar pvar, char FAR *
296    
297          if (SSH_is_any_payload(pvar)) {          if (SSH_is_any_payload(pvar)) {
298                  PostMessage(pvar->NotificationWindow, WM_USER_COMMNOTIFY,                  PostMessage(pvar->NotificationWindow, WM_USER_COMMNOTIFY,
299                                          pvar->socket, MAKELPARAM(FD_READ, 0));                              pvar->socket, MAKELPARAM(FD_READ, 0));
300          }          }
301    
302          return amount_in_buf;          return amount_in_buf;
# Line 306  void PKT_end(PTInstVar pvar) Line 306  void PKT_end(PTInstVar pvar)
306  {  {
307          buf_destroy(&pvar->pkt_state.buf, &pvar->pkt_state.buflen);          buf_destroy(&pvar->pkt_state.buf, &pvar->pkt_state.buflen);
308  }  }
   
 /*  
  * $Log: not supported by cvs2svn $  
  * Revision 1.5  2006/12/05 09:20:36  maya  
  * 表示メッセージの読み込み対応  
  *  
  * Revision 1.4  2006/11/23 02:19:30  maya  
  * 表示メッセージを言語ファイルから読み込みむコードの作成を開始した。  
  *  
  * Revision 1.3  2006/10/29 17:15:47  yutakapon  
  * DEBUG_PRINT_TO_FILEマクロを追加。  
  *  
  * Revision 1.2  2004/12/19 15:39:58  yutakakn  
  * CVS LogIDの追加  
  *  
  */  

Legend:
Removed from v.2980  
changed lines
  Added in v.3215

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26