X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/putty/blobdiff_plain/2dbd915ad2c977fa0def5fdb2c318f4976a2ecac..6cc170f02be245cb3269b2512f9e8a9373cc0c55:/psftp.c diff --git a/psftp.c b/psftp.c index d395b6f1..c3fb62ae 100644 --- a/psftp.c +++ b/psftp.c @@ -25,6 +25,7 @@ static int psftp_connect(char *userhost, char *user, int portnumber); static int do_sftp_init(void); +void do_sftp_cleanup(); /* ---------------------------------------------------------------------- * sftp client state. @@ -1013,6 +1014,8 @@ int sftp_cmd_chmod(struct sftp_command *cmd) static int sftp_cmd_open(struct sftp_command *cmd) { + int portnumber; + if (back != NULL) { printf("psftp: already connected\n"); return 0; @@ -1023,7 +1026,16 @@ static int sftp_cmd_open(struct sftp_command *cmd) return 0; } - if (psftp_connect(cmd->words[1], NULL, 0)) { + if (cmd->nwords > 2) { + portnumber = atoi(cmd->words[2]); + if (portnumber == 0) { + printf("open: invalid port number\n"); + return 0; + } + } else + portnumber = 0; + + if (psftp_connect(cmd->words[1], NULL, portnumber)) { back = NULL; /* connection is already closed */ return -1; /* this is fatal */ } @@ -1215,7 +1227,7 @@ static struct sftp_cmd_lookup { }, { "open", TRUE, "connect to a host", - " [@]\n" + " [@] []\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", @@ -1404,8 +1416,8 @@ struct sftp_command *sftp_getcmd(FILE *fp, int mode, int modeflags) */ cmd->nwords = cmd->wordssize = 2; cmd->words = sresize(cmd->words, cmd->wordssize, char *); - cmd->words[0] = "!"; - cmd->words[1] = p+1; + cmd->words[0] = dupstr("!"); + cmd->words[1] = dupstr(p+1); } else { /* @@ -1448,10 +1460,11 @@ struct sftp_command *sftp_getcmd(FILE *fp, int mode, int modeflags) cmd->wordssize = cmd->nwords + 16; cmd->words = sresize(cmd->words, cmd->wordssize, char *); } - cmd->words[cmd->nwords++] = q; + cmd->words[cmd->nwords++] = dupstr(q); } } + sfree(line); /* * Now parse the first word and assign a function. */ @@ -1504,6 +1517,25 @@ static int do_sftp_init(void) return 0; } +void do_sftp_cleanup() +{ + char ch; + if (back) { + back->special(backhandle, TS_EOF); + sftp_recvdata(&ch, 1); + back->free(backhandle); + sftp_cleanup_request(); + } + if (pwd) { + sfree(pwd); + pwd = NULL; + } + if (homedir) { + sfree(homedir); + homedir = NULL; + } +} + void do_sftp(int mode, int modeflags, char *batchfile) { FILE *fp; @@ -1522,7 +1554,15 @@ void do_sftp(int mode, int modeflags, char *batchfile) cmd = sftp_getcmd(stdin, 0, 0); if (!cmd) break; - if (cmd->obey(cmd) < 0) + ret = cmd->obey(cmd); + if (cmd->words) { + int i; + for(i = 0; i < cmd->nwords; i++) + sfree(cmd->words[i]); + sfree(cmd->words); + } + sfree(cmd); + if (ret < 0) break; } } else { @@ -1714,7 +1754,7 @@ int sftp_recvdata(char *buf, int len) } int sftp_senddata(char *buf, int len) { - back->send(backhandle, (unsigned char *) buf, len); + back->send(backhandle, buf, len); return 1; } @@ -1725,7 +1765,7 @@ static void usage(void) { printf("PuTTY Secure File Transfer (SFTP) client\n"); printf("%s\n", ver); - printf("Usage: psftp [options] user@host\n"); + printf("Usage: psftp [options] [user@]host\n"); printf("Options:\n"); printf(" -b file use specified batchfile\n"); printf(" -bc output batchfile commands\n"); @@ -1908,6 +1948,8 @@ static int psftp_connect(char *userhost, char *user, int portnumber) } if (verbose && realhost != NULL) printf("Connected to %s\n", realhost); + if (realhost != NULL) + sfree(realhost); return 0; } @@ -1993,13 +2035,16 @@ int psftp_main(int argc, char *argv[]) * it now. */ if (userhost) { - if (psftp_connect(userhost, user, portnumber)) + int ret; + ret = psftp_connect(userhost, user, portnumber); + sfree(userhost); + if (ret) return 1; if (do_sftp_init()) return 1; } else { printf("psftp: no hostname specified; use \"open host.name\"" - " to connect\n"); + " to connect\n"); } do_sftp(mode, modeflags, batchfile); @@ -2010,6 +2055,12 @@ int psftp_main(int argc, char *argv[]) sftp_recvdata(&ch, 1); } random_save_seed(); + cmdline_cleanup(); + console_provide_logctx(NULL); + do_sftp_cleanup(); + backhandle = NULL; + back = NULL; + sk_cleanup(); return 0; }