+ return 1;
+}
+
+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();
+ return 1;
+}
+
+static int sftp_cmd_lcd(struct sftp_command *cmd)
+{
+ char *currdir;
+ int len;
+
+ if (cmd->nwords < 2) {
+ printf("lcd: expects a local directory name\n");
+ return 0;
+ }
+
+ if (!SetCurrentDirectory(cmd->words[1])) {
+ LPVOID message;
+ int i;
+ FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL, GetLastError(),
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ (LPTSTR)&message, 0, NULL);
+ i = strcspn((char *)message, "\n");
+ printf("lcd: unable to change directory: %.*s\n", i, (LPCTSTR)message);
+ LocalFree(message);
+ return 0;
+ }
+
+ currdir = smalloc(256);
+ len = GetCurrentDirectory(256, currdir);
+ if (len > 256)
+ currdir = srealloc(currdir, len);
+ GetCurrentDirectory(len, currdir);
+ printf("New local directory is %s\n", currdir);
+ sfree(currdir);
+
+ return 1;
+}
+
+static int sftp_cmd_lpwd(struct sftp_command *cmd)
+{
+ char *currdir;
+ int len;
+
+ currdir = smalloc(256);
+ len = GetCurrentDirectory(256, currdir);
+ if (len > 256)
+ currdir = srealloc(currdir, len);
+ GetCurrentDirectory(len, currdir);
+ printf("Current local directory is %s\n", currdir);
+ sfree(currdir);
+
+ return 1;
+}
+
+static int sftp_cmd_pling(struct sftp_command *cmd)
+{
+ int exitcode;
+
+ exitcode = system(cmd->words[1]);
+ return (exitcode == 0);