to report command failures is now gone; instead each sftp_cmd_*
routine returns 0 or 1 depending on success, like they should have
done right from the start. This fixes problems with `ls' prematurely
terminating PSFTP batch files.
git-svn-id: svn://svn.tartarus.org/sgt/putty@1481
cda61777-01e9-0310-a592-
d414129be87e
int sftp_cmd_null(struct sftp_command *cmd)
{
int sftp_cmd_null(struct sftp_command *cmd)
{
+ return 1; /* success */
}
int sftp_cmd_unknown(struct sftp_command *cmd)
{
printf("psftp: unknown command \"%s\"\n", cmd->words[0]);
}
int sftp_cmd_unknown(struct sftp_command *cmd)
{
printf("psftp: unknown command \"%s\"\n", cmd->words[0]);
+ return 0; /* failure */
}
int sftp_cmd_quit(struct sftp_command *cmd)
}
int sftp_cmd_quit(struct sftp_command *cmd)
pwd = dir;
printf("Remote directory is now %s\n", pwd);
pwd = dir;
printf("Remote directory is now %s\n", pwd);
}
printf("Remote directory is %s\n", pwd);
}
printf("Remote directory is %s\n", pwd);
char *fname, *outfname;
uint64 offset;
FILE *fp;
char *fname, *outfname;
uint64 offset;
FILE *fp;
if (back == NULL) {
printf("psftp: not connected to a host; use \"open host.name\"\n");
if (back == NULL) {
printf("psftp: not connected to a host; use \"open host.name\"\n");
* FIXME: we can use FXP_FSTAT here to get the file size, and
* thus put up a progress bar.
*/
* FIXME: we can use FXP_FSTAT here to get the file size, and
* thus put up a progress bar.
*/
while (1) {
char buffer[4096];
int len;
while (1) {
char buffer[4096];
int len;
break;
if (len == -1) {
printf("error while reading: %s\n", fxp_error());
break;
if (len == -1) {
printf("error while reading: %s\n", fxp_error());
wlen = fwrite(buffer, 1, len - wpos, fp);
if (wlen <= 0) {
printf("error while writing local file\n");
wlen = fwrite(buffer, 1, len - wpos, fp);
if (wlen <= 0) {
printf("error while writing local file\n");
- if (wpos < len) /* we had an error */
+ if (wpos < len) { /* we had an error */
+ ret = 0;
offset = uint64_add32(offset, len);
}
offset = uint64_add32(offset, len);
}
fxp_close(fh);
sfree(fname);
fxp_close(fh);
sfree(fname);
}
int sftp_cmd_get(struct sftp_command *cmd)
{
}
int sftp_cmd_get(struct sftp_command *cmd)
{
char *fname, *origoutfname, *outfname;
uint64 offset;
FILE *fp;
char *fname, *origoutfname, *outfname;
uint64 offset;
FILE *fp;
if (back == NULL) {
printf("psftp: not connected to a host; use \"open host.name\"\n");
if (back == NULL) {
printf("psftp: not connected to a host; use \"open host.name\"\n");
* FIXME: we can use FXP_FSTAT here to get the file size, and
* thus put up a progress bar.
*/
* FIXME: we can use FXP_FSTAT here to get the file size, and
* thus put up a progress bar.
*/
while (1) {
char buffer[4096];
int len;
while (1) {
char buffer[4096];
int len;
len = fread(buffer, 1, sizeof(buffer), fp);
if (len == -1) {
printf("error while reading local file\n");
len = fread(buffer, 1, sizeof(buffer), fp);
if (len == -1) {
printf("error while reading local file\n");
break;
} else if (len == 0) {
break;
}
if (!fxp_write(fh, buffer, offset, len)) {
printf("error while writing: %s\n", fxp_error());
break;
} else if (len == 0) {
break;
}
if (!fxp_write(fh, buffer, offset, len)) {
printf("error while writing: %s\n", fxp_error());
break;
}
offset = uint64_add32(offset, len);
break;
}
offset = uint64_add32(offset, len);
fclose(fp);
sfree(outfname);
fclose(fp);
sfree(outfname);
}
int sftp_cmd_put(struct sftp_command *cmd)
{
}
int sftp_cmd_put(struct sftp_command *cmd)
{
}
int sftp_cmd_rmdir(struct sftp_command *cmd)
}
int sftp_cmd_rmdir(struct sftp_command *cmd)
}
int sftp_cmd_rm(struct sftp_command *cmd)
}
int sftp_cmd_rm(struct sftp_command *cmd)
}
int sftp_cmd_mv(struct sftp_command *cmd)
}
int sftp_cmd_mv(struct sftp_command *cmd)
sfree(srcfname);
sfree(dstfname);
sfree(srcfname);
sfree(dstfname);
}
int sftp_cmd_chmod(struct sftp_command *cmd)
}
int sftp_cmd_chmod(struct sftp_command *cmd)
printf("%s: %04o -> %04o\n", fname, oldperms, newperms);
sfree(fname);
printf("%s: %04o -> %04o\n", fname, oldperms, newperms);
sfree(fname);
}
static int sftp_cmd_open(struct sftp_command *cmd)
}
static int sftp_cmd_open(struct sftp_command *cmd)
return -1; /* this is fatal */
}
do_sftp_init();
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);
}
/* ----------------------------------------------------------------------
}
/* ----------------------------------------------------------------------
char *p, *q, *r;
int quoting;
char *p, *q, *r;
int quoting;
- if ((mode == 0) || (modeflags & 1)) {
- printf("psftp> ");
- }
+ if ((mode == 0) || (modeflags & 1)) {
+ printf("psftp> ");
+ }
fflush(stdout);
cmd = smalloc(sizeof(struct sftp_command));
fflush(stdout);
cmd = smalloc(sizeof(struct sftp_command));
linesize += 512;
line = srealloc(line, linesize);
ret = fgets(line + linelen, linesize - linelen, fp);
linesize += 512;
line = srealloc(line, linesize);
ret = fgets(line + linelen, linesize - linelen, fp);
- if (modeflags & 1) {
- printf("%s", ret);
- }
if (!ret || (linelen == 0 && line[0] == '\0')) {
cmd->obey = sftp_cmd_quit;
if (!ret || (linelen == 0 && line[0] == '\0')) {
cmd->obey = sftp_cmd_quit;
+ if (modeflags & 1) {
+ printf("%s\n", line);
+ }
/*
* Parse the command line into words. The syntax is:
/*
* Parse the command line into words. The syntax is:
void do_sftp(int mode, int modeflags, char *batchfile)
{
FILE *fp;
void do_sftp(int mode, int modeflags, char *batchfile)
{
FILE *fp;
* Now we're ready to do Real Stuff.
*/
while (1) {
* Now we're ready to do Real Stuff.
*/
while (1) {
- struct sftp_command *cmd;
- cmd = sftp_getcmd(stdin, 0, 0);
- if (!cmd)
- break;
- if (cmd->obey(cmd) < 0)
- break;
+ struct sftp_command *cmd;
+ cmd = sftp_getcmd(stdin, 0, 0);
+ if (!cmd)
+ break;
+ if (cmd->obey(cmd) < 0)
+ break;
}
} else {
fp = fopen(batchfile, "r");
}
} else {
fp = fopen(batchfile, "r");
cmd = sftp_getcmd(fp, mode, modeflags);
if (!cmd)
break;
cmd = sftp_getcmd(fp, mode, modeflags);
if (!cmd)
break;
- if (cmd->obey(cmd) < 0)
+ ret = cmd->obey(cmd);
+ if (ret < 0)
- if (fxp_error() != NULL) {
if (!(modeflags & 2))
break;
}
if (!(modeflags & 2))
break;
}