diff options
author | Ben Lindstrom <mouring@eviladmin.org> | 2001-05-08 20:27:25 +0000 |
---|---|---|
committer | Ben Lindstrom <mouring@eviladmin.org> | 2001-05-08 20:27:25 +0000 |
commit | 387c472660ef173c2e469e70eb1a25d47f6e8887 (patch) | |
tree | 4686516a373bbb5ca9594c4cb285aedc6a72aa8d /sftp.c | |
parent | 69128668938c82e8d428e77726ef00b2b6f799b9 (diff) |
- mouring@cvs.openbsd.org 2001/05/08 19:45:25
[misc.c misc.h scp.c sftp.c]
Use addargs() in sftp plus some clean up of addargs(). OK Markus
Diffstat (limited to 'sftp.c')
-rw-r--r-- | sftp.c | 123 |
1 files changed, 31 insertions, 92 deletions
@@ -24,7 +24,7 @@ | |||
24 | 24 | ||
25 | #include "includes.h" | 25 | #include "includes.h" |
26 | 26 | ||
27 | RCSID("$OpenBSD: sftp.c,v 1.16 2001/05/03 23:09:53 mouring Exp $"); | 27 | RCSID("$OpenBSD: sftp.c,v 1.17 2001/05/08 19:45:25 mouring Exp $"); |
28 | 28 | ||
29 | /* XXX: commandline mode */ | 29 | /* XXX: commandline mode */ |
30 | /* XXX: short-form remote directory listings (like 'ls -C') */ | 30 | /* XXX: short-form remote directory listings (like 'ls -C') */ |
@@ -46,9 +46,7 @@ extern char *__progname; | |||
46 | char *__progname; | 46 | char *__progname; |
47 | #endif | 47 | #endif |
48 | 48 | ||
49 | int use_ssh1 = 0; | ||
50 | char *ssh_program = _PATH_SSH_PROGRAM; | 49 | char *ssh_program = _PATH_SSH_PROGRAM; |
51 | char *sftp_server = NULL; | ||
52 | FILE* infile; | 50 | FILE* infile; |
53 | 51 | ||
54 | void | 52 | void |
@@ -92,58 +90,6 @@ connect_to_server(char **args, int *in, int *out, pid_t *sshpid) | |||
92 | close(c_out); | 90 | close(c_out); |
93 | } | 91 | } |
94 | 92 | ||
95 | char ** | ||
96 | make_ssh_args(char *add_arg) | ||
97 | { | ||
98 | static char **args = NULL; | ||
99 | static int nargs = 0; | ||
100 | char debug_buf[4096]; | ||
101 | int i; | ||
102 | |||
103 | /* Init args array */ | ||
104 | if (args == NULL) { | ||
105 | nargs = 2; | ||
106 | i = 0; | ||
107 | args = xmalloc(sizeof(*args) * nargs); | ||
108 | args[i++] = "ssh"; | ||
109 | args[i++] = NULL; | ||
110 | } | ||
111 | |||
112 | /* If asked to add args, then do so and return */ | ||
113 | if (add_arg) { | ||
114 | i = nargs++ - 1; | ||
115 | args = xrealloc(args, sizeof(*args) * nargs); | ||
116 | args[i++] = add_arg; | ||
117 | args[i++] = NULL; | ||
118 | return(NULL); | ||
119 | } | ||
120 | |||
121 | /* no subsystem if the server-spec contains a '/' */ | ||
122 | if (sftp_server == NULL || strchr(sftp_server, '/') == NULL) | ||
123 | make_ssh_args("-s"); | ||
124 | make_ssh_args("-oForwardX11=no"); | ||
125 | make_ssh_args("-oForwardAgent=no"); | ||
126 | make_ssh_args(use_ssh1 ? "-oProtocol=1" : "-oProtocol=2"); | ||
127 | |||
128 | /* Otherwise finish up and return the arg array */ | ||
129 | if (sftp_server != NULL) | ||
130 | make_ssh_args(sftp_server); | ||
131 | else | ||
132 | make_ssh_args("sftp"); | ||
133 | |||
134 | /* XXX: overflow - doesn't grow debug_buf */ | ||
135 | debug_buf[0] = '\0'; | ||
136 | for(i = 0; args[i]; i++) { | ||
137 | if (i) | ||
138 | strlcat(debug_buf, " ", sizeof(debug_buf)); | ||
139 | |||
140 | strlcat(debug_buf, args[i], sizeof(debug_buf)); | ||
141 | } | ||
142 | debug("SSH args \"%s\"", debug_buf); | ||
143 | |||
144 | return(args); | ||
145 | } | ||
146 | |||
147 | void | 93 | void |
148 | usage(void) | 94 | usage(void) |
149 | { | 95 | { |
@@ -154,32 +100,42 @@ usage(void) | |||
154 | int | 100 | int |
155 | main(int argc, char **argv) | 101 | main(int argc, char **argv) |
156 | { | 102 | { |
157 | int in, out, ch, debug_level, compress_flag; | 103 | int in, out, ch; |
158 | pid_t sshpid; | 104 | pid_t sshpid; |
159 | char *file1 = NULL; | ||
160 | char *host, *userhost, *cp, *file2; | 105 | char *host, *userhost, *cp, *file2; |
161 | LogLevel ll; | 106 | int debug_level = 0, sshver = 2; |
107 | char *file1 = NULL, *sftp_server = NULL; | ||
108 | LogLevel ll = SYSLOG_LEVEL_INFO; | ||
109 | arglist args; | ||
162 | extern int optind; | 110 | extern int optind; |
163 | extern char *optarg; | 111 | extern char *optarg; |
164 | 112 | ||
165 | __progname = get_progname(argv[0]); | 113 | __progname = get_progname(argv[0]); |
166 | infile = stdin; /* Read from STDIN unless changed by -b */ | 114 | args.list = NULL; |
167 | debug_level = compress_flag = 0; | 115 | addargs(&args, "ssh"); /* overwritten with ssh_program */ |
116 | addargs(&args, "-oFallBackToRsh no"); | ||
117 | addargs(&args, "-oForwardX11 no"); | ||
118 | addargs(&args, "-oForwardAgent no"); | ||
119 | ll = SYSLOG_LEVEL_INFO; | ||
120 | infile = stdin; /* Read from STDIN unless changed by -b */ | ||
168 | 121 | ||
169 | while ((ch = getopt(argc, argv, "1hvCo:s:S:b:")) != -1) { | 122 | while ((ch = getopt(argc, argv, "1hvCo:s:S:b:")) != -1) { |
170 | switch (ch) { | 123 | switch (ch) { |
171 | case 'C': | 124 | case 'C': |
172 | compress_flag = 1; | 125 | addargs(&args, "-C"); |
173 | break; | 126 | break; |
174 | case 'v': | 127 | case 'v': |
175 | debug_level = MIN(3, debug_level + 1); | 128 | if (debug_level < 3) { |
129 | addargs(&args, "-v"); | ||
130 | ll = SYSLOG_LEVEL_DEBUG1 + debug_level; | ||
131 | } | ||
132 | debug_level++; | ||
176 | break; | 133 | break; |
177 | case 'o': | 134 | case 'o': |
178 | make_ssh_args("-o"); | 135 | addargs(&args, "-o%s", optarg); |
179 | make_ssh_args(optarg); | ||
180 | break; | 136 | break; |
181 | case '1': | 137 | case '1': |
182 | use_ssh1 = 1; | 138 | sshver = 1; |
183 | if (sftp_server == NULL) | 139 | if (sftp_server == NULL) |
184 | sftp_server = _PATH_SFTP_SERVER; | 140 | sftp_server = _PATH_SFTP_SERVER; |
185 | break; | 141 | break; |
@@ -222,8 +178,7 @@ main(int argc, char **argv) | |||
222 | fprintf(stderr, "Missing username\n"); | 178 | fprintf(stderr, "Missing username\n"); |
223 | usage(); | 179 | usage(); |
224 | } | 180 | } |
225 | make_ssh_args("-l"); | 181 | addargs(&args, "-l%s",userhost); |
226 | make_ssh_args(userhost); | ||
227 | } | 182 | } |
228 | 183 | ||
229 | host = cleanhostname(host); | 184 | host = cleanhostname(host); |
@@ -232,36 +187,20 @@ main(int argc, char **argv) | |||
232 | usage(); | 187 | usage(); |
233 | } | 188 | } |
234 | 189 | ||
235 | /* Set up logging and debug '-d' arguments to ssh */ | ||
236 | ll = SYSLOG_LEVEL_INFO; | ||
237 | switch (debug_level) { | ||
238 | case 1: | ||
239 | ll = SYSLOG_LEVEL_DEBUG1; | ||
240 | make_ssh_args("-v"); | ||
241 | break; | ||
242 | case 2: | ||
243 | ll = SYSLOG_LEVEL_DEBUG2; | ||
244 | make_ssh_args("-v"); | ||
245 | make_ssh_args("-v"); | ||
246 | break; | ||
247 | case 3: | ||
248 | ll = SYSLOG_LEVEL_DEBUG3; | ||
249 | make_ssh_args("-v"); | ||
250 | make_ssh_args("-v"); | ||
251 | make_ssh_args("-v"); | ||
252 | break; | ||
253 | } | ||
254 | |||
255 | if (compress_flag) | ||
256 | make_ssh_args("-C"); | ||
257 | |||
258 | log_init(argv[0], ll, SYSLOG_FACILITY_USER, 1); | 190 | log_init(argv[0], ll, SYSLOG_FACILITY_USER, 1); |
191 | addargs(&args, "-oProtocol %d", sshver); | ||
192 | |||
193 | /* no subsystem if the server-spec contains a '/' */ | ||
194 | if (sftp_server == NULL || strchr(sftp_server, '/') == NULL) | ||
195 | addargs(&args, "-s"); | ||
259 | 196 | ||
260 | make_ssh_args(host); | 197 | addargs(&args, "%s", host); |
198 | addargs(&args, "%s", (sftp_server != NULL ? sftp_server : "sftp")); | ||
199 | args.list[0] = ssh_program; | ||
261 | 200 | ||
262 | fprintf(stderr, "Connecting to %s...\n", host); | 201 | fprintf(stderr, "Connecting to %s...\n", host); |
263 | 202 | ||
264 | connect_to_server(make_ssh_args(NULL), &in, &out, &sshpid); | 203 | connect_to_server(args.list, &in, &out, &sshpid); |
265 | 204 | ||
266 | interactive_loop(in, out, file1, file2); | 205 | interactive_loop(in, out, file1, file2); |
267 | 206 | ||