version 1.79, 2008/01/19 22:04:57 |
version 1.80, 2008/01/21 19:20:17 |
|
|
do_upload(struct sftp_conn *conn, char *local_path, char *remote_path, |
do_upload(struct sftp_conn *conn, char *local_path, char *remote_path, |
int pflag) |
int pflag) |
{ |
{ |
int local_fd, status; |
int local_fd; |
|
int status = SSH2_FX_OK; |
u_int handle_len, id, type; |
u_int handle_len, id, type; |
off_t offset; |
off_t offset; |
char *handle, *data; |
char *handle, *data; |
|
|
if (handle == NULL) { |
if (handle == NULL) { |
close(local_fd); |
close(local_fd); |
buffer_free(&msg); |
buffer_free(&msg); |
return(-1); |
return -1; |
} |
} |
|
|
startid = ackid = id + 1; |
startid = ackid = id + 1; |
|
|
* Simulate an EOF on interrupt, allowing ACKs from the |
* Simulate an EOF on interrupt, allowing ACKs from the |
* server to drain. |
* server to drain. |
*/ |
*/ |
if (interrupted) |
if (interrupted || status != SSH2_FX_OK) |
len = 0; |
len = 0; |
else do |
else do |
len = read(local_fd, data, conn->transfer_buflen); |
len = read(local_fd, data, conn->transfer_buflen); |
|
|
if (ack == NULL) |
if (ack == NULL) |
fatal("Can't find request for ID %u", r_id); |
fatal("Can't find request for ID %u", r_id); |
TAILQ_REMOVE(&acks, ack, tq); |
TAILQ_REMOVE(&acks, ack, tq); |
|
|
if (status != SSH2_FX_OK) { |
|
error("Couldn't write to remote file \"%s\": %s", |
|
remote_path, fx2txt(status)); |
|
if (showprogress) |
|
stop_progress_meter(); |
|
do_close(conn, handle, handle_len); |
|
close(local_fd); |
|
xfree(data); |
|
xfree(ack); |
|
status = -1; |
|
goto done; |
|
} |
|
debug3("In write loop, ack for %u %u bytes at %lld", |
debug3("In write loop, ack for %u %u bytes at %lld", |
ack->id, ack->len, (long long)ack->offset); |
ack->id, ack->len, (long long)ack->offset); |
++ackid; |
++ackid; |
|
|
if (offset < 0) |
if (offset < 0) |
fatal("%s: offset < 0", __func__); |
fatal("%s: offset < 0", __func__); |
} |
} |
|
buffer_free(&msg); |
|
|
if (showprogress) |
if (showprogress) |
stop_progress_meter(); |
stop_progress_meter(); |
xfree(data); |
xfree(data); |
|
|
|
if (status != SSH2_FX_OK) { |
|
error("Couldn't write to remote file \"%s\": %s", |
|
remote_path, fx2txt(status)); |
|
status = -1; |
|
} |
|
|
if (close(local_fd) == -1) { |
if (close(local_fd) == -1) { |
error("Couldn't close local file \"%s\": %s", local_path, |
error("Couldn't close local file \"%s\": %s", local_path, |
strerror(errno)); |
strerror(errno)); |
do_close(conn, handle, handle_len); |
|
status = -1; |
status = -1; |
goto done; |
|
} |
} |
|
|
/* Override umask and utimes if asked */ |
/* Override umask and utimes if asked */ |
if (pflag) |
if (pflag) |
do_fsetstat(conn, handle, handle_len, &a); |
do_fsetstat(conn, handle, handle_len, &a); |
|
|
status = do_close(conn, handle, handle_len); |
if (do_close(conn, handle, handle_len) != SSH2_FX_OK) |
|
status = -1; |
done: |
|
xfree(handle); |
xfree(handle); |
buffer_free(&msg); |
|
return(status); |
return status; |
} |
} |