1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-07-03 20:42:48 -05:00

Propagate file permissions in both directions in Unix pscp and psftp.

I think I have to consider this to be a separate but related change to
the wishlist item 'pscp-filemodes'; that was written before the Unix
port existed, and referred to the ability to configure the permissions
used for files copied from Windows to Unix - which is still not done.

[originally from svn r9260]
This commit is contained in:
Simon Tatham
2011-08-11 17:59:30 +00:00
parent f14953d9e9
commit 5c00b581c8
7 changed files with 81 additions and 31 deletions

24
psftp.c
View File

@ -212,6 +212,7 @@ int sftp_get_file(char *fname, char *outfname, int recurse, int restart)
uint64 offset;
WFile *file;
int ret, shown_err = FALSE;
struct fxp_attrs attrs;
/*
* In recursive mode, see if we're dealing with a directory.
@ -219,7 +220,6 @@ int sftp_get_file(char *fname, char *outfname, int recurse, int restart)
* subsequent FXP_OPEN will return a usable error message.)
*/
if (recurse) {
struct fxp_attrs attrs;
int result;
sftp_register(req = fxp_stat_send(fname));
@ -383,7 +383,13 @@ int sftp_get_file(char *fname, char *outfname, int recurse, int restart)
}
}
sftp_register(req = fxp_open_send(fname, SSH_FXF_READ));
sftp_register(req = fxp_stat_send(fname));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
if (!fxp_stat_recv(pktin, rreq, &attrs))
attrs.flags = 0;
sftp_register(req = fxp_open_send(fname, SSH_FXF_READ, NULL));
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);
fh = fxp_open_recv(pktin, rreq);
@ -396,7 +402,7 @@ int sftp_get_file(char *fname, char *outfname, int recurse, int restart)
if (restart) {
file = open_existing_wfile(outfname, NULL);
} else {
file = open_new_file(outfname);
file = open_new_file(outfname, GET_PERMISSIONS(attrs));
}
if (!file) {
@ -500,6 +506,8 @@ int sftp_put_file(char *fname, char *outfname, int recurse, int restart)
uint64 offset;
RFile *file;
int ret, err, eof;
struct fxp_attrs attrs;
long permissions;
/*
* In recursive mode, see if we're dealing with a directory.
@ -507,7 +515,6 @@ int sftp_put_file(char *fname, char *outfname, int recurse, int restart)
* subsequent fopen will return an error message.)
*/
if (recurse && file_type(fname) == FILE_TYPE_DIRECTORY) {
struct fxp_attrs attrs;
int result;
int nnames, namesize;
char *name, **ournames;
@ -630,16 +637,19 @@ int sftp_put_file(char *fname, char *outfname, int recurse, int restart)
return 1;
}
file = open_existing_file(fname, NULL, NULL, NULL);
file = open_existing_file(fname, NULL, NULL, NULL, &permissions);
if (!file) {
printf("local: unable to open %s\n", fname);
return 0;
}
attrs.flags = 0;
PUT_PERMISSIONS(attrs, permissions);
if (restart) {
sftp_register(req = fxp_open_send(outfname, SSH_FXF_WRITE));
sftp_register(req = fxp_open_send(outfname, SSH_FXF_WRITE, &attrs));
} else {
sftp_register(req = fxp_open_send(outfname, SSH_FXF_WRITE |
SSH_FXF_CREAT | SSH_FXF_TRUNC));
SSH_FXF_CREAT | SSH_FXF_TRUNC,
&attrs));
}
rreq = sftp_find_request(pktin = sftp_recv());
assert(rreq == req);