diff --git a/contrib/win32/openssh/win32iocompat.vcxproj b/contrib/win32/openssh/win32iocompat.vcxproj
index 43bedc5..ed569cc 100644
--- a/contrib/win32/openssh/win32iocompat.vcxproj
+++ b/contrib/win32/openssh/win32iocompat.vcxproj
@@ -150,6 +150,7 @@
+
diff --git a/contrib/win32/openssh/win32iocompat.vcxproj.filters b/contrib/win32/openssh/win32iocompat.vcxproj.filters
index 31d0e0d..5c4975b 100644
--- a/contrib/win32/openssh/win32iocompat.vcxproj.filters
+++ b/contrib/win32/openssh/win32iocompat.vcxproj.filters
@@ -7,9 +7,10 @@
-
-
-
+
+
+
+
@@ -49,13 +50,9 @@
inc\sys
-
- inc
-
-
- inc
-
-
+
+
+
diff --git a/contrib/win32/win32compat/inc/defs.h b/contrib/win32/win32compat/inc/defs.h
index 7f49745..9338000 100644
--- a/contrib/win32/win32compat/inc/defs.h
+++ b/contrib/win32/win32compat/inc/defs.h
@@ -47,9 +47,10 @@
#define W32_SIGTERM 8
#define W32_SIGTTIN 9
#define W32_SIGTTOU 10
-#define W32_SIGWINCH 11
+#define W32_SIGWINCH 11
#define W32_SIGMAX 12
+#define W32_SIGSTOP 13
/* singprocmask "how" codes*/
#define SIG_BLOCK 0
diff --git a/contrib/win32/win32compat/inc/signal.h b/contrib/win32/win32compat/inc/signal.h
index f99d990..71bfc97 100644
--- a/contrib/win32/win32compat/inc/signal.h
+++ b/contrib/win32/win32compat/inc/signal.h
@@ -12,6 +12,7 @@
#define mysignal(a,b) w32_signal((a), (b))
#define raise(a) w32_raise(a)
#define kill(a,b) w32_kill((a), (b))
+#define ftruncate(a, b) w32_ftruncate((a), (b))
#define sigprocmask(a,b,c) w32_sigprocmask((a), (b), (c))
#define SIGINT W32_SIGINT
@@ -26,6 +27,7 @@
#define SIGTTIN W32_SIGTTIN
#define SIGTTOU W32_SIGTTOU
#define SIGWINCH W32_SIGWINCH
+#define SIGSTOP W32_SIGSTOP
#define SIG_DFL W32_SIG_DFL
#define SIG_IGN W32_SIG_IGN
diff --git a/contrib/win32/win32compat/inc/sys/wait.h b/contrib/win32/win32compat/inc/sys/wait.h
index 25ad69f..312486b 100644
--- a/contrib/win32/win32compat/inc/sys/wait.h
+++ b/contrib/win32/win32compat/inc/sys/wait.h
@@ -13,5 +13,7 @@
#define WIFSIGNALED(w) FALSE
#define WEXITSTATUS(w) w
#define WTERMSIG(w) -1
+#define WNOHANG 1
+#define WUNTRACED 2
int waitpid(int pid, int *status, int options);
\ No newline at end of file
diff --git a/contrib/win32/win32compat/inc/w32posix.h b/contrib/win32/win32compat/inc/w32posix.h
index 3e21515..874ddeb 100644
--- a/contrib/win32/win32compat/inc/w32posix.h
+++ b/contrib/win32/win32compat/inc/w32posix.h
@@ -9,6 +9,15 @@
#include
#include "defs.h"
+#ifndef _OFF_T_DEFINED
+#define _OFF_T_DEFINED
+
+typedef long _off_t; // file offset value
+
+#if !__STDC__
+typedef _off_t off_t;
+#endif
+#endif
typedef struct w32_fd_set_ {
unsigned char bitmap[MAX_FDS >> 3];
@@ -73,6 +82,7 @@ int w32_sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
int w32_raise(int sig);
int w32_kill(int pid, int sig);
FILE* w32_fopen_utf8(const char *, const char *);
+int w32_ftruncate(int fd, off_t length);
/* Shutdown constants */
#define SHUT_WR SD_SEND
diff --git a/contrib/win32/win32compat/includes/sys/param.h b/contrib/win32/win32compat/includes/sys/param.h
index 2607d96..8668601 100644
--- a/contrib/win32/win32compat/includes/sys/param.h
+++ b/contrib/win32/win32compat/includes/sys/param.h
@@ -4,8 +4,17 @@
/* Compatibility header to avoid lots of #ifdef _WIN32's in includes.h */
typedef unsigned int uid_t;
typedef unsigned int gid_t;
-//typedef size_t _off_t;
-typedef size_t off_t;
+
+#ifndef _OFF_T_DEFINED
+#define _OFF_T_DEFINED
+
+typedef long _off_t; // file offset value
+
+#if !__STDC__
+typedef _off_t off_t;
+#endif
+#endif
+
typedef _dev_t dev_t;
diff --git a/contrib/win32/win32compat/w32fd.c b/contrib/win32/win32compat/w32fd.c
index d6da8aa..45c4e4e 100644
--- a/contrib/win32/win32compat/w32fd.c
+++ b/contrib/win32/win32compat/w32fd.c
@@ -846,4 +846,18 @@ w32_raise(int sig) {
int
w32_kill(int pid, int sig) {
return sw_kill(pid, sig);
+}
+
+int
+w32_ftruncate(int fd, off_t length) {
+ CHECK_FD(fd);
+
+ if (!SetEndOfFile(w32_fd_to_handle(fd)))
+ return -1;
+ if (!SetFileValidData(w32_fd_to_handle(fd), length))
+ return -1;
+ if (!SetFilePointer(w32_fd_to_handle(fd), 0, 0, FILE_BEGIN))
+ return -1;
+
+ return 0;
}
\ No newline at end of file
diff --git a/win32_dirent.c b/contrib/win32/win32compat/win32_dirent.c
similarity index 100%
rename from win32_dirent.c
rename to contrib/win32/win32compat/win32_dirent.c
index c5337bc..7c5a5c2 100644
--- a/win32_dirent.c
+++ b/contrib/win32/win32compat/win32_dirent.c
@@ -2,11 +2,11 @@
// directory entry functions in Windows platform like Ubix/Linux
// opendir(), readdir(), closedir().
+#include
#include
#include
#include
#include
-#include
#include "win32_dirent.h"
diff --git a/win32_dirent.h b/contrib/win32/win32compat/win32_dirent.h
similarity index 95%
rename from win32_dirent.h
rename to contrib/win32/win32compat/win32_dirent.h
index 2b2bec6..3859889 100644
--- a/win32_dirent.h
+++ b/contrib/win32/win32compat/win32_dirent.h
@@ -8,7 +8,8 @@
#define __DIRENT_H__
#include
-#include
+#include
+#include
// Windows directory structure content
struct dirent {
diff --git a/defines.h b/defines.h
index 14b3bc3..2dd7432 100644
--- a/defines.h
+++ b/defines.h
@@ -172,6 +172,8 @@ enum
# define S_IRWXU 0000700 /* read, write, execute */
# define S_IRWXG 0000070 /* read, write, execute */
# define S_IRWXO 0000007 /* read, write, execute */
+# define S_ISUID 0x800
+# define S_ISGID 0x400
#endif /* S_IXUSR */
#if !defined(MAP_ANON) && defined(MAP_ANONYMOUS)
diff --git a/scp.c b/scp.c
index 76cfd85..692e017 100644
--- a/scp.c
+++ b/scp.c
@@ -73,6 +73,14 @@
#include "includes.h"
+#ifndef WINDOWS
+#include
+#else
+#include
+#include
+#include "win32_dirent.h"
+#endif
+
#include
#include
#ifdef HAVE_SYS_STAT_H
@@ -93,10 +101,6 @@
#include
-#ifndef WINDOWS
-#include
-#endif
-
#include
#include
#include
@@ -119,7 +123,7 @@
#include "misc.h"
#include "progressmeter.h"
-#ifdef WIN32_VS
+#ifdef WINDOWS
#include
#endif
extern char *__progname;
@@ -284,17 +288,16 @@ CHAR g_HomeDir[MAX_PATH];
CHAR g_FSRoot[MAX_PATH];
int isRootedPath = 0; // set to 1 if we prepend a home root
-char *TranslatePath(char *, bool *bDirSpec);
int start_process_io(char *exename, char **argv, char **envv,
HANDLE StdInput, HANDLE StdOutput, HANDLE StdError,
unsigned long CreateFlags, PROCESS_INFORMATION *pi,
char *homedir, char *lpDesktop);
#ifdef WINDOWS
-
-// InitForMicrosoftWindows() will initialize Unix like settings in Windows operating system.
struct passwd pw;
char username[128];
+
+// InitForMicrosoftWindows() will initialize Unix like settings in Windows operating system.
int InitForMicrosoftWindows()
{
int rc;
@@ -547,44 +550,6 @@ SCPDIR * scp_opendir(char *name)
}
}
-/* Close the directory stream SCPDIRP.
- Return 0 if successful, -1 if not. */
-int closedir(SCPDIR *dirp)
-{
- if ( dirp && (dirp->hFile) ) {
- _findclose( dirp->hFile );
- dirp->hFile = 0;
- free (dirp);
- }
-
- return 0;
-}
-
-/* Read a directory entry from SCPDIRP.
- Return a pointer to a `struct scp_dirent' describing the entry,
- or NULL for EOF or error. The storage returned may be overwritten
- by a later readdir call on the same SCPDIR stream. */
-struct scp_dirent *readdir(SCPDIR *dirp)
-{
- struct scp_dirent *pdirentry;
-
- for (;;) {
- if ( _findnext( dirp->hFile, &(dirp->c_file) ) == 0 ) {
- if ( ( strcmp (dirp->c_file.name,".") == 0 ) ||
- ( strcmp (dirp->c_file.name,"..") == 0 ) ) {
- continue ;
- }
- pdirentry = (struct scp_dirent *)malloc( sizeof(struct scp_dirent) );
- pdirentry->d_name = dirp->c_file.name ;
- pdirentry->d_ino = 1; // a fictious one like UNIX to say it is nonzero
- return pdirentry ;
- }
- else {
- return (struct scp_dirent *) NULL;
- }
- }
-}
-
int _utimedir (char *name, struct _utimbuf *filetime)
{
int rc, chandle;
@@ -610,33 +575,59 @@ int _utimedir (char *name, struct _utimbuf *filetime)
// end of direntry functions
HANDLE hprocess=(HANDLE) 0; // we made it a global to stop child process(ssh) of scp
#else
+
+/* Read a directory entry from SCPDIRP.
+Return a pointer to a `struct scp_dirent' describing the entry,
+or NULL for EOF or error. The storage returned may be overwritten
+by a later readdir call on the same SCPDIR stream. */
+struct scp_dirent *readdir(SCPDIR *dirp)
+{
+ struct scp_dirent *pdirentry;
+
+ for (;;) {
+ if (_findnext(dirp->hFile, &(dirp->c_file)) == 0) {
+ if ((strcmp(dirp->c_file.name, ".") == 0) ||
+ (strcmp(dirp->c_file.name, "..") == 0)) {
+ continue;
+ }
+ pdirentry = (struct scp_dirent *)malloc(sizeof(struct scp_dirent));
+ pdirentry->d_name = dirp->c_file.name;
+ pdirentry->d_ino = 1; // a fictious one like UNIX to say it is nonzero
+ return pdirentry;
+ }
+ else {
+ return (struct scp_dirent *) NULL;
+ }
+ }
+}
+#endif
+
static void
killchild(int signo)
{
- if (do_cmd_pid > 1) {
- kill(do_cmd_pid, signo ? signo : SIGTERM);
- waitpid(do_cmd_pid, NULL, 0);
- }
+ if (do_cmd_pid > 1) {
+ kill(do_cmd_pid, signo ? signo : SIGTERM);
+ waitpid(do_cmd_pid, NULL, 0);
+ }
- if (signo)
- _exit(1);
- exit(1);
+ if (signo)
+ _exit(1);
+ exit(1);
}
static void
suspchild(int signo)
{
- int status;
+ int status;
- if (do_cmd_pid > 1) {
- kill(do_cmd_pid, signo);
- while (waitpid(do_cmd_pid, &status, WUNTRACED) == -1 &&
- errno == EINTR)
- ;
- kill(getpid(), SIGSTOP);
- }
+ if (do_cmd_pid > 1) {
+ kill(do_cmd_pid, signo);
+ while (waitpid(do_cmd_pid, &status, WUNTRACED) == -1 &&
+ errno == EINTR)
+ ;
+ kill(getpid(), SIGSTOP);
+ }
}
-#endif
static int
do_local_cmd(arglist *a)
@@ -1449,735 +1440,7 @@ tolocal(int argc, char **argv)
remin = remout = -1;
}
}
-#ifdef WIN32_FIXME
-void
-source(int argc, char *argv[])
-{
- struct stat stb;
- static BUF buffer;
- BUF *bp;
- off_t i;
- int haderr;
- size_t amt, indx, result;
- int fd;
- char *last, *name, buf[16384];
- unsigned short locfmode;
- char * originalname = NULL;
- char aggregatePath[MAX_PATH] = "";
- char * pArgPath;
- bool bDirSpec = false;
- char * filenames[1024];
- int numfiles = 0;
-
- WIN32_FIND_DATA FindFileData;
- HANDLE hFind;
-
- char FileRoot[MAX_PATH];
- bool bHasRoot = false;
-
- for (indx = 0; indx < (size_t)argc; ++indx) {
- if (strchr(argv[indx],'*'))
- {
- bHasRoot = getRootFrompath(argv[indx],FileRoot);
-
- if (1){//!iamremote) {
- hFind = FindFirstFile(argv[indx], &FindFileData);
- if (hFind != INVALID_HANDLE_VALUE){
-
- do {
- if (!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
- if (bHasRoot)
- {
- filenames[numfiles] = (char *)malloc(MAX_PATH);
- sprintf(filenames[numfiles++],"%s/%s",FileRoot,FindFileData.cFileName);
- }
- else
- filenames[numfiles++] = strdup(FindFileData.cFileName);
-
- if (numfiles >= 1024)
- {
- break;
- }
- }
- while (FindNextFile(hFind,&FindFileData));
- FindClose(hFind);
- }
-
- }
- // expand
- }
- else
- filenames[numfiles++] = strdup(argv[indx]);
-
- if (numfiles >= 1024)
- break;
- }
-
-
- // loop through filenames list
- for (indx = 0; indx < (size_t)numfiles; ++indx) {
-
- {
- pArgPath = filenames[indx];
- }
-
- originalname = pArgPath;
- name = TranslatePath(pArgPath, &bDirSpec);
- if (name == NULL)
- {
-// strerror_s(buf, EPERM);
- strerror_s(buf, sizeof(buf), ENOENT);
- run_err("%s: %s", pArgPath, buf);
- continue;
- }
-
- if (_sopen_s(&fd, name, O_RDONLY | O_BINARY, _SH_DENYNO, 0) != 0) {
- // in NT, we have to check if it is a directory
- if (stat(name, &stb) >= 0) {
- goto switchpoint;
- }
- else
- goto syserr;
- }
-
- if (_fstati64(fd, &stb) < 0) {
-syserr:
- strerror_s(buf, sizeof(buf), errno);
- run_err("%s: %s", originalname, buf);
- goto next;
- }
-switchpoint:
- switch (stb.st_mode & _S_IFMT) {
- case _S_IFREG:
- break;
- case _S_IFDIR:
- if (iamrecursive) {
- rsource(name, &stb);
- goto next;
- }
- /* FALLTHROUGH */
- default:
- run_err("%s: not a regular file", name);
- goto next;
- }
-
- last = getfilenamefrompath(originalname);
-
- if (pflag) {
- /*
- * Make it compatible with possible future
- * versions expecting microseconds.
- */
- (void)sprintf_s(buf, sizeof(buf), "T%lu 0 %lu 0\n",
- (unsigned long)stb.st_mtime,
- (unsigned long)stb.st_atime);
- (void)_write(remout, buf, (unsigned int)strlen(buf));
- if (response() < 0)
- goto next;
- }
-//CHECK #define FILEMODEMASK (S_ISUID|S_ISGID|S_IRWXU|S_IRWXG|S_IRWXO)
-//#define FILEMODEMASK (S_IRWXU|S_IRWXG|S_IRWXO)
-#define FILEMODEMASK (S_IREAD|S_IWRITE|S_IEXEC)
- locfmode = stb.st_mode & FILEMODEMASK;
- locfmode |= ((locfmode & _S_IREAD) >> 3); // group access, just read bit now
- locfmode |= ((locfmode & _S_IREAD) >> 6); // world access, just read bit now
-
-
- (void)sprintf_s(buf, sizeof(buf), "C%04o %I64u %s\n",
- (unsigned int)(locfmode), //(stb.st_mode & FILEMODEMASK),
- (u_int64_t)stb.st_size,
- last);
- if (scpverbose)
- {
- fprintf(stderr, "Sending file modes: %s", buf);
- fflush(stderr);
- }
- (void)_write(remout, buf, (unsigned int)strlen(buf));
- if (response() < 0)
- goto next;
- if ((bp = allocbuf(&buffer, fd, 16384)) == NULL) {
-next: if (fd != -1) (void)_close(fd);
- continue;
- }
-#ifdef WITH_SCP_STATS
- if (!iamremote && statistics)
- {
- statbytes = 0;
- ratebs = 0.0;
- stat_starttime = time(NULL);
- stat_starttimems = GetTickCount();
- }
-#endif /* WITH_SCP_STATS */
-
- /* Keep writing after an error so that we stay sync'd up. */
- for (haderr = 0, i = 0; i < (size_t)stb.st_size; i += bp->cnt) {
- amt = bp->cnt;
- if (i + amt > (size_t)stb.st_size)
- amt = (size_t)(stb.st_size - i);
- if (!haderr) {
- result = _read(fd, bp->buf, (unsigned int)amt);
- if (result != amt)
- haderr = result >= 0 ? EIO : errno;
- }
- if (haderr)
- {
- (void)_write(remout, bp->buf, (unsigned int)amt);
-#ifdef WITH_SCP_STATS
- if (!iamremote && statistics)
- {
- if ((time(NULL) - stat_lasttime) > 0)
- {
- int bwritten;
- bwritten = fprintf(SOME_STATS_FILE,
- "\r%s : ERROR..continuing to end of file anyway", last);
- stats_fixlen(bwritten);
- fflush(SOME_STATS_FILE);
- stat_lasttime = time(NULL);
- }
- }
-#endif /* WITH_SCP_STATS */
- }
- else {
- result = _write(remout, bp->buf, (unsigned int)amt);
- if (result != amt)
- haderr = result >= 0 ? EIO : errno;
-#ifdef WITH_SCP_STATS
- if (!iamremote && statistics)
- {
- statbytes += result;
- /* At least one second delay between
- outputs, or if finished */
- if (time(NULL) - stat_lasttime > 0 ||
- //(result + i) == stb.st_size)
- statbytes == stb.st_size)
- {
- int bwritten;
-
- if (time(NULL) == stat_starttime)
- {
- stat_starttime -= 1;
- // stat_starttimems -= 1000;
- }
- ratebs = ssh_max(1.0,
- (double) statbytes /
- (time(NULL) -
- stat_starttime));
- bwritten =
- fprintf(SOME_STATS_FILE,
- "\r%-25.25s | %10I64d KB | %7.1f kB/s | %s | %3d%%",
- last,
- statbytes / 1024,
- ratebs / 1024,
- stat_eta_new((int) ( GetTickCount() - stat_starttimems)),
-//stat_eta((int) ( time(NULL) - stat_starttime)),
- (int) (100.0 *
- (double) statbytes /
- stb.st_size));
- if (all_statistics && /*(result + i)*/ statbytes ==
- stb.st_size)
- bwritten += fprintf(SOME_STATS_FILE,
- "\n");
- fflush(SOME_STATS_FILE);
- stats_fixlen(bwritten);
- stat_lasttime = time(NULL);
- }
- }
-#endif /* WITH_SCP_STATS */
- }
- }
-
-
-
- if (_close(fd) < 0 && !haderr)
- haderr = errno;
- if (!haderr)
- (void)_write(remout, "", 1);
- else
- {
- strerror_s(buf, sizeof(buf), haderr);
- run_err("%s: %s", originalname, buf);
- }
- (void)response();
- }
- int ii;
- if (numfiles > 0)
- for (ii = 0;iist_mtime,
- (unsigned long)statp->st_atime);
- (void)_write(remout, path, (unsigned int)strlen(path));
- if (response() < 0) {
- closedir(dirp);
- return;
- }
- }
- locfmode = statp->st_mode & FILEMODEMASK;
- locfmode |= ((locfmode & (_S_IREAD | _S_IEXEC)) >> 3); // group access, read,exec bit now
- locfmode |= ((locfmode & (_S_IREAD | _S_IEXEC)) >> 6); // world access, read,exec bit now
-
- (void)sprintf_s(path, sizeof(path),
- "D%04o %d %.1024s\n", (unsigned int)(locfmode),
- 0, last);
- if (scpverbose)
- fprintf(stderr, "Entering directory: %s", path);
- (void)_write(remout, path, (unsigned int)strlen(path));
- if (response() < 0) {
- closedir(dirp);
- return;
- }
- while ((dp = readdir(dirp))) {
- //if (dp->d_ino == 0) //commented out as not needed
- // continue;
-
- if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, ".."))
- continue;
- if (strlen(name) + 1 + strlen(dp->d_name) >= sizeof(path) - 1) {
- run_err("%s/%s: name too long", name, dp->d_name);
- continue;
- }
- (void)sprintf_s(path, sizeof(path), "%s/%s", name, dp->d_name);
- vect[0] = path;
- source(1, vect);
- }
- (void)closedir(dirp);
- (void)_write(remout, "E\n", 2);
- (void)response();
-}
-
-void sink(int argc, char *argv[])
-{
-// DWORD dwread;
- static BUF buffer;
- struct stat stb;
- enum { YES, NO, DISPLAYED } wrerr;
- BUF *bp;
- size_t i, j, size;
- size_t amt, count, exists, first;
- int mask, mode, ofd, omode;
- int setimes, targisdir, wrerrno = 0;
- char ch, *cp, *np, *targ, *why, *vect[1], buf[16384];
- char aggregatePath[MAX_PATH] = "";
- struct _utimbuf ut;
- int dummy_usec;
- bool bDirSpec = false;
-
-#ifdef WITH_SCP_STATS
- char *statslast;
-#endif /* WITH_SCP_STATS */
-
-#define SCREWUP(str) { why = str; goto screwup; }
-
-
-
- setimes = targisdir = 0;
- _umask_s(0, &mask);
- int oldmask;
- if (!pflag)
- _umask_s(mask,&oldmask);
- if (argc != 1) {
- if (!iamremote)
- {
- run_err("ambiguous target");
- exit(1);
- }
- int i;
- for (i = 0; i");
- do {
- if (_read(remin, &ch, sizeof(ch)) != sizeof(ch))
- SCREWUP("lost connection");
- *cp++ = ch;
- } while (cp < &buf[sizeof(buf) - 1] && ch != '\n');
- *cp = 0;
-
- if (buf[0] == '\01' || buf[0] == '\02') {
- if (iamremote == 0)
- (void)_write(STDERR_FILENO,
- buf + 1, (unsigned int)strlen(buf + 1));
- if (buf[0] == '\02')
- exit(1);
- ++errs;
- continue;
- }
- if (buf[0] == 'E') {
- (void)_write(remout, "", 1);
- return;
- }
-
- if (ch == '\n')
- *--cp = 0;
-
-#define getnum(t) (t) = 0; \
- while (*cp >= '0' && *cp <= '9') (t) = (t) * 10 + (*cp++ - '0');
- cp = buf;
- if (*cp == 'T') {
- setimes++;
- cp++;
- getnum(ut.modtime);
- if (*cp++ != ' ')
- SCREWUP("mtime.sec not delimited");
- getnum(dummy_usec);
- if (*cp++ != ' ')
- SCREWUP("mtime.usec not delimited");
- getnum(ut.actime);
- if (*cp++ != ' ')
- SCREWUP("atime.sec not delimited");
- getnum(dummy_usec);
- if (*cp++ != '\0')
- SCREWUP("atime.usec not delimited");
- (void)_write(remout, "", 1);
- goto keepgoing; // added 5/3/2001 by QI for -p not working !!!
- // in place of next continue commented out
- //continue;
- }
- if (*cp != 'C' && *cp != 'D') {
- /*
- * Check for the case "rcp remote:foo\* local:bar".
- * In this case, the line "No match." can be returned
- * by the shell before the rcp command on the remote is
- * executed so the ^Aerror_message convention isn't
- * followed.
- */
- if (first) {
- run_err("%s", cp);
- exit(1);
- }
- SCREWUP("expected control record");
- }
- mode = 0;
- for (++cp; cp < buf + 5; cp++) {
- if (*cp < '0' || *cp > '7')
- SCREWUP("bad mode");
- mode = (mode << 3) | (*cp - '0');
- }
- if (*cp++ != ' ')
- SCREWUP("mode not delimited");
-
- for (size = 0; *cp >= '0' && *cp <= '9';)
- size = size * 10 + (*cp++ - '0');
- if (*cp++ != ' ')
- SCREWUP("size not delimited");
- if (targisdir) {
- static char *namebuf;
- static unsigned int cursize;
- size_t need;
-
- need = strlen(targ) + strlen(cp) + 250;
- if (need > cursize)
- namebuf = (char *)xmalloc(need);
- (void)sprintf_s(namebuf, need, "%s%s%s", targ,
- *targ ? "/" : "", cp);
- np = namebuf;
- } else
- np = targ;
- exists = stat(np, &stb) == 0;
- if (buf[0] == 'D') {
- int mod_flag = pflag;
- if (exists) {
- if (!S_ISDIR(stb.st_mode)) {
- errno = ENOTDIR;
- goto bad;
- }
- if (pflag)
- (void)_chmod(np, mode);
- } else {
- /* Handle copying from a read-only directory */
- mod_flag = 1;
- if (_mkdir(np) < 0) // was mkdir(np, mode | S_IRWXU) < 0)
- {
- if (errno == EEXIST) // stat returned didn't exist, but mkdir returned it does - see this when user doesn't have access
- errno = EPERM;
- np = targ;
- goto bad;
- }
- }
- vect[0] = np;
- sink(1, vect);
- if (setimes) {
- setimes = 0;
- //if (_utime(np, &ut) < 0)
- // in NT cannot set directory time by _utime(), we have our
- // call _utimedir() above in this file.
- if (_utimedir(np, &ut) < 0)
- //run_err("%s: set times: %s", np, strerror(errno));
- run_err("setting times on %s failed:", np );
- }
- if (mod_flag)
- (void)_chmod(np, mode);
- continue;
- }
- omode = mode;
-#ifdef HAVE_FTRUNCATE
- /* Don't use O_TRUNC so the file doesn't get corrupted if
- copying on itself. */
- ofd = open(np, O_WRONLY|O_CREAT|O_BINARY, mode);
-#else /* HAVE_FTRUNCATE */
- _sopen_s(&ofd, np, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, _SH_DENYNO, S_IWRITE);
-#endif /* HAVE_FTRUNCATE */
- if (ofd < 0) {
-bad: strerror_s(buf, sizeof(buf), errno);
-
- if (isRootedPath && (strlen(np) > strlen(g_HomeDir)))
- np += strlen(g_HomeDir);
- run_err("%s: %s", np, buf);
- continue;
- }
- (void)_write(remout, "", 1);
- if ((bp = allocbuf(&buffer, ofd, 16384)) == NULL) {
- (void)_close(ofd);
- continue;
- }
- cp = bp->buf;
- wrerr = NO;
-#ifdef WITH_SCP_STATS
- if (!iamremote && statistics)
- {
- statbytes = 0;
- ratebs = 0.0;
- stat_starttime = time(NULL);
- stat_starttimems = GetTickCount();
- statslast = getfilenamefrompath(np);
-
- }
-#endif /* WITH_SCP_STATS */
- for (count = i = 0; i < size; i += 16384) {
- amt = 16384;
- if (i + amt > size)
- amt = size - i;
- count += amt;
- do {
- j = _read(remin, cp, (unsigned int)amt);
- if (j <= 0) {
- strerror_s(buf, sizeof(buf), errno);
- run_err("%s", j ? buf :
- "dropped connection");
- exit(1);
- }
-
-#ifdef WITH_SCP_STATS
- if (!iamremote && statistics){
- int bwritten;
- statbytes += j;
- if ( (time(NULL) - stat_lasttime > 0) || ( statbytes == size) ) {
- if (time(NULL) == stat_starttime) {
- stat_starttime -= 1;
-// stat_starttimems -= 1000;
- }
- ratebs = ssh_max(1.0,
- (double)
- statbytes /
- (time(NULL) -
- stat_starttime));
- bwritten =
- fprintf(SOME_STATS_FILE,
- "\r%-25.25s | %10I64d KB | %7.1f kB/s | %s | %3d%%",
- statslast,
- statbytes / 1024,
- ratebs / 1024,
-// stat_eta((int)
-// (time(NULL) - stat_starttime)),
- stat_eta_new((int)(GetTickCount() - stat_starttimems)),
- (int) (100.0 *
- (double) statbytes /size));
- if (all_statistics && statbytes == size)
- bwritten += fprintf(SOME_STATS_FILE, "\n");
- fflush(SOME_STATS_FILE);
- stats_fixlen(bwritten);
- stat_lasttime = time(NULL);
- }
- }
-#endif /* WITH_SCP_STATS */
- amt -= j;
- cp += j;
- } while (amt > 0);
- if (count == bp->cnt) {
- /* Keep reading so we stay sync'd up. */
- if (wrerr == NO) {
- j = _write(ofd, bp->buf, (unsigned int)count);
- if (j != count) {
- wrerr = YES;
- wrerrno = j >= 0 ? EIO : errno;
- }
- }
- count = 0;
- cp = bp->buf;
- }
- } // end of main 16384 byte read for loop
- if (count != 0 && wrerr == NO &&
- (j = _write(ofd, bp->buf, (unsigned int)count)) != count) {
- wrerr = YES;
- wrerrno = j >= 0 ? EIO : errno;
- }
-#ifdef HAVE_FTRUNCATE
- if (ftruncate(ofd, size)) {
- run_err("%s: truncate: %s", np, strerror(errno));
- wrerr = DISPLAYED;
- }
-#endif /* HAVE_FTRUNCATE */
- if (pflag) {
- if (exists || omode != mode)
- {
-#ifdef HAVE_FCHMOD
- if (fchmod(ofd, omode)) {
-#else /* HAVE_FCHMOD */
- if (_chmod(np, omode)) {
-#endif /* HAVE_FCHMOD */
- strerror_s(buf, sizeof(buf), errno);
- run_err("%s: set mode: %s",
- np, buf);
- }
- }
- } else {
- if (!exists && omode != mode)
-#ifdef HAVE_FCHMOD
- if (fchmod(ofd, omode & ~mask)) {
-#else /* HAVE_FCHMOD */
- if (_chmod(np, omode & ~mask)) {
-#endif /* HAVE_FCHMOD */
- strerror_s(buf, sizeof(buf), errno);
- run_err("%s: set mode: %s",
- np, buf);
- }
- }
- (void)_close(ofd);
- (void)response();
- if (setimes && wrerr == NO) {
- setimes = 0;
- if (_utime(np, &ut) < 0) {
-
- // see if the error was due to read only file permission
- if ( _access(np,2) < 0 ) {
- // lacks write permission, so give it for now
- _chmod(np, _S_IWRITE);
- if (_utime(np, &ut) < 0) {
- strerror_s(buf, sizeof(buf), errno);
- run_err("%s: set times: %s", np, buf);
- wrerr = DISPLAYED;
- }
- _chmod(np, _S_IREAD); // read only permission set again
- }
- else {
- strerror_s(buf, sizeof(buf), errno);
- run_err("%s: set times: %s",
- np, buf);
- wrerr = DISPLAYED;
- }
- }
- }
- switch(wrerr) {
- case YES:
- strerror_s(buf, sizeof(buf), errno);
- run_err("%s: %s", np, buf);
- break;
- case NO:
- (void)_write(remout, "", 1);
- fflush(stdout);
- fflush(stdin);
- break;
- case DISPLAYED:
- break;
- }
- }
-
- if (targ)
- LocalFree(targ);
-
- if ( first > 1 ) {
- return;
- }
-screwup:
- run_err("protocol error: %s", why);
- exit(1);
-}
-
-int response(void)
-{
- char ch, *cp, resp, rbuf[2048];
-
- if (_read(remin, &resp, sizeof(resp)) != sizeof(resp))
- lostconn(0);
-
- cp = rbuf;
- switch(resp) {
- case 0: /* ok */
- return (0);
- default:
- *cp++ = resp;
- /* FALLTHROUGH */
- case 1: /* error, followed by error msg */
- case 2: /* fatal error, "" */
- do {
- if (_read(remin, &ch, sizeof(ch)) != sizeof(ch))
- lostconn(0);
- *cp++ = ch;
- } while (cp < &rbuf[sizeof(rbuf) - 1] && ch != '\n');
-
- if (!iamremote)
- (void)_write(STDERR_FILENO, rbuf, (unsigned int)(cp - rbuf));
- ++errs;
- if (resp == 1)
- return (-1);
- exit(1);
- }
- /* NOTREACHED */
-}
-#else
void
source(int argc, char **argv)
{
@@ -2668,7 +1931,6 @@ response(void)
}
/* NOTREACHED */
}
-#endif
void
usage(void)
@@ -2704,7 +1966,7 @@ run_err(const char *fmt,...)
fprintf(stderr, "\n");
}
}
-#ifndef WIN32_FIXME
+
void
verifydir(char *cp)
{
@@ -2787,63 +2049,6 @@ lostconn(int signo)
else
exit(1);
}
-#else
-
-void verifydir(char *cp)
-{
- struct stat stb;
-
- if (!stat(cp, &stb)) {
- if (S_ISDIR(stb.st_mode))
- return;
- errno = ENOTDIR;
- }
- char buf[MAX_PATH];
- strerror_s(buf, sizeof(buf), errno);
- run_err("%s: %s", cp, buf);
- exit(1);
-}
-
-int okname(char *cp0)
-{
- return (1);
-}
-
-BUF *
-allocbuf(BUF *bp, int fd, int blksize)
-{
- size_t size;
-#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
- struct stat stb;
-
- if (fstat(fd, &stb) < 0) {
- run_err("fstat: %s", strerror(errno));
- return (0);
- }
- size = roundup(stb.st_blksize, blksize);
- if (size == 0)
- size = blksize;
-#else /* HAVE_STRUCT_STAT_ST_BLKSIZE */
- size = blksize;
-#endif /* HAVE_STRUCT_STAT_ST_BLKSIZE */
- if (bp->cnt >= size)
- return (bp);
- if (bp->buf == NULL)
- bp->buf = xmalloc(size);
- else
- bp->buf = xreallocarray(bp->buf, 1, size);
- memset(bp->buf, 0, size);
- bp->cnt = size;
- return (bp);
-}
-
-void lostconn(int signo)
-{
- if (!iamremote)
- fprintf(stderr, "lost connection\n");
- exit(1);
-}
-#endif
#ifdef WITH_SCP_STATS
void stats_fixlen(int bwritten)
@@ -2896,76 +2101,7 @@ char *stat_eta(int secs)
}
#endif /* WITH_SCP_STATS */
-#ifdef WIN32_FIXME
-char *TranslatePath(char *path, bool *bDirSpec)
-{
- char temp[MAX_PATH * 2];
- char resolved[MAX_PATH];
- char* rootpath;
-
- if (iamremote == 0)
- return path; // if we are scp client, nothing special to do, return path we got.
-
- char *s = NULL;
-
- if (g_RootMode == M_ADMIN){
- rootpath = g_FSRoot;
- }else{
- rootpath = g_HomeDir;
- }
-
- if (!_strnicmp(path, rootpath, strlen(g_HomeDir)))
- { // already set to home directory
- strcpy_s(temp, sizeof(temp), path); // absolute path
- }
- else
- {
- if (path[1] != ':')
- {
- if (path[0] == '\\' || path[0] == '/')
- sprintf_s(temp, sizeof(temp), "%s%s",rootpath,&path[1]);
- else
- sprintf_s(temp, sizeof(temp), "%s%s",rootpath,path);
- }
- else
- strcpy(temp,path);
-
- }
- fixslashes(temp);
- PathCanonicalizeA(resolved,temp);
-
- *bDirSpec = (resolved[strlen(temp)-1] == '\\');
- // Remove trailing slash unless it's a root spec (c:\ etc)
- if (strcmp(&(resolved[1]),":\\") && resolved[strlen(temp)-1] == '\\')
- resolved[strlen(temp)-1] = 0x00;
-
- if (strlen(resolved) == strlen(rootpath)-1)
- {
- // We specify a length of less than one because if we
- // resolve to the scp home directory (i.e. user specified
- // '.' for the target), then PathCanonicalize will strip
- // the trailing slash.
- if (_strnicmp(resolved, rootpath, strlen(g_HomeDir)-1))
- return NULL;
- }
- else if (!((g_RootMode == M_ADMIN) && resolved[1] == ':')){
- // if we are in admin mode and the user specified a drive, let it go through
- if (_strnicmp(resolved, rootpath, strlen(rootpath)))
- return NULL;
- }
-
- // if we reach this point, the path is fine. We can actually just return path
- // if the path doesn't begin with a slash
- if (path[0] != '/' && path[0] != '\\')
- return path;
-
- s = (char *)LocalAlloc(LPTR,strlen(resolved)+1);
- strcpy_s(s,strlen(resolved)+1,resolved);
- isRootedPath = 1;
-
- return s;
-}
-
+#ifdef WINDOWS
/* start_process_io()
input parameters:
exename - name of executable
diff --git a/sftp-glob.c b/sftp-glob.c
index 3863e87..fbe3294 100644
--- a/sftp-glob.c
+++ b/sftp-glob.c
@@ -37,10 +37,6 @@
#include "sftp-common.h"
#include "sftp-client.h"
-#ifdef WINDOWS
-#include "win32_dirent.c"
-#endif
-
int remote_glob(struct sftp_conn *, const char *, int,
int (*)(const char *, int), glob_t *);
diff --git a/sftp-server.c b/sftp-server.c
index e6dd029..f9f31cb 100644
--- a/sftp-server.c
+++ b/sftp-server.c
@@ -60,9 +60,6 @@
#include "sftp.h"
#include "sftp-common.h"
-#ifdef WIN32_VS
-#include "win32_dirent.c"
-#endif
#ifdef WIN32_FIXME
diff --git a/sftp.c b/sftp.c
index 47f35dd..d5f7471 100644
--- a/sftp.c
+++ b/sftp.c
@@ -75,8 +75,6 @@ typedef void EditLine;
#define MAX_COMMAND_LINE 2048
#ifdef WINDOWS
-#include
-#include
#include "win32_dirent.h"
#endif