static Backend *back;
static void *backhandle;
static Conf *conf;
+int sent_eof = FALSE;
/* ----------------------------------------------------------------------
* Higher-level helper functions used in commands.
printf("%s: reading directory: %s\n", swcm->prefix,
fxp_error());
return NULL;
- }
+ } else if (swcm->names->nnames == 0) {
+ /*
+ * Another failure mode which we treat as EOF is if
+ * the server reports success from FXP_READDIR but
+ * returns no actual names. This is unusual, since
+ * from most servers you'd expect at least "." and
+ * "..", but there's nothing forbidding a server from
+ * omitting those if it wants to.
+ */
+ return NULL;
+ }
swcm->namepos = 0;
}
if (back != NULL && back->connected(backhandle)) {
char ch;
back->special(backhandle, TS_EOF);
+ sent_eof = TRUE;
sftp_recvdata(&ch, 1);
}
do_sftp_cleanup();
* >this has "quotes" in<
* >and"this"<
*/
- while (*p) {
+ while (1) {
/* skip whitespace */
while (*p && (*p == ' ' || *p == '\t'))
p++;
+ /* terminate loop */
+ if (!*p)
+ break;
/* mark start of word */
q = r = p; /* q sits at start, r writes word */
quoting = 0;
char ch;
if (back) {
back->special(backhandle, TS_EOF);
+ sent_eof = TRUE;
sftp_recvdata(&ch, 1);
back->free(backhandle);
sftp_cleanup_request();
assert(!"Unexpected call to from_backend_untrusted()");
return 0; /* not reached */
}
+int from_backend_eof(void *frontend)
+{
+ /*
+ * We expect to be the party deciding when to close the
+ * connection, so if we see EOF before we sent it ourselves, we
+ * should panic.
+ */
+ if (!sent_eof) {
+ connection_fatal(frontend,
+ "Received unexpected end-of-file from SFTP server");
+ }
+ return FALSE;
+}
int sftp_recvdata(char *buf, int len)
{
outptr = (unsigned char *) buf;
if (flags & FLAG_VERBOSE)
verbose = 1;
} else if (strcmp(argv[i], "-h") == 0 ||
- strcmp(argv[i], "-?") == 0) {
+ strcmp(argv[i], "-?") == 0 ||
+ strcmp(argv[i], "--help") == 0) {
usage();
} else if (strcmp(argv[i], "-pgpfp") == 0) {
pgp_fingerprints();
return 1;
- } else if (strcmp(argv[i], "-V") == 0) {
+ } else if (strcmp(argv[i], "-V") == 0 ||
+ strcmp(argv[i], "--version") == 0) {
version();
} else if (strcmp(argv[i], "-batch") == 0) {
console_batch_mode = 1;
if (back != NULL && back->connected(backhandle)) {
char ch;
back->special(backhandle, TS_EOF);
+ sent_eof = TRUE;
sftp_recvdata(&ch, 1);
}
do_sftp_cleanup();