mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-03-22 06:38:37 -05:00
Allow PSFTP to be run with no arguments, in which case it enters the
command-line state but all commands are disallowed except `open host.name'. The idea is to provide marginal extra niceness for people who double-click the icon without realising it's a cmdline app. [originally from svn r1480]
This commit is contained in:
parent
f3a8796cf5
commit
9cfcab6cb6
218
psftp.c
218
psftp.c
@ -24,6 +24,9 @@
|
|||||||
* send buffer.
|
* send buffer.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
static int psftp_connect(char *userhost, char *user, int portnumber);
|
||||||
|
static void do_sftp_init(void);
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
* sftp client state.
|
* sftp client state.
|
||||||
*/
|
*/
|
||||||
@ -198,6 +201,11 @@ int sftp_cmd_ls(struct sftp_command *cmd)
|
|||||||
char *dir, *cdir;
|
char *dir, *cdir;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
if (back == NULL) {
|
||||||
|
printf("psftp: not connected to a host; use \"open host.name\"\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (cmd->nwords < 2)
|
if (cmd->nwords < 2)
|
||||||
dir = ".";
|
dir = ".";
|
||||||
else
|
else
|
||||||
@ -273,6 +281,11 @@ int sftp_cmd_cd(struct sftp_command *cmd)
|
|||||||
struct fxp_handle *dirh;
|
struct fxp_handle *dirh;
|
||||||
char *dir;
|
char *dir;
|
||||||
|
|
||||||
|
if (back == NULL) {
|
||||||
|
printf("psftp: not connected to a host; use \"open host.name\"\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (cmd->nwords < 2)
|
if (cmd->nwords < 2)
|
||||||
dir = dupstr(homedir);
|
dir = dupstr(homedir);
|
||||||
else
|
else
|
||||||
@ -304,6 +317,11 @@ int sftp_cmd_cd(struct sftp_command *cmd)
|
|||||||
*/
|
*/
|
||||||
int sftp_cmd_pwd(struct sftp_command *cmd)
|
int sftp_cmd_pwd(struct sftp_command *cmd)
|
||||||
{
|
{
|
||||||
|
if (back == NULL) {
|
||||||
|
printf("psftp: not connected to a host; use \"open host.name\"\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
printf("Remote directory is %s\n", pwd);
|
printf("Remote directory is %s\n", pwd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -321,6 +339,11 @@ int sftp_general_get(struct sftp_command *cmd, int restart)
|
|||||||
uint64 offset;
|
uint64 offset;
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
|
||||||
|
if (back == NULL) {
|
||||||
|
printf("psftp: not connected to a host; use \"open host.name\"\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (cmd->nwords < 2) {
|
if (cmd->nwords < 2) {
|
||||||
printf("get: expects a filename\n");
|
printf("get: expects a filename\n");
|
||||||
return 0;
|
return 0;
|
||||||
@ -425,6 +448,11 @@ int sftp_general_put(struct sftp_command *cmd, int restart)
|
|||||||
uint64 offset;
|
uint64 offset;
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
|
||||||
|
if (back == NULL) {
|
||||||
|
printf("psftp: not connected to a host; use \"open host.name\"\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (cmd->nwords < 2) {
|
if (cmd->nwords < 2) {
|
||||||
printf("put: expects a filename\n");
|
printf("put: expects a filename\n");
|
||||||
return 0;
|
return 0;
|
||||||
@ -529,6 +557,10 @@ int sftp_cmd_mkdir(struct sftp_command *cmd)
|
|||||||
char *dir;
|
char *dir;
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
|
if (back == NULL) {
|
||||||
|
printf("psftp: not connected to a host; use \"open host.name\"\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (cmd->nwords < 2) {
|
if (cmd->nwords < 2) {
|
||||||
printf("mkdir: expects a directory\n");
|
printf("mkdir: expects a directory\n");
|
||||||
@ -557,6 +589,10 @@ int sftp_cmd_rmdir(struct sftp_command *cmd)
|
|||||||
char *dir;
|
char *dir;
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
|
if (back == NULL) {
|
||||||
|
printf("psftp: not connected to a host; use \"open host.name\"\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (cmd->nwords < 2) {
|
if (cmd->nwords < 2) {
|
||||||
printf("rmdir: expects a directory\n");
|
printf("rmdir: expects a directory\n");
|
||||||
@ -585,6 +621,11 @@ int sftp_cmd_rm(struct sftp_command *cmd)
|
|||||||
char *fname;
|
char *fname;
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
|
if (back == NULL) {
|
||||||
|
printf("psftp: not connected to a host; use \"open host.name\"\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (cmd->nwords < 2) {
|
if (cmd->nwords < 2) {
|
||||||
printf("rm: expects a filename\n");
|
printf("rm: expects a filename\n");
|
||||||
return 0;
|
return 0;
|
||||||
@ -613,6 +654,11 @@ int sftp_cmd_mv(struct sftp_command *cmd)
|
|||||||
char *srcfname, *dstfname;
|
char *srcfname, *dstfname;
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
|
if (back == NULL) {
|
||||||
|
printf("psftp: not connected to a host; use \"open host.name\"\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (cmd->nwords < 3) {
|
if (cmd->nwords < 3) {
|
||||||
printf("mv: expects two filenames\n");
|
printf("mv: expects two filenames\n");
|
||||||
return 0;
|
return 0;
|
||||||
@ -680,6 +726,11 @@ int sftp_cmd_chmod(struct sftp_command *cmd)
|
|||||||
struct fxp_attrs attrs;
|
struct fxp_attrs attrs;
|
||||||
unsigned attrs_clr, attrs_xor, oldperms, newperms;
|
unsigned attrs_clr, attrs_xor, oldperms, newperms;
|
||||||
|
|
||||||
|
if (back == NULL) {
|
||||||
|
printf("psftp: not connected to a host; use \"open host.name\"\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (cmd->nwords < 3) {
|
if (cmd->nwords < 3) {
|
||||||
printf("chmod: expects a mode specifier and a filename\n");
|
printf("chmod: expects a mode specifier and a filename\n");
|
||||||
return 0;
|
return 0;
|
||||||
@ -824,6 +875,25 @@ int sftp_cmd_chmod(struct sftp_command *cmd)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int sftp_cmd_open(struct sftp_command *cmd)
|
||||||
|
{
|
||||||
|
if (back != NULL) {
|
||||||
|
printf("psftp: already connected\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cmd->nwords < 2) {
|
||||||
|
printf("open: expects a host name\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (psftp_connect(cmd->words[1], NULL, 0)) {
|
||||||
|
back = NULL; /* connection is already closed */
|
||||||
|
return -1; /* this is fatal */
|
||||||
|
}
|
||||||
|
do_sftp_init();
|
||||||
|
}
|
||||||
|
|
||||||
static int sftp_cmd_help(struct sftp_command *cmd);
|
static int sftp_cmd_help(struct sftp_command *cmd);
|
||||||
|
|
||||||
static struct sftp_cmd_lookup {
|
static struct sftp_cmd_lookup {
|
||||||
@ -953,6 +1023,14 @@ static struct sftp_cmd_lookup {
|
|||||||
" argument <remote-filename>.\n",
|
" argument <remote-filename>.\n",
|
||||||
sftp_cmd_put
|
sftp_cmd_put
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"open", "connect to a host",
|
||||||
|
" [<user>@]<hostname>\n"
|
||||||
|
" Establishes an SFTP connection to a given host. Only usable\n"
|
||||||
|
" when you did not already specify a host name on the command\n"
|
||||||
|
" line.\n",
|
||||||
|
sftp_cmd_open
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"pwd", "print your remote working directory",
|
"pwd", "print your remote working directory",
|
||||||
"\n"
|
"\n"
|
||||||
@ -1173,10 +1251,8 @@ struct sftp_command *sftp_getcmd(FILE *fp, int mode, int modeflags)
|
|||||||
return cmd;
|
return cmd;
|
||||||
}
|
}
|
||||||
|
|
||||||
void do_sftp(int mode, int modeflags, char *batchfile)
|
static void do_sftp_init(void)
|
||||||
{
|
{
|
||||||
FILE *fp;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Do protocol initialisation.
|
* Do protocol initialisation.
|
||||||
*/
|
*/
|
||||||
@ -1199,6 +1275,11 @@ void do_sftp(int mode, int modeflags, char *batchfile)
|
|||||||
printf("Remote working directory is %s\n", homedir);
|
printf("Remote working directory is %s\n", homedir);
|
||||||
}
|
}
|
||||||
pwd = dupstr(homedir);
|
pwd = dupstr(homedir);
|
||||||
|
}
|
||||||
|
|
||||||
|
void do_sftp(int mode, int modeflags, char *batchfile)
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Batch mode?
|
* Batch mode?
|
||||||
@ -1392,7 +1473,7 @@ void fatalbox(char *fmt, ...)
|
|||||||
vsprintf(str + strlen(str), fmt, ap);
|
vsprintf(str + strlen(str), fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
strcat(str, "\n");
|
strcat(str, "\n");
|
||||||
fprintf(stderr, str);
|
fputs(stderr, str);
|
||||||
|
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
@ -1405,7 +1486,7 @@ void connection_fatal(char *fmt, ...)
|
|||||||
vsprintf(str + strlen(str), fmt, ap);
|
vsprintf(str + strlen(str), fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
strcat(str, "\n");
|
strcat(str, "\n");
|
||||||
fprintf(stderr, str);
|
fputs(stderr, str);
|
||||||
|
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
@ -1648,62 +1729,12 @@ static void usage(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Main program. Parse arguments etc.
|
* Connect to a host.
|
||||||
*/
|
*/
|
||||||
int main(int argc, char *argv[])
|
static int psftp_connect(char *userhost, char *user, int portnumber)
|
||||||
{
|
{
|
||||||
int i;
|
char *host, *realhost;
|
||||||
int portnumber = 0;
|
|
||||||
char *user, *host, *userhost, *realhost;
|
|
||||||
char *err;
|
char *err;
|
||||||
int mode = 0;
|
|
||||||
int modeflags = 0;
|
|
||||||
char *batchfile = NULL;
|
|
||||||
|
|
||||||
flags = FLAG_STDERR | FLAG_INTERACTIVE;
|
|
||||||
ssh_get_line = &get_line;
|
|
||||||
init_winsock();
|
|
||||||
sk_init();
|
|
||||||
|
|
||||||
userhost = user = NULL;
|
|
||||||
|
|
||||||
for (i = 1; i < argc; i++) {
|
|
||||||
if (argv[i][0] != '-') {
|
|
||||||
if (userhost)
|
|
||||||
usage();
|
|
||||||
else
|
|
||||||
userhost = dupstr(argv[i]);
|
|
||||||
} else if (strcmp(argv[i], "-v") == 0) {
|
|
||||||
verbose = 1, flags |= FLAG_VERBOSE;
|
|
||||||
} else if (strcmp(argv[i], "-h") == 0 ||
|
|
||||||
strcmp(argv[i], "-?") == 0) {
|
|
||||||
usage();
|
|
||||||
} else if (strcmp(argv[i], "-l") == 0 && i + 1 < argc) {
|
|
||||||
user = argv[++i];
|
|
||||||
} else if (strcmp(argv[i], "-P") == 0 && i + 1 < argc) {
|
|
||||||
portnumber = atoi(argv[++i]);
|
|
||||||
} else if (strcmp(argv[i], "-pw") == 0 && i + 1 < argc) {
|
|
||||||
password = argv[++i];
|
|
||||||
} else if (strcmp(argv[i], "-b") == 0 && i + 1 < argc) {
|
|
||||||
mode = 1;
|
|
||||||
batchfile = argv[++i];
|
|
||||||
} else if (strcmp(argv[i], "-bc") == 0 && i + 1 < argc) {
|
|
||||||
modeflags = modeflags | 1;
|
|
||||||
} else if (strcmp(argv[i], "-be") == 0 && i + 1 < argc) {
|
|
||||||
modeflags = modeflags | 2;
|
|
||||||
} else if (strcmp(argv[i], "--") == 0) {
|
|
||||||
i++;
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
usage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
argc -= i;
|
|
||||||
argv += i;
|
|
||||||
back = NULL;
|
|
||||||
|
|
||||||
if (argc > 0 || !userhost)
|
|
||||||
usage();
|
|
||||||
|
|
||||||
/* Separate host and username */
|
/* Separate host and username */
|
||||||
host = userhost;
|
host = userhost;
|
||||||
@ -1822,12 +1853,81 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
err = back->init(cfg.host, cfg.port, &realhost, 0);
|
err = back->init(cfg.host, cfg.port, &realhost, 0);
|
||||||
if (err != NULL) {
|
if (err != NULL) {
|
||||||
fprintf(stderr, "ssh_init: %s", err);
|
fprintf(stderr, "ssh_init: %s\n", err);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
ssh_sftp_init();
|
ssh_sftp_init();
|
||||||
if (verbose && realhost != NULL)
|
if (verbose && realhost != NULL)
|
||||||
printf("Connected to %s\n", realhost);
|
printf("Connected to %s\n", realhost);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Main program. Parse arguments etc.
|
||||||
|
*/
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int portnumber = 0;
|
||||||
|
char *userhost, *user;
|
||||||
|
int mode = 0;
|
||||||
|
int modeflags = 0;
|
||||||
|
char *batchfile = NULL;
|
||||||
|
|
||||||
|
flags = FLAG_STDERR | FLAG_INTERACTIVE;
|
||||||
|
ssh_get_line = &get_line;
|
||||||
|
init_winsock();
|
||||||
|
sk_init();
|
||||||
|
|
||||||
|
userhost = user = NULL;
|
||||||
|
|
||||||
|
for (i = 1; i < argc; i++) {
|
||||||
|
if (argv[i][0] != '-') {
|
||||||
|
if (userhost)
|
||||||
|
usage();
|
||||||
|
else
|
||||||
|
userhost = dupstr(argv[i]);
|
||||||
|
} else if (strcmp(argv[i], "-v") == 0) {
|
||||||
|
verbose = 1, flags |= FLAG_VERBOSE;
|
||||||
|
} else if (strcmp(argv[i], "-h") == 0 ||
|
||||||
|
strcmp(argv[i], "-?") == 0) {
|
||||||
|
usage();
|
||||||
|
} else if (strcmp(argv[i], "-l") == 0 && i + 1 < argc) {
|
||||||
|
user = argv[++i];
|
||||||
|
} else if (strcmp(argv[i], "-P") == 0 && i + 1 < argc) {
|
||||||
|
portnumber = atoi(argv[++i]);
|
||||||
|
} else if (strcmp(argv[i], "-pw") == 0 && i + 1 < argc) {
|
||||||
|
password = argv[++i];
|
||||||
|
} else if (strcmp(argv[i], "-b") == 0 && i + 1 < argc) {
|
||||||
|
mode = 1;
|
||||||
|
batchfile = argv[++i];
|
||||||
|
} else if (strcmp(argv[i], "-bc") == 0 && i + 1 < argc) {
|
||||||
|
modeflags = modeflags | 1;
|
||||||
|
} else if (strcmp(argv[i], "-be") == 0 && i + 1 < argc) {
|
||||||
|
modeflags = modeflags | 2;
|
||||||
|
} else if (strcmp(argv[i], "--") == 0) {
|
||||||
|
i++;
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
usage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
argc -= i;
|
||||||
|
argv += i;
|
||||||
|
back = NULL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If a user@host string has already been provided, connect to
|
||||||
|
* it now.
|
||||||
|
*/
|
||||||
|
if (userhost) {
|
||||||
|
if (psftp_connect(userhost, user, portnumber))
|
||||||
|
return 1;
|
||||||
|
do_sftp_init();
|
||||||
|
} else {
|
||||||
|
printf("psftp: no hostname specified; use \"open host.name\""
|
||||||
|
" to connect\n");
|
||||||
|
}
|
||||||
|
|
||||||
do_sftp(mode, modeflags, batchfile);
|
do_sftp(mode, modeflags, batchfile);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user