Fix formatting issues with prompt/memory release.

This commit is contained in:
Ray Hayes 2016-10-22 00:00:25 -07:00
parent 24175599cc
commit 58a582815f
5 changed files with 168 additions and 27 deletions

View File

@ -559,12 +559,12 @@ fileio_fstat(struct w32_io* pio, struct _stat64 *buf) {
int int
fileio_stat(const char *path, struct _stat64 *buf) { fileio_stat(const char *path, struct _stat64 *buf) {
wchar_t* wpath[MAX_PATH]; wchar_t wpath[MAX_PATH];
wchar_t* wtmp = NULL; wchar_t* wtmp = NULL;
if ((wtmp = utf8_to_utf16(path)) == NULL) if ((wtmp = utf8_to_utf16(path)) == NULL)
fatal("failed to covert input arguments"); fatal("failed to covert input arguments");
strcpy(wpath, wtmp); wcscpy(&wpath[0], wtmp);
free(wtmp); free(wtmp);
return _wstat64(wpath, buf); return _wstat64(wpath, buf);

View File

@ -140,4 +140,4 @@ utf16_to_utf8(const wchar_t* utf16) {
WideCharToMultiByte(CP_UTF8, 0, utf16, -1, utf8, needed, NULL, NULL) == 0) WideCharToMultiByte(CP_UTF8, 0, utf16, -1, utf8, needed, NULL, NULL) == 0)
return NULL; return NULL;
return utf8; return utf8;
} }

View File

@ -36,6 +36,7 @@
#include <errno.h> #include <errno.h>
#include <time.h> #include <time.h>
#include <assert.h> #include <assert.h>
#include <direct.h>
/* internal table that stores the fd to w32_io mapping*/ /* internal table that stores the fd to w32_io mapping*/
struct w32fd_table { struct w32fd_table {
@ -438,11 +439,14 @@ int w32_chdir(const char *dirname_utf8) {
char *w32_getcwd(char *buffer, int maxlen) { char *w32_getcwd(char *buffer, int maxlen) {
wchar_t wdirname[MAX_PATH]; wchar_t wdirname[MAX_PATH];
char* putf8 = NULL;
wchar_t *wpwd = _wgetcwd(wdirname, MAX_PATH); wchar_t *wpwd = _wgetcwd(&wdirname[0], MAX_PATH);
if (buffer = utf16_to_utf8(wpwd)) if ((putf8 = utf16_to_utf8(&wdirname[0])) == NULL)
fatal("failed to convert input arguments"); fatal("failed to convert input arguments");
strcpy(buffer, putf8);
free(putf8);
return buffer; return buffer;
} }

181
sftp.c
View File

@ -655,10 +655,38 @@ process_get(struct sftp_conn *conn, char *src, char *dst, char *pwd,
free(tmp); free(tmp);
resume |= global_aflag; resume |= global_aflag;
if (!quiet && resume) if (!quiet && resume)
#ifdef WINDOWS
{
printf("Resuming ");
wchar_t* wtmp = utf8_to_utf16(g.gl_pathv[i]);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), wtmp, wcslen(wtmp), 0, 0);
printf(" to ");
free(wtmp);
wtmp = utf8_to_utf16(abs_dst);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), wtmp, wcslen(wtmp), 0, 0);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), L"\n", 1, 0, 0);
free(wtmp);
}
#else
printf("Resuming %s to %s\n", g.gl_pathv[i], abs_dst); printf("Resuming %s to %s\n", g.gl_pathv[i], abs_dst);
else if (!quiet && !resume) #endif
printf("Fetching %s to %s\n", g.gl_pathv[i], abs_dst); else if (!quiet && !resume)
#ifdef WINDOWS
{
printf("Fetching ");
wchar_t* wtmp = utf8_to_utf16(g.gl_pathv[i]);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), wtmp, wcslen(wtmp), 0, 0);
printf(" to ");
free(wtmp);
wtmp = utf8_to_utf16(abs_dst);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), wtmp, wcslen(wtmp), 0, 0);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), L"\n", 1, 0, 0);
free(wtmp);
}
#else
printf("Fetching %s to %s\n", g.gl_pathv[i], abs_dst);
#endif
if (pathname_is_dir(g.gl_pathv[i]) && (rflag || global_rflag)) { if (pathname_is_dir(g.gl_pathv[i]) && (rflag || global_rflag)) {
if (download_dir(conn, g.gl_pathv[i], abs_dst, NULL, if (download_dir(conn, g.gl_pathv[i], abs_dst, NULL,
pflag || global_pflag, 1, resume, pflag || global_pflag, 1, resume,
@ -745,12 +773,40 @@ process_put(struct sftp_conn *conn, char *src, char *dst, char *pwd,
} }
free(tmp); free(tmp);
resume |= global_aflag; resume |= global_aflag;
if (!quiet && resume) if (!quiet && resume)
#ifdef WINDOWS
{
printf("Resuming upload of ");
wchar_t* wtmp = utf8_to_utf16(g.gl_pathv[i]);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), wtmp, wcslen(wtmp), 0, 0);
printf(" to ");
free(wtmp);
wtmp = utf8_to_utf16(abs_dst);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), wtmp, wcslen(wtmp), 0, 0);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), L"\n", 1, 0, 0);
free(wtmp);
}
#else
printf("Resuming upload of %s to %s\n", g.gl_pathv[i], printf("Resuming upload of %s to %s\n", g.gl_pathv[i],
abs_dst); abs_dst);
#endif
else if (!quiet && !resume) else if (!quiet && !resume)
#ifdef WINDOWS
{
printf("Uploading ");
wchar_t* wtmp = utf8_to_utf16(g.gl_pathv[i]);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), wtmp, wcslen(wtmp), 0, 0);
printf(" to ");
free(wtmp);
wtmp = utf8_to_utf16(abs_dst);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), wtmp, wcslen(wtmp), 0, 0);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), L"\n", 1, 0, 0);
free(wtmp);
}
#else
printf("Uploading %s to %s\n", g.gl_pathv[i], abs_dst); printf("Uploading %s to %s\n", g.gl_pathv[i], abs_dst);
#endif
if (pathname_is_dir(g.gl_pathv[i]) && (rflag || global_rflag)) { if (pathname_is_dir(g.gl_pathv[i]) && (rflag || global_rflag)) {
if (upload_dir(conn, g.gl_pathv[i], abs_dst, if (upload_dir(conn, g.gl_pathv[i], abs_dst,
pflag || global_pflag, 1, resume, pflag || global_pflag, 1, resume,
@ -857,8 +913,7 @@ do_ls_dir(struct sftp_conn *conn, char *path, char *strip_path, int lflag)
wchar_t* wtmp = utf8_to_utf16(lname); wchar_t* wtmp = utf8_to_utf16(lname);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), wtmp, wcslen(wtmp), 0, 0); WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), wtmp, wcslen(wtmp), 0, 0);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), L"\n", 1, 0, 0); WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), L"\n", 1, 0, 0);
free(wtmp);
free(tmp);
#else #else
printf("%s\n", lname); printf("%s\n", lname);
#endif #endif
@ -969,11 +1024,26 @@ do_globbed_ls(struct sftp_conn *conn, char *path, char *strip_path,
} }
lname = ls_file(fname, g.gl_statv[i], 1, lname = ls_file(fname, g.gl_statv[i], 1,
(lflag & LS_SI_UNITS)); (lflag & LS_SI_UNITS));
printf("%s\n", lname); #ifdef WINDOWS
free(lname); wchar_t* wtmp = utf8_to_utf16(lname);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), wtmp, wcslen(wtmp), 0, 0);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), L"\n", 1, 0, 0);
free(wtmp);
#else
printf("%s\n", lname);
#endif
free(lname);
} else { } else {
printf("%-*s", colspace, fname); #ifdef WINDOWS
if (c >= columns) { wchar_t* wtmp = utf8_to_utf16(fname);
// TODO: Deal with the sizing wprintf_s(L"%-*s", colspace, wtmp);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), wtmp, wcslen(wtmp), 0, 0);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), L" ", 1, 0, 0);
free(wtmp);
#else
printf("%-*s", colspace, fname);
#endif
if (c >= columns) {
printf("\n"); printf("\n");
c = 1; c = 1;
} else } else
@ -1500,8 +1570,18 @@ parse_dispatch_command(struct sftp_conn *conn, const char *cmd, char **pwd,
path1 = make_absolute(path1, *pwd); path1 = make_absolute(path1, *pwd);
remote_glob(conn, path1, GLOB_NOCHECK, NULL, &g); remote_glob(conn, path1, GLOB_NOCHECK, NULL, &g);
for (i = 0; g.gl_pathv[i] && !interrupted; i++) { for (i = 0; g.gl_pathv[i] && !interrupted; i++) {
if (!quiet) if (!quiet)
printf("Removing %s\n", g.gl_pathv[i]); #ifdef WINDOWS
{
printf("Removing ");
wchar_t* wtmp = utf8_to_utf16(g.gl_pathv[i]);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), wtmp, wcslen(wtmp), 0, 0);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), L"\n", 1, 0, 0);
free(wtmp);
}
#else
printf("Removing %s\n", g.gl_pathv[i]);
#endif
err = do_rm(conn, g.gl_pathv[i]); err = do_rm(conn, g.gl_pathv[i]);
if (err != 0 && err_abort) if (err != 0 && err_abort)
break; break;
@ -1601,7 +1681,17 @@ parse_dispatch_command(struct sftp_conn *conn, const char *cmd, char **pwd,
remote_glob(conn, path1, GLOB_NOCHECK, NULL, &g); remote_glob(conn, path1, GLOB_NOCHECK, NULL, &g);
for (i = 0; g.gl_pathv[i] && !interrupted; i++) { for (i = 0; g.gl_pathv[i] && !interrupted; i++) {
if (!quiet) if (!quiet)
printf("Changing mode on %s\n", g.gl_pathv[i]); #ifdef WINDOWS
{
printf("Changing mode on ");
wchar_t* wtmp = utf8_to_utf16(g.gl_pathv[i]);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), wtmp, wcslen(wtmp), 0, 0);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), L"\n", 1, 0, 0);
free(wtmp);
}
#else
printf("Changing mode on %s\n", g.gl_pathv[i]);
#endif
err = do_setstat(conn, g.gl_pathv[i], &a); err = do_setstat(conn, g.gl_pathv[i], &a);
if (err != 0 && err_abort) if (err != 0 && err_abort)
break; break;
@ -1631,13 +1721,33 @@ parse_dispatch_command(struct sftp_conn *conn, const char *cmd, char **pwd,
aa->flags &= SSH2_FILEXFER_ATTR_UIDGID; aa->flags &= SSH2_FILEXFER_ATTR_UIDGID;
if (cmdnum == I_CHOWN) { if (cmdnum == I_CHOWN) {
if (!quiet) if (!quiet)
printf("Changing owner on %s\n", #ifdef WINDOWS
g.gl_pathv[i]); {
printf("Changing owner on ");
wchar_t* wtmp = utf8_to_utf16(g.gl_pathv[i]);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), wtmp, wcslen(wtmp), 0, 0);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), L"\n", 1, 0, 0);
free(wtmp);
}
#else
printf("Changing owner on %s\n",
g.gl_pathv[i]);
#endif
aa->uid = n_arg; aa->uid = n_arg;
} else { } else {
if (!quiet) if (!quiet)
printf("Changing group on %s\n", #ifdef WINDOWS
g.gl_pathv[i]); {
printf("Changing group on ");
wchar_t* wtmp = utf8_to_utf16(g.gl_pathv[i]);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), wtmp, wcslen(wtmp), 0, 0);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), L"\n", 1, 0, 0);
free(wtmp);
}
#else
printf("Changing group on %s\n",
g.gl_pathv[i]);
#endif
aa->gid = n_arg; aa->gid = n_arg;
} }
err = do_setstat(conn, g.gl_pathv[i], aa); err = do_setstat(conn, g.gl_pathv[i], aa);
@ -1646,10 +1756,17 @@ parse_dispatch_command(struct sftp_conn *conn, const char *cmd, char **pwd,
} }
break; break;
case I_PWD: case I_PWD:
#ifdef WINDOWS
printf("Remote working directory: "); printf("Remote working directory: ");
wchar_t* wtmp = utf8_to_utf16(*pwd); {
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), wtmp, wcslen(wtmp), 0, 0); wchar_t* wtmp = utf8_to_utf16(*pwd);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), L"\n", 1, 0, 0); WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), wtmp, wcslen(wtmp), 0, 0);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), L"\n", 1, 0, 0);
free(wtmp);
}
#else
printf("Remote working directory: %s\n", *pwd);
#endif
break; break;
case I_LPWD: case I_LPWD:
if (!getcwd(path_buf, sizeof(path_buf))) { if (!getcwd(path_buf, sizeof(path_buf))) {
@ -1657,7 +1774,17 @@ parse_dispatch_command(struct sftp_conn *conn, const char *cmd, char **pwd,
err = -1; err = -1;
break; break;
} }
printf("Local working directory: %s\n", path_buf); #ifdef WINDOWS
printf("Local working directory: ");
{
wchar_t* wtmp = utf8_to_utf16(path_buf);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), wtmp, wcslen(wtmp), 0, 0);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), L"\n", 1, 0, 0);
free(wtmp);
}
#else
printf("Local working directory: %s\n", path_buf);
#endif
break; break;
case I_QUIT: case I_QUIT:
/* Processed below */ /* Processed below */
@ -2110,7 +2237,17 @@ interactive_loop(struct sftp_conn *conn, char *file1, char *file2)
if (remote_is_dir(conn, dir) && file2 == NULL) { if (remote_is_dir(conn, dir) && file2 == NULL) {
if (!quiet) if (!quiet)
printf("Changing to: %s\n", dir); #ifdef WINDOWS
{
printf("Changing to: ");
wchar_t* wtmp = utf8_to_utf16(dir);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), wtmp, wcslen(wtmp), 0, 0);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), L"\n", 1, 0, 0);
free(wtmp);
}
#else
printf("Changing to: %s\n", dir);
#endif
snprintf(cmd, sizeof cmd, "cd \"%s\"", dir); snprintf(cmd, sizeof cmd, "cd \"%s\"", dir);
if (parse_dispatch_command(conn, cmd, if (parse_dispatch_command(conn, cmd,
&remote_path, 1) != 0) { &remote_path, 1) != 0) {