- char buf[2048];
- char namebuf[2048];
- char ch;
- int targisdir = 0;
- int settime = 0;
- int exists;
- DWORD attr;
- HANDLE f;
- unsigned long mtime, atime;
- unsigned int mode;
- unsigned long size, i;
- int wrerror = 0;
- unsigned long stat_bytes;
- unsigned long stat_starttime, stat_lasttime;
- char *stat_name;
-
- attr = GetFileAttributes(targ);
- if (attr != -1 && (attr & FILE_ATTRIBUTE_DIRECTORY) != 0)
- targisdir = 1;
-
- if (targetshouldbedirectory && !targisdir)
- bump("%s: Not a directory", targ);
-
- ssh_send("", 1);
- while (1) {
- settime = 0;
-gottime:
- if (ssh_recv(&ch, 1) <= 0)
- return;
- if (ch == '\n')
- bump("Protocol error: Unexpected newline");
- i = 0;
- buf[i++] = ch;
- do {
- if (ssh_recv(&ch, 1) <= 0)
- bump("Lost connection");
- buf[i++] = ch;
- } while (i < sizeof(buf) && ch != '\n');
- buf[i-1] = '\0';
- switch (buf[0]) {
- case '\01': /* error */
- fprintf(stderr, "%s\n", buf+1);
- errs++;
- continue;
- case '\02': /* fatal error */
- bump("%s", buf+1);
- case 'E':
- ssh_send("", 1);
- return;
- case 'T':
- if (sscanf(buf, "T%d %*d %d %*d",
- &mtime, &atime) == 2) {
- settime = 1;
- ssh_send("", 1);
- goto gottime;
- }
- bump("Protocol error: Illegal time format");
- case 'C':
- case 'D':
- break;
- default:
- bump("Protocol error: Expected control record");
- }
-
- if (sscanf(buf+1, "%u %u %[^\n]", &mode, &size, namebuf) != 3)
- bump("Protocol error: Illegal file descriptor format");
- if (targisdir) {
- char t[2048];
- strcpy(t, targ);
- if (targ[0] != '\0')
- strcat(t, "/");
- strcat(t, namebuf);
- strcpy(namebuf, t);
- } else {
- strcpy(namebuf, targ);
- }
- attr = GetFileAttributes(namebuf);
- exists = (attr != -1);
-
- if (buf[0] == 'D') {
- if (exists && (attr & FILE_ATTRIBUTE_DIRECTORY) == 0) {
- run_err("%s: Not a directory", namebuf);
- continue;
- }
- if (!exists) {
- if (! CreateDirectory(namebuf, NULL)) {
- run_err("%s: Cannot create directory",
- namebuf);
- continue;
- }
- }
- sink(namebuf);
- /* can we set the timestamp for directories ? */
- continue;
- }
-
- f = CreateFile(namebuf, GENERIC_WRITE, 0, NULL,
- CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
- if (f == INVALID_HANDLE_VALUE) {
- run_err("%s: Cannot create file", namebuf);
- continue;
- }
+ char buf[2048];
+ char namebuf[2048];
+ char ch;
+ int targisdir = 0;
+ int settime;
+ int exists;
+ DWORD attr;
+ HANDLE f;
+ unsigned long mtime, atime;
+ unsigned int mode;
+ unsigned long size, i;
+ int wrerror = 0;
+ unsigned long stat_bytes;
+ time_t stat_starttime, stat_lasttime;
+ char *stat_name;
+
+ attr = GetFileAttributes(targ);
+ if (attr != (DWORD)-1 && (attr & FILE_ATTRIBUTE_DIRECTORY) != 0)
+ targisdir = 1;
+
+ if (targetshouldbedirectory && !targisdir)
+ bump("%s: Not a directory", targ);
+
+ ssh_scp_send("", 1);
+ while (1) {
+ settime = 0;
+ gottime:
+ if (ssh_scp_recv(&ch, 1) <= 0)
+ return;
+ if (ch == '\n')
+ bump("Protocol error: Unexpected newline");
+ i = 0;
+ buf[i++] = ch;
+ do {
+ if (ssh_scp_recv(&ch, 1) <= 0)
+ bump("Lost connection");
+ buf[i++] = ch;
+ } while (i < sizeof(buf) && ch != '\n');
+ buf[i-1] = '\0';
+ switch (buf[0]) {
+ case '\01': /* error */
+ fprintf(stderr, "%s\n", buf+1);
+ errs++;
+ continue;
+ case '\02': /* fatal error */
+ bump("%s", buf+1);
+ case 'E':
+ ssh_scp_send("", 1);
+ return;
+ case 'T':
+ if (sscanf(buf, "T%ld %*d %ld %*d",
+ &mtime, &atime) == 2) {
+ settime = 1;
+ ssh_scp_send("", 1);
+ goto gottime;
+ }
+ bump("Protocol error: Illegal time format");
+ case 'C':
+ case 'D':
+ break;
+ default:
+ bump("Protocol error: Expected control record");
+ }