version 1.25, 2002/03/08 06:10:16 |
version 1.26, 2002/03/11 03:18:49 |
|
|
break; |
break; |
case SSH2_FXP_DATA: |
case SSH2_FXP_DATA: |
data = buffer_get_string(&msg, &len); |
data = buffer_get_string(&msg, &len); |
debug3("Received data %llu -> %llu", req->offset, |
debug3("Received data %llu -> %llu", |
req->offset + len - 1); |
(unsigned long long)req->offset, |
|
(unsigned long long)req->offset + len - 1); |
if (len > req->len) |
if (len > req->len) |
fatal("Received more data than asked for " |
fatal("Received more data than asked for " |
"%d > %d", len, req->len); |
"%d > %d", len, req->len); |
|
|
} else { |
} else { |
/* Resend the request for the missing data */ |
/* Resend the request for the missing data */ |
debug3("Short data block, re-requesting " |
debug3("Short data block, re-requesting " |
"%llu -> %llu (%2d)", req->offset + len, |
"%llu -> %llu (%2d)", |
req->offset + req->len - 1, num_req); |
(unsigned long long)req->offset + len, |
|
(unsigned long long)req->offset + req->len - 1, |
|
num_req); |
req->id = conn->msg_id++; |
req->id = conn->msg_id++; |
req->len -= len; |
req->len -= len; |
req->offset += len; |
req->offset += len; |
|
|
/* Only one request at a time |
/* Only one request at a time |
* after the expected EOF */ |
* after the expected EOF */ |
debug3("Finish at %llu (%2d)", |
debug3("Finish at %llu (%2d)", |
offset, num_req); |
(unsigned long long)offset, |
|
num_req); |
max_req = 1; |
max_req = 1; |
} |
} |
else if (max_req < conn->num_requests + 1) { |
else if (max_req < conn->num_requests + 1) { |
|
|
buffer_put_string(&msg, data, len); |
buffer_put_string(&msg, data, len); |
send_msg(conn->fd_out, &msg); |
send_msg(conn->fd_out, &msg); |
debug3("Sent message SSH2_FXP_WRITE I:%d O:%llu S:%u", |
debug3("Sent message SSH2_FXP_WRITE I:%d O:%llu S:%u", |
id, (u_int64_t)offset, len); |
id, (unsigned long long)offset, len); |
} else if (TAILQ_FIRST(&acks) == NULL) |
} else if (TAILQ_FIRST(&acks) == NULL) |
break; |
break; |
|
|
|
|
goto done; |
goto done; |
} |
} |
debug3("In write loop, ack for %u %d bytes at %llu", |
debug3("In write loop, ack for %u %d bytes at %llu", |
ack->id, ack->len, ack->offset); |
ack->id, ack->len, (unsigned long long)ack->offset); |
++ackid; |
++ackid; |
free(ack); |
free(ack); |
} |
} |