58 |
/* Shuffle data to the start of the buffer */ |
/* Shuffle data to the start of the buffer */ |
59 |
if (pvar->pkt_state.datastart != 0) { |
if (pvar->pkt_state.datastart != 0) { |
60 |
memmove(pvar->pkt_state.buf, |
memmove(pvar->pkt_state.buf, |
61 |
pvar->pkt_state.buf + pvar->pkt_state.datastart, |
pvar->pkt_state.buf + pvar->pkt_state.datastart, |
62 |
pvar->pkt_state.datalen); |
pvar->pkt_state.datalen); |
63 |
pvar->pkt_state.datastart = 0; |
pvar->pkt_state.datastart = 0; |
64 |
} |
} |
65 |
|
|
66 |
buf_ensure_size(&pvar->pkt_state.buf, &pvar->pkt_state.buflen, |
buf_ensure_size(&pvar->pkt_state.buf, &pvar->pkt_state.buflen, |
67 |
up_to_amount); |
up_to_amount); |
68 |
|
|
69 |
_ASSERT(pvar->pkt_state.buf != NULL); |
_ASSERT(pvar->pkt_state.buf != NULL); |
70 |
|
|
71 |
amount_read = (pvar->Precv) (pvar->socket, |
amount_read = (pvar->Precv) (pvar->socket, |
72 |
pvar->pkt_state.buf + |
pvar->pkt_state.buf + |
73 |
pvar->pkt_state.datalen, |
pvar->pkt_state.datalen, |
74 |
up_to_amount - pvar->pkt_state.datalen, |
up_to_amount - pvar->pkt_state.datalen, |
75 |
0); |
0); |
76 |
|
|
77 |
if (amount_read > 0) { |
if (amount_read > 0) { |
78 |
/* Update seen_newline if necessary */ |
/* Update seen_newline if necessary */ |
79 |
if (!pvar->pkt_state.seen_server_ID |
if (!pvar->pkt_state.seen_server_ID |
80 |
&& !pvar->pkt_state.seen_newline) { |
&& !pvar->pkt_state.seen_newline) { |
81 |
int i; |
int i; |
82 |
|
|
83 |
for (i = 0; i < amount_read; i++) { |
for (i = 0; i < amount_read; i++) { |
84 |
if (pvar->pkt_state.buf[pvar->pkt_state.datalen + i] == |
if (pvar->pkt_state.buf[pvar->pkt_state.datalen + i] == |
85 |
'\n') { |
'\n') { |
86 |
pvar->pkt_state.seen_newline = 1; |
pvar->pkt_state.seen_newline = 1; |
87 |
} |
} |
88 |
} |
} |
106 |
/* Shuffle data to the start of the buffer */ |
/* Shuffle data to the start of the buffer */ |
107 |
if (pvar->pkt_state.datastart != 0) { |
if (pvar->pkt_state.datastart != 0) { |
108 |
memmove(pvar->pkt_state.buf, |
memmove(pvar->pkt_state.buf, |
109 |
pvar->pkt_state.buf + pvar->pkt_state.datastart, |
pvar->pkt_state.buf + pvar->pkt_state.datastart, |
110 |
pvar->pkt_state.datalen); |
pvar->pkt_state.datalen); |
111 |
pvar->pkt_state.datastart = 0; |
pvar->pkt_state.datastart = 0; |
112 |
} |
} |
113 |
|
|
114 |
buf_ensure_size(&pvar->pkt_state.buf, &pvar->pkt_state.buflen, |
buf_ensure_size(&pvar->pkt_state.buf, &pvar->pkt_state.buflen, |
115 |
up_to_amount); |
up_to_amount); |
116 |
|
|
117 |
for (i = 0 ; i < (int)up_to_amount ; i++) { |
for (i = 0 ; i < (int)up_to_amount ; i++) { |
118 |
amount_read = (pvar->Precv) (pvar->socket, |
amount_read = (pvar->Precv) (pvar->socket, |
119 |
&buf[i], |
&buf[i], 1, 0); |
|
1, |
|
|
0); |
|
120 |
if (amount_read != 1) { |
if (amount_read != 1) { |
121 |
return 0; // error |
return 0; // error |
122 |
} |
} |
156 |
buflen -= grabbed; |
buflen -= grabbed; |
157 |
|
|
158 |
} else if (!pvar->pkt_state.seen_server_ID && |
} else if (!pvar->pkt_state.seen_server_ID && |
159 |
(pvar->pkt_state.seen_newline |
(pvar->pkt_state.seen_newline |
160 |
|| pvar->pkt_state.datalen >= 255)) { |
|| pvar->pkt_state.datalen >= 255)) { |
161 |
/* 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 |
162 |
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 |
163 |
a newline. */ |
a newline. */ |
164 |
unsigned int i; |
unsigned int i; |
165 |
|
|
166 |
for (i = 0; |
for (i = 0; |
167 |
pvar->pkt_state.buf[i] != '\n' |
pvar->pkt_state.buf[i] != '\n' |
168 |
&& i < pvar->pkt_state.datalen; i++) { |
&& i < pvar->pkt_state.datalen; i++) { |
169 |
} |
} |
170 |
if (pvar->pkt_state.buf[i] == '\n') { |
if (pvar->pkt_state.buf[i] == '\n') { |
171 |
i++; |
i++; |
188 |
pvar->pkt_state.datalen -= i; |
pvar->pkt_state.datalen -= i; |
189 |
|
|
190 |
} else if (pvar->pkt_state.seen_server_ID |
} else if (pvar->pkt_state.seen_server_ID |
191 |
&& pvar->pkt_state.datalen >= |
&& pvar->pkt_state.datalen >= |
192 |
(unsigned int) SSH_get_min_packet_size(pvar)) { |
(unsigned int) SSH_get_min_packet_size(pvar)) { |
193 |
char FAR *data = |
char FAR *data = |
194 |
pvar->pkt_state.buf + pvar->pkt_state.datastart; |
pvar->pkt_state.buf + pvar->pkt_state.datastart; |
195 |
uint32 padding; |
uint32 padding; |
289 |
|
|
290 |
if (SSH_is_any_payload(pvar)) { |
if (SSH_is_any_payload(pvar)) { |
291 |
PostMessage(pvar->NotificationWindow, WM_USER_COMMNOTIFY, |
PostMessage(pvar->NotificationWindow, WM_USER_COMMNOTIFY, |
292 |
pvar->socket, MAKELPARAM(FD_READ, 0)); |
pvar->socket, MAKELPARAM(FD_READ, 0)); |
293 |
} |
} |
294 |
|
|
295 |
return amount_in_buf; |
return amount_in_buf; |