version 1.97.4.1, 2013/11/08 05:52:21 |
version 1.98, 2013/05/17 00:13:14 |
|
|
} else { |
} else { |
debug2("Unrecognised server extension \"%s\"", name); |
debug2("Unrecognised server extension \"%s\"", name); |
} |
} |
xfree(name); |
free(name); |
xfree(value); |
free(value); |
} |
} |
|
|
buffer_free(&msg); |
buffer_free(&msg); |
|
|
|
|
if (dir) { |
if (dir) { |
ents = 0; |
ents = 0; |
*dir = xcalloc(1, sizeof(**dir)); |
*dir = xmalloc(sizeof(**dir)); |
(*dir)[0] = NULL; |
(*dir)[0] = NULL; |
} |
} |
|
|
|
|
error("Couldn't read directory: %s", |
error("Couldn't read directory: %s", |
fx2txt(status)); |
fx2txt(status)); |
do_close(conn, handle, handle_len); |
do_close(conn, handle, handle_len); |
xfree(handle); |
free(handle); |
buffer_free(&msg); |
buffer_free(&msg); |
return(status); |
return(status); |
} |
} |
|
|
|
|
if (dir) { |
if (dir) { |
*dir = xrealloc(*dir, ents + 2, sizeof(**dir)); |
*dir = xrealloc(*dir, ents + 2, sizeof(**dir)); |
(*dir)[ents] = xcalloc(1, sizeof(***dir)); |
(*dir)[ents] = xmalloc(sizeof(***dir)); |
(*dir)[ents]->filename = xstrdup(filename); |
(*dir)[ents]->filename = xstrdup(filename); |
(*dir)[ents]->longname = xstrdup(longname); |
(*dir)[ents]->longname = xstrdup(longname); |
memcpy(&(*dir)[ents]->a, a, sizeof(*a)); |
memcpy(&(*dir)[ents]->a, a, sizeof(*a)); |
(*dir)[++ents] = NULL; |
(*dir)[++ents] = NULL; |
} |
} |
next: |
next: |
xfree(filename); |
free(filename); |
xfree(longname); |
free(longname); |
} |
} |
} |
} |
|
|
buffer_free(&msg); |
buffer_free(&msg); |
do_close(conn, handle, handle_len); |
do_close(conn, handle, handle_len); |
xfree(handle); |
free(handle); |
|
|
/* Don't return partial matches on interrupt */ |
/* Don't return partial matches on interrupt */ |
if (interrupted && dir != NULL && *dir != NULL) { |
if (interrupted && dir != NULL && *dir != NULL) { |
free_sftp_dirents(*dir); |
free_sftp_dirents(*dir); |
*dir = xcalloc(1, sizeof(**dir)); |
*dir = xmalloc(sizeof(**dir)); |
**dir = NULL; |
**dir = NULL; |
} |
} |
|
|
|
|
int i; |
int i; |
|
|
for (i = 0; s[i]; i++) { |
for (i = 0; s[i]; i++) { |
xfree(s[i]->filename); |
free(s[i]->filename); |
xfree(s[i]->longname); |
free(s[i]->longname); |
xfree(s[i]); |
free(s[i]); |
} |
} |
xfree(s); |
free(s); |
} |
} |
|
|
int |
int |
|
|
debug3("SSH_FXP_REALPATH %s -> %s size %lu", path, filename, |
debug3("SSH_FXP_REALPATH %s -> %s size %lu", path, filename, |
(unsigned long)a->size); |
(unsigned long)a->size); |
|
|
xfree(longname); |
free(longname); |
|
|
buffer_free(&msg); |
buffer_free(&msg); |
|
|
|
|
|
|
debug3("SSH_FXP_READLINK %s -> %s", path, filename); |
debug3("SSH_FXP_READLINK %s -> %s", path, filename); |
|
|
xfree(longname); |
free(longname); |
|
|
buffer_free(&msg); |
buffer_free(&msg); |
|
|
|
|
local_path, strerror(errno)); |
local_path, strerror(errno)); |
do_close(conn, handle, handle_len); |
do_close(conn, handle, handle_len); |
buffer_free(&msg); |
buffer_free(&msg); |
xfree(handle); |
free(handle); |
return(-1); |
return(-1); |
} |
} |
|
|
|
|
(unsigned long long)offset, |
(unsigned long long)offset, |
(unsigned long long)offset + buflen - 1, |
(unsigned long long)offset + buflen - 1, |
num_req, max_req); |
num_req, max_req); |
req = xcalloc(1, sizeof(*req)); |
req = xmalloc(sizeof(*req)); |
req->id = conn->msg_id++; |
req->id = conn->msg_id++; |
req->len = buflen; |
req->len = buflen; |
req->offset = offset; |
req->offset = offset; |
|
|
read_error = 1; |
read_error = 1; |
max_req = 0; |
max_req = 0; |
TAILQ_REMOVE(&requests, req, tq); |
TAILQ_REMOVE(&requests, req, tq); |
xfree(req); |
free(req); |
num_req--; |
num_req--; |
break; |
break; |
case SSH2_FXP_DATA: |
case SSH2_FXP_DATA: |
|
|
max_req = 0; |
max_req = 0; |
} |
} |
progress_counter += len; |
progress_counter += len; |
xfree(data); |
free(data); |
|
|
if (len == req->len) { |
if (len == req->len) { |
TAILQ_REMOVE(&requests, req, tq); |
TAILQ_REMOVE(&requests, req, tq); |
xfree(req); |
free(req); |
num_req--; |
num_req--; |
} else { |
} else { |
/* Resend the request for the missing data */ |
/* Resend the request for the missing data */ |
|
|
} |
} |
close(local_fd); |
close(local_fd); |
buffer_free(&msg); |
buffer_free(&msg); |
xfree(handle); |
free(handle); |
|
|
return(status); |
return(status); |
} |
} |
|
|
} else |
} else |
logit("%s: not a regular file\n", new_src); |
logit("%s: not a regular file\n", new_src); |
|
|
xfree(new_dst); |
free(new_dst); |
xfree(new_src); |
free(new_src); |
} |
} |
|
|
if (pflag) { |
if (pflag) { |
|
|
|
|
ret = download_dir_internal(conn, src_canon, dst, |
ret = download_dir_internal(conn, src_canon, dst, |
dirattrib, pflag, printflag, 0); |
dirattrib, pflag, printflag, 0); |
xfree(src_canon); |
free(src_canon); |
return ret; |
return ret; |
} |
} |
|
|
|
|
strerror(errno)); |
strerror(errno)); |
|
|
if (len != 0) { |
if (len != 0) { |
ack = xcalloc(1, sizeof(*ack)); |
ack = xmalloc(sizeof(*ack)); |
ack->id = ++id; |
ack->id = ++id; |
ack->offset = offset; |
ack->offset = offset; |
ack->len = len; |
ack->len = len; |
|
|
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; |
xfree(ack); |
free(ack); |
} |
} |
offset += len; |
offset += len; |
if (offset < 0) |
if (offset < 0) |
|
|
|
|
if (showprogress) |
if (showprogress) |
stop_progress_meter(); |
stop_progress_meter(); |
xfree(data); |
free(data); |
|
|
if (status != SSH2_FX_OK) { |
if (status != SSH2_FX_OK) { |
error("Couldn't write to remote file \"%s\": %s", |
error("Couldn't write to remote file \"%s\": %s", |
|
|
|
|
if (do_close(conn, handle, handle_len) != SSH2_FX_OK) |
if (do_close(conn, handle, handle_len) != SSH2_FX_OK) |
status = -1; |
status = -1; |
xfree(handle); |
free(handle); |
|
|
return status; |
return status; |
} |
} |
|
|
} |
} |
} else |
} else |
logit("%s: not a regular file\n", filename); |
logit("%s: not a regular file\n", filename); |
xfree(new_dst); |
free(new_dst); |
xfree(new_src); |
free(new_src); |
} |
} |
|
|
do_setstat(conn, dst, &a); |
do_setstat(conn, dst, &a); |
|
|
} |
} |
|
|
ret = upload_dir_internal(conn, src, dst_canon, pflag, printflag, 0); |
ret = upload_dir_internal(conn, src, dst_canon, pflag, printflag, 0); |
xfree(dst_canon); |
free(dst_canon); |
return ret; |
return ret; |
} |
} |
|
|