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