int sftp_cmd_null(struct sftp_command *cmd)
{
- return 0;
+ return 1; /* success */
}
int sftp_cmd_unknown(struct sftp_command *cmd)
{
printf("psftp: unknown command \"%s\"\n", cmd->words[0]);
- return 0;
+ return 0; /* failure */
}
int sftp_cmd_quit(struct sftp_command *cmd)
sfree(cdir);
- return 0;
+ return 1;
}
/*
pwd = dir;
printf("Remote directory is now %s\n", pwd);
- return 0;
+ return 1;
}
/*
}
printf("Remote directory is %s\n", pwd);
- return 0;
+ return 1;
}
/*
char *fname, *outfname;
uint64 offset;
FILE *fp;
+ int ret;
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.
*/
+ ret = 1;
while (1) {
char buffer[4096];
int len;
break;
if (len == -1) {
printf("error while reading: %s\n", fxp_error());
+ ret = 0;
break;
}
wlen = fwrite(buffer, 1, len - wpos, fp);
if (wlen <= 0) {
printf("error while writing local file\n");
+ ret = 0;
break;
}
wpos += wlen;
}
- if (wpos < len) /* we had an error */
+ if (wpos < len) { /* we had an error */
+ ret = 0;
break;
+ }
offset = uint64_add32(offset, len);
}
fxp_close(fh);
sfree(fname);
- return 0;
+ return ret;
}
int sftp_cmd_get(struct sftp_command *cmd)
{
char *fname, *origoutfname, *outfname;
uint64 offset;
FILE *fp;
+ int ret;
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.
*/
+ ret = 1;
while (1) {
char buffer[4096];
int len;
len = fread(buffer, 1, sizeof(buffer), fp);
if (len == -1) {
printf("error while reading local file\n");
+ ret = 0;
break;
} else if (len == 0) {
break;
}
if (!fxp_write(fh, buffer, offset, len)) {
printf("error while writing: %s\n", fxp_error());
+ ret = 0;
break;
}
offset = uint64_add32(offset, len);
fclose(fp);
sfree(outfname);
- return 0;
+ return ret;
}
int sftp_cmd_put(struct sftp_command *cmd)
{
}
sfree(dir);
- return 0;
+ return 1;
}
int sftp_cmd_rmdir(struct sftp_command *cmd)
}
sfree(dir);
- return 0;
+ return 1;
}
int sftp_cmd_rm(struct sftp_command *cmd)
}
sfree(fname);
- return 0;
-
+ return 1;
}
int sftp_cmd_mv(struct sftp_command *cmd)
sfree(srcfname);
sfree(dstfname);
- return 0;
+ return 1;
}
int sftp_cmd_chmod(struct sftp_command *cmd)
printf("%s: %04o -> %04o\n", fname, oldperms, newperms);
sfree(fname);
- return 0;
+ return 1;
}
static int sftp_cmd_open(struct sftp_command *cmd)
return -1; /* this is fatal */
}
do_sftp_init();
+ return 1;
}
static int sftp_cmd_help(struct sftp_command *cmd);
}
}
}
- return 0;
+ return 1;
}
/* ----------------------------------------------------------------------
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));
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;
- printf("quit\n");
+ if ((mode == 0) || (modeflags & 1))
+ printf("quit\n");
return cmd; /* eof */
}
len = linelen + strlen(line + linelen);
break;
}
}
+ if (modeflags & 1) {
+ printf("%s\n", line);
+ }
/*
* Parse the command line into words. The syntax is:
void do_sftp(int mode, int modeflags, char *batchfile)
{
FILE *fp;
+ int ret;
/*
* Batch mode?
* 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");
cmd = sftp_getcmd(fp, mode, modeflags);
if (!cmd)
break;
- if (cmd->obey(cmd) < 0)
+ ret = cmd->obey(cmd);
+ if (ret < 0)
break;
- if (fxp_error() != NULL) {
+ if (ret == 0) {
if (!(modeflags & 2))
break;
}
}
/*
+ * Ask whether to wipe a session log file before writing to it.
+ * Returns 2 for wipe, 1 for append, 0 for cancel (don't log).
+ */
+int askappend(char *filename)
+{
+ HANDLE hin;
+ DWORD savemode, i;
+
+ static const char msgtemplate[] =
+ "The session log file \"%.*s\" already exists.\n"
+ "You can overwrite it with a new session log,\n"
+ "append your session log to the end of it,\n"
+ "or disable session logging for this session.\n"
+ "Enter \"y\" to wipe the file, \"n\" to append to it,\n"
+ "or just press Return to disable logging.\n"
+ "Wipe the log file? (y/n, Return cancels logging) ";
+
+ char line[32];
+
+ fprintf(stderr, msgtemplate, FILENAME_MAX, filename);
+ fflush(stderr);
+
+ hin = GetStdHandle(STD_INPUT_HANDLE);
+ GetConsoleMode(hin, &savemode);
+ SetConsoleMode(hin, (savemode | ENABLE_ECHO_INPUT |
+ ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT));
+ ReadFile(hin, line, sizeof(line) - 1, &i, NULL);
+ SetConsoleMode(hin, savemode);
+
+ if (line[0] == 'y' || line[0] == 'Y')
+ return 2;
+ else if (line[0] == 'n' || line[0] == 'N')
+ return 1;
+ else
+ return 0;
+}
+
+/*
* Warn about the obsolescent key file format.
*/
void old_keyfile_warning(void)
} 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) {
+ } else if (strcmp(argv[i], "-bc") == 0) {
modeflags = modeflags | 1;
- } else if (strcmp(argv[i], "-be") == 0 && i + 1 < argc) {
+ } else if (strcmp(argv[i], "-be") == 0) {
modeflags = modeflags | 2;
} else if (strcmp(argv[i], "--") == 0) {
i++;