diff options
Diffstat (limited to 'sftp.c')
-rw-r--r-- | sftp.c | 28 |
1 files changed, 19 insertions, 9 deletions
@@ -24,7 +24,7 @@ | |||
24 | 24 | ||
25 | #include "includes.h" | 25 | #include "includes.h" |
26 | 26 | ||
27 | RCSID("$OpenBSD: sftp.c,v 1.35 2003/05/15 03:44:00 mouring Exp $"); | 27 | RCSID("$OpenBSD: sftp.c,v 1.36 2003/06/04 12:41:22 djm Exp $"); |
28 | 28 | ||
29 | #include "buffer.h" | 29 | #include "buffer.h" |
30 | #include "xmalloc.h" | 30 | #include "xmalloc.h" |
@@ -46,11 +46,21 @@ char *__progname; | |||
46 | FILE* infile; | 46 | FILE* infile; |
47 | size_t copy_buffer_len = 32768; | 47 | size_t copy_buffer_len = 32768; |
48 | size_t num_requests = 16; | 48 | size_t num_requests = 16; |
49 | static pid_t sshpid = -1; | ||
49 | 50 | ||
50 | extern int showprogress; | 51 | extern int showprogress; |
51 | 52 | ||
52 | static void | 53 | static void |
53 | connect_to_server(char *path, char **args, int *in, int *out, pid_t *sshpid) | 54 | killchild(int signo) |
55 | { | ||
56 | if (sshpid > 1) | ||
57 | kill(sshpid, signo); | ||
58 | |||
59 | _exit(1); | ||
60 | } | ||
61 | |||
62 | static void | ||
63 | connect_to_server(char *path, char **args, int *in, int *out) | ||
54 | { | 64 | { |
55 | int c_in, c_out; | 65 | int c_in, c_out; |
56 | 66 | ||
@@ -72,9 +82,9 @@ connect_to_server(char *path, char **args, int *in, int *out, pid_t *sshpid) | |||
72 | c_in = c_out = inout[1]; | 82 | c_in = c_out = inout[1]; |
73 | #endif /* USE_PIPES */ | 83 | #endif /* USE_PIPES */ |
74 | 84 | ||
75 | if ((*sshpid = fork()) == -1) | 85 | if ((sshpid = fork()) == -1) |
76 | fatal("fork: %s", strerror(errno)); | 86 | fatal("fork: %s", strerror(errno)); |
77 | else if (*sshpid == 0) { | 87 | else if (sshpid == 0) { |
78 | if ((dup2(c_in, STDIN_FILENO) == -1) || | 88 | if ((dup2(c_in, STDIN_FILENO) == -1) || |
79 | (dup2(c_out, STDOUT_FILENO) == -1)) { | 89 | (dup2(c_out, STDOUT_FILENO) == -1)) { |
80 | fprintf(stderr, "dup2: %s\n", strerror(errno)); | 90 | fprintf(stderr, "dup2: %s\n", strerror(errno)); |
@@ -89,6 +99,9 @@ connect_to_server(char *path, char **args, int *in, int *out, pid_t *sshpid) | |||
89 | exit(1); | 99 | exit(1); |
90 | } | 100 | } |
91 | 101 | ||
102 | signal(SIGTERM, killchild); | ||
103 | signal(SIGINT, killchild); | ||
104 | signal(SIGHUP, killchild); | ||
92 | close(c_in); | 105 | close(c_in); |
93 | close(c_out); | 106 | close(c_out); |
94 | } | 107 | } |
@@ -109,7 +122,6 @@ int | |||
109 | main(int argc, char **argv) | 122 | main(int argc, char **argv) |
110 | { | 123 | { |
111 | int in, out, ch, err; | 124 | int in, out, ch, err; |
112 | pid_t sshpid; | ||
113 | char *host, *userhost, *cp, *file2; | 125 | char *host, *userhost, *cp, *file2; |
114 | int debug_level = 0, sshver = 2; | 126 | int debug_level = 0, sshver = 2; |
115 | char *file1 = NULL, *sftp_server = NULL; | 127 | char *file1 = NULL, *sftp_server = NULL; |
@@ -227,15 +239,13 @@ main(int argc, char **argv) | |||
227 | args.list[0] = ssh_program; | 239 | args.list[0] = ssh_program; |
228 | 240 | ||
229 | fprintf(stderr, "Connecting to %s...\n", host); | 241 | fprintf(stderr, "Connecting to %s...\n", host); |
230 | connect_to_server(ssh_program, args.list, &in, &out, | 242 | connect_to_server(ssh_program, args.list, &in, &out); |
231 | &sshpid); | ||
232 | } else { | 243 | } else { |
233 | args.list = NULL; | 244 | args.list = NULL; |
234 | addargs(&args, "sftp-server"); | 245 | addargs(&args, "sftp-server"); |
235 | 246 | ||
236 | fprintf(stderr, "Attaching to %s...\n", sftp_direct); | 247 | fprintf(stderr, "Attaching to %s...\n", sftp_direct); |
237 | connect_to_server(sftp_direct, args.list, &in, &out, | 248 | connect_to_server(sftp_direct, args.list, &in, &out); |
238 | &sshpid); | ||
239 | } | 249 | } |
240 | 250 | ||
241 | err = interactive_loop(in, out, file1, file2); | 251 | err = interactive_loop(in, out, file1, file2); |