sftp_register(req = fxp_realpath_send(fullname));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- canonname = fxp_realpath_recv(pktin);
+ canonname = fxp_realpath_recv(pktin, rreq);
if (canonname) {
sfree(fullname);
}
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- canonname = fxp_realpath_recv(pktin);
+ canonname = fxp_realpath_recv(pktin, rreq);
if (!canonname)
return fullname; /* even that failed; give up */
sftp_register(req = fxp_opendir_send(cdir));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- dirh = fxp_opendir_recv(pktin);
+ dirh = fxp_opendir_recv(pktin, rreq);
if (dirh == NULL) {
printf("Unable to open %s: %s\n", dir, fxp_error());
sftp_register(req = fxp_readdir_send(dirh));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- names = fxp_readdir_recv(pktin);
+ names = fxp_readdir_recv(pktin, rreq);
if (names == NULL) {
if (fxp_error_type() == SSH_FX_EOF)
sftp_register(req = fxp_close_send(dirh));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- fxp_close_recv(pktin);
+ fxp_close_recv(pktin, rreq);
/*
* Now we have our filenames. Sort them by actual file
sftp_register(req = fxp_opendir_send(dir));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- dirh = fxp_opendir_recv(pktin);
+ dirh = fxp_opendir_recv(pktin, rreq);
if (!dirh) {
printf("Directory %s: %s\n", dir, fxp_error());
sftp_register(req = fxp_close_send(dirh));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- fxp_close_recv(pktin);
+ fxp_close_recv(pktin, rreq);
sfree(pwd);
pwd = dir;
sftp_register(req = fxp_open_send(fname, SSH_FXF_READ));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- fh = fxp_open_recv(pktin);
+ fh = fxp_open_recv(pktin, rreq);
if (!fh) {
printf("%s: %s\n", fname, fxp_error());
sftp_register(req = fxp_close_send(fh));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- fxp_close_recv(pktin);
+ fxp_close_recv(pktin, rreq);
sfree(fname);
return 0;
sftp_register(req = fxp_read_send(fh, offset, sizeof(buffer)));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- len = fxp_read_recv(pktin, buffer, sizeof(buffer));
+ len = fxp_read_recv(pktin, rreq, buffer, sizeof(buffer));
if ((len == -1 && fxp_error_type() == SSH_FX_EOF) || len == 0)
break;
sftp_register(req = fxp_close_send(fh));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- fxp_close_recv(pktin);
+ fxp_close_recv(pktin, rreq);
sfree(fname);
}
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- fh = fxp_open_recv(pktin);
+ fh = fxp_open_recv(pktin, rreq);
if (!fh) {
printf("%s: %s\n", outfname, fxp_error());
sftp_register(req = fxp_fstat_send(fh));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- ret = fxp_fstat_recv(pktin, &attrs);
+ ret = fxp_fstat_recv(pktin, rreq, &attrs);
if (!ret) {
printf("read size of %s: %s\n", outfname, fxp_error());
sftp_register(req = fxp_write_send(fh, buffer, offset, len));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- ret = fxp_write_recv(pktin);
+ ret = fxp_write_recv(pktin, rreq);
if (!ret) {
printf("error while writing: %s\n", fxp_error());
sftp_register(req = fxp_close_send(fh));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- fxp_close_recv(pktin);
+ fxp_close_recv(pktin, rreq);
fclose(fp);
sfree(outfname);
sftp_register(req = fxp_mkdir_send(dir));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- result = fxp_mkdir_recv(pktin);
+ result = fxp_mkdir_recv(pktin, rreq);
if (!result) {
printf("mkdir %s: %s\n", dir, fxp_error());
sftp_register(req = fxp_rmdir_send(dir));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- result = fxp_rmdir_recv(pktin);
+ result = fxp_rmdir_recv(pktin, rreq);
if (!result) {
printf("rmdir %s: %s\n", dir, fxp_error());
sftp_register(req = fxp_remove_send(fname));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- result = fxp_remove_recv(pktin);
+ result = fxp_remove_recv(pktin, rreq);
if (!result) {
printf("rm %s: %s\n", fname, fxp_error());
sftp_register(req = fxp_rename_send(srcfname, dstfname));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- result = fxp_rename_recv(pktin);
+ result = fxp_rename_recv(pktin, rreq);
if (!result) {
char const *error = fxp_error();
sftp_register(req = fxp_stat_send(dstfname));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- result = fxp_stat_recv(pktin, &attrs);
+ result = fxp_stat_recv(pktin, rreq, &attrs);
if (result &&
(attrs.flags & SSH_FILEXFER_ATTR_PERMISSIONS) &&
sftp_register(req = fxp_rename_send(srcfname, dstfname));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- result = fxp_rename_recv(pktin);
+ result = fxp_rename_recv(pktin, rreq);
error = result ? NULL : fxp_error();
}
sftp_register(req = fxp_stat_send(fname));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- result = fxp_stat_recv(pktin, &attrs);
+ result = fxp_stat_recv(pktin, rreq, &attrs);
if (!result || !(attrs.flags & SSH_FILEXFER_ATTR_PERMISSIONS)) {
printf("get attrs for %s: %s\n", fname,
sftp_register(req = fxp_setstat_send(fname, attrs));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- result = fxp_setstat_recv(pktin);
+ result = fxp_setstat_recv(pktin, rreq);
if (!result) {
printf("set attrs for %s: %s\n", fname, fxp_error());
sftp_register(req = fxp_realpath_send("."));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- homedir = fxp_realpath_recv(pktin);
+ homedir = fxp_realpath_recv(pktin, rreq);
if (!homedir) {
fprintf(stderr,
sftp_register(req = fxp_opendir_send(dirname));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- dirh = fxp_opendir_recv(pktin);
+ dirh = fxp_opendir_recv(pktin, rreq);
if (dirh == NULL) {
printf("Unable to open %s: %s\n", dirname, fxp_error());
sftp_register(req = fxp_readdir_send(dirh));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- names = fxp_readdir_recv(pktin);
+ names = fxp_readdir_recv(pktin, rreq);
if (names == NULL) {
if (fxp_error_type() == SSH_FX_EOF)
sftp_register(req = fxp_close_send(dirh));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- fxp_close_recv(pktin);
+ fxp_close_recv(pktin, rreq);
/*
* Now we have our filenames. Sort them by actual file
sftp_register(req = fxp_stat_send(target));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- ret = fxp_stat_recv(pktin, &attrs);
+ ret = fxp_stat_recv(pktin, rreq, &attrs);
if (!ret || !(attrs.flags & SSH_FILEXFER_ATTR_PERMISSIONS))
scp_sftp_targetisdir = 0;
SSH_FXF_CREAT | SSH_FXF_TRUNC));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- scp_sftp_filehandle = fxp_open_recv(pktin);
+ scp_sftp_filehandle = fxp_open_recv(pktin, rreq);
if (!scp_sftp_filehandle) {
tell_user(stderr, "pscp: unable to open %s: %s",
data, scp_sftp_fileoffset, len));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- ret = fxp_write_recv(pktin);
+ ret = fxp_write_recv(pktin, rreq);
if (!ret) {
tell_user(stderr, "error while writing: %s\n", fxp_error());
sftp_register(req = fxp_fsetstat_send(scp_sftp_filehandle, attrs));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- ret = fxp_fsetstat_recv(pktin);
+ ret = fxp_fsetstat_recv(pktin, rreq);
if (!ret) {
tell_user(stderr, "unable to set file times: %s\n", fxp_error());
errs++;
sftp_register(req = fxp_close_send(scp_sftp_filehandle));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- fxp_close_recv(pktin);
+ fxp_close_recv(pktin, rreq);
scp_has_times = 0;
return 0;
} else {
sftp_register(req = fxp_mkdir_send(fullname));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- ret = fxp_mkdir_recv(pktin);
+ ret = fxp_mkdir_recv(pktin, rreq);
if (!ret)
err = fxp_error();
sftp_register(req = fxp_stat_send(fullname));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- ret = fxp_stat_recv(pktin, &attrs);
+ ret = fxp_stat_recv(pktin, rreq, &attrs);
if (!ret || !(attrs.flags & SSH_FILEXFER_ATTR_PERMISSIONS) ||
!(attrs.permissions & 0040000)) {
sftp_register(req = fxp_stat_send(fname));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- ret = fxp_stat_recv(pktin, &attrs);
+ ret = fxp_stat_recv(pktin, rreq, &attrs);
if (!ret || !(attrs.flags & SSH_FILEXFER_ATTR_PERMISSIONS)) {
tell_user(stderr, "unable to identify %s: %s", fname,
sftp_register(req = fxp_opendir_send(fname));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- dirhandle = fxp_opendir_recv(pktin);
+ dirhandle = fxp_opendir_recv(pktin, rreq);
if (!dirhandle) {
tell_user(stderr, "scp: unable to open directory %s: %s",
sftp_register(req = fxp_readdir_send(dirhandle));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- names = fxp_readdir_recv(pktin);
+ names = fxp_readdir_recv(pktin, rreq);
if (names == NULL) {
if (fxp_error_type() == SSH_FX_EOF)
sftp_register(req = fxp_close_send(dirhandle));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- fxp_close_recv(pktin);
+ fxp_close_recv(pktin, rreq);
newitem = snew(struct scp_sftp_dirstack);
newitem->next = scp_sftp_dirstack_head;
sftp_register(req = fxp_open_send(scp_sftp_currentname, SSH_FXF_READ));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- scp_sftp_filehandle = fxp_open_recv(pktin);
+ scp_sftp_filehandle = fxp_open_recv(pktin, rreq);
if (!scp_sftp_filehandle) {
tell_user(stderr, "pscp: unable to open %s: %s",
scp_sftp_fileoffset, len));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- actuallen = fxp_read_recv(pktin, data, len);
+ actuallen = fxp_read_recv(pktin, rreq, data, len);
if (actuallen == -1 && fxp_error_type() != SSH_FX_EOF) {
tell_user(stderr, "pscp: error while reading: %s", fxp_error());
sftp_register(req = fxp_close_send(scp_sftp_filehandle));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
- fxp_close_recv(pktin);
+ fxp_close_recv(pktin, rreq);
return 0;
} else {
back->send(backhandle, "", 1);
return NULL;
}
+ del234(sftp_requests, req);
+
return req;
}
return req;
}
-char *fxp_realpath_recv(struct sftp_packet *pktin)
+char *fxp_realpath_recv(struct sftp_packet *pktin, struct sftp_request *req)
{
+ sfree(req);
+
if (pktin->type == SSH_FXP_NAME) {
int count;
char *path;
return req;
}
-struct fxp_handle *fxp_open_recv(struct sftp_packet *pktin)
+struct fxp_handle *fxp_open_recv(struct sftp_packet *pktin,
+ struct sftp_request *req)
{
+ sfree(req);
+
if (pktin->type == SSH_FXP_HANDLE) {
char *hstring;
struct fxp_handle *handle;
return req;
}
-struct fxp_handle *fxp_opendir_recv(struct sftp_packet *pktin)
+struct fxp_handle *fxp_opendir_recv(struct sftp_packet *pktin,
+ struct sftp_request *req)
{
+ sfree(req);
if (pktin->type == SSH_FXP_HANDLE) {
char *hstring;
struct fxp_handle *handle;
return req;
}
-void fxp_close_recv(struct sftp_packet *pktin)
+void fxp_close_recv(struct sftp_packet *pktin, struct sftp_request *req)
{
+ sfree(req);
fxp_got_status(pktin);
sftp_pkt_free(pktin);
}
return req;
}
-int fxp_mkdir_recv(struct sftp_packet *pktin)
+int fxp_mkdir_recv(struct sftp_packet *pktin, struct sftp_request *req)
{
- int id = fxp_got_status(pktin);
+ int id;
+ sfree(req);
+ id = fxp_got_status(pktin);
sftp_pkt_free(pktin);
if (id != 1) {
return 0;
return req;
}
-int fxp_rmdir_recv(struct sftp_packet *pktin)
+int fxp_rmdir_recv(struct sftp_packet *pktin, struct sftp_request *req)
{
- int id = fxp_got_status(pktin);
+ int id;
+ sfree(req);
+ id = fxp_got_status(pktin);
sftp_pkt_free(pktin);
if (id != 1) {
return 0;
return req;
}
-int fxp_remove_recv(struct sftp_packet *pktin)
+int fxp_remove_recv(struct sftp_packet *pktin, struct sftp_request *req)
{
- int id = fxp_got_status(pktin);
+ int id;
+ sfree(req);
+ id = fxp_got_status(pktin);
sftp_pkt_free(pktin);
if (id != 1) {
return 0;
return req;
}
-int fxp_rename_recv(struct sftp_packet *pktin)
+int fxp_rename_recv(struct sftp_packet *pktin, struct sftp_request *req)
{
- int id = fxp_got_status(pktin);
+ int id;
+ sfree(req);
+ id = fxp_got_status(pktin);
sftp_pkt_free(pktin);
if (id != 1) {
return 0;
return req;
}
-int fxp_stat_recv(struct sftp_packet *pktin, struct fxp_attrs *attrs)
+int fxp_stat_recv(struct sftp_packet *pktin, struct sftp_request *req,
+ struct fxp_attrs *attrs)
{
+ sfree(req);
if (pktin->type == SSH_FXP_ATTRS) {
*attrs = sftp_pkt_getattrs(pktin);
sftp_pkt_free(pktin);
return req;
}
-int fxp_fstat_recv(struct sftp_packet *pktin,
+int fxp_fstat_recv(struct sftp_packet *pktin, struct sftp_request *req,
struct fxp_attrs *attrs)
{
+ sfree(req);
if (pktin->type == SSH_FXP_ATTRS) {
*attrs = sftp_pkt_getattrs(pktin);
sftp_pkt_free(pktin);
return req;
}
-int fxp_setstat_recv(struct sftp_packet *pktin)
+int fxp_setstat_recv(struct sftp_packet *pktin, struct sftp_request *req)
{
- int id = fxp_got_status(pktin);
+ int id;
+ sfree(req);
+ id = fxp_got_status(pktin);
sftp_pkt_free(pktin);
if (id != 1) {
return 0;
return req;
}
-int fxp_fsetstat_recv(struct sftp_packet *pktin)
+int fxp_fsetstat_recv(struct sftp_packet *pktin, struct sftp_request *req)
{
- int id = fxp_got_status(pktin);
+ int id;
+ sfree(req);
+ id = fxp_got_status(pktin);
sftp_pkt_free(pktin);
if (id != 1) {
return 0;
return req;
}
-int fxp_read_recv(struct sftp_packet *pktin, char *buffer, int len)
+int fxp_read_recv(struct sftp_packet *pktin, struct sftp_request *req,
+ char *buffer, int len)
{
+ sfree(req);
if (pktin->type == SSH_FXP_DATA) {
char *str;
int rlen;
return req;
}
-struct fxp_names *fxp_readdir_recv(struct sftp_packet *pktin)
+struct fxp_names *fxp_readdir_recv(struct sftp_packet *pktin,
+ struct sftp_request *req)
{
+ sfree(req);
if (pktin->type == SSH_FXP_NAME) {
struct fxp_names *ret;
int i;
return req;
}
-int fxp_write_recv(struct sftp_packet *pktin)
+int fxp_write_recv(struct sftp_packet *pktin, struct sftp_request *req)
{
+ sfree(req);
fxp_got_status(pktin);
sftp_pkt_free(pktin);
return fxp_errtype == SSH_FX_OK;
* with a separating slash, unless the second is NULL.
*/
struct sftp_request *fxp_realpath_send(char *path);
-char *fxp_realpath_recv(struct sftp_packet *pktin);
+char *fxp_realpath_recv(struct sftp_packet *pktin, struct sftp_request *req);
/*
* Open a file.
*/
struct sftp_request *fxp_open_send(char *path, int type);
-struct fxp_handle *fxp_open_recv(struct sftp_packet *pktin);
+struct fxp_handle *fxp_open_recv(struct sftp_packet *pktin,
+ struct sftp_request *req);
/*
* Open a directory.
*/
struct sftp_request *fxp_opendir_send(char *path);
-struct fxp_handle *fxp_opendir_recv(struct sftp_packet *pktin);
+struct fxp_handle *fxp_opendir_recv(struct sftp_packet *pktin,
+ struct sftp_request *req);
/*
* Close a file/dir.
*/
struct sftp_request *fxp_close_send(struct fxp_handle *handle);
-void fxp_close_recv(struct sftp_packet *pktin);
+void fxp_close_recv(struct sftp_packet *pktin, struct sftp_request *req);
/*
* Make a directory.
*/
struct sftp_request *fxp_mkdir_send(char *path);
-int fxp_mkdir_recv(struct sftp_packet *pktin);
+int fxp_mkdir_recv(struct sftp_packet *pktin, struct sftp_request *req);
/*
* Remove a directory.
*/
struct sftp_request *fxp_rmdir_send(char *path);
-int fxp_rmdir_recv(struct sftp_packet *pktin);
+int fxp_rmdir_recv(struct sftp_packet *pktin, struct sftp_request *req);
/*
* Remove a file.
*/
struct sftp_request *fxp_remove_send(char *fname);
-int fxp_remove_recv(struct sftp_packet *pktin);
+int fxp_remove_recv(struct sftp_packet *pktin, struct sftp_request *req);
/*
* Rename a file.
*/
struct sftp_request *fxp_rename_send(char *srcfname, char *dstfname);
-int fxp_rename_recv(struct sftp_packet *pktin);
+int fxp_rename_recv(struct sftp_packet *pktin, struct sftp_request *req);
/*
* Return file attributes.
*/
struct sftp_request *fxp_stat_send(char *fname);
-int fxp_stat_recv(struct sftp_packet *pktin, struct fxp_attrs *attrs);
+int fxp_stat_recv(struct sftp_packet *pktin, struct sftp_request *req,
+ struct fxp_attrs *attrs);
struct sftp_request *fxp_fstat_send(struct fxp_handle *handle);
-int fxp_fstat_recv(struct sftp_packet *pktin, struct fxp_attrs *attrs);
+int fxp_fstat_recv(struct sftp_packet *pktin, struct sftp_request *req,
+ struct fxp_attrs *attrs);
/*
* Set file attributes.
*/
struct sftp_request *fxp_setstat_send(char *fname, struct fxp_attrs attrs);
-int fxp_setstat_recv(struct sftp_packet *pktin);
+int fxp_setstat_recv(struct sftp_packet *pktin, struct sftp_request *req);
struct sftp_request *fxp_fsetstat_send(struct fxp_handle *handle,
struct fxp_attrs attrs);
-int fxp_fsetstat_recv(struct sftp_packet *pktin);
+int fxp_fsetstat_recv(struct sftp_packet *pktin, struct sftp_request *req);
/*
* Read from a file.
*/
struct sftp_request *fxp_read_send(struct fxp_handle *handle,
uint64 offset, int len);
-int fxp_read_recv(struct sftp_packet *pktin, char *buffer, int len);
+int fxp_read_recv(struct sftp_packet *pktin, struct sftp_request *req,
+ char *buffer, int len);
/*
* Write to a file. Returns 0 on error, 1 on OK.
*/
struct sftp_request *fxp_write_send(struct fxp_handle *handle,
char *buffer, uint64 offset, int len);
-int fxp_write_recv(struct sftp_packet *pktin);
+int fxp_write_recv(struct sftp_packet *pktin, struct sftp_request *req);
/*
* Read from a directory.
*/
struct sftp_request *fxp_readdir_send(struct fxp_handle *handle);
-struct fxp_names *fxp_readdir_recv(struct sftp_packet *pktin);
+struct fxp_names *fxp_readdir_recv(struct sftp_packet *pktin,
+ struct sftp_request *req);
/*
* Free up an fxp_names structure.