#include "psftp.h"
#include "ssh.h"
#include "int64.h"
+#include "winsecur.h"
char *get_ttymode(void *frontend, const char *mode) { return NULL; }
-int get_userpass_input(prompts_t *p, unsigned char *in, int inlen)
+int get_userpass_input(prompts_t *p, const unsigned char *in, int inlen)
{
int ret;
ret = cmdline_get_passwd_input(p, in, inlen);
HANDLE h;
};
-RFile *open_existing_file(char *name, uint64 *size,
- unsigned long *mtime, unsigned long *atime)
+RFile *open_existing_file(const char *name, uint64 *size,
+ unsigned long *mtime, unsigned long *atime,
+ long *perms)
{
HANDLE h;
RFile *ret;
ret = snew(RFile);
ret->h = h;
- if (size)
- size->lo=GetFileSize(h, &(size->hi));
+ if (size) {
+ DWORD lo, hi;
+ lo = GetFileSize(h, &hi);
+ size->lo = lo;
+ size->hi = hi;
+ }
if (mtime || atime) {
FILETIME actime, wrtime;
TIME_WIN_TO_POSIX(wrtime, *mtime);
}
+ if (perms)
+ *perms = -1;
+
return ret;
}
HANDLE h;
};
-WFile *open_new_file(char *name)
+WFile *open_new_file(const char *name, long perms)
{
HANDLE h;
WFile *ret;
return ret;
}
-WFile *open_existing_wfile(char *name, uint64 *size)
+WFile *open_existing_wfile(const char *name, uint64 *size)
{
HANDLE h;
WFile *ret;
ret = snew(WFile);
ret->h = h;
- if (size)
- size->lo=GetFileSize(h, &(size->hi));
+ if (size) {
+ DWORD lo, hi;
+ lo = GetFileSize(h, &hi);
+ size->lo = lo;
+ size->hi = hi;
+ }
return ret;
}
return -1;
}
- SetFilePointer(f->h, offset.lo, &(offset.hi), movemethod);
+ {
+ LONG lo = offset.lo, hi = offset.hi;
+ SetFilePointer(f->h, lo, &hi, movemethod);
+ }
if (GetLastError() != NO_ERROR)
return -1;
uint64 get_file_posn(WFile *f)
{
uint64 ret;
+ LONG lo, hi = 0;
- ret.hi = 0L;
- ret.lo = SetFilePointer(f->h, 0L, &(ret.hi), FILE_CURRENT);
+ lo = SetFilePointer(f->h, 0L, &hi, FILE_CURRENT);
+ ret.lo = lo;
+ ret.hi = hi;
return ret;
}
-int file_type(char *name)
+int file_type(const char *name)
{
DWORD attr;
attr = GetFileAttributes(name);
char *name;
};
-DirHandle *open_directory(char *name)
+DirHandle *open_directory(const char *name)
{
HANDLE h;
WIN32_FIND_DATA fdat;
sfree(dir);
}
-int test_wildcard(char *name, int cmdline)
+int test_wildcard(const char *name, int cmdline)
{
HANDLE fh;
WIN32_FIND_DATA fdat;
char *srcpath;
};
-/*
- * Return a pointer to the portion of str that comes after the last
- * slash (or backslash or colon, if `local' is TRUE).
- */
-static char *stripslashes(char *str, int local)
+char *stripslashes(const char *str, int local)
{
char *p;
+ /*
+ * On Windows, \ / : are all path component separators.
+ */
+
if (local) {
p = strchr(str, ':');
if (p) str = p+1;
if (p) str = p+1;
}
- return str;
+ return (char *)str;
}
-WildcardMatcher *begin_wildcard_matching(char *name)
+WildcardMatcher *begin_wildcard_matching(const char *name)
{
HANDLE h;
WIN32_FIND_DATA fdat;
sfree(dir);
}
-int vet_filename(char *name)
+int vet_filename(const char *name)
{
if (strchr(name, '/') || strchr(name, '\\') || strchr(name, ':'))
return FALSE;
return TRUE;
}
-int create_directory(char *name)
+int create_directory(const char *name)
{
return CreateDirectory(name, NULL) != 0;
}
-char *dir_file_cat(char *dir, char *file)
+char *dir_file_cat(const char *dir, const char *file)
{
return dupcat(dir, "\\", file, NULL);
}
int do_eventsel_loop(HANDLE other_event)
{
int n, nhandles, nallhandles, netindex, otherindex;
- long next, ticks;
+ unsigned long next, then;
+ long ticks;
HANDLE *handles;
SOCKET *sklist;
int skcount;
- long now = GETTICKCOUNT();
+ unsigned long now = GETTICKCOUNT();
- if (run_timers(now, &next)) {
- ticks = next - GETTICKCOUNT();
- if (ticks < 0) ticks = 0; /* just in case */
+ if (toplevel_callback_pending()) {
+ ticks = 0;
+ next = now;
+ } else if (run_timers(now, &next)) {
+ then = now;
+ now = GETTICKCOUNT();
+ if (now - then > next - then)
+ ticks = 0;
+ else
+ ticks = next - now;
} else {
ticks = INFINITE;
+ /* no need to initialise next here because we can never get
+ * WAIT_TIMEOUT */
}
handles = handle_get_events(&nhandles);
sfree(handles);
+ run_toplevel_callbacks();
+
if (n == WAIT_TIMEOUT) {
now = next;
} else {
if (p_WSAEventSelect == NULL) {
fd_set readfds;
int ret;
- long now = GETTICKCOUNT();
+ unsigned long now = GETTICKCOUNT(), then;
if (sftp_ssh_socket == INVALID_SOCKET)
return -1; /* doom */
select_result((WPARAM) sftp_ssh_socket, (LPARAM) FD_WRITE);
do {
- long next, ticks;
+ unsigned long next;
+ long ticks;
struct timeval tv, *ptv;
if (run_timers(now, &next)) {
- ticks = next - GETTICKCOUNT();
- if (ticks <= 0)
- ticks = 1; /* just in case */
+ then = now;
+ now = GETTICKCOUNT();
+ if (now - then > next - then)
+ ticks = 0;
+ else
+ ticks = next - now;
tv.tv_sec = ticks / 1000;
tv.tv_usec = ticks % 1000 * 1000;
ptv = &tv;
return 0;
}
-char *ssh_sftp_get_cmdline(char *prompt, int no_fds_ok)
+char *ssh_sftp_get_cmdline(const char *prompt, int no_fds_ok)
{
int ret;
struct command_read_ctx actx, *ctx = &actx;
DWORD threadid;
+ HANDLE hThread;
fputs(prompt, stdout);
fflush(stdout);
ctx->event = CreateEvent(NULL, FALSE, FALSE, NULL);
ctx->line = NULL;
- if (!CreateThread(NULL, 0, command_read_thread,
- ctx, 0, &threadid)) {
+ hThread = CreateThread(NULL, 0, command_read_thread, ctx, 0, &threadid);
+ if (!hThread) {
+ CloseHandle(ctx->event);
fprintf(stderr, "Unable to create command input thread\n");
cleanup_exit(1);
}
assert(ret >= 0);
} while (ret == 0);
+ CloseHandle(hThread);
+ CloseHandle(ctx->event);
+
return ctx->line;
}
+void platform_psftp_post_option_setup(void)
+{
+#if !defined UNPROTECT && !defined NO_SECURITY
+ /*
+ * Protect our process.
+ */
+ {
+ char *error = NULL;
+ if (!setprocessacl(error)) {
+ char *message = dupprintf("Could not restrict process ACL: %s",
+ error);
+ logevent(NULL, message);
+ sfree(message);
+ sfree(error);
+ }
+ }
+#endif
+}
+
/* ----------------------------------------------------------------------
* Main program. Parse arguments etc.
*/