version 1.34, 2000/08/19 02:26:08 |
version 1.35, 2000/08/19 02:50:07 |
|
|
*/ |
*/ |
|
|
/* |
/* |
|
* Parts from: |
|
* |
* Copyright (c) 1983, 1990, 1992, 1993, 1995 |
* Copyright (c) 1983, 1990, 1992, 1993, 1995 |
* The Regents of the University of California. All rights reserved. |
* The Regents of the University of California. All rights reserved. |
* |
* |
|
|
|
|
/* Returns width of the terminal (for progress meter calculations). */ |
/* Returns width of the terminal (for progress meter calculations). */ |
int getttywidth(void); |
int getttywidth(void); |
|
int do_cmd(char *host, char *remuser, char *cmd, int *fdin, int *fdout, int argc); |
|
|
/* Time a transfer started. */ |
/* Time a transfer started. */ |
static struct timeval start; |
static struct timeval start; |
|
|
*/ |
*/ |
|
|
int |
int |
do_cmd(char *host, char *remuser, char *cmd, int *fdin, int *fdout) |
do_cmd(char *host, char *remuser, char *cmd, int *fdin, int *fdout, int argc) |
{ |
{ |
int pin[2], pout[2], reserved[2]; |
int pin[2], pout[2], reserved[2]; |
|
|
if (verbose_mode) |
if (verbose_mode) |
fprintf(stderr, "Executing: host %s, user %s, command %s\n", |
fprintf(stderr, "Executing: host %s, user %s, command %s\n", |
host, remuser ? remuser : "(unspecified)", cmd); |
host, remuser ? remuser : "(unspecified)", cmd); |
|
|
/* |
/* |
* Reserve two descriptors so that the real pipes won't get |
* Reserve two descriptors so that the real pipes won't get |
|
|
|
|
/* For a child to execute the command on the remote host using ssh. */ |
/* For a child to execute the command on the remote host using ssh. */ |
if (fork() == 0) { |
if (fork() == 0) { |
char *args[100]; |
char *args[100]; /* XXX careful */ |
unsigned int i; |
unsigned int i; |
|
|
/* Child. */ |
/* Child. */ |
|
|
exit(255); |
exit(255); |
} |
} |
|
|
/* This stuff used to be in BSD rcp extern.h. */ |
|
|
|
typedef struct { |
typedef struct { |
int cnt; |
int cnt; |
char *buf; |
char *buf; |
|
|
void run_err(const char *,...); |
void run_err(const char *,...); |
void verifydir(char *); |
void verifydir(char *); |
|
|
/* Stuff from BSD rcp.c continues. */ |
|
|
|
struct passwd *pwd; |
struct passwd *pwd; |
uid_t userid; |
uid_t userid; |
int errs, remin, remout; |
int errs, remin, remout; |
|
|
remin = remout = -1; |
remin = remout = -1; |
/* Command to be executed on remote system using "ssh". */ |
/* Command to be executed on remote system using "ssh". */ |
(void) sprintf(cmd, "scp%s%s%s%s", verbose_mode ? " -v" : "", |
(void) sprintf(cmd, "scp%s%s%s%s", verbose_mode ? " -v" : "", |
iamrecursive ? " -r" : "", pflag ? " -p" : "", |
iamrecursive ? " -r" : "", pflag ? " -p" : "", |
targetshouldbedirectory ? " -d" : ""); |
targetshouldbedirectory ? " -d" : ""); |
|
|
(void) signal(SIGPIPE, lostconn); |
(void) signal(SIGPIPE, lostconn); |
|
|
|
|
src = "."; |
src = "."; |
host = strchr(argv[i], '@'); |
host = strchr(argv[i], '@'); |
len = strlen(ssh_program) + strlen(argv[i]) + |
len = strlen(ssh_program) + strlen(argv[i]) + |
strlen(src) + (tuser ? strlen(tuser) : 0) + |
strlen(src) + (tuser ? strlen(tuser) : 0) + |
strlen(thost) + strlen(targ) + CMDNEEDS + 32; |
strlen(thost) + strlen(targ) + CMDNEEDS + 32; |
bp = xmalloc(len); |
bp = xmalloc(len); |
if (host) { |
if (host) { |
*host++ = 0; |
*host++ = 0; |
|
|
bp = xmalloc(len); |
bp = xmalloc(len); |
(void) sprintf(bp, "%s -t %s", cmd, targ); |
(void) sprintf(bp, "%s -t %s", cmd, targ); |
host = cleanhostname(thost); |
host = cleanhostname(thost); |
if (do_cmd(host, tuser, |
if (do_cmd(host, tuser, bp, &remin, |
bp, &remin, &remout) < 0) |
&remout, argc) < 0) |
exit(1); |
exit(1); |
if (response() < 0) |
if (response() < 0) |
exit(1); |
exit(1); |
|
|
for (i = 0; i < argc - 1; i++) { |
for (i = 0; i < argc - 1; i++) { |
if (!(src = colon(argv[i]))) { /* Local to local. */ |
if (!(src = colon(argv[i]))) { /* Local to local. */ |
len = strlen(_PATH_CP) + strlen(argv[i]) + |
len = strlen(_PATH_CP) + strlen(argv[i]) + |
strlen(argv[argc - 1]) + 20; |
strlen(argv[argc - 1]) + 20; |
bp = xmalloc(len); |
bp = xmalloc(len); |
(void) sprintf(bp, "exec %s%s%s %s %s", _PATH_CP, |
(void) sprintf(bp, "exec %s%s%s %s %s", _PATH_CP, |
iamrecursive ? " -r" : "", pflag ? " -p" : "", |
iamrecursive ? " -r" : "", pflag ? " -p" : "", |
argv[i], argv[argc - 1]); |
argv[i], argv[argc - 1]); |
if (verbose_mode) |
if (verbose_mode) |
fprintf(stderr, "Executing: %s\n", bp); |
fprintf(stderr, "Executing: %s\n", bp); |
if (system(bp)) |
if (system(bp)) |
|
|
len = strlen(src) + CMDNEEDS + 20; |
len = strlen(src) + CMDNEEDS + 20; |
bp = xmalloc(len); |
bp = xmalloc(len); |
(void) sprintf(bp, "%s -f %s", cmd, src); |
(void) sprintf(bp, "%s -f %s", cmd, src); |
if (do_cmd(host, suser, bp, &remin, &remout) < 0) { |
if (do_cmd(host, suser, bp, &remin, &remout, argc) < 0) { |
(void) xfree(bp); |
(void) xfree(bp); |
++errs; |
++errs; |
continue; |
continue; |
|
|
* versions expecting microseconds. |
* versions expecting microseconds. |
*/ |
*/ |
(void) sprintf(buf, "T%lu 0 %lu 0\n", |
(void) sprintf(buf, "T%lu 0 %lu 0\n", |
(unsigned long) stb.st_mtime, |
(unsigned long) stb.st_mtime, |
(unsigned long) stb.st_atime); |
(unsigned long) stb.st_atime); |
(void) atomicio(write, remout, buf, strlen(buf)); |
(void) atomicio(write, remout, buf, strlen(buf)); |
if (response() < 0) |
if (response() < 0) |
goto next; |
goto next; |
|
|
last++; |
last++; |
if (pflag) { |
if (pflag) { |
(void) sprintf(path, "T%lu 0 %lu 0\n", |
(void) sprintf(path, "T%lu 0 %lu 0\n", |
(unsigned long) statp->st_mtime, |
(unsigned long) statp->st_mtime, |
(unsigned long) statp->st_atime); |
(unsigned long) statp->st_atime); |
(void) atomicio(write, remout, path, strlen(path)); |
(void) atomicio(write, remout, path, strlen(path)); |
if (response() < 0) { |
if (response() < 0) { |
closedir(dirp); |
closedir(dirp); |
|
|
} |
} |
} |
} |
(void) sprintf(path, "D%04o %d %.1024s\n", |
(void) sprintf(path, "D%04o %d %.1024s\n", |
(unsigned int) (statp->st_mode & FILEMODEMASK), |
(unsigned int) (statp->st_mode & FILEMODEMASK), 0, last); |
0, last); |
|
if (verbose_mode) |
if (verbose_mode) |
fprintf(stderr, "Entering directory: %s", path); |
fprintf(stderr, "Entering directory: %s", path); |
(void) atomicio(write, remout, path, strlen(path)); |
(void) atomicio(write, remout, path, strlen(path)); |
|
|
if (need > cursize) |
if (need > cursize) |
namebuf = xmalloc(need); |
namebuf = xmalloc(need); |
(void) sprintf(namebuf, "%s%s%s", targ, |
(void) sprintf(namebuf, "%s%s%s", targ, |
*targ ? "/" : "", cp); |
*targ ? "/" : "", cp); |
np = namebuf; |
np = namebuf; |
} else |
} else |
np = targ; |
np = targ; |
|
|
va_end(ap); |
va_end(ap); |
} |
} |
|
|
/* Stuff below is from BSD rcp util.c. */ |
|
|
|
/*- |
|
* Copyright (c) 1992, 1993 |
|
* The Regents of the University of California. All rights reserved. |
|
* |
|
* Redistribution and use in source and binary forms, with or without |
|
* modification, are permitted provided that the following conditions |
|
* are met: |
|
* 1. Redistributions of source code must retain the above copyright |
|
* notice, this list of conditions and the following disclaimer. |
|
* 2. Redistributions in binary form must reproduce the above copyright |
|
* notice, this list of conditions and the following disclaimer in the |
|
* documentation and/or other materials provided with the distribution. |
|
* 3. All advertising materials mentioning features or use of this software |
|
* must display the following acknowledgement: |
|
* This product includes software developed by the University of |
|
* California, Berkeley and its contributors. |
|
* 4. Neither the name of the University nor the names of its contributors |
|
* may be used to endorse or promote products derived from this software |
|
* without specific prior written permission. |
|
* |
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
|
* SUCH DAMAGE. |
|
* |
|
* $OpenBSD$ |
|
*/ |
|
|
|
char * |
char * |
colon(cp) |
colon(cp) |
char *cp; |
char *cp; |
|
|
size = blksize; |
size = blksize; |
else |
else |
size = blksize + (stb.st_blksize - blksize % stb.st_blksize) % |
size = blksize + (stb.st_blksize - blksize % stb.st_blksize) % |
stb.st_blksize; |
stb.st_blksize; |
if (bp->cnt >= size) |
if (bp->cnt >= size) |
return (bp); |
return (bp); |
if (bp->buf == NULL) |
if (bp->buf == NULL) |
|
|
if (barlength > 0) { |
if (barlength > 0) { |
i = barlength * ratio / 100; |
i = barlength * ratio / 100; |
snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), |
snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), |
"|%.*s%*s|", i, |
"|%.*s%*s|", i, |
"*****************************************************************************" |
"*****************************************************************************" |
"*****************************************************************************", |
"*****************************************************************************", |
barlength - i, ""); |
barlength - i, ""); |
} |
} |
i = 0; |
i = 0; |
abbrevsize = cursize; |
abbrevsize = cursize; |
|
|
i = remaining / 3600; |
i = remaining / 3600; |
if (i) |
if (i) |
snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), |
snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), |
"%2d:", i); |
"%2d:", i); |
else |
else |
snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), |
snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), |
" "); |
" "); |
i = remaining % 3600; |
i = remaining % 3600; |
snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), |
snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), |
"%02d:%02d%s", i / 60, i % 60, |
"%02d:%02d%s", i / 60, i % 60, |
(flag != 1) ? " ETA" : " "); |
(flag != 1) ? " ETA" : " "); |
} |
} |
atomicio(write, fileno(stdout), buf, strlen(buf)); |
atomicio(write, fileno(stdout), buf, strlen(buf)); |
|
|