* send buffer.
*/
+static int psftp_connect(char *userhost, char *user, int portnumber);
+static void do_sftp_init(void);
+
/* ----------------------------------------------------------------------
* sftp client state.
*/
char *dir, *cdir;
int i;
+ if (back == NULL) {
+ printf("psftp: not connected to a host; use \"open host.name\"\n");
+ return 0;
+ }
+
if (cmd->nwords < 2)
dir = ".";
else
struct fxp_handle *dirh;
char *dir;
+ if (back == NULL) {
+ printf("psftp: not connected to a host; use \"open host.name\"\n");
+ return 0;
+ }
+
if (cmd->nwords < 2)
dir = dupstr(homedir);
else
*/
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);
return 0;
}
uint64 offset;
FILE *fp;
+ if (back == NULL) {
+ printf("psftp: not connected to a host; use \"open host.name\"\n");
+ return 0;
+ }
+
if (cmd->nwords < 2) {
printf("get: expects a filename\n");
return 0;
uint64 offset;
FILE *fp;
+ if (back == NULL) {
+ printf("psftp: not connected to a host; use \"open host.name\"\n");
+ return 0;
+ }
+
if (cmd->nwords < 2) {
printf("put: expects a filename\n");
return 0;
char *dir;
int result;
+ if (back == NULL) {
+ printf("psftp: not connected to a host; use \"open host.name\"\n");
+ return 0;
+ }
if (cmd->nwords < 2) {
printf("mkdir: expects a directory\n");
char *dir;
int result;
+ if (back == NULL) {
+ printf("psftp: not connected to a host; use \"open host.name\"\n");
+ return 0;
+ }
if (cmd->nwords < 2) {
printf("rmdir: expects a directory\n");
char *fname;
int result;
+ if (back == NULL) {
+ printf("psftp: not connected to a host; use \"open host.name\"\n");
+ return 0;
+ }
+
if (cmd->nwords < 2) {
printf("rm: expects a filename\n");
return 0;
char *srcfname, *dstfname;
int result;
+ if (back == NULL) {
+ printf("psftp: not connected to a host; use \"open host.name\"\n");
+ return 0;
+ }
+
if (cmd->nwords < 3) {
printf("mv: expects two filenames\n");
return 0;
struct fxp_attrs attrs;
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) {
printf("chmod: expects a mode specifier and a filename\n");
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 struct sftp_cmd_lookup {
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",
"\n"
" Print the current remote working directory for your SFTP session.\n",
return cmd;
}
-void do_sftp(int mode, int modeflags, char *batchfile)
+static void do_sftp_init(void)
{
- FILE *fp;
-
/*
* Do protocol initialisation.
*/
printf("Remote working directory is %s\n", homedir);
}
pwd = dupstr(homedir);
+}
+
+void do_sftp(int mode, int modeflags, char *batchfile)
+{
+ FILE *fp;
/*
* Batch mode?
vsprintf(str + strlen(str), fmt, ap);
va_end(ap);
strcat(str, "\n");
- fprintf(stderr, str);
+ fputs(stderr, str);
exit(1);
}
vsprintf(str + strlen(str), fmt, ap);
va_end(ap);
strcat(str, "\n");
- fprintf(stderr, str);
+ fputs(stderr, str);
exit(1);
}
}
/*
- * 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;
- int portnumber = 0;
- char *user, *host, *userhost, *realhost;
+ char *host, *realhost;
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 */
host = userhost;
err = back->init(cfg.host, cfg.port, &realhost, 0);
if (err != NULL) {
- fprintf(stderr, "ssh_init: %s", err);
+ fprintf(stderr, "ssh_init: %s\n", err);
return 1;
}
ssh_sftp_init();
if (verbose && realhost != NULL)
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);