X-Git-Url: http://andersk.mit.edu/gitweb/openssh.git/blobdiff_plain/762715cee0114dae4b3ec201df5a7e22684dffb8..eacb954ed9ad43fc7fd4711811d8286e67bdc253:/sftp.c diff --git a/sftp.c b/sftp.c index f576ed3d..4354bfd4 100644 --- a/sftp.c +++ b/sftp.c @@ -24,9 +24,7 @@ #include "includes.h" -RCSID("$OpenBSD: sftp.c,v 1.27 2002/03/19 10:49:35 markus Exp $"); - -/* XXX: short-form remote directory listings (like 'ls -C') */ +RCSID("$OpenBSD: sftp.c,v 1.37 2003/07/10 20:05:55 markus Exp $"); #include "buffer.h" #include "xmalloc.h" @@ -48,13 +46,27 @@ char *__progname; FILE* infile; size_t copy_buffer_len = 32768; size_t num_requests = 16; +static pid_t sshpid = -1; + +extern int showprogress; static void -connect_to_server(char *path, char **args, int *in, int *out, pid_t *sshpid) +killchild(int signo) +{ + if (sshpid > 1) + kill(sshpid, signo); + + _exit(1); +} + +static void +connect_to_server(char *path, char **args, int *in, int *out) { int c_in, c_out; + #ifdef USE_PIPES int pin[2], pout[2]; + if ((pipe(pin) == -1) || (pipe(pout) == -1)) fatal("pipe: %s", strerror(errno)); *in = pin[0]; @@ -63,15 +75,16 @@ connect_to_server(char *path, char **args, int *in, int *out, pid_t *sshpid) c_out = pin[1]; #else /* USE_PIPES */ int inout[2]; + if (socketpair(AF_UNIX, SOCK_STREAM, 0, inout) == -1) fatal("socketpair: %s", strerror(errno)); *in = *out = inout[0]; c_in = c_out = inout[1]; #endif /* USE_PIPES */ - if ((*sshpid = fork()) == -1) + if ((sshpid = fork()) == -1) fatal("fork: %s", strerror(errno)); - else if (*sshpid == 0) { + else if (sshpid == 0) { if ((dup2(c_in, STDIN_FILENO) == -1) || (dup2(c_out, STDOUT_FILENO) == -1)) { fprintf(stderr, "dup2: %s\n", strerror(errno)); @@ -86,6 +99,9 @@ connect_to_server(char *path, char **args, int *in, int *out, pid_t *sshpid) exit(1); } + signal(SIGTERM, killchild); + signal(SIGINT, killchild); + signal(SIGHUP, killchild); close(c_in); close(c_out); } @@ -96,8 +112,9 @@ usage(void) extern char *__progname; fprintf(stderr, - "usage: %s [-vC1] [-b batchfile] [-o option] [-s subsystem|path] [-B buffer_size]\n" - " [-F config] [-P direct server path] [-S program]\n" + "usage: %s [-vC1] [-b batchfile] [-o ssh_option] [-s subsystem | sftp_server]\n" + " [-B buffer_size] [-F ssh_config] [-P sftp_server path]\n" + " [-R num_requests] [-S program]\n" " [user@]host[:file [file]]\n", __progname); exit(1); } @@ -105,8 +122,7 @@ usage(void) int main(int argc, char **argv) { - int in, out, ch; - pid_t sshpid; + int in, out, ch, err; char *host, *userhost, *cp, *file2; int debug_level = 0, sshver = 2; char *file1 = NULL, *sftp_server = NULL; @@ -119,7 +135,6 @@ main(int argc, char **argv) __progname = get_progname(argv[0]); args.list = NULL; addargs(&args, "ssh"); /* overwritten with ssh_program */ - addargs(&args, "-oFallBackToRsh no"); addargs(&args, "-oForwardX11 no"); addargs(&args, "-oForwardAgent no"); addargs(&args, "-oClearAllForwardings yes"); @@ -160,6 +175,7 @@ main(int argc, char **argv) fatal("%s (%s).", strerror(errno), optarg); } else fatal("Filename already specified."); + showprogress = 0; break; case 'P': sftp_direct = optarg; @@ -181,6 +197,8 @@ main(int argc, char **argv) } } + log_init(argv[0], ll, SYSLOG_FACILITY_USER, 1); + if (sftp_direct == NULL) { if (optind == argc || argc > (optind + 2)) usage(); @@ -193,7 +211,7 @@ main(int argc, char **argv) file1 = cp; } - if ((host = strchr(userhost, '@')) == NULL) + if ((host = strrchr(userhost, '@')) == NULL) host = userhost; else { *host++ = '\0'; @@ -210,7 +228,6 @@ main(int argc, char **argv) usage(); } - log_init(argv[0], ll, SYSLOG_FACILITY_USER, 1); addargs(&args, "-oProtocol %d", sshver); /* no subsystem if the server-spec contains a '/' */ @@ -223,22 +240,20 @@ main(int argc, char **argv) args.list[0] = ssh_program; fprintf(stderr, "Connecting to %s...\n", host); - connect_to_server(ssh_program, args.list, &in, &out, - &sshpid); + connect_to_server(ssh_program, args.list, &in, &out); } else { args.list = NULL; addargs(&args, "sftp-server"); fprintf(stderr, "Attaching to %s...\n", sftp_direct); - connect_to_server(sftp_direct, args.list, &in, &out, - &sshpid); + connect_to_server(sftp_direct, args.list, &in, &out); } - interactive_loop(in, out, file1, file2); + err = interactive_loop(in, out, file1, file2); #if !defined(USE_PIPES) - shutdown(in, SHUT_RDWR); - shutdown(out, SHUT_RDWR); + shutdown(in, SHUT_RDWR); + shutdown(out, SHUT_RDWR); #endif close(in); @@ -246,8 +261,10 @@ main(int argc, char **argv) if (infile != stdin) fclose(infile); - if (waitpid(sshpid, NULL, 0) == -1) - fatal("Couldn't wait for ssh process: %s", strerror(errno)); + while (waitpid(sshpid, NULL, 0) == -1) + if (errno != EINTR) + fatal("Couldn't wait for ssh process: %s", + strerror(errno)); - exit(0); + exit(err == 0 ? 0 : 1); }