#include <stdio.h>
#include <string.h>
#include <time.h>
+#include <assert.h>
/* GUI Adaptation - Sept 2000 */
#include <winuser.h>
#include <winbase.h>
static char statname[NAME_STR_MAX+1];
static unsigned long statsize = 0;
static int statperct = 0;
-static time_t statelapsed = 0;
+static unsigned long statelapsed = 0;
static int gui_mode = 0;
static char *gui_hwnd = NULL;
static void tell_user(FILE *stream, char *fmt, ...);
static void send_char_msg(unsigned int msg_id, char c);
static void send_str_msg(unsigned int msg_id, char *str);
-static void gui_update_stats(char *name, unsigned long size, int percentage, time_t elapsed);
+static void gui_update_stats(char *name, unsigned long size,
+ int percentage, unsigned long elapsed);
-void begin_session(void) { }
void logevent(char *string) { }
+void ldisc_send(char *buf, int len) {
+ /*
+ * This is only here because of the calls to ldisc_send(NULL,
+ * 0) in ssh.c. Nothing in PSCP actually needs to use the ldisc
+ * as an ldisc. So if we get called with any real data, I want
+ * to know about it.
+ */
+ assert(len == 0);
+}
+
void verify_ssh_host_key(char *host, int port, char *keytype,
char *keystr, char *fingerprint) {
int ret;
tell_str(stream, str);
}
-static void gui_update_stats(char *name, unsigned long size, int percentage, time_t elapsed)
+static void gui_update_stats(char *name, unsigned long size, int percentage, unsigned long elapsed)
{
unsigned int i;
if (len > 0) {
if (pendsize < pendlen + len) {
pendsize = pendlen + len + 4096;
- pending = (pending ? realloc(pending, pendsize) :
- malloc(pendsize));
+ pending = (pending ? srealloc(pending, pendsize) :
+ smalloc(pendsize));
if (!pending)
fatalbox("Out of memory");
}
pendlen -= pendused;
if (pendlen == 0) {
pendsize = 0;
- free(pending);
+ sfree(pending);
pending = NULL;
}
if (outlen == 0)
strcat(str, "\n");
tell_str(stderr, str);
- if (back->socket() != NULL) {
+ if (back != NULL && back->socket() != NULL) {
char ch;
back->special(TS_EOF);
ssh_scp_recv(&ch, 1);
static void do_cmd(char *host, char *user, char *cmd)
{
char *err, *realhost;
+ DWORD namelen;
if (host == NULL || host[0] == '\0')
bump("Empty host name");
strncpy(cfg.username, user, sizeof(cfg.username)-1);
cfg.username[sizeof(cfg.username)-1] = '\0';
} else if (cfg.username[0] == '\0') {
- bump("Empty user name");
+ namelen = 0;
+ if (GetUserName(user, &namelen) == FALSE)
+ bump("Empty user name");
+ user = smalloc(namelen * sizeof(char));
+ GetUserName(user, &namelen);
+ if (verbose) tell_user(stderr, "Guessing user name: %s", user);
+ strncpy(cfg.username, user, sizeof(cfg.username)-1);
+ cfg.username[sizeof(cfg.username)-1] = '\0';
+ free(user);
}
if (cfg.protocol != PROT_SSH)
/* GUI Adaptation - Sept 2000 */
if (gui_mode)
- gui_update_stats(name, size, ((done *100) / size), now-start);
+ gui_update_stats(name, size, (int)(100 * (done*1.0/size)),
+ (unsigned long)difftime(now, start));
else {
if (now > start)
ratebs = (float) done / (now - start);
if (sscanf(buf+1, "%u %lu %[^\n]", &mode, &size, namebuf) != 3)
bump("Protocol error: Illegal file descriptor format");
/* Security fix: ensure the file ends up where we asked for it. */
- if (src) {
- char *p = src + strlen(src);
- while (p > src && p[-1] != '/' && p[-1] != '\\')
- p--;
- strcpy(namebuf, p);
- }
if (targisdir) {
char t[2048];
char *p;
do {
char *last;
char namebuf[2048];
+ /*
+ * Ensure that . and .. are never matched by wildcards,
+ * but only by deliberate action.
+ */
+ if (!strcmp(fdat.cFileName, ".") ||
+ !strcmp(fdat.cFileName, "..")) {
+ /*
+ * Find*File has returned a special dir. We require
+ * that _either_ `src' ends in a backslash followed
+ * by that string, _or_ `src' is precisely that
+ * string.
+ */
+ int len = strlen(src), dlen = strlen(fdat.cFileName);
+ if (len == dlen && !strcmp(src, fdat.cFileName)) {
+ /* ok */;
+ } else if (len > dlen+1 && src[len-dlen-1] == '\\' &&
+ !strcmp(src+len-dlen, fdat.cFileName)) {
+ /* ok */;
+ } else
+ continue; /* ignore this one */
+ }
if (strlen(src) + strlen(fdat.cFileName) >=
sizeof(namebuf)) {
tell_user(stderr, "%s: Name too long", src);
printf(" -v show verbose messages\n");
printf(" -P port connect to specified port\n");
printf(" -pw passw login with specified password\n");
- /* GUI Adaptation - Sept 2000 */
+#if 0
+ /*
+ * -gui is an internal option, used by GUI front ends to get
+ * pscp to pass progress reports back to them. It's not an
+ * ordinary user-accessible option, so it shouldn't be part of
+ * the command-line help. The only people who need to know
+ * about it are programmers, and they can read the source.
+ */
printf(" -gui hWnd GUI mode with the windows handle for receiving messages\n");
+#endif
exit(1);
}
}
argc -= i;
argv += i;
+ back = NULL;
if (list) {
if (argc != 1)
tolocal(argc, argv);
}
- if (back->socket() != NULL) {
+ if (back != NULL && back->socket() != NULL) {
char ch;
back->special(TS_EOF);
ssh_scp_recv(&ch, 1);