=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/ssh/sftp.c,v retrieving revision 1.34 retrieving revision 1.34.2.1 diff -u -r1.34 -r1.34.2.1 --- src/usr.bin/ssh/sftp.c 2003/01/10 08:19:07 1.34 +++ src/usr.bin/ssh/sftp.c 2003/09/16 20:50:43 1.34.2.1 @@ -24,10 +24,8 @@ #include "includes.h" -RCSID("$OpenBSD: sftp.c,v 1.34 2003/01/10 08:19:07 fgsch Exp $"); +RCSID("$OpenBSD: sftp.c,v 1.34.2.1 2003/09/16 20:50:43 brad Exp $"); -/* XXX: short-form remote directory listings (like 'ls -C') */ - #include "buffer.h" #include "xmalloc.h" #include "log.h" @@ -42,12 +40,22 @@ 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 @@ -68,9 +76,9 @@ 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)); @@ -85,6 +93,9 @@ exit(1); } + signal(SIGTERM, killchild); + signal(SIGINT, killchild); + signal(SIGHUP, killchild); close(c_in); close(c_out); } @@ -95,8 +106,9 @@ 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,7 +117,6 @@ main(int argc, char **argv) { int in, out, ch, err; - pid_t sshpid; char *host, *userhost, *cp, *file2; int debug_level = 0, sshver = 2; char *file1 = NULL, *sftp_server = NULL; @@ -222,15 +233,13 @@ 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); } err = interactive_loop(in, out, file1, file2);